7 l8r比9好吗?(七点比九点晚吗?)


10

这是一个相当简单的高尔夫代码挑战。给定一个ASCII字符串,您的程序将把该字符串解析为两个字符串,它将对其求值。如果第二个字符串比第一个字符串“晚”,则将返回1;如果比第一个字符串“早”,则将返回-1;如果相同,则将返回0。弄清楚“稍后”和“更早”的含义,让我们看一下ASCII字符代码。您需要比较字符串中的每个字符,将每个字符视为一个数字。后来是指较大的数字,出现在较小的数字之后。字符串将使用连字符格式化,以分隔两个输入组。

看一下这个例子:

7-9作为输入应该返回1

7转换为ASCII代码55,然后9转换为ASCII代码57

57数字后所示559晚于7

另一个例子:

LKzb-LKaj 作为输入应该返回 -1

为此的ASCII代码序列是76-75-122-9876-75-97-106

这是一场高尔夫挑战赛,字节计数是对参赛作品进行评分的方式。

可以接受来自95个可打印ASCII字符的任何输入,但空格和连字符除外,除了分隔输入之外,都可以使用连字符。另外,不能保证字符串的长度相同。

祝好运!

编辑:更清楚地说,每个字符将被视为数字中的数字。在这个例子中LKzb-LKaj,虽然j是迟bz迟于a,并且由于它是一个更显著的数字,它的优先级。提供的字符串将始终至少包含3个字符,从而从此问题的范围中消除了空字符串。

编辑:这是一些更多的测试用例,为您提供帮助:

  • A-9 -> -1
  • 11-Z -> -1
  • 3h~J*-3h~J* -> 0
  • Xv-Y0 -> 1

1
两个字符串的长度保证相同吗?
es1024 2015年

5
考虑到问题的当前措辞,测试用例11-Z-> -1没有任何意义。Z(90)大于1(49),并且是最高有效字母。请说明如何比较不同长度的字符串。
乔治·里斯

2
那又如何A-AA呢?

2
@SamWeaver我知道最左边的数字是最高位,因此我对为什么11>Z在您的示例中为什么感到困惑1<Z。必须使用一些不确定的行为来处理不同长度的字符串,否则该示例是错误的。
乔治·里斯

3
如前所述:每个字符串都应被视为以127为基数的数字。如果要在此系统中进行计数,则将从一个字符开始,将其增加到可打印字符的障碍,~在126,然后将下一位数字加1,将起始数字返回!。最显著的数字每增加相当于提高127递增第二最显著位
山姆·韦弗

Answers:


11

Pyth-11个字节

容易,使用._sign来获取符号并C获取字符码。

._-F_CMcz\-

在这里在线尝试

测试套件

._               Sign of number
 -F              Fold subtraction (this finds difference of a tuple)
  _              Reverse list to get correct order of operands when subtracting
   CM            Map char, already treats strings as digits of base256 number
    c \-         Split by "-"
     z           Input

非常好!执行预期。
山姆·韦弗2015年

7

CJam,12个字节

l'-/esfb~\-g

CJam解释器中在线尝试。

怎么运行的

l   e# Read a line from STDIN.
'-/ e# Split it at spaces.
es  e# Push the current time (milliseconds since epoch).
fb  e# Consider each string as digits in base huge-number.
~\  e# Dump the results and reverse their order.
-g  e# Subtract and apply sign function.

优秀的!这将通过所有测试用例。
山姆·韦弗2015年

6

爪哇,86 118

int f(String...s){return(int)Math.signum((s=s[0].split("-"))[1].compareTo(s[0])*(s[0].length()==s[1].length()?1:-1));}  

比较字符串的一种非常奇怪的方式。进行了快速修复,使其通过了其他测试用例,以后将寻求更多的高尔夫体验。

感谢Vartan的signum建议


反正Java的比较不会返回1,0,-1吗?我知道不能保证,但是有没有这种情况?在这种情况下return s[0].compareTo(s[1]);
Vartan 2015年

这是好的,但它不通过的测试用例11-Z返回-1,返回1
山姆·韦弗

啊,在添加这些测试用例之前,我不清楚。固定。
Geobits,2015年

@Vartan否,它将返回第一个不匹配位置的值差(如果有一个和所有字符都匹配,则返回长度差)。例如,"A".compareTo("Z") return-25不幸。
Geobits

你能解释一下这句话吗?i = a!=b ? b-a : s[1].compareTo(s[0]);我似乎不明白...而且,您也许可以使用Math.signum并保存自己来声明i;
Vartan

4

Perl,31个字节

#!/usr/bin/perl -p
/-/;$_=($`.$'^$`)cmp($'.$`^$')

30个字节+ 1个字节(用于)-p。接受STDIN上的输入。

说明

当操作数cmp具有不同的长度(如chicken和)时egg,它们的对齐方式如下:

c  h  i  c  k  e  n
e  g  g  \0 \0 \0 \0

因此egg> chicken\0是一个空字节)。但是我们希望它们像这样对齐:

c  h  i  c  k  e  n
\0 \0 \0 \0 e  g  g

这样chicken> egg

为此,我们将它们连接在一起,一次用chickenbefore egg和一次用eggbefore chicken

c  h  i  c  k  e  n  e  g  g
e  g  g  c  h  i  c  k  e  n

现在我们的两个字符串长度相同,我们使用XOR删除前导词以得到:

\0 \0 \0 \0 \0 \0 \0 e  g  g
\0 \0 \0 c  h  i  c  k  e  n

现在,我们可以利用cmp查找哪一个先。(在那里,我说了!)


非常聪明-太棒了!
山姆·韦弗

3

Python 2,88个字符

a=raw_input().split('-');print-cmp(*(map(ord,s.rjust(max(map(len,a)),'\0'))for s in a))

cmp当您使用两个不同长度的字符串时,它做不正确的事情,因此我必须用空字符(ord将其转换为0)填充它们,以处理这种情况。不幸的是,这增加了大约35个字符,加上现在是两行而不是一行,因为我既需要输入的长度,又需要遍历输入的长度。


不幸的是,这不是有效的解决方案。下面的测试案例:1-2,这应该返回1的回报-1。聪明的工作。
山姆·韦弗2015年

糟糕,操作数似乎已交换。太奇怪了,我用您的几个测试用例进行了测试,我认为它很好用!没关系,我可以更改它而无需更改字符数。现在试一试。
Alex Van Liew

您的编辑确实解决了这种情况,但是现在使这种11-A情况失败了,该情况应该返回-1,而不是1在此示例中返回。
山姆·韦弗2015年

我不喜欢你的篇幅。我以大约35个字符的价格修复了该问题,但我认为我无法使其更好。
Alex Van Liew,2015年

1
通过将字符串编码为十六进制格式,然后将该字符串解析为int,我设法得到了比您短的答案。在python 2中,似乎默认使用big-endianness。因此,不再需要0填充。
沙丘

2

R,54字节

这需要实用库。它在上分割输入字符串-。右对齐字符串。对它们进行排名并进行比较。

因此,对于11-7,我们最终得到字符串“ 11”和“ 7”。这些的等级是[2,1]。差是-1。对于3h〜J * -3h〜J *,我们得到“ 3h〜J *”和“ 3h〜J *”。它们的等级为[1.5,1.5],差异为0。

diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))

测试例

> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: LKzb-LKaj
3: 
Read 2 items
[1] -1
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: A-9
3: 
Read 2 items
[1] -1
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: 11-Z
3: 
Read 2 items
[1] -1
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: 3h~J*-3h~J*
3: 
Read 2 items
[1] 0
> diff(rank(pracma::strjust(scan(,'',sep='-'),"right")))
1: Xv-Y0
3: 
Read 2 items
[1] 1

聪明。做得好:)
Alex A.

2

的CoffeeScript,143 140 139

f=(s)->[a,b]=((t=s.split '-').map (y)->Array((m=Math.max) 1, 1+(m ((l=(c)->c.length) t[0]),l t[1])-l y).join('\u0000')+y);`b<a?-1:(b>a?1:0)`

是一个带有结果的jsfiddle(在控制台中查看)


2

PERL,46 36字节

print$2cmp$1if"@ARGV"=~/(\S+)-(\S+)/

将argv列表转换为字符串,由连字符分隔为左右两侧无空格arg,然后返回cmp调用。


我怀疑您可以摆脱一些空格和空格;
MickyT

应该能够摆脱:("@ARGV"=~/-/;print$`cmp$' 未经测试)
Jarmex 2015年

1
使用的好主意cmp,但是当字符串长度不同时,它不起作用。即使两个输入都应为该质询返回相同的值,"A" cmp "9"则为1而"11" cmp "Z"为-1。
ThisSuitIsBlackNot

1

Python 3,84个字节

x,y=[int.from_bytes(i.encode(),"big")for i in input().split("-")];print((x<y)-(y<x))

用分割输入的字符串"-"。将unicode字符串转换为字节字符串,然后将这些字节字符串解释为big-endian整数。最后进行比较-(不幸的cmp是)在Python 3中不再可用。

Python 2,69个字节

print -cmp(*[int(i.encode("hex"),16)for i in raw_input().split("-")]) 

您可以通过删除之间的空间剃去一个字符printcmp
Alex Van Liew

1

Python 2,79字节

非常简单的解决方案,而且很容易理解。比较字符串长度,然后从字法上比较字符串。

在这里尝试

s,t=raw_input().split('-')
x,y=len(s),len(t)
print(x<y)*2-1if x-y else cmp(t,s)

1

perl5、64

perl -aF- -pe '@f=map{length}@F;$_=$f[1]<=>$f[0]||$F[1]cmp$F[0]'

只需从命令行运行即可。虽然换行看起来会更好,但要花1个字符。

perl -laF- -pe '@f=map{length}@F;$_=$f[1]<=>$f[0]||$F[1]cmp$F[0]'

此较长的版本可以正确处理不匹配的长度。


/-/,$_=$`cmp$'会更容易,您可以略过-aF-一点。另外,我将其计算为20(对于$_=$F[1]cmp$F[0],分别为16 和4 paF-,分别保存到文件中并以方式运行perl -paF- file.pl)。
2015年

1
正如我在Eric的答案中所指出的那样,cmp当两个字符串的长度不同时(例如使用),将不起作用11-Z
ThisSuitIsBlackNot 2015年

@ThisSuitIsBlackNot,已修复。
hildred

真好 您可以使用/-/;$_=length$'<=>length$`||$' cmp$`和降低至39 -p。($`在正则表达式匹配之前$'存储所有内容,在之后存储所有内容。)使用map实际上花费的字节数比仅调用length两次要多。
ThisSuitIsBlackNot

0

F#,53

fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a

这是匿名函数(lambda)的形式,因此您必须粘贴它并在is之后直接提供参数(或使用管道符号)。例如(在FSI中):

> "7-9" |> fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a
1
> "abc-abc" |> fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a
0
> "LKzb-LKaj" |> fun s->let[|a;b|]=s="";s.Split[|'-'|]in b.CompareTo a
-1

0

JavaScript ES6,46 43字节

f=s=>((a=s.split('-'))[1]>a[0])-(a[1]<a[0])

做得很好,但这不能完成测试用例2:11-Z应该返回-1但返回1
山姆·韦弗

1
@SamWeaver确实,这是在答案之后添加的,并且还会破坏其他答案。您能否解释为什么'11'>'Z''11'<'ZZ'关于如何比较不同长度的字符串或空字符串具有什么值的问题中什么都没有的时候。
乔治·里斯

问题的意图从未改变,我只添加了这些测试用例和说明,因为我意识到我一开始还不够清楚。没错,我从未定义空字符串的值,因此我将相应地更新问题。这些测试用例并没有改变问题的行为或目标,只是对其进行了澄清。您命名的示例之所以具有这样的功能,是因为每个字符必须被视为数字中的一个单独的“数字”,其基数等于所有可打印的ASCII字符。这个问题的机制从未改变,只是变得更加清晰。
山姆·韦弗

1
@SamWeaver从未定义行为更改为已定义行为会更改它。没有什么不是角色。除非它是null字符,否则它将处理。
乔治·瑞斯

0

Ruby,59个字节

a,b=gets.chomp.split ?-
p (b.size<=>a.size).nonzero?||b<=>a

0

05AB1E12 11 9 字节

'-¡₄ö¥0.S

在线尝试验证所有测试用例

说明:

'-¡          # Split the (implicit) input on '-'
             #  i.e. 'LKzb-LKaj' → ['LKzb','LKaj']
   ₄ö        # Convert both parts to a Base-1000 number
             #  i.e. ['LKzb','LKaj'] → [21020061037,21020036045]
     ¥       # Push the deltas (subtraction between each sub sequential pair) of the list
             #  i.e. [21020061037,21020036045] → [-24992]
      0.S    # Get the sign [1 for a>0; -1 for a<0; 0 for a==0] (and output implicitly)
             #  i.e. [-24992] → [-1]
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.