如何在PowerShell中实现循环数字匹配求和(Advent of Code 2017 Day1)
解决Advent of Code 2017 Day 1的PowerShell问题
咱们先拆解你遇到的两个核心问题:字符串转数字数组失败,以及循环求和时的边界逻辑错误。
问题1:无法将字符串拆分为单个数字的数组
你用$line.split('')的方式不对,PowerShell里的Split方法传空字符串不会按单个字符拆分。正确的做法是先把字符串转成字符数组,再逐个转成整数:
foreach($line in [System.IO.File]::ReadLines("./task1.txt")) { [int[]]$data = [char[]]$line | ForEach-Object { [int]::Parse($_) } }
或者更简洁的写法(利用字符ASCII值差实现转换):
[int[]]$data = $line.ToCharArray() | ForEach-Object { $_ - '0' }
问题2:循环求和的边界逻辑错误
原来的循环While ($i -le $data.Length)会导致索引越界,而且没处理最后一位的下一位是第一位的循环规则。咱们修正逻辑,用取模运算天然适配循环结构:
$finalSum = 0 $length = $data.Length for ($i = 0; $i -lt $length; $i++) { # 取模运算自动处理循环索引:最后一位的下一位是0(第一位) $nextIndex = ($i + 1) % $length if ($data[$i] -eq $data[$nextIndex]) { $finalSum += $data[$i] } } $finalSum
这样输入1122会得到3,1111得到4,完全符合题目要求。
完整可运行代码
把两部分结合起来的完整代码:
# 读取文件内容并转成数字数组 foreach($line in [System.IO.File]::ReadLines("./task1.txt")) { [int[]]$data = [char[]]$line | ForEach-Object { [int]::Parse($_) } } # 计算匹配数字的总和 $finalSum = 0 $length = $data.Length for ($i = 0; $i -lt $length; $i++) { $nextIndex = ($i + 1) % $length if ($data[$i] -eq $data[$nextIndex]) { $finalSum += $data[$i] } } # 输出结果 $finalSum
为什么原来的代码求和失败?
你原来的$final是字符串拼接(比如得到"12"),用Measure-Object -Sum时PowerShell会把字符串当成普通对象处理,无法识别为数字求和。改成直接累加数字就解决了这个问题。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

