Confronto di elenchi quasi lessicografici


9

Ingresso

Due elenchi Ae Bnumeri interi non negativi.

Produzione

O 1, 0oppure -1, a seconda che Asia maggiore di, uguale o inferiore Brispetto all'ordinamento lessicografico contorto come definito di seguito. Se si desidera, è possibile sostituire 1, 0e -1con tutti gli altri tre valori costanti.

L'ordinamento lessicografico contorto è come l'ordinamento lessicografico ordinario, in quanto si confrontano gli elenchi elemento per elemento e si decide il loro ordine al primo indice diverso. Tuttavia, nella versione contorta utilizziamo un diverso ordinamento per numeri interi non negativi in ​​ciascun indice. Vale a dire, ad ogni indice i(l'indicizzazione inizia da 1), l'ordine dei primi inumeri interi non negativi (da 0a i-1) viene invertito e vengono spostati sopra tutti gli altri numeri. Inoltre, l '"elemento mancante" che indica che un elenco è più corto dell'altro viene spostato direttamente sotto i-1. Visivamente, l'ordine all'indice iè

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

Si noti che il primo ...indica infiniti numeri. Ciò significa che i seguenti elenchi sono in ordine crescente rispetto all'ordinamento lessicografico contorto:

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

Regole

Puoi dare un programma completo o una funzione. Vince il conteggio di byte più basso e non sono consentite scappatoie standard.

Casi test

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]

Gli elenchi di input sono indicizzati da 0, da 1 o da qualunque sia appropriato per la nostra lingua?
Peter Taylor,

@PeterTaylor Da 1. Chiarirò questo.
Zgarb,

Posso usare l'enum di Haskell per i risultati del confronto invece di -1/0/1 per l'output?
John Dvorak,

@JanDvorak Lo permetterò e modificherò la sfida.
Zgarb,

Risposte:


1

CJam - 57

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

Sì, è ancora molto lungo ...

Provalo online

Breve spiegazione:
il codice genera 0 se gli array sono uguali in senso tradizionale, altrimenti converte ogni elemento di ciascun array in un array di 2 elementi: [0 a i ] se a i > i (basato su 0), [1 comunque] se manca un i , e [2 -a i ] se un i <= i. Nel processo, l'array più corto viene esteso anche alle dimensioni maggiori. Quindi le matrici trasformate vengono confrontate lessicograficamente e il risultato viene regolato su -1/1.


3

Python 2, 76 byte

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

Questo sostituisce ogni numero intero in entrambe le liste con una 2 tupla per tenere conto dell'ordinamento contorto. Il cmpbuiltin di Python 2 fa il resto.

Uso:

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

1
In che modo questo rappresenta un elenco più breve tra diversi elenchi più lunghi ( [3,2,3,1341] < [3,2,3] < [3,2,3,0]?
nutki,

@nutki aggiunge la tupla (0,)alla fine di ogni elenco, che è maggiore di qualsiasi (-1, x)e minore di (i-x, x)quando i-x >= 0.
grc,

Oh, certo. Non sono esperto di Python.
nutki,

1

Perl, 74

Senza buone funzioni di manipolazione dell'array perl non è lo strumento ottimale per il lavoro, ma funziona.

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

Metti alla prova me .


1

J, 95 byte

(Non super corto ma comunque. Sicuramente golfabile.)

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

Passando tutti i casi di test. (Ottimo set di test! Grazie!)

Metodo:

  • Riempi l'elenco più breve con il valore massimo + 1 ( m=.>:>./x,y).(],m$~>&#*-&#
  • Trasformando gli elementi dell'elenco in modo da poter utilizzare il confronto normale. (|+(1+m)*0>:*)@(i.@#-~])
  • Calcolo di due numeri baseX dai due elenchi con X sufficiente. ((m+#x,y)&#.)
  • Restituisce il segno della differenza tra i due numeri.*@-&

0

Mathematica, 65 anni

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

Uso:

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

-1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.