Vergleichen Sie zwei Zahlen, die als Zeichenfolgen angegeben sind


21

Ich habe ein Problem bei der Arbeit. Ich muss zwei Zahlen vergleichen, die als Zeichenfolgen aus zwei verschiedenen Datenbanken stammen. Die Zahlen können führende Nullen und / oder führende / nachfolgende Leerzeichen enthalten. So kann ich "0001 "von einer Datenbank und " 1 "von der anderen haben.

Ich habe das Problem in C # mit folgendem Code gelöst:

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

Die Herausforderung

Dies ist eine wirklich einfache Herausforderung, geeignet für Anfänger und jede Art von esoterischen Sprachen. Wenn Sie zwei Zahlen als Zeichenfolgen mit führenden Nullen und / oder führenden / nachfolgenden Leerzeichen angeben, schreiben Sie den kürzesten Code, der prüft, ob die beiden Zeichenfolgen dieselbe Zahl darstellen.

  • Die Eingaben müssen aus zwei Zeichenfolgen oder der Entsprechung in Ihrer Sprache bestehen (ein Zeichen-Array ist in Ordnung) und sie stellen immer ganzzahlige Werte dar, die größer als Null sind.
  • Die Ausgabe muss aus zwei beliebigen konsistenten Werten bestehen, die einen Wahrheitswert und einen Falsey-Wert darstellen.

Beispiele

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

Das ist , also kann der kürzeste Code für jede Sprache gewinnen!



8
Zumindest ist es diesmal nicht von Ihren Kindern inspiriert ...
Caird Coinheringaahing

2
@cairdcoinheringaahing meine eigene Arbeit ist meine zweite Quelle der Inspiration. Ich weiß, dass dies eine sehr einfache Herausforderung ist, aber ich denke, dass diese einfachen Herausforderungen manchmal auch gebraucht werden. Ich werde versuchen, mir das nächste Mal etwas Schwierigeres auszudenken.
Charlie

Übrigens, es scheint, dass meine arbeitsinspirierten Herausforderungen entweder zu einfach oder zu schwer sind ...
Charlie

@ JonathanAllan Nein, jede Eingabezeichenfolge steht nur für eine Zahl. Zwischen den Zeichenfolgen werden keine Leerzeichen eingefügt.
Charlie

Antworten:


22

Javascript , 11 Bytes

a=>b=>+a==b

Das Casting von Javascript ein wenig zu missbrauchen; +azwingt sich ain einen numerischen Typ.

-6 Bytes dank Shaggy und Martin Ender ♦

Auch eine coole Einstellung von LiefdeWen :

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

2
Willkommen bei PPCG. Sie können diese currying in 11 Bytes tun verwenden und nur auf eine ganze Zahl einer der Eingänge Umwandlung: tio.run/##y0osSyxOLsosKNHNy09J/... Hinweis auch , dass, es sei denn , eine Funktion auf sich selbst verweist, müssen Sie nicht die Variable müssen schließen Zuweisung in Ihrer Byteanzahl.
Shaggy

2
Willkommen bei PPCG! Unbenannte Funktionen sind in Ordnung, so dass Sie sie nicht benötigen c=, und Currying ist auch in Ordnung, sodass Sie sie a=>b=>...anstelle von verwenden können (a,b)=>. Endlich ist mein JavaScript etwas eingerostet, aber ich denke sowas !(a-b)würde auch funktionieren?
Martin Ender

1
In den Tipps zum Golfen in ES6 (und in den allgemeinen JS-Golftipps ) finden Sie weitere Tricks, mit denen Sie Byte aus Ihren Lösungen herausholen können.
Shaggy

1
Die coole Version ist cool, aber der Umfang ist begrenzt. Versuchen Sie es mit den Eingaben '9123456789' und '533522197'. Dies sind String-Darstellungen von Integer-Werten, die weit innerhalb des gültigen Bereichs von Integer-Werten in Javascript (aber mehr als 32 Bit) liegen
edc65

1
Ihr Text stimmt nicht mehr mit dem Code überein. Es gibt keine Subtraktion. Sie zwingen sich amit unary zu einem numerischen Typ +.
Peter Cordes


18

Operation Flashpoint- Skriptsprache, 33 Byte

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

Rufen Sie an mit:

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]

Ausgabe:

Alternative Version (41 Bytes):

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

Immer noch 5 Bytes kürzer als der einfachere f={t=_this;call(t select 0)==call(t select 1)}

39 Bytes:

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

count(das die Größe eines Arrays zurückgibt) funktioniert stattdessen forEach, weil Sie ihm ein "Lambda" geben können, das als Bedingung verwendet wird, um nur die Array-Elemente zu zählen, die diese Bedingung erfüllen. Die in diesem Fall verwendete "Bedingung" ist keine gültige Bedingung, spielt hier jedoch keine Rolle, da sie keinen Fehler verursacht und der Rückgabewert von countnicht benötigt wird.


7
Ich mag die Vielzahl von Situationen, in denen Sie Screenshots Ihres Codes machen.
Οurous

11

Taxi , 488 Bytes

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.

Probieren Sie es 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.

Taxi ist für diese Herausforderung (relativ) gut geeignet, da nur Strings als Eingabe- oder Ausgabetyp zulässig sind. The Babelfisherykonvertiert Zeichenfolgen in Zahlen (und umgekehrt) und entfernt alle Leerzeichen und führenden Nullen. Es werden auch negative Zahlen verarbeitet, wenn sich das -unmittelbar vor der ersten Ziffer befindet. Anschließend Equal's Cornerwerden die beiden Werte miteinander verglichen und Writer's Depotdie Ausgabe im Zeichenfolgenformat bereitgestellt. Die Ausgabe ist 1für die Wahrheit und 0für die Falschheit.


1
Schön! Warum zeigt das Debug-Fenster aus Neugier die Meldung an error: The boss couldn't find your taxi in the garage. You're fired!?
Charlie

6
@Charlie Taxi fordert Sie auf, zur Taxigarage zurückzukehren, wenn Sie mit Ihrer Route fertig sind. Wenn Sie das Auto nicht zurückbringen, werden Sie gefeuert. (Sie müssen auch sicher sein, dass Sie ab und zu anhalten und tanken, oder Sie haben kein Benzin mehr.) Bei Code-Golf- Fragen, die die Ausgabe an STDERR nicht verbieten, mache ich mir im Allgemeinen keine Sorgen darüber, gefeuert zu werden. Sie können dies hinzufügen, um den Fehler zu beseitigen, wenn Sie Ihren Job nicht verlieren möchten:Go to Taxi Garage:n 1 r 1 l 1 r.
Engineer Toast

Diese Antwort und ihre Kommentare sind absolut surrealistisch. Ich liebe diese Community.
Rechtes Bein

@RightLeg Mein Lieblings-Taxi-Programm, das ich geschrieben habe, dauerte zwei Wochen und viel Debugging. Sie wollen aber wirklich eine Reise? Schauen Sie sich Shakespeare an .
Ingenieur Toast

10

C (gcc) , 27 Bytes

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

Mit -O0 (das ist die Standardeinstellung).

Probieren Sie es online!

C 32 Bytes

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

Probieren Sie es online!


2
@Charlie In C sind Strings Arrays von charund wenn Sie ein Array an eine Funktion übergeben, übergeben Sie den Zeiger einfach an das erste Element des Arrays. Hier werden die Zeiger auf die charArrays implizit in Ganzzahlen konvertiert, wenn sie an die Funktion übergeben werden, und die Ganzzahlen werden beim Aufruf wieder in Zeiger konvertiert atoi.
Steadybox

1
Das könnte auf einer Plattform, auf der die Zeiger breiter sind als die Ints, furchtbar in die Luft jagen. Natürlich ist das in Ordnung für die Site-Standards hier :)
Felix Palmen,

2
Wenn Sie lächerlichen Mist wie s=foo;verwenden möchten, return foo;müssen Sie dies als "x86 gcc mit deaktivierter Optimierung" und nicht nur als "C" bezeichnen, da dieser Code nur als Implementierungsartefakt einen Wert zurückgibt.
Peter Cordes

2
Ich habe nachgefragt, ob es Architekturen gibt, bei denen s=retval;nicht return retval;wirklich kaputt gegangen ist . Es sieht so aus, als würde die interne Logik von gcc (mit -O0nur) den letzten Ausdruck als Rückgabewert behandeln, vielleicht genauso wie ein GNU C-Anweisungsausdruck . (Aber es erfordert s=). In ARM32 berechnet es das ==Ergebnis in r3und verwendet dann ein Extra mov r0, r3, um den Rückgabewert zu bestimmen ! Es handelt sich also nicht um einen x86-spezifischen Hack, sondern um einen gcc -O0Hack, den GCC offenbar nicht zu unterstützen versucht .
Peter Cordes

2
@ KenY-N Sie vermissen den gesamten Punkt des C-Code-Golfs. Es geht darum, diese speziellen Fälle zu finden, in denen Sie die Mindestmenge an Code eingeben und die gewünschten Ergebnisse erzielen können, ohne eine tragbare Erfahrung zu bieten.

8

J , 4 Bytes

=&do

Vergleichen Sie =nach der &Bewertung do. Kann auch =&". online probiert werden!


Interessanterweise funktioniert dies für beide Negative, da andere Sprachen sie verstehen (z. B. -10) und für Negative, wie J sie _10aufgrund der monadischen Arbeitsweise versteht (z. B. ) -.
Cole

6

Retina , 11 Bytes

.+
$*
D`
¶$

Probieren Sie es online!

Die Eingabe ist durch Zeilenvorschub getrennt, die Testsuite verwendet jedoch zur Vereinfachung eine Kommatrennung. Druckt 1für Gleichheit und 0für Ungleichheit.

Erläuterung

.+
$*

Wandle jede Zeile in eine unäre um. Dies ignoriert führende Nullen und Leerzeichen.

D`

Deduplizieren: Löschen Sie die zweite Zeile, wenn beide identisch sind.

¶$

Überprüfen Sie, ob die Zeichenfolge jetzt in einem Zeilenumbruch endet.




3

Dreieckigkeit , 17 Bytes

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

Probieren Sie es online!

Dreieckigkeit ist ausnahmsweise wettbewerbsfähig!

Wie es funktioniert

Dreieckigkeit erfordert, dass der Code eine dreieckige Verteilung der Punkte aufweist. Das heißt, die Länge jeder Zeile muss gleich der Anzahl der mit 2 multiplizierten und dekrementierten Zeilen sein, und jede Zeile muss (auf jeder Seite) eine Anzahl von Punkten aufweisen, die ihrer Position im Programm entspricht (die unterste Zeile ist Zeile 0). die darüberliegende ist Reihe 1 und so weiter). Lassen Sie uns vor diesem Hintergrund analysieren, wie der Code funktioniert:

..).. || 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 Bytes

X/n
o@i

Probieren Sie es online!

Jedes nicht-stellige Trennzeichen funktioniert. Druckt 1für Gleichheit und0 sonst.

Erläuterung

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 Bytes

¥Vn

Versuch es

Konvertiert die zweite Eingabe in eine Ganzzahl und vergleicht die Gleichheit mit der ersten.



3

jq, 24 Zeichen

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

Die 2 Zeichenfolgen werden als Elemente eines Arrays übergeben.

Probelauf:

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

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

Probieren Sie es online! ( Alle Testfälle )



3

PowerShell , 20 Byte

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

Ähnlich wie bei der JavaScript-Antwort, nur länger, da PowerShell kein Currying hat. Verwendet +, um die erste Zeichenfolge in eine Ganzzahl umzuwandeln, und dann die-eq umzuwandeln wandelt uals die zweite Zeichenfolge automatisch in eine Ganzzahl um. Die Ausgabe ist wahr / falsch.

Probieren Sie es online!


3

PowerShell , 19 Byte

$args-join'-eq'|iex

Probieren Sie es online!

-joinDas Argument array ( $args) mit der String-Darstellung des Vergleichsoperators ( -eq) wertet dann den Ausdruck mit Invoke-Expression( iex) aus.


Interessant. Ich frage mich, wie Sie zurechtkommen, ohne auf eine Ganzzahl umwandeln zu müssen, während meine abbricht, wenn ich die entferne, +da sie die Prüfung der Zeichenfolgengleichheit durchführt.
AdmBorkBork

@AdmBorkBork, da ich im Wesentlichen PowerShell-Code generiere und ihn dann ausführe. Da führende Nullen und führende / nachfolgende Leerzeichen für den Interpreter keine Rolle spielen, funktioniert er einfach. Wenn die 2 Zahlen 00009 und 077 dann der resultierende Code sind 00009 -eq077 , ist ein vollkommen gültiger Code. Sie arbeiten zur Laufzeit direkt mit der Zeichenfolge. Sie müssen sie also zuerst umwandeln, damit die Operation für eine numerische Zeichenfolge ausgeführt wird.
Briantist

Richtig, ja, das macht Sinn. Danke für die Erklärung.
AdmBorkBork

3

Q (Kdb +), 13 Bytes

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

Erläuterung

(x; y): eine Liste der beiden Eingaben.

"J" $: Jede Eingabe wird aus String (10c) in einen langen Typ (7j) umgewandelt, der
Leerzeichen und führende Nullen korrekt interpretieren kann .

= /: Überprüft die Gleichheit über Elemente in einer Liste (jedes nachfolgende Paar).
Da es nur ein Paar gibt, wird der einzelne Boolian 0b / 1b zurückgegeben.


Willkommen bei PPCG! In der Regel wird ein Link zu einem Online-Dolmetscher / Compiler geschätzt und, falls nicht offensichtlich, auch eine Erklärung.
FantaC

Vielen Dank! Erklärung dort hinzugefügt. Ich bezweifle, dass es einen Online-Dolmetscher für q gibt. Ich habe einen kurzen Blick darauf geworfen und keinen gefunden.
Sidney

Ich würde sagen, dass dies als Lambda geschrieben werden sollte, einschließlich der geschweiften Klammern, dh {=/["J"$(x;y)]}für 15 Bytes ... Obwohl Sie dies für 8 Bytes haben könnten: (~/)"J"$Wenn Sie nur die REPL verwenden und die Eingaben als Liste von Zeichenfolgen übergeben. oder {(~/)"J"$x}für 11 als Funktion.
Streetster

3

T-SQL, 35 Bytes

Gemäß unseren Standards werden Daten über eine bereits vorhandene Tabelle tmit varcharFeldern aund eingegeben b.

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

Gibt zurück, 1wenn sie übereinstimmen,0 wenn sie nicht .

Ein paar von SQL mathematischen Funktionen (einschließlich ABS, FLOORund CEILING) wird eine implizite Konvertierung in numerischen tun , wenn String - Parametern gegeben, das ist kürzer als ein expliziteCAST(a AS INT) oderCONVERT(INT,b) , und arbeitet in diesem Fall , da wir die Eingangswerte sind immer positiv kennen.

IIF ist spezifisch für MS SQL 2012 und höher, daher kann keine Garantie für andere Implementierungen übernommen werden.


3

Excel VBA, 27 16 Bytes

-9 Danke an @Nayrb und @TaylorScott

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

Wo Sie die Werte auf den Zellen mit eingeben 'string.

Wo xund ysind die Eingabezeichenfolgen undz ist eine boolesche Ausgabe.

Wenn CInt (x) = CInt (y), dann ist z = 1

Verwenden von CInt


1
Warum nicht: z = xy = 0?
Nayrb

Leider ist diese Lösung für ungültig , da sie nicht Eingang nimmt und eher beruht auf vordefinierten Werten ( die gegen die Regeln der Gemeinschaft erachtet wurde ) und zum Ausgeben einer Variablen ( die auch gegen Regeln Gemeinschaft )
Taylor Scott

Wie für eine gültige Lösung vielleicht eine VBE sofort Fensterfunktion wie ?[Int(A1)=Int(B1)]das nimmt eine Eingabe von den Bereichen A1und B1und gibt an die VBE sofortigen Fenster
Taylor Scott




2

Gema , 21 Zeichen

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

Kein Boolescher in Gema. Als das @get-switch{}/@set-switch{} -Funktionen 0 und 1 zur Darstellung von Schaltzuständen verwenden, werden auch 0 und 1 verwendet.

Die 2 Zeichenfolgen werden auf separaten Eingabezeilen übergeben.

Probelauf:

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 Bytes

Same@Map&:N

Probieren Sie es online!

Dies erfordert eine Reihe von Zeichenfolgen, z V["0001", "1 "]. Einfach ausgedrückt, Map&:Nist eine Funktion, die Nihr Argument abbildet und Sameprüft, ob das Array nur gleiche Mitglieder enthält. (Unterhaltsame Tatsache: Diese Funktion funktioniert für mehr als 2 Zeichenfolgenargumente.)


2

SNOBOL4 (CSNOBOL4) , 42 Bytes

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

Probieren Sie es online!

Gibt 1 für wahr, nichts für falsch aus. Da (Leerzeichen) der Verkettungsoperator in SNOBOL ist, EVALergibt eine Zahl mit führenden / nachfolgenden Leerzeichen die Zahl selbst und kümmert sich ordentlich um alle führenden Nullen. EQtestet auf numerische Gleichheit, setzt bedingt OUTPUTauf 1 an Success.


2

Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 29 tokenisierte BASIC-Bytes

Neue Lösung dank Neil (danke für den Tipp).

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

Diese Lösung erfordert Benutzereingaben. Geben Sie also zwei Zeichenfolgen mit Leerzeichen und / oder führenden Nullen ein oder zwei Zeichenfolgen mit ungleichem numerischen Wert. 0ist falsch und1 ist true, sobald Zeile 3 den Wert jeder eingegebenen Zeichenfolge verglichen hat.

Alte Lösung: Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 46 tokenisierte BASIC-Bytes

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

Die eigentliche Prüfung erfolgt in Zeile drei, die nur ~ 16 tokenisierte BASIC-Bytes enthält. Wenn Sie also jedes Testfallpaar im Direktmodus eingeben, werden ca. 30 Byte aus der Liste entfernt. Beachten Sie, dass diese Byteanzahl das nicht enthält var stack.


1
Solltest du nicht INPUT A$und verwenden INPUT B$? Ich glaube auch nicht, dass du das ()s brauchst .
Neil

Ja, ich könnte das auch gebrauchen - ich wollte nur einen Proof of Concept
Shaun Bebbers

2

APL (NARS2000) , 7 Byte

=⍥⍎

Nun ja, ich weiß, dass NARS2000 hier nicht mit Dyalog konkurrieren kann, da es Unicode verwendet, aber ich dachte, ich würde lieber angeben ( Komposition in NARS2000 genannt, obwohl es eigentlich nichts mit Komposition zu tun hat), was Dyalog nicht tut habe da ein eingebautes gesehen und habe es hier noch nie benutzt. In Dyalog muss es implementiert werden als{(⍵⍵⍺)⍺⍺⍵⍵ ⍵} . Es ruft die monadische Funktion des rechten Operanden sowohl für das linke als auch für das rechte Argument auf und ruft dann die dyadische Funktion des linken Operanden für die Ergebnisse auf.

Hier ist der rechte Operand ( Execute , dh eval) und der linke Operand ist =( Equal To , dh überprüfe, ob seine Argumente gleich sind).


Sollen Komposition und Ausführung als Leerzeichen gerendert werden?
John Dvorak

@ JohnDvorak um, nein? Sie sind keine Leerzeichen, das zweite Zeichen ist U + 2365 APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS und das dritte ist U + 234E APL FUNCTIONAL SYMBOL DOWN TACK JOT.
Erik der Outgolfer

@JohnDvorak Unabhängig davon, in welcher Schriftart Sie dies anzeigen, sind möglicherweise keine Symbole für diese Codepunkte vorhanden.
Οurous

@ Οurous Ich vermute sehr, dass dies auch der Fall ist, aber wenn Sie eine gut aktualisierte Software verwenden, sollten Sie keine Probleme haben, solche Zeichen anzuzeigen.
Erik der Outgolfer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.