比较以字符串形式给出的两个数字


21

我上班有问题。我需要比较来自两个不同数据库的两个数字作为字符串。数字可能带有前导零和/或前导/后跟空格。所以我可能"0001 "来自一个数据库,也可能来自另一个数据库" 1 "

我用以下代码解决了C#中的问题:

Func<string, string, bool> f = (a,b) => int.Parse(a.Trim()) == int.Parse(b.Trim())

挑战

这是一个非常简单的挑战,适合初学者和任何深奥的语言。给定两个数字作为可能带有前导零和/或前导/后跟空格的字符串,请编写最短的代码来检查两个字符串是否表示相同的数字。

  • 输入必须是两个字符串或您的语言中的等效字符串(char数组可以),它们将始终表示大于零的整数值。
  • 输出必须是代表真值和假值的任何两个一致值。

例子

A          B          Result
----------------------------
"0001"     "1    "    true
"1450"     "1450 "    true
"0010001 " " 10001  " true
"0010000"  "  10  "   false
"101023"   "101024"   false

这是,因此每种语言的最短代码可能会胜出!



8
至少这次没有受到您孩子的启发……
caird coinheringaahing

2
@cairdcoinheringaahing我自己的工作是我的第二个灵感来源。我知道这是一个非常简单的挑战,但我认为有时也需要这些简单的挑战。下次我会尝试一些更困难的事情。
查理

顺便说一句,似乎我的工作挑战要么太容易要么太难了 ……
查理

@JonathanAllan不,每个输入字符串仅代表一个数字。字符串之间不会有空格。
查理

Answers:


22

Javascript,11个字节

a=>b=>+a==b

稍微滥用Javascript的转换规则;+a强制a转换为数字类型。

-6个字节,感谢ShaggyMartin Ender♦

LiefdeWen也很喜欢

a=>b=>~~a==~~b

2
欢迎来到PPCG。您可以使用currying并通过仅将输入之一转换为整数来以11个字节的形式执行此操作:tio.run/##y0osSyxOLsosKNHNy09J/…还请注意,除非函数引用了自身,否则不需要包括变量您的字节数分配。
粗野的

2
欢迎来到PPCG!未命名函数很好,因此不需要c=,currying也很好,因此您可以使用a=>b=>...代替(a,b)=>。最后,我的JavaScript有点生锈,但是我认为类似的!(a-b)方法也可以吗?
Martin Ender

1
请参阅ES6中的打高尔夫球技巧(以及一般的JS打高尔夫球技巧),以获取更多技巧来从解决方案中压缩字节。
毛茸茸的

1
很酷的版本很酷,但范围有限,请尝试输入“ 9123456789”和“ 533522197”。这些是整数值的字符串表示形式,很好地位于javascript中的整数的有效范围内(但大于32位)
edc65

1
您的文字不再与代码匹配;没有减法。您正在a使用unary 强制转换为数字类型+
彼得·科德斯


18

操作Flashpoint脚本语言,33字节

f={call format(["%1==%2"]+_this)}

致电:

hint format["%1\n%2\n%3\n%4\n%5",
    ["0001", "1    "] call f,
    ["1450", "1450 "] call f,
    ["0010001 ", " 10001  "] call f,
    ["0010000", "  10  "] call f,
    ["101023", "101024"] call f]

输出:

备用版本(41字节):

f={{t=call _x;r=t==s;s=t}forEach _this;r}

仍然比更直接的字节还短5个字节 f={t=_this;call(t select 0)==call(t select 1)}

39个字节:

f={{t=call _x;r=t==s;s=t}count _this;r}

count(返回数组的大小)(而不是)起作用forEach,因为您可以给它一个“ lambda”,用作仅计算满足该条件的数组元素的条件。在这种情况下使用的“条件”不是有效条件,但在这里并不重要,因为它不会导致错误,并且不需要返回值count


7
我喜欢您在其中截取代码屏幕快照的各种情况
。– urous

11

出租车,488字节

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Equal's Corner.Pickup a passenger going to Equal's Corner.Go to Equal's Corner:n 1 l 1 l 1 l.Switch to plan "b" if no one is waiting.'1' is waiting at Writer's Depot.[b]'0' is waiting at Writer's Depot.Go to Writer's Depot:n 1 l 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.

在线尝试!

取消高尔夫:

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Equal's Corner.
Pickup a passenger going to Equal's Corner.
Go to Equal's Corner: north 1st left 1st left 1st left.
Switch to plan "b" if no one is waiting.
'1' is waiting at Writer's Depot.
[b]
'0' is waiting at Writer's Depot.
Go to Writer's Depot: north 1st left 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.

出租车(相对)非常适合此挑战,因为字符串是允许的唯一输入或输出类型。The Babelfishery是将字符串转换为数字(反之亦然)的方法,它处理剥离所有空格和前导零的问题。如果-紧接在第一个数字之前,它还将处理负数。之后,Equal's Corner将两个值相互检查,并Writer's Depot以字符串格式提供输出。输出是1为真和0为假。


1
好东西!出于好奇,调试窗口为什么显示此消息error: The boss couldn't find your taxi in the garage. You're fired!
查理

6
完成路线后,@ Charlie Taxi要求您开车回到出租车车库。如果不把汽车带回来,就会被解雇。(您还必须确保时不时停止加油,否则您将用尽汽油。)在不允许禁止向STDERR输出的代码高尔夫球问题中,我通常不必担心被解雇。如果您不想丢掉工作,可以添加此命令来消除错误:Go to Taxi Garage:n 1 r 1 l 1 r.
Engineer Toast

这个答案及其评论是完全超现实的。我爱这个社区。
右腿

@RightLeg我编写的最喜欢的出租车程序花了我两个星期的时间,并且进行了大量调试。您是否真的想旅行?看看莎士比亚
Engineer Toast

10

C(gcc),27个字节

f(s,t){s=atoi(s)==atoi(t);}

使用-O0(这是默认设置)。

在线尝试!

C,32个字节

f(s,t){return atoi(s)==atoi(t);}

在线尝试!


2
@Charlie在C中,字符串是的数组char,当您将数组传递给函数时,实际上只是将指针传递给数组的第一个元素。此处,指向char数组的指针在传递给函数时隐式转换为整数,而在调用时将整数转换回指针atoi
Steadybox

1
这可能会在指针比int宽的平台上可怕地爆炸……只是说,这当然适用于此处的站点标准:)
Felix Palmen

2
如果要使用像这样的荒谬废话s=foo;,则return foo;需要将其标记为“禁用优化的x86 gcc”,而不仅仅是“ C”,因为该代码除了作为实现伪像外,不会返回任何值。
彼得·科德斯

2
我去看看是否有任何架构s=retval;而不是return retval;实际崩溃。看起来gcc的内部逻辑(-O0仅含)实际上将最后一个表达式视为返回值,这可能与GNU C语句表达式的工作方式相同。(但确实需要s=)。在ARM32上,它计算中的==结果r3,然后使用一个额外mov r0, r3的值作为返回值!因此,它不是特定于x86的hack,而是gcc -O0gcc似乎无法提供支持的hack。
彼得·科德斯

2
@ KenY-N您错过了C代码高尔夫的全部内容。这是关于查找特定的hacky边缘案例,在这些案例中您可以输入最少的代码并获得所需的结果,而不是提供可移植的体验。

8

J,4个字节

=&do

评估=后比较。也可以在线尝试!&do=&".


有趣的是,这对否定词既有效,因为其他语言也可以理解它们(例如-10),也可以_10由于单子的-工作方式而使J可以理解否定词(例如)。
科尔

6

视网膜,11字节

.+
$*
D`
¶$

在线尝试!

输入是用换行符分隔的,但是为了方便起见,测试套件使用逗号分隔。1为平等和0不平等而打印。

说明

.+
$*

将每一行转换为一元。这将忽略前导零和空格。

D`

重复数据删除:如果两者相同,请清除第二行。

¶$

检查字符串现在是否以换行结尾。




3

三角形,17个字节

..)..
.Ii).
@Ii=.

在线尝试!

三角关系是一次竞争!

怎么运行的

三角性要求代码具有点的三角形分布。也就是说,每行的长度必须等于行数乘以2并递减,并且每行(在每一侧上)必须具有等于其在程序中位置的点数(最底行是第0行,上方的是第1行,依此类推)。记住这一点,让我们分析代码的工作方式:

..).. || Push a 0 onto the stack.
.Ii   || Get the 0th input and cast it to an integer.
   ). || Push another 0 onto the stack.
@I    || Increment the ToS => 1. Get the first input.
  i=. || Then cast it to an integer and compare their equality.

3

爱丽丝,7个字节

X/n
o@i

在线尝试!

任何非数字分隔符均可使用。打印1是否相等0

说明

X   XOR, does nothing.
/   Switch to Ordinal mode.
i   Read all input as a string.
/   Switch to Cardinal mode.
X   XOR. Implicitly finds all integers in the string and pushes them separately
    onto the stack. The XOR gives 0 if the values are identical.
n   Logical NOT. Gives 1 for equal inputs and 9 otherwise.
/   Switch to Ordinal.
o   Print the 0 or 1 as a string.
/   Switch to Cardinal.
@   Terminate the program.



3

jq,24个字符

map(tonumber)|.[0]==.[1]

2个字符串作为数组的项目传递。

样品运行:

bash-4.4$ jq 'map(tonumber)|.[0]==.[1]' <<< '["0010001 ", " 10001  "]'
true

bash-4.4$ jq 'map(tonumber)|.[0]==.[1]' <<< '["0010000", "  10  "]'
false

在线尝试!所有测试用例



3

PowerShell,20字节

param($a,$b)+$a-eq$b

与JavaScript答案类似,只是更长一点,因为PowerShell不会出现流动。用于+将第一个字符串转换为整数,然后-equals自动将第二个字符串转换为整数。输出为真/假。

在线尝试!


3

Powershell,19个字节

$args-join'-eq'|iex

在线尝试!

-join参数数组($args)与比较运算符(的字符串表示-eq),然后评估该表达Invoke-Expressioniex)。


有趣。我想知道如何在不强制转换为整数的情况下获得成功,但是如果删除,我的方法就会中断,+因为它正在执行字符串相等性检查。
AdmBorkBork

@AdmBorkBork,因为我本质上是在生成PowerShell代码,然后执行它,并且由于前导零和前导/尾随空格对于解释器而言无关紧要,因此它“可以正常工作”。如果两个数字为00009 077 则结果代码为00009 -eq077 ,这是一段完全有效的代码。您是在运行时直接处理字符串,因此必须首先将其强制转换,以便对数字进行操作。
briantist

对,是的,这很有意义。感谢您的解释。
AdmBorkBork

3

Q(Kdb +),13个字节

=/["J"$(x;y)]

说明

[x; y):两个输入的列表。

“ J” $:将每个输入从字符串(10c)强制转换为long(7j)类型,该字符串可以正确解释
空格和前导0。

= /:检查列表中的元素是否相等(每个后续对)。
由于只有一对,因此返回一个布尔值0b / 1b。


欢迎来到PPCG!通常,希望获得指向在线解释器/编译器的链接,如果不清楚的话,也可以进行解释。
FantaC

谢谢!在此处添加说明。我怀疑是否存在用于q的在线解释器,我快速浏览了一下却找不到。
悉尼,

我会说,这应写为包括大括号,即拉姆达{=/["J"$(x;y)]}15个字节 ......虽然8个字节你可以有这样的:(~/)"J"$如果你只是使用REPL并通过输入作为一个字符串列表.. 。或{(~/)"J"$x}对于11为函数。
streetster

3

T-SQL,35个字节

根据我们的标准,数据是通过预先存在的t带有varchar字段a和的表格输入的b

    SELECT IIF(ABS(a)=ABS(b),1,0)FROM t

1如果匹配0则返回,如果不匹配则返回。

几个SQL的数学函数(包括ABSFLOORCEILING)将进行隐式转换为数字,如果给定的字符串参数,这是不是一个明确的短CAST(a AS INT)或者CONVERT(INT,b)在这种情况下,和作品,因为我们知道输入值始终为正。

IIF 特定于MS SQL 2012及更高版本,因此无法保证其他实现。


3

Excel VBA,27 16字节

-9感谢@Nayrb和@TaylorScott

[C1]=[A1]-[B1]=0

您在其中输入值的单元格的位置 'string

其中xy是输入字符串,z是布尔输出。

如果CInt(x)= CInt(y)则z = 1

使用CInt


1
为什么不这样:z = xy = 0?
内尔布(Nayrb)'18年

不幸的是,该解决方案无效,因为它不接受输入,而是依赖于具有预定义的值(已被视为违反社区规则)并输出到变量(也违反了社区规则
Taylor Scott

作为一个有效的解决方案可能是一个VBE即时窗口函数如 ?[Int(A1)=Int(B1)]这需要从范围输入A1B1,并输出到VBE即时窗口
泰勒斯科特




2

Gema,21个字符

*\n*=@cmpn{*;*;0;1;0}

Gema中没有布尔值。由于@get-switch{}/ @set-switch{}函数使用0和1表示开关状态,还使用0和1。

2个字符串在单独的输入行上传递。

样品运行:

bash-4.4$ gema '*\n*=@cmpn{*;*;0;1;0}' <<< $'0010001\n10001  '
1

bash-4.4$ gema '*\n*=@cmpn{*;*;0;1;0}' <<< $'0010000\n  10  '
0



2

附件,11个字节

Same@Map&:N

在线尝试!

这需要一个字符串数组,例如V["0001", "1 "]。简单地说,Map&:N是一个映射N其参数并Same检查数组仅包含相等成员的函数。(有趣的事实:此函数可用于2个以上的字符串参数。)


2

SNOBOL4(CSNOBOL4),42个字节

	OUTPUT =EQ(EVAL(INPUT),EVAL(INPUT)) 1
END

在线尝试!

输出1为真,否为假。由于(space)是SNOBOL中的级联运算符,因此EVAL对带有前导/尾随空格的数字本身会产生数字,并且它还会巧妙地处理任何前导零。EQ测试数值相等性,有条件地将设置OUTPUT为1 Success


2

Sinclair ZX81 / Timex TS1000 / 1500 BASIC,〜29个标记化BASIC字节

感谢Neil(感谢小费)的新解决方案。

 1 INPUT A$
 2 INPUT B$
 3 PRINT VAL A$=VAL B$

此解决方案需要用户输入,因此请输入两个带有空格和/或前导零的字符串,或者输入两个不等于数字的字符串;0为假,1一旦第三行比较了输入的每个字符串的值,则为true。

旧解决方案:Sinclair ZX81 / Timex TS1000 / 1500 BASIC,〜46个标记化BASIC字节

 1 LET A$=" 001 "
 2 LET B$="1"
 3 PRINT (VAL A$=VAL B$)

实际的检查是在第三行完成的,该行只有〜16个标记化的BASIC字节;因此,使用直接模式输入每个测试用例对将节省清单中的〜30个字节。请注意,此字节计数不包含var stack


1
您不应该使用INPUT A$INPUT B$吗?另外,我认为您不需要()s。
尼尔

是的,我也可以使用它-我只想要一个概念证明
Shaun Bebbers

2

APL(NARS2000),7个字节

=⍥⍎

好吧,是的,我确实知道NARS2000在这里无法与Dyalog竞争,因为它使用Unicode,但是我想炫耀(尽管实际上与函数组合无关,但在NARS2000中称为Composition),但Dyalog却没有具有内置功能,我从未见过在这里使用过。在Dyalog中,必须将其实现为{(⍵⍵⍺)⍺⍺⍵⍵ ⍵}。它的作用是在left和right参数上都调用right操作数monadic函数,然后在结果上调用left操作数二元函数。

在此,右操作数为Execute,即eval),左操作数为=Equal To,即检查其参数是否相等)。


合成和执行应该渲染为空白吗?
John Dvorak

@JohnDvorak嗯,不是吗?它们不是空格,第二个字符是U + 2365 APL功能符号循环显示,而第三个字符是U + 234E APL功能符号向下标记。
暴民埃里克(Erik the Outgolfer)

@JohnDvorak无论您使用的是哪种字体,都可能没有这些代码点的符号。
Οurous

@ourous我也非常怀疑这种情况,但是如果您使用的是更新良好的软件,则查看此类字符应该没有任何问题。
暴民埃里克(Erik the Outgolfer)'18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.