È 7 l8r di 9? (Sono le sette dopo le nove?)


10

Questa è una sfida abbastanza semplice per giocare a golf. Il tuo programma, dato una stringa ASCII, è di analizzare quella stringa in due stringhe, che valuterà. Se la seconda stringa è "successiva" rispetto alla prima, restituirà un 1, se è "precedente" rispetto alla prima, restituirà un -1 e, se sono uguali, restituirà 0. A chiariamo cosa significano "più tardi" e "prima", diamo un'occhiata ai codici dei caratteri ASCII. Devi confrontare ogni carattere della stringa, trattandoli come cifre di un numero. Successivamente si riferisce a un numero più grande, che si verifica dopo un numero più piccolo. Le stringhe verranno formattate con un carattere trattino per separare i due gruppi di input.

Dai un'occhiata a questo esempio:

7-9come input dovrebbe tornare 1.

7converte in codice ASCII 55e 9converte in codice ASCII 57.

Come 57accade numericamente dopo 55, 9è più tardi di 7.

Un altro esempio:

LKzb-LKaj come input dovrebbe tornare -1

Le sequenze di codice ASCII per questo sono 76-75-122-98e76-75-97-106

Questa è una sfida di golf del codice e il conteggio dei byte è il modo in cui verranno segnate le voci.

È accettato qualsiasi input dai 95 caratteri ASCII stampabili, esclusi spazi e trattini per tutto tranne che separare l'input. Inoltre, non è garantito che le stringhe abbiano la stessa lunghezza.

In bocca al lupo!

EDIT: per essere più chiari, ogni personaggio deve essere trattato come una cifra in un numero. Nell'esempio LKzb-LKaj, sebbene jsia più tardi di b, zè più tardi di a, e poiché è una cifra più significativa, ha la precedenza. Una stringa fornita avrà sempre almeno 3 caratteri, eliminando le stringhe vuote dall'ambito di questo problema.

EDIT: ecco alcuni altri casi di test, per il tuo aiuto:

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

1
Le due stringhe sono garantite per avere la stessa lunghezza?
es1024

5
Caso di prova 11-Z-> -1non ha senso data l'attuale formulazione della domanda. Z(90) è maggiore di 1(49) ed è la lettera più significativa. Si prega di chiarire come vengono confrontate stringhe di diverse lunghezze.
George Reith,

2
E che dire A-AA?

2
@SamWeaver So che l'estrema sinistra è la cifra più significativa, quindi la mia confusione sul perché 11>Znei tuoi esempi quando 1<Z. Ci deve essere un comportamento indefinito da fare con stringhe di lunghezze diverse o l'esempio è sbagliato.
George Reith,

3
Come precedentemente spiegato: ogni stringa deve essere trattata come una cifra in un numero di base-127. Se dovessi contare in questo sistema, inizieresti con un carattere, lo incrementeresti fino alla barriera dei caratteri stampabili, ~a 126, quindi aumenteresti la cifra successiva di una, riportando la cifra iniziale a !. Ogni aumento della cifra più significativa equivale a incrementare la seconda cifra più significativa di 127.
Sam Weaver

Risposte:


11

Pyth - 11 byte

Facile, usa il ._segno per ottenere il segno e Cper ottenere i codici char.

._-F_CMcz\-

Provalo online qui .

Suite di test .

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

Molto bella! Si comporta come previsto.
Sam Weaver,

7

CJam, 12 byte

l'-/esfb~\-g

Provalo online nell'interprete CJam .

Come funziona

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.

Eccellente! Questo supera tutti i casi di test.
Sam Weaver,

6

Java, 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));}  

Un modo molto strano di confrontare le stringhe. Ha fatto una soluzione rapida in modo da superare ulteriori casi di test, cercherà più golfiness in seguito.

Grazie a Vartan nei commenti per il signumsuggerimento


Il confronto di java non restituisce comunque 1,0, -1? So che non è garantito, ma non c'è nessun caso? nel qual casoreturn s[0].compareTo(s[1]);
Vartan,

Questo è carino, ma non supera il test case di 11-Zritorno -1, ritorna 1.
Sam Weaver,

Ah, questo non mi era chiaro prima che quei casi di test fossero aggiunti. Fisso.
Geobits il

@Vartan No, restituisce la differenza di valore nella prima posizione non corrispondente (o la differenza di lunghezza se c'è una corrispondenza di tutti i caratteri). Ad esempio, "A".compareTo("Z") restituisce-25 . Purtroppo.
Geobits il

Puoi spiegare questa linea? i = a!=b ? b-a : s[1].compareTo(s[0]);Non mi sembra di averlo ... Inoltre, potresti forse usare Math.signum e salvarti dichiarando i;
Vartan,

4

Perl, 31 byte

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

30 byte + 1 byte per -p. Accetta input su STDIN.

Spiegazione

Quando gli operandi cmphanno lunghezze diverse, come chickene egg, sono allineati in questo modo:

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

in modo che egg> chicken( \0sia un byte null). Ma vogliamo che siano allineati in questo modo:

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

in modo che chicken> egg.

Per fare questo, li concateniamo, una volta con chickenprima egge una volta con eggprima chicken:

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

Ora che le nostre due stringhe hanno la stessa lunghezza, rimuoviamo la parola iniziale usando un XOR per ottenere:

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

E ora possiamo usare cmpper scoprire quale è venuto prima. (Ecco, l'ho detto!)


Bravo! Bravo!
Sam Weaver,

3

Python 2, 88 caratteri

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

cmpnon fa la cosa giusta quando hai due stringhe di lunghezza diversa, quindi devo riempirle entrambe con il carattere null (che ordconverte in 0) per gestire quel caso. Sfortunatamente, questo ha aggiunto circa 35 caratteri, in più ora sono due righe anziché una perché ho bisogno sia della lunghezza dell'input che dell'iterazione su di essa.


Sfortunatamente, questa non è una soluzione valida. Il seguente caso di test:, 1-2che dovrebbe restituire 1restituisce -1. Lavoro intelligente però.
Sam Weaver,

Spiacenti, sembra che gli operandi vengano scambiati. È davvero strano, l'ho testato con un paio di casi di test e ho pensato che funzionasse bene! Non importa, posso cambiarlo senza cambiare il conteggio dei personaggi. Prova adesso.
Alex Van Liew,

La tua modifica ha risolto quel caso, ma ora fallisce il 11-Acaso, che dovrebbe tornare -1, invece di tornare 1in questo esempio.
Sam Weaver,

Non mi piacciono le tue regole per la lunghezza. L'ho risolto al costo di circa 35 caratteri e non credo di poterlo migliorare.
Alex Van Liew,

1
Sono riuscito a ottenere una risposta più breve della tua codificando la stringa in formato esadecimale, quindi analizzando quella stringa come int. In python 2, sembra predefinito per big-endianness per questo. Pertanto, l'imbottitura 0 non è più richiesta.
Dunes,

2

R, 54 byte

Ciò richiede la libreria pracma. Divide la stringa di input su -. Giusto giustifica le stringhe. Li classifica e fa una differenza.

Quindi per 11-7 finiamo con le stringhe "11" e "7". Il grado di questi è [2, 1]. La differenza è -1. Per 3h ~ J * -3h ~ J * otteniamo "3h ~ J *" e "3h ~ J *". Il grado di questi è [1,5, 1,5] con una differenza di 0.

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

Esempi di test

> 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

Intelligente. Bel lavoro :)
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)`

Ecco un jsfiddle con i risultati (guarda nella console)


2

PERL, 46 36 byte

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

Converte l'elenco argv in una stringa, si divide per il trattino in un arg a sinistra e a destra senza spazi, quindi restituisce una chiamata cmp.


Ho il sospetto che tu possa sbarazzarti di un numero di spazi e il;
MickyT,

Dovrebbe essere in grado di cavarsela con: "@ARGV"=~/-/;print$`cmp$' (non testato)
Jarmex

1
Buona idea da usare cmp, ma non funziona quando le lunghezze delle stringhe sono diverse. "A" cmp "9"è 1 mentre "11" cmp "Z"è -1, anche se entrambi gli input dovrebbero restituire lo stesso valore per questa sfida.
ThisSuitIsBlackNon

1

Python 3, 84 byte

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

Dividi l'input della stringa per "-". Converti le stringhe unicode in stringhe di byte, quindi interpreta queste stringhe di byte come numeri interi big-endian. Finalmente fai il confronto - (un) fortunatamente cmpnon è più disponibile in Python 3.

Python 2, 69 byte

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

Puoi radere un personaggio rimuovendo lo spazio tra printe cmp.
Alex Van Liew,

1

Python 2, 79 byte

Soluzione piuttosto semplice ed è facile da capire. Confronta le lunghezze delle stringhe, quindi confronta le stringhe in modo lessigrafico.

Provalo qui

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

Eseguilo dalla riga di comando. anche se apparirebbe meglio con una nuova linea ma che costa 1 carattere.

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

Questa versione più lunga gestisce correttamente lunghezze non corrispondenti.


/-/,$_=$`cmp$'sarebbe più facile e puoi saltare il -aF-bit. Inoltre, lo conto come 20 (16 per $_=$F[1]cmp$F[0], e 4 per paF-, salvato in un file ed eseguito come perl -paF- file.pl).
primo

1
Come ho notato nella risposta di Eric , cmpnon funziona quando le due stringhe hanno lunghezze diverse, come nel caso di 11-Z.
ThisSuitIsBlackNon

@ThisSuitIsBlackNot, risolto.
Hildred

Bello. Puoi giocare a golf fino a 39 con /-/;$_=length$'<=>length$`||$' cmp$`e -p. ( $`memorizza tutto prima della corrispondenza regex, $'memorizza tutto dopo.) L'utilizzo in maprealtà costa più byte di una semplice chiamata lengthdue volte.
ThisSuitIsBlackNon

0

F #, 53

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

Questo è nella forma di una funzione anonima (lambda), quindi devi incollarlo e fornire il parametro direttamente dopo (o, usando la notazione di piping). Ad esempio (in 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 byte

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

Buon lavoro, ma questo non compie il caso di test 2: 11-Zdovrebbe tornare -1ma ritorna 1.
Sam Weaver,

1
@SamWeaver In effetti, è stato aggiunto dopo la risposta e interrompe anche altre risposte. Puoi spiegare perché '11'>'Z'quando '11'<'ZZ'non c'è nulla nella domanda su come confrontare una stringa di diverse lunghezze o quale valore ha una stringa vuota.
George Reith,

L'intento della domanda non è mai cambiato, ho aggiunto solo quei casi di test e chiarimenti perché mi sono reso conto che all'inizio non ero abbastanza chiaro. Hai ragione sul fatto che non ho mai definito il valore di una stringa vuota e aggiornerò la domanda di conseguenza. Quei casi di test non hanno modificato il comportamento o l'obiettivo della domanda, ma solo chiarito. Gli esempi che hai nominato funzionano come tali perché ogni carattere deve essere trattato come una singola "cifra" in un numero la cui base è equivalente a tutti i caratteri ASCII stampabili. Questo meccanico della domanda non è mai cambiato, semplicemente è diventato più chiaro.
Sam Weaver,

1
@SamWeaver Il passaggio da un comportamento indefinito a definito lo modifica. Niente non è un personaggio. A meno che non sia il carattere null, che questo gestisce.
George Reith,

0

Rubino, 59 byte

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

0

05AB1E , 12 11 9 byte

'-¡₄ö¥0.S

Provalo online o verifica tutti i casi di test .

Spiegazione:

'-¡          # 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]
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.