首页 > 编程语言 >Advent of Code 2023题解 [Mathematica/Python]

Advent of Code 2023题解 [Mathematica/Python]

时间:2023-12-01 14:46:03浏览次数:63  
标签:Code end Python 题解 start num dict positions word

Day 1

Part 1

(*读取文件*)lines = ReadList["E:\\ExplorerDownload\input.txt", String];

(*计算校准值*)
calibrationValues = 
  ToExpression[
     StringJoin[#[[1]], #[[-1]]]] & /@ (StringCases[#, 
       DigitCharacter] & /@ lines);

(*打印总和*)
Print[Total[calibrationValues]]

Part 2

import re

# 英文数字词对应的字典
word_to_num = {
    'one': 1,
    'two': 2,
    'three': 3,
    'four': 4,
    'five': 5,
    'six': 6,
    'seven': 7,
    'eight': 8,
    'nine': 9
    # ,
    # 'ten': 10,
    # 'eleven': 11,
    # 'twelve': 12,
    # 'thirteen': 13,
    # 'fourteen': 14,
    # 'fifteen': 15,
    # 'sixteen': 16,
    # 'seventeen': 17,
    # 'eighteen': 18,
    # 'nineteen': 19,
    # 'twenty': 20,
    # 'thirty': 30,
    # 'forty': 40,
    # 'fifty': 50,
    # 'sixty': 60,
    # 'seventy': 70,
    # 'eighty': 80,
    # 'ninety': 90,
    # 'hundred': 100,
    # 'thousand': 1000,
    # 'million': 1000000,
    # 'billion': 1000000000,
}

# 输入的字符串
# input_strs = [
#     'two1nine',
#     'eightwothree',
#     'abcone2threexyz',
#     'xtwone3four',
#     '4nineeightseven2',
#     'zoneight234',
#     '7pqrstsixteen'
# ]
# 从文件中读取输入的字符串
with open('input_part2.txt', 'r') as f:
    input_strs = [line.strip() for line in f]


# 抽取英文数字词和它们的位置
word_num_positions = []
for i, s in enumerate(input_strs):
    for word, num in word_to_num.items():
        for match in re.finditer(word, s):
            start, end = match.span()
            word_num_positions.append((i, start, end, word, num))

# 抽取所有的数字和它们的位置
digit_positions = []
for i, s in enumerate(input_strs):
    for match in re.finditer(r'\d', s):
        start, end = match.span()
        digit_positions.append((i, start, end, int(s[start:end])))

# 输出结果
# print('Word numbers and their positions:')
# for pos in word_num_positions:
#     print(f'String index: {pos[0]}, Start: {pos[1]}, End: {pos[2]}, Word: {pos[3]}, Number: {pos[4]}')
#
# print('\nDigits and their positions:')
# for pos in digit_positions:
#     print(f'String index: {pos[0]}, Start: {pos[1]}, End: {pos[2]}, Digit: {pos[3]}')

# for [StringIndex, Start, End, Word, Number] in word_num_positions:
#     print(f"{StringIndex=} {Start=} {End=} {Number=}")
# for [StringIndex, Start, End, Digit] in digit_positions:
#     print(f"{StringIndex=} {Start=} {End=} {Digit=}")

# 英文数字词和数字的位置
word_num_positions.sort()
digit_positions.sort()

# 创建存储每个StringIndex最小Start和最大End的字典
start_dict = {}
end_dict = {}

# 找到每个StringIndex的最小Start
for i, s, e, w, n in word_num_positions:
    if i in start_dict:
        start_dict[i] = min(start_dict[i], (s, n))
    else:
        start_dict[i] = (s, n)

for i, s, e, d in digit_positions:
    if i in start_dict:
        start_dict[i] = min(start_dict[i], (s, d))
    else:
        start_dict[i] = (s, d)

# 找到每个StringIndex的最大End
for i, s, e, w, n in word_num_positions[::-1]:
    if i in end_dict:
        end_dict[i] = max(end_dict[i], (e, n))
    else:
        end_dict[i] = (e, n)

for i, s, e, d in digit_positions[::-1]:
    if i in end_dict:
        end_dict[i] = max(end_dict[i], (e, d))
    else:
        end_dict[i] = (e, d)

# 输出每个StringIndex的二位数
total=0
for i in range(len(input_strs)):
    start_num = start_dict.get(i, (None, 0))[1]
    end_num = end_dict.get(i, (None, 0))[1]
    total+=(start_num * 10 + end_num)
    print(f'String index: {i}, Number: {start_num * 10 + end_num}')
print(f"{total=}")

标签:Code,end,Python,题解,start,num,dict,positions,word
From: https://www.cnblogs.com/yhm138/p/17869557.html

相关文章

  • python5
    数据容器入门数据容器:一种可以容纳多份的数据类型,每一份数据称为元素,分五类: 1.列表list2.元组tuple3.字符串str4.集合set5.字典dict 一.列表语法列表【下标】即可取出#基本语法【元素1,元素2,元素3~~~】#定义变量 变量名称=【元素1,元素2,元素3~~~......
  • Python接口自动化项目----Anan
    优点本效果展示仅是整体样式功能,更详细的使用方法和优点,需要参考使用手册。整体的优点包括:1.测试接口的统一管理2.支持多环境3.测试报告展示4.定时任务5.支持代码驱动6.便捷的交互式页面7.支持根据业务的定制化操作8.基于httprunner1.x,支持各种复杂情况下的接口测试,多依......
  • 九章算法Twitter 后端系统 - Python 项目实战2023
    获取完整版--》请留言VisualStudioCodeVisualStudioCode(简称VSCode)是一个免费的跨平台文本编辑器,由微软开发和维护。虽然它被称为文本编辑器,但它实际上是一个功能强大的集成开发环境(IDE),支持多种编程语言,如Python、JavaScript、C++等。以下是VSCode的一些主要特点:轻量级:VSCo......
  • Python使用cURL库下载文件
    Python使用cURL库下载文件cURL库是一个功能强大的工具,可以用于在Python中下载文件。以下是一个简单的Python程序,使用cURL库实现文件下载功能:importsubprocessdefdownload_file(url,output_path):command=['curl','-o',output_path,url]process=subprocess.Popen(comman......
  • Python爬虫异步与缓存技巧浅析
    Python爬虫异步与缓存技巧浅析在Python爬虫中,异步和缓存是两个非常重要的概念。异步可以显著提高爬虫的效率,而缓存则可以帮助我们避免重复抓取网页,节省时间和资源。一、异步爬虫Python的异步爬虫通常使用asyncio库来实现。这个库提供了异步I/O、事件循环、协程和任务等功能。下面是......
  • Python爬虫完整代码模版——获取网页数据的艺术
    Python爬虫完整代码模版——获取网页数据的艺术在当今数字化世界中,数据是价值的源泉。如何从海量数据中提取所需信息,是每个数据科学家和开发者必须面对的问题。Python爬虫作为一种自动化工具,专门用于从网站上抓取数据。本文将提供一个Python爬虫的完整代码模板,并配以插图,帮助读者理......
  • Python制作排班小工具【二】
    一、背景在上一篇文章中(Python制作排班小工具【一】),已经编写了小工具的排班逻辑,本篇文章将实现小工具的GUI界面。那么先粗略画一张UI示意图,GUI界面代码就按照这张图来编写:二、代码实现使用ttkbootstrap:1.创建“生成排班”和“查看记录”两个Notebook2.将Label标签,Entry输入框,Button......
  • 无涯教程-Python - 单词标记化
    单词标签化是将大量文本样本拆分为单词的过程,这是自然语言处理任务的要求,其中每个单词都需要捕获并接受以便进一步分析,如对特定情感进行分类和计数等,自然语言工具包(NLTK)是用于实现此目的的库,在继续进行python之前安装NLTK单词标签化程序。condainstall-canacondanltk接......
  • 聪明办法学python——Task05,06
    聪明办法学python——Task5,Task6Task05——循环for循环和循环范围特点:基于提供的范围,重复执行特定范围的操作forxinrange(n,m+1):  count+=1returncountrange(x,y)是左闭右开的区间,不含yreturnsum(range(m,n+1))range的第三个参数是步长,可正可负foriinrange(......
  • 聪明办法学python——06,07
    聪明办法学python——Task6,Task7Task06——循环for循环和循环范围特点:基于提供的范围,重复执行特定范围的操作forxinrange(n,m+1):  count+=1returncountrange(x,y)是左闭右开的区间,不含yreturnsum(range(m,n+1))range的第三个参数是步长,可正可负foriinrange(......