Confronta due numeri indicati come stringhe


21

Ho un problema sul lavoro. Ho bisogno di confrontare due numeri che arrivano come stringhe da due diversi database. I numeri possono venire con zeri iniziali e / o spazi iniziali / finali. Quindi potrei avere "0001 "da un database e " 1 "dall'altro.

Ho risolto il problema in C # con il seguente codice:

Func<string, string, bool> f = (a,b) => int.Parse(a.Trim()) == int.Parse(b.Trim())

La sfida

Questa è una sfida davvero semplice, adatta a principianti e qualsiasi tipo di lingue esoteriche. Dati due numeri come stringhe che possono venire con zeri iniziali e / o spazi iniziali / finali, scrivere il codice più breve che controlla se le due stringhe rappresentano lo stesso numero.

  • Gli input devono essere due stringhe o equivalenti nella tua lingua (un array di caratteri è OK) e rappresenteranno sempre valori interi maggiori di zero.
  • L'output deve essere due valori coerenti che rappresentano un valore di verità e un valore di falsità.

Esempi

A          B          Result
----------------------------
"0001"     "1    "    true
"1450"     "1450 "    true
"0010001 " " 10001  " true
"0010000"  "  10  "   false
"101023"   "101024"   false

Questo è , quindi può vincere il codice più breve per ogni lingua!



8
Almeno questa volta non è ispirato dai tuoi figli ...
caird coinheringaahing

2
@cairdcoinheringaahing il mio lavoro è la mia seconda fonte di ispirazione. So che questa è una sfida molto semplice, ma penso che queste sfide facili siano necessarie anche a volte. Proverò a trovare qualcosa di più difficile la prossima volta.
Charlie

A proposito, sembra che le mie sfide ispirate al lavoro siano troppo facili o troppo difficili ...
Charlie

@JonathanAllan no, ogni stringa di input rappresenterà solo un numero. Non ci saranno spazi tra le stringhe.
Charlie

Risposte:


22

Javascript , 11 byte

a=>b=>+a==b

Abusare un po 'delle regole di casting di Javascript; +acostringe ain un tipo numerico.

-6 byte grazie a Shaggy e Martin Ender ♦

Anche una bella idea di LiefdeWen :

a=>b=>~~a==~~b

2
Benvenuti in PPCG. Puoi farlo in 11 byte usando il curry e convertendo solo uno degli input in un numero intero: tio.run/##y0osSyxOLsosKNHNy09J/… Nota anche che, a meno che una funzione non faccia riferimento a se stessa, non è necessario includere la variabile assegnazione nel conteggio dei byte.
Shaggy,

2
Benvenuti in PPCG! Le funzioni senza nome vanno bene, quindi non è necessario c=, e anche il curry va bene, quindi puoi usare al a=>b=>...posto di (a,b)=>. Infine, il mio JavaScript è un po 'arrugginito, ma penso che funzionerebbe anche qualcosa del genere !(a-b)?
Martin Ender,

1
Vedi i suggerimenti per giocare a golf in ES6 (e suggerimenti generali sul golf JS ) per ulteriori trucchi per spremere i byte dalle tue soluzioni.
Shaggy,

1
Il versius freddo è cool ma ha una portata limitata, prova a inserire "9123456789" e "533522197". Queste sono rappresentazioni di stringhe di valori interi, ben rientrano nell'intervallo valido di numeri interi in javascript (ma più di 32 bit)
edc65

1
Il tuo testo non corrisponde più al codice; non c'è sottrazione. Stai costringendo aa un tipo numerico con unario +.
Peter Cordes,


18

Operazione linguaggio di scripting Flashpoint , 33 byte

f={call format(["%1==%2"]+_this)}

Chiama con:

hint format["%1\n%2\n%3\n%4\n%5",
    ["0001", "1    "] call f,
    ["1450", "1450 "] call f,
    ["0010001 ", " 10001  "] call f,
    ["0010000", "  10  "] call f,
    ["101023", "101024"] call f]

Produzione:

Versione alternativa (41 byte):

f={{t=call _x;r=t==s;s=t}forEach _this;r}

Ancora 5 byte più brevi di quelli più semplici f={t=_this;call(t select 0)==call(t select 1)}

39 byte:

f={{t=call _x;r=t==s;s=t}count _this;r}

count(che restituisce le dimensioni di un array) funziona invece di forEach, perché puoi assegnargli un "lambda" che viene utilizzato come condizione per contare solo gli elementi dell'array che soddisfano tale condizione. La "condizione" utilizzata in questo caso non è una condizione valida, ma qui non importa perché non causa un errore e countnon è necessario il valore restituito .


7
Mi piace la varietà di situazioni in cui prendi screenshot del tuo codice.
Οuroso

11

Taxi , 488 byte

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Equal's Corner.Pickup a passenger going to Equal's Corner.Go to Equal's Corner:n 1 l 1 l 1 l.Switch to plan "b" if no one is waiting.'1' is waiting at Writer's Depot.[b]'0' is waiting at Writer's Depot.Go to Writer's Depot:n 1 l 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.

Provalo online!

Ungolfed:

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Equal's Corner.
Pickup a passenger going to Equal's Corner.
Go to Equal's Corner: north 1st left 1st left 1st left.
Switch to plan "b" if no one is waiting.
'1' is waiting at Writer's Depot.
[b]
'0' is waiting at Writer's Depot.
Go to Writer's Depot: north 1st left 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.

Il taxi è (relativamente) adatto a questa sfida perché le stringhe sono l'unico tipo di input o output consentito. The Babelfisheryè ciò che converte le stringhe in numero (e viceversa) e gestisce la rimozione di tutti gli spazi e lo zero iniziale. Gestirà anche numeri negativi se -è immediatamente prima della prima cifra. Successivamente, Equal's Cornercontrolla i due valori l'uno contro l'altro e Writer's Depotfornisce l'output in formato stringa. L'output è 1per la verità e 0per la falsità.


1
Ben fatto! Solo per curiosità, perché la finestra di debug mostra il messaggio error: The boss couldn't find your taxi in the garage. You're fired!?
Charlie

6
@Charlie Taxi richiede di tornare al garage dei taxi una volta terminato il percorso. Se non porti indietro la macchina, vieni licenziato. (Devi anche essere sicuro di fermarti e fare rifornimento di carburante di tanto in tanto o finisci la benzina.) Nelle domande di code-golf che non impediscono l'uscita a STDERR, generalmente non mi preoccupo di essere licenziato. È possibile aggiungere questo per eliminare l'errore se non si desidera perdere il lavoro:Go to Taxi Garage:n 1 r 1 l 1 r.
Ingegnere Toast

Questa risposta e i suoi commenti sono totalmente surreali. Adoro questa comunità.
Right Leg

@RightLeg Il mio programma Taxi preferito che ho scritto mi ha richiesto due settimane e molti debug. Vuoi davvero un viaggio, però? Dai un'occhiata a Shakespeare .
ingegnere Toast l'

10

C (gcc) , 27 byte

f(s,t){s=atoi(s)==atoi(t);}

Con -O0(che è l'impostazione predefinita).

Provalo online!

C, 32 byte

f(s,t){return atoi(s)==atoi(t);}

Provalo online!


2
@Charlie In C, le stringhe sono matrici di chare quando si passa un array a una funzione, in realtà si passa il puntatore al primo elemento dell'array. In questo caso, i puntatori agli chararray vengono convertiti implicitamente in numeri interi quando vengono passati alla funzione e gli interi vengono convertiti nuovamente in puntatori quando si chiama atoi.
Steadybox

1
che potrebbe esplodere orribilmente su una piattaforma in cui i puntatori sono più larghi degli ints ... solo dicendo, ovviamente va bene per gli standard del sito qui :)
Felix Palmen

2
Se vuoi usare schifezze ridicole come s=foo;invece di return foo;etichettarle come "x86 gcc con ottimizzazione disabilitata", non solo "C", perché questo codice non restituisce un valore se non come artefatto dell'implementazione.
Peter Cordes,

2
Ho cercato di vedere se c'erano delle architetture in cui s=retval;invece si è return retval;effettivamente rotto. Sembra che la logica interna di gcc (con -O0solo) in realtà tratta l'ultima espressione come il valore restituito, forse allo stesso modo in cui funziona un'espressione dell'istruzione C GNU . (Ma richiede s=). Su ARM32, calcola il ==risultato r3e quindi usa un extra mov r0, r3per rendere il valore restituito! Quindi non è un hack specifico per x86, è un gcc -O0hack che gcc sembra fare di tutto per supportare.
Peter Cordes,

2
@ KenY-N Ti manca l'intero punto del codice c golf. Si tratta di trovare quei casi di hacky edge specifici in cui è possibile inserire la quantità minima di codice e ottenere i risultati desiderati, non fornendo un'esperienza portatile.

8

J , 4 byte

=&do

Confronta =dopo aver &valutato do. Può anche essere =&". Provalo online!


È interessante notare che questo funzionerà sia per i negativi come le altre lingue li comprendono (ad esempio -10) sia per i negativi come J li capisce (ad esempio _10) a causa del modo in cui -funziona la monade .
Cole

6

Retina , 11 byte

.+
$*
D`
¶$

Provalo online!

L'input è separato dalla linea di alimentazione, ma la suite di test utilizza la separazione virgola per comodità. Stampa 1per l'uguaglianza e 0per la disuguaglianza.

Spiegazione

.+
$*

Converti ogni riga in unario. Ciò ignora gli zeri e gli spazi iniziali.

D`

Deduplica: cancella la seconda riga se entrambi sono uguali.

¶$

Controlla che la stringa finisca ora con un avanzamento riga.




3

Triangolarità , 17 byte

..)..
.Ii).
@Ii=.

Provalo online!

La triangolarità è, per una volta, competitiva!

Come funziona

La triangolarità richiede che il codice abbia una distribuzione triangolare dei punti. Cioè, la lunghezza di ogni riga deve essere uguale al numero di righe moltiplicato per 2 e decrementato e ogni riga deve avere (su ciascun lato) un numero di punti uguale alla sua posizione nel programma (la riga inferiore è la riga 0, quello sopra di esso è la riga 1 e così via). Tenendo presente questo, analizziamo come funziona il codice:

..).. || Push a 0 onto the stack.
.Ii   || Get the 0th input and cast it to an integer.
   ). || Push another 0 onto the stack.
@I    || Increment the ToS => 1. Get the first input.
  i=. || Then cast it to an integer and compare their equality.

3

Alice , 7 byte

X/n
o@i

Provalo online!

Qualsiasi separatore senza cifre funziona. Stampa 1per uguaglianza e 0altro.

Spiegazione

X   XOR, does nothing.
/   Switch to Ordinal mode.
i   Read all input as a string.
/   Switch to Cardinal mode.
X   XOR. Implicitly finds all integers in the string and pushes them separately
    onto the stack. The XOR gives 0 if the values are identical.
n   Logical NOT. Gives 1 for equal inputs and 9 otherwise.
/   Switch to Ordinal.
o   Print the 0 or 1 as a string.
/   Switch to Cardinal.
@   Terminate the program.

3

Japt , 3 byte

¥Vn

Provalo

Converte il secondo input in un numero intero e confronta l'uguaglianza con il primo.



3

jq, 24 caratteri

map(tonumber)|.[0]==.[1]

Le 2 stringhe vengono passate come elementi di un array.

Esecuzione di esempio:

bash-4.4$ jq 'map(tonumber)|.[0]==.[1]' <<< '["0010001 ", " 10001  "]'
true

bash-4.4$ jq 'map(tonumber)|.[0]==.[1]' <<< '["0010000", "  10  "]'
false

Provalo online! ( Tutti i casi di test )



3

PowerShell , 20 byte

param($a,$b)+$a-eq$b

Simile alla risposta JavaScript, solo più a lungo perché PowerShell non ha curry. Utilizza per +eseguire il cast della prima stringa in numero intero, quindi -equals lancia automaticamente la seconda stringa in numero intero. L'output è Vero / Falso.

Provalo online!


3

PowerShell , 19 byte

$args-join'-eq'|iex

Provalo online!

-joinl'argomento array ( $args) con la rappresentazione in formato stringa dell'operatore di confronto ( -eq) quindi valuta l'espressione con Invoke-Expression( iex).


Interessante. Mi chiedo come ci si possa cavare senza la necessità di eseguire il cast di numeri interi, mentre il mio si interrompe se rimuovo il +poiché esegue il controllo dell'uguaglianza delle stringhe.
AdmBorkBork,

@AdmBorkBork perché sto essenzialmente generando codice PowerShell e quindi eseguendolo, e poiché gli zero iniziali e gli spazi iniziali / finali non contano per l'interprete, "funziona". Se i 2 numeri sono 00009 e 077 quindi il codice risultante è 00009 -eq077 , un pezzo di codice perfettamente valido. Hai a che fare direttamente con la stringa in fase di esecuzione, quindi devi prima lanciarla in modo che l'operazione venga eseguita su un valore numerico.
Briantist

Giusto, sì, ha senso. Grazie per la spiegazione.
AdmBorkBork,

3

Q (Kdb +), 13 byte

=/["J"$(x;y)]

Spiegazione

(x; y): un elenco dei due input.

"J" $: cast di ogni input in un tipo lungo (7j) da stringa (10c), che può interpretare correttamente
gli spazi bianchi e gli 0 iniziali.

= /: controlla l'uguaglianza sugli elementi in un elenco (ogni coppia successiva).
Poiché esiste solo una coppia, restituisce un singolo booliano 0b / 1b.


Benvenuti in PPCG! Di solito, viene apprezzato un collegamento a un interprete / compilatore online e, se non ovvio, anche una spiegazione.
FantaC,

Grazie! Spiegazione aggiunta lì. Dubito che ci sia un interprete online per q, ho fatto una rapida occhiata e non sono riuscito a trovarne uno.
Sidney,

Direi che questo dovrebbe essere scritto come lambda includendo le parentesi graffe, cioè {=/["J"$(x;y)]}per 15 byte ... Anche se per 8 byte potresti avere questo: (~/)"J"$se stai solo usando il REPL e passando gli input come un elenco di stringhe .. o {(~/)"J"$x}per 11 in funzione.
streetster

3

T-SQL, 35 byte

Secondo i nostri standard , i dati vengono inseriti tramite una tabella preesistente tcon varcharcampi ae b.

    SELECT IIF(ABS(a)=ABS(b),1,0)FROM t

Restituisce 1se corrispondono, in 0caso contrario.

Alcune delle funzioni matematiche di SQL (incluso ABS, FLOORe CEILING) eseguiranno una conversione implicita in valori numerici se dati parametri stringa, questo è più breve di un esplicito CAST(a AS INT)o CONVERT(INT,b), e funziona in questo caso poiché sappiamo che i valori di input sono sempre positivi.

IIF è specifico per MS SQL 2012 e versioni successive, quindi nessuna garanzia su altre implementazioni.


3

Excel VBA, 27 16 byte

-9 Grazie a @Nayrb e @TaylorScott

[C1]=[A1]-[B1]=0

Dove si inseriscono i valori nelle celle con 'string.

Dove xe ysono le stringhe di input ed zè un output booleano.

Se CInt (x) = CInt (y) Quindi z = 1

Utilizzando CInt


1
Perché no: z = xy = 0?
Nayrb,

Purtroppo questa soluzione non è valida in quanto non accetta input e si basa piuttosto su valori predefiniti ( accetta sull'avere che è stato considerato contro le regole della comunità ) e l'output su una variabile ( che è anche contro le regole della comunità )
Taylor Scott

Per quanto riguarda una soluzione valida, forse una funzione di finestra immediata vbe come ?[Int(A1)=Int(B1)]quella prende input dagli intervalli A1e B1ed esce alla finestra immediata VBE
Taylor Scott,




2

Gema , 21 personaggi

*\n*=@cmpn{*;*;0;1;0}

Nessun booleano a Gema. Come il @get-switch{}/@set-switch{} funzioni usano 0 e 1 per rappresentare gli stati degli interruttori, usate anche 0 e 1.

Le 2 stringhe vengono passate su righe di input separate.

Esecuzione di esempio:

bash-4.4$ gema '*\n*=@cmpn{*;*;0;1;0}' <<< $'0010001\n10001  '
1

bash-4.4$ gema '*\n*=@cmpn{*;*;0;1;0}' <<< $'0010000\n  10  '
0



2

Attache , 11 byte

Same@Map&:N

Provalo online!

Questo richiede una serie di stringhe, come ad esempio V["0001", "1 "]. Detto semplicemente, Map&:Nè una funzione che si associa Nal suo argomento e Sameverifica che l'array contenga solo membri uguali. (Curiosità: questa funzione funziona per più di 2 argomenti di stringa.)


2

SNOBOL4 (CSNOBOL4) , 42 byte

	OUTPUT =EQ(EVAL(INPUT),EVAL(INPUT)) 1
END

Provalo online!

Output 1 per verità, niente per falsità. Poiché (spazio) è l'operatore di concatenazione in SNOBOL, EVALl' inging un numero con spazi iniziali / finali produce il numero stesso e si occupa anche ordinatamente di tutti gli zeri iniziali. EQtest per l'uguaglianza numerica, impostando condizionalmente OUTPUTa 1 su Success.


2

Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 29 byte BASIC tokenizzati

Nuova soluzione grazie a Neil (grazie per la punta).

 1 INPUT A$
 2 INPUT B$
 3 PRINT VAL A$=VAL B$

Questa soluzione richiede l'input dell'utente, quindi inserisci due stringhe con spazi bianchi e / o zeri iniziali o inserisci due stringhe di valore numerico non uguale; 0è falso ed 1è vero una volta che la riga tre ha confrontato il valore di ogni stringa immessa.

Vecchia soluzione: Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 46 byte BASIC tokenizzati

 1 LET A$=" 001 "
 2 LET B$="1"
 3 PRINT (VAL A$=VAL B$)

Il controllo effettivo viene eseguito nella riga tre, che è solo ~ 16 byte BASIC tokenizzati; quindi inserendo ciascuna coppia di test case usando la modalità diretta si risparmierà ~ 30 byte dall'elenco. Si noti che questo conteggio di byte non include il var stack.


1
Non dovresti usare INPUT A$e INPUT B$? Inoltre non penso che tu abbia bisogno della ()s.
Neil

Sì, potrei usarlo anche - volevo solo una prova di concetto
Shaun Bebbers il

2

APL (NARS2000) , 7 byte

=⍥⍎

Bene, sì, so che NARS2000 non può competere su Dyalog qui poiché usa Unicode, ma ho pensato che avrei preferito mettermi in mostra (chiamato Composizione in NARS2000, anche se in realtà non è correlato alla composizione delle funzioni), qualcosa che Dyalog non ha come built-in e non ho mai visto usato qui. In Dyalog, deve essere implementato come {(⍵⍵⍺)⍺⍺⍵⍵ ⍵}. Ciò che fa è chiamare la funzione monadica dell'operando destro sull'argomento sinistro e destro, quindi chiamare la funzione diadica dell'operando sinistro sui risultati.

Qui, l'operando di destra è ( Esegui , cioè eval) e l'operando di sinistra è =( Uguale a , cioè controlla se i suoi argomenti sono uguali).


Si suppone che la composizione e l'esecuzione vengano renderizzate come spazi bianchi?
John Dvorak,

@JohnDvorak um, no? Non sono spazi bianchi, il secondo carattere è U + 2365 APL DIAERESI CIRCOLARE IL SIMBOLO FUNZIONALE e il terzo è U + 234E APL SIMBOLO FUNZIONALE DOWN TACK JOT.
Erik the Outgolfer,

@JohnDvorak Qualunque sia il carattere che stai visualizzando questo potrebbe non avere simboli per quei punti di codice.
Οuroso

@ Οurous Sospetto fortemente che sia così, ma se stai usando un software ben aggiornato non dovresti avere problemi a visualizzare tali caratteri.
Erik the Outgolfer
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.