Neredeyse Sözlük Listesi Karşılaştırma


9

Giriş

İki liste Ave Bnegatif olmayan tamsayılar.

Çıktı

Ya 1, 0ya da -1, bağlı olarak Adaha büyük olan, e eşit ya da daha küçük Bgöre bükülmüş lexicographical sipariş aşağıda tanımlandığı gibidir. İsterseniz 1, 0ve -1diğer üç sabit değeri değiştirebilirsiniz.

Bükümlü sözlükbilimsel sıralama sıradan sözlükbilimsel düzen gibidir, çünkü listeler öğesini öğeye göre karşılaştırır ve sıralarına ilk farklı dizinde karar verirsiniz. Bununla birlikte, bükülmüş versiyonda, her bir dizinde negatif olmayan tamsayılar için farklı bir sıralama kullanıyoruz. Yani, her indekste i(indeksleme başlar 1), ilk inegatif olmayan tamsayıların ( 0ila i-1)) sırası tersine çevrilir ve diğer tüm sayıların üzerine taşınır. Ayrıca, bir listenin diğerinden daha kısa olduğunu gösteren "eksik öğe" doğrudan aşağıya taşınır i-1. Görsel olarak, endeksinde sipariş iolduğunu

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

Birincisinin ...sonsuz sayıda rakam olduğunu unutmayın. Bu, aşağıdaki listelerin bükülmüş sözlükbilimsel sıralamaya göre artan sırada olduğu anlamına gelir:

[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]

kurallar

Tam bir program veya işlev verebilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklara izin verilmez.

Test Durumları

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]

Giriş listeleri 0'dan, 1'den mi, yoksa dilimiz için hangisinden uygunsa dizine ekleniyor mu?
Peter Taylor

@PeterTaylor 1'den. Bunu netleştireceğim.
Zgarb

Çıktı için -1/0/1 yerine karşılaştırma sonuçları için Haskell'in kendi numaralandırmasını kullanabilir miyim?
John Dvorak

@JanDvorak Buna izin vereceğim ve mücadeleyi düzenleyeceğim.
Zgarb

Yanıtlar:


1

CJam - 57

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

Evet, hala çok uzun ...

Çevrimiçi deneyin

Kısa açıklama:
Diziler geleneksel anlamda eşitse kod 0 verir, aksi takdirde her dizinin her bir öğesini 2 elemanlı bir diziye dönüştürür: [0 a i ] bir i > i (0 tabanlı), [1 ne olursa olsun] bir i eksikse ve [2 -a i ] bir i <= i ise. İşlemde, daha kısa dizi de daha büyük boyuta genişletilir. Daha sonra dönüştürülmüş diziler sözlükbilimsel olarak karşılaştırılır ve sonuç -1 / 1'e ayarlanır.


3

Python 2, 76 bayt

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

Bu, her iki listedeki her tamsayıyı, bükülmüş sıralamayı hesaba katmak için 2 demet ile değiştirir. cmpGerisini Python 2'nin yerleşik yapısı yapıyor.

Kullanımı:

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

1
Bu, daha uzun farklı listeler arasında daha kısa bir liste için nasıl hesap verir ( [3,2,3,1341] < [3,2,3] < [3,2,3,0]?
nutki

@nutki bu başlığın ekler (0,)herhangi birinden daha büyük olan her liste, sonuna (-1, x)daha az (i-x, x)zaman i-x >= 0.
grc

Oo elbette. Python'da okuryazar değilim.
nutki

1

Perl, 74

İyi dizi manipülasyon fonksiyonları olmadan perl iş için en uygun araç değildir, ancak çalışır.

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

Test et beni .


1

J, 95 bayt

(Süper kısa değil ama her neyse. Kesinlikle golf oynayabilir.)

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

Tüm test senaryolarını geçmek. (Harika test çantası seti! Teşekkürler!)

Yöntem:

  • Daha kısa listenin maksval + 1 ( m=.>:>./x,y) ile doldurulması .(],m$~>&#*-&#
  • Liste öğelerini normal karşılaştırma kullanılabilecek şekilde dönüştürme. (|+(1+m)*0>:*)@(i.@#-~])
  • İki listeden iki baseX sayısının yeterli X ile hesaplanması. ((m+#x,y)&#.)
  • İki sayı farkının işaretini döndürme.*@-&

0

Mathematica, 65

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

Kullanımı:

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

-1

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.