[玩转系统] 解决另一个 PowerShell 数学挑战
作者:精品下载站 日期:2024-12-14 08:02:17 浏览:13 分类:玩电脑
解决另一个 PowerShell 数学挑战
上个月,Iron Scripter 主席发布了一个“有趣的”PowerShell 脚本挑战。实际上,有一些与数学相关的挑战。与所有这些挑战一样,您用来解决挑战的技术和概念比结果本身更重要。以下是我解决这些问题的方法。
问题#1
第一个挑战是取一个数字,例如 2568,并获得各个整数的总和。
2+5+6+8
答案是 21。您可能可以想出几种方法将字符串拆分为单独的元素。我决定使用正则表达式。
[int]$i = 12931
#define a regex pattern to match a single digit
[regex]$rx="\d{1}"
每个正则表达式匹配对象值将是单独的数字。我可以轻松地将值通过管道传递给 Measure-Object 以获得总和。
#get all matches and add them up
$measure = $rx.Matches($i) | Measure-Object -Property Value -Sum
#write the sum to the pipeline
$measure.sum
这很容易变成一个函数。
Function Get-NumberSum {
[cmdletbinding()]
[OutputType([Int])]
Param(
[Parameter(Position = 0, Mandatory, HelpMessage = "Enter an integer value like 1234")]
[Alias("i")]
[int]$Value
)
#define a regex pattern to match a single digit
[regex]$rx = "\d{1}"
#get all matches and add them up
$measure = $rx.Matches($Value) | Measure-Object -Property Value -Sum
#write the sum to the pipeline
$measure.sum
}
该函数需要一个整数。但正则表达式模式适用于任何包含数字的内容。
($rx.matches("A12B9C31D") | measure value -sum).sum
这给了我相同的答案 16。挑战有一些奖励元素,所以这里是该函数的稍微更高级的版本。
Function Get-NumberSum {
[cmdletbinding()]
[OutputType([Int])]
[OutputType("NumberSum")]
[Alias("gns")]
Param(
[ValidateScript({
if ($_.ToString().Length -le 10) {
$True
}
else {
Throw "Specify a value of 10 digits or less."
$False
}
})]
[int64]$Value,
[switch]$Quiet
)
Write-Verbose "Processing $Value"
#define a regex pattern to match a single digit
[regex]$rx = "\d{1}"
$values = $rx.Matches($Value).Value
Write-Verbose ($values -join "+")
$measure = $Values | Measure-Object -Sum
Write-Verbose "Equals $($measure.sum)"
if ($Quiet) {
$measure.sum
}
else {
[pscustomobject]@{
PSTypeName = "NumberSum"
Value = $Value
Elements = $values
Sum = $measure.sum
}
}
}
此版本将默认创建自定义对象。 -Quiet 参数仅显示结果。可以通过多种方式处理参数验证。如果我将 $Value 的类型保留为 [int],那么数字无论如何都不能超过 10 位。但我想尝试一些不同的东西。因此,我使用 ValidateScript 属性来显示自定义错误消息。这是使用函数别名的样子。
好吧,我承认使用正则表达式对于这个挑战来说有点大材小用,但它很有趣。这是一个更简单的方法。
($i -split "" | measure-object -sum).sum
问题#2
第二个问题更具挑战性。给定一个数字数组,所有可能的唯一和是多少。
$a = 2,5,6
2
5
6
2+5 = 7
2+5+6 = 13
2+6 = 8
5+6 = 11
此问题需要从数组中获取数字之和,并考虑所有可能的组合。诀窍是递归调用该函数,减少组合测试的数量。
function Get-ReductiveSum {
param([array]$Numbers,[int]$Index=0,[int]$Sum=0)
if ($numbers.count -eq $index) {
$sum
}
else {
Get-ReductiveSum $numbers -index ($index+1) -sum ($sum+$numbers[$index])
Get-ReductiveSum $numbers ($index+1) $sum
}
}
我可以像这样使用这个功能。
为了满足挑战目标并使其易于使用,我创建了这个“父”功能。
Function Get-PossibleSum {
[cmdletbinding()]
Param(
[Parameter(Position = 0, Mandatory)]
[ValidateRange(1,9)]
[int[]]$Values
)
#nested function
function Get-ReductiveSum {
param([array]$Numbers,[int]$Index=0,[int]$Sum=0)
Write-Verbose "Get-ReductiveSum -Numbers $($numbers -join ',') -index $index -sum $sum"
if ($numbers.count -eq $index) {
Write-Verbose "Found sum $sum"
$sum
}
else {
Write-Verbose "Reducing numbers to $($numbers -join ',')"
Write-Verbose "Setting index to $($index+1)"
Write-Verbose "Get-ReductiveSum $($sum+$numbers[$index])"
Get-ReductiveSum $numbers -index ($index+1) -sum ($sum+$numbers[$index])
Write-Verbose "Get-ReductiveSum $sum"
Get-ReductiveSum $numbers ($index+1) $sum
}
}
Write-Verbose "Using values $($values -join ',')"
Write-Verbose "Verifying unique values"
$values = $values | Get-Unique
if ($values.count -gt 9) {
#this should probably never happen
Write-Warning "You specified $($values.count) values. Only using the first 9"
$Values = $Values[0..8]
}
Write-Verbose "Calculating possible unique sums for $($values -join ',')"
$result = Get-ReductiveSum $Values | Where-Object {$_ -gt 0}
Write-Verbose "Found $($result.count) non-zero sums"
$result | Sort-Object
}
我将让您尝试代码以查看详细输出。
让你的大脑以 PowerShell 的方式思考可能很困难。这就是为什么这些挑战如此有帮助。您越能在头脑中遵循 PowerShell 管道,它就越容易使用。
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag