我今年发现了“Advent of Code”并决定尝试参加它。我回顾了去年的一些任务,看看我可能会期待什么。到目前为止,跳出框框思考并提出解决问题的方案是很有趣的。
第1部分
对于第一个任务,我们得到了一个文件,其中行上有一些文本和数字。我们被要求选择行中的第一个和最后一个数字,然后将它们全部加在一起。我一开始认为这相当简单。
For example: 1abc2 pqr3stu8vwx a1b2c3d4e5f treb7uchet In this example, the calibration values of these four lines are 12, 38, 15, and 77. Adding these together produces 142.
我选择在 PowerShell 中启动它。这是我通常开始做的事情,因为它是基本的文件输入、选择数字和加法,为什么不呢?
$inputfile = get-content day1 . txt $digits = $inputfile -replace '[a-zA-Z]' , '' $sum = 0 $digits | ForEach-Object { $line = $_ $first = $line . ToCharArray ( ) | Select-Object - first 1 $last = $line . ToCharArray ( ) | Select-Object - last 1 $number = " $ ( $first ) $ ( $last ) " $sum += [int] $number } Write-Host "Part one total: $sum "
我发现我的正则表达式没有达到仅选择数字的效果。所以我决定用空格替换字母字符。这有效,对于每一行,我将数字分成一个数组,这样我就可以选择第一个和最后一个数字。有些行有 3、4、5 位数字。重新阅读说明和示例后,这是获取数字的好方法。让我感到困惑的是,有些行只有一个数字…所以这一行, 9zml
,数字 9 算作 99。我从最后一行的 7 的示例中找到了这一点,
由于这是一个字符串,要添加数字,我必须将其类型强制转换为[int]
。
现在进入第二部分
笔记上说这个数字是正确的,但我们看到文字上有拼写出来的单词。
9sixsevenz3 seven1cvdvnhpgthfhfljmnq 6tvxlgrsevenjvbxbfqrsk4seven 9zml 52sevenone 41onevfsgvssxnpsix38four
这次我正在考虑使用Select-String
来实现正则表达式功能,它大部分工作……仍然没有得到正确的答案。
$sum2 = 0 foreach ( $line in $inputfile ) { $digits2 = $line | Select-String '(?=(\d|one|two|three|four|five|six|seven|eight|nine))' - AllMatches | ForEach-Object { $_ . Matches } | % { $_ . Value } $first = $digits2 | Select-Object - first 1 $last = $digits2 | Select-Object - last 1 $first = convertToInteger ( $first ) $last = convertToInteger ( $last ) $completeDigit = " $ ( $first ) $ ( $last ) " Write-Host " $line $completeDigit " pause $sum2 += [int] $completeDigit } Write-Host "Part two total: $sum2 "
我对 PowerShell 确实有一点奇怪的地方。我从Robb Knight借用了正则表达式,谢谢!但正则表达式在 PowerShell 中无法正常工作。这个想法就在那里,我得到了正确的数字,在 1000 行输入文件中的某个地方,有些东西没有得到正确的正则表达式。
然而,我仍然对自己选择的数字和数字的文字印象深刻。我确实对$digits2
进行了联接,并且确实看到了字符串的正确导出,并且它确实从以下示例中正确导出。
41onevfsgvssxnpsix38four 4,1,one,six,3,8,four
由于Select-String
是一个数组,因此我们可以轻松获取第一个和最后一个元素。现在有趣的是,将单词转换为整数;我为此构建了一个矩阵函数。
function convertToInteger ( $word ) { if ( -not $word -is [ValueType] ) { switch ( $word ) { 'one' { return 1 } 'two' { return 2 } 'three' { return 3 } 'four' { return 4 } 'five' { return 5 } 'six' { return 6 } 'seven' { return 7 } 'eight' { return 8 } 'nine' { return 9 } default { return $word } } } }
这将获取每个项目并将单词转换为正确的数字。接下来使用类似的概念来构建我们的$completeDigit
并完成总和。我的正则表达式中的某些内容以及选择正确的第一个/最后一个数字组合没有获得正确的数字来正确完成任务。
全面的
这是一个有趣的过程。我会看看明天会发生什么以及我在这个过程中能走多远。这个花了我比我想要的更长的时间,几乎放弃了,但我认为我至少应该得到第一部分。
原文: https://claytonerrington.com/blog/advent-of-code-2023-day-1/