【问题标题】:How to add values in a string of type System.String in Powershell如何在 Powershell 中的 System.String 类型的字符串中添加值
【发布时间】:2018-05-17 18:04:10
【问题描述】:

问题描述: 我正在尝试执行此处提到的任务 - https://codereview.stackexchange.com/questions/182483/advent-of-code-2017-day-1-sum-of-digits-matching-the-next-digit-circular-list

但在 Windows Power Shell 中使用简单的循环逻辑(因为我是 Power Shell 新手)

该任务需要查看一系列数字并找到与列表中下一个数字匹配的所有数字的总和。该列表是循环的,因此最后一位之后的数字是列表中的第一位。例如:

1122 产生的和为 3 (1 + 2),因为第一个数字 1 匹配第二个数字,第三个数字 2 匹配第四个数字; 1111 产生 4,因为每个数字(全为 1)与下一个数字匹配; 1234 产生 0,因为没有数字匹配下一个; 91212129 产生 9,因为与下一个匹配的唯一数字是最后一个数字 9

我已经编码了这个:

foreach($line in [System.IO.File]::ReadLines("./task1.txt"))
{
    $data = ($line)
}

$i=0
Do 
{    
if ($data[$i] -eq $data[$i+1]) {    
$final += $data[$i]
}

$i++    
}
While ($i -le $data.Length)

($final | Measure-Object -Sum).sum

我的“task1.txt”包含值 - “1122”

$final 存储的值是“12”,这些数字是预期的,但我无法将它们相加得到所需的答案 - “3”

当我尝试使用时:

foreach($line in [System.IO.File]::ReadLines("./task1.txt"))
{
    [int[]]$data = [int[]]$line.split('')


}

我的“$data”获取整个“1122”作为值

请帮忙!

【问题讨论】:

  • 将 $data 视为字符串并使用 [index] 或 .Substring() 方法遍历它的 Length
  • $line.split('') 没有做你认为它正在做的事情。在转换为 int 数组之前转换为字符串数组可能会起作用。例如[int[]][string[]]$line

标签: windows powershell window


【解决方案1】:

var $i 遍历 Length,

编辑精简版感谢BenH的提示

## Q:\Test\2018\05\17\SO_50397884.ps1
function CodeAdvent2017-1 {
    param ([string]$data)
    $res = 0
    for ($i=0;$i -le $data.Length-1;$i++){
        if ($data[$i] -eq $data[$i-1]){
            $res+=[int]$data.substring($i,1)
        }
        #"`$i={0}, `$pnt={1} `$data[`$i]={2} `$res={3}" -f $i,$pnt,$data[$i],$res
    }
    return "Result: {0} of {1}" -f $res, $data
}

CodeAdvent2017-1 1122       #produces 3
CodeAdvent2017-1 1111       #produces 4
CodeAdvent2017-1 1234       #produces 0
CodeAdvent2017-1 91212129   #produces 9

样本输出:

> Q:\Test\2018\05\17\SO_50397884.ps1
Result: 3 of 1122
Result: 4 of 1111
Result: 0 of 1234
Result: 9 of 91212129

【讨论】:

  • 除了使用模数,你也可以往后看,因为[0][0-1] 会与最后一个值进行比较。
  • @LotPings 太棒了!非常感谢。但是,您能否解释一下“-1”在函数“CodeAdvent2017-1”中的作用。以及您如何检查最后一位数字和第一位数字?我在那里有点困惑。
  • @LotPings 在下面添加我的代码,但需要了解您的答案:) 另外,在我的代码中如果我想在调用我的 .ps1 文件时提供文件名作为参数,该怎么做?任何想法
  • @Alex CodeAdvent2017-1 只是函数的名称,- 是函数名称中的有效字符。至于比较第一个和最后一个数字,在 PowerShell 中,如果您使用 [-1] 作为索引,它会引用数组的末尾。所以@('a','b','c')[-1]c。因此,当$i 为0 时,通过比较$i$i-1 来比较索引0-1,这是第一个和最后一个元素。
【解决方案2】:
foreach($line in (gc ".\task1")) {
    [string]$data = $line   
}

$i=0
$final = 0
Do {
    if ($data[$i] -eq $data[$i -1]) {
        $final += [int]$data.substring($i,1)
    }
    $i++    
} While ($i -le $data.Length-1)

$final 

【讨论】:

  • 你的尝试太复杂了,上面改了。
  • 虽然这段代码可以回答问题,但最好解释一下如何解决问题,并提供代码作为示例或参考。仅代码的答案可能会令人困惑且缺乏上下文。
猜你喜欢
  • 2021-11-16
  • 2019-09-13
  • 1970-01-01
  • 2018-05-15
  • 2020-09-19
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多