You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:15:04