ほとんど辞書式リストの比較


9

入力

2つのリストAB非負の整数。

出力

いずれか10または-1、かどうかに応じAに等しい、より大きい、またはより小さいBに対してねじれた辞書式順序付けの下に定義した通りです。必要に応じて10および-1を他の3つの定数値に置き換えることができます。

ツイスト辞書編集順序は、リストを要素ごとに比較し、最初の異なるインデックスでそれらの順序を決定するという点で、通常の辞書編集順序に似ています。ただし、ツイストバージョンでは、インデックスごとに非負の整数に異なる順序を使用します。すなわち、すべてのインデックスでi(インデキシングから始まる1)、第一のオーダーi(より負でない整数0にはi-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、または私たちの言語に適した方からインデックスが付けられていますか?
Peter Taylor、

@PeterTaylor 1から。これを明確にします。
Zgarb 2015

出力に-1/0/1の代わりにHaskell独自の列挙型を比較結果に使用できますか?
John Dvorak

@JanDvorak許可し、チャレンジを編集します。
Zgarb 2015

回答:


1

CJam-57

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

ええ、まだとても長いです...

オンラインでお試しください

簡単な説明:
配列が従来の意味で等しい場合、コードは0を出力します。それ以外の場合は、各配列の各項目を2要素配列に変換します:[0 a i ] if a i > i(0-based)、[1何でも)a iが欠落している場合、そして[2 -a i ] 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,)各リストの末尾にタプルを追加します。これは、anyよりも大きく(-1, x)(i-x, x)when よりも小さくなりi-x >= 0ます。
grc

はいもちろん。私は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を持つ2つのリストから2つのbaseX数を計算します。 ((m+#x,y)&#.)
  • 2つの数値の差の符号を返します。*@-&

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.