几乎词典列表比较


9

输入项

两个列表AB非负整数。

输出量

任一10-1根据是否A大于,等于或小于B相对于所述扭曲词典式排序如下文所定义。如果需要,可以将10和替换-1为任何其他三个常数值。

扭曲的字典顺序与普通的字典顺序类似,在于您逐个元素比较列表,并在第一个不同的索引处确定列表的顺序。但是,在扭曲版本中,对于每个索引,我们对非负整数使用不同的排序。即,在每个索引处i(索引从处开始1),第一个i非负整数(从0i-1)的顺序被颠倒,并且它们移至所有其他数字的上方。此外,表示一个列表比另一个列表短的“缺失元素”直接移到下面i-1。视觉上,索引的顺序i

i < i+1 < i+2 < i+3 < ... < [missing element] < i-1 < i-2 < i-3 < ... < 2 < 1 < 0

请注意,第一个...表示无限多个数字。这意味着以下列表相对于扭曲的字典顺序而言按升序排列:

[3,2,3,4]
[3,2,3,5]
[3,2,3,10]
[3,2,3,1341]
[3,2,3]
[3,2,3,3]
[3,2,3,2]
[3,2,3,1]
[3,2,3,0]

规则

您可以提供完整的程序或功能。最低字节数获胜,并且不允许出现标准漏洞。

测试用例

Output 1:
[0] []
[] [1]
[] [1,2,1,2]
[2,1] [1,1]
[0,1,2] [0,2,1]
[3,0] [3,1]
[3,1] [3]
[2] [2,2]
[2] [2,23]
[2,24] [2,23]
[2,1] [2,23]

Output 0:
[] []
[0] [0]
[1,1] [1,1]
[2,1,2] [2,1,2]

Output -1:
[1,2,1,1,2] [1,2,1,1,1]
[1,2,1,1,5] [1,2,1,1,4]
[1,2,1,1,5] [1,2,1,1]
[1,2,1] [1,2,1,1]
[1,2,1,1,5] [1,2,1,1,6]
[1,2,1,1,6] [1,2,1,1,7]

输入列表是从0,从1还是从适合我们语言的任何一个开始索引的?
彼得·泰勒

@PeterTaylor来自1.我将进行澄清。
Zgarb 2015年

我可以使用Haskell自己的枚举作为比较结果而不是-1/0/1作为输出吗?
约翰·德沃夏克

@JanDvorak我会允许的,并编辑挑战。
Zgarb 2015年

Answers:


1

果酱-57

q:S~=0{S~]:A:,~e>{A{_,I>{I=_I>0{W*2}?}1?[\]}%}fI]z~>2*(}?

是的,还很长...

在线尝试

简要说明:
如果在传统意义上数组相等,则代码输出0,否则它将每个数组的每个项目转换为2元素数组:[0 a i ]如果i > i(基于0),[1无论如何,如果i缺失,则为[2-a i ],如果i <= i。在此过程中,较短的数组也将扩展为较大的大小。然后按字典顺序比较转换后的数组,并将结果调整为-1/1。


3

Python 2,76个字节

c=lambda*a:cmp(*[[(max(i-x,-1),x)for i,x in enumerate(L)]+[(0,)]for L in a])

这将两个列表中的每个整数替换为2元组,以说明扭曲的顺序。cmp其余部分由Python 2的内置函数完成。

用法:

>>> c([1,2,1,1,6], [1,2,1,1,7])
-1

1
如何计算较短的列表在不同的较长列表之间的位置([3,2,3,1341] < [3,2,3] < [3,2,3,0]
nutki

@nutki它将元组添加(0,)到每个列表的末尾,该列表大于任何一个(-1, x),小于小于(i-x, x)when i-x >= 0
grc 2015年

哦当然了 我不懂Python。
nutki

1

Perl,74岁

如果没有良好的数组操作功能,perl并不是完成这项工作的最佳工具,但是它会起作用。

#!perl -pa
$i=0,s/\d+,?/$s=sprintf"%9d",$&;$&>$i++?$s:~$s/ge for@F;$_=$F[0]cmp$F[1]

测试


1

J,95个字节

(不是超短的,而是任何东西。绝对是高尔夫球场。)

f=.4 :0
m=.>:>./x,y
t=.(|+(1+m)*0>:*)@(i.@#-~])@(],m$~>&#*-&#)
x(t~(*@-&((m+#x,y)&#.))t)y
)

通过所有测试用例。(很棒的测试用例集!谢谢!)

方法:

  • 用maxvalue + 1(m=.>:>./x,y)填充较短的列表。(],m$~>&#*-&#
  • 转换列表元素,以便可以使用常规比较。 (|+(1+m)*0>:*)@(i.@#-~])
  • 从两个具有足够X的列表中计算两个baseX数字。 ((m+#x,y)&#.)
  • 返回两个数字的和。*@-&

0

Mathematica,65岁

f=-Order@@MapIndexed[If[#>Last@#2,#,a-b#]&,PadRight[{##}+1],{2}]&

用法:

f[{1, 2, 1, 1, 6}, {1, 2, 1, 1, 7}]

-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.