Porównaj dwie liczby podane jako ciągi

21

Mam problem w pracy. Muszę porównać dwie liczby, które są ciągami znaków z dwóch różnych baz danych. Liczby mogą zawierać początkowe zera i / lub początkowe / końcowe spacje. Więc mogę mieć "0001 "z jednej bazy danych iz " 1 "drugiej.

Rozwiązałem problem w języku C # za pomocą następującego kodu:

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

Wyzwanie

To naprawdę proste wyzwanie, odpowiednie dla początkujących i każdego rodzaju ezoterycznych języków. Biorąc pod uwagę dwie liczby jako ciągi znaków, które mogą zawierać początkowe zera i / lub wiodące / końcowe spacje, napisz najkrótszy kod, który sprawdza, czy dwa ciągi reprezentują tę samą liczbę.

  • Dane wejściowe muszą być dwoma łańcuchami lub odpowiednikiem w twoim języku (tablica znaków jest OK) i zawsze będą reprezentować wartości całkowite większe od zera.
  • Dane wyjściowe muszą być dowolnymi dwiema spójnymi wartościami, które reprezentują prawdziwą wartość i wartość falsey.

Przykłady

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

To jest , więc wygrywa najkrótszy kod dla każdego języka!

Charlie
źródło
3
...
user202729,
8
Tym razem nie zainspirowały go twoje dzieci ...
Cairn coinheringaahing
2
@cairdcoinheringaahing moje własne dzieło jest moim drugim źródłem inspiracji. Wiem, że jest to bardzo proste wyzwanie, ale myślę, że te łatwe wyzwania są czasem potrzebne. Następnym razem spróbuję wymyślić coś trudniejszego.
Charlie,
Nawiasem mówiąc, wydaje mi się, że moje inspirowane pracą wyzwania są albo zbyt łatwe, albo zbyt trudne ...
Charlie
@JonathanAllan nie, każdy ciąg wejściowy będzie reprezentował tylko jedną liczbę. Pomiędzy ciągami nie będzie żadnych spacji.
Charlie,

Odpowiedzi:

22

JavaScript , 11 bajtów

a=>b=>+a==b

Nadużywanie zasad obsady Javascript jest trochę; +awymusza ana typ numeryczny.

-6 bajtów dzięki Shaggy i Martinowi Enderowi ♦

Również fajne ujęcie LiefdeWen :

a=>b=>~~a==~~b
elementbound
źródło
2
Witamy w PPCG. Możesz to zrobić w 11 bajtach, używając curry i konwertując tylko jedno z danych wejściowych na liczbę całkowitą: tio.run / ##y0osSyxOLsosKNHNy09J/... Należy również pamiętać, że jeśli funkcja nie odwołuje się do samej siebie, nie trzeba dołączać zmiennej przypisanie w liczbie bajtów.
Kudłaty
2
Witamy w PPCG! Funkcje bez nazw są w porządku, więc nie potrzebujesz c=, a curry jest również w porządku, więc możesz użyć a=>b=>...zamiast (a,b)=>. W końcu mój JavaScript jest trochę zardzewiały, ale myślę, że coś w !(a-b)tym stylu też by działało?
Martin Ender,
1
Zobacz wskazówki dotyczące gry w golfa w ES6 (i ogólne wskazówki gry w golfa JS ), aby uzyskać więcej sztuczek, aby wycisnąć bajty ze swoich rozwiązań.
Kudłaty
1
Fajna wersja jest fajna, ale ma ograniczony zakres, spróbuj wpisać „9123456789” i „533522197”. Są to ciąg reprezentujący wartości liczb całkowitych, mieszczą się w prawidłowym zakresie liczb całkowitych w javascript (ale ponad 32-bitowym)
edc65
1
Twój tekst nie pasuje już do kodu; nie ma odejmowania. Wymuszasz ana typ liczbowy z jednością +.
Peter Cordes,
18

05AB1E , 1 bajt

Q

Wypróbuj online!

Wyjaśnienie

Porównanie równości Qautomatycznie spróbuje ocenić ciągi znaków jako ints przed porównaniem.

Emigna
źródło
Naprawdę? I pomyślałem, że |0+Qbył wystarczająco krótki ...
Erik the Outgolfer
18

Operacyjny język skryptowy Flashpoint , 33 bajty

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

Zadzwoń z:

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]

Wydajność:

Alternatywna wersja (41 bajtów):

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

Nadal 5 bajtów krótszych niż te bardziej proste f={t=_this;call(t select 0)==call(t select 1)}

39 bajtów:

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

count(który zwraca rozmiar tablicy) działa zamiast forEach, ponieważ można nadać mu „lambda”, która jest używana jako warunek do zliczania tylko elementów tablicy, które spełniają ten warunek. „Warunek” użyty w tym przypadku nie jest prawidłowym warunkiem, ale nie ma tutaj znaczenia, ponieważ nie powoduje błędu, a zwracana wartość countnie jest potrzebna.

Steadybox
źródło
7
Podoba mi się różnorodność sytuacji, w których robisz zrzuty ekranu swojego kodu.
Οurous,
11

Taxi , 488 bajtów

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.

Wypróbuj online!

Nie golfowany:

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 jest (względnie) dobrze przystosowane do tego wyzwania, ponieważ ciągi są jedynym dozwolonym typem wejścia lub wyjścia. The Babelfisheryjest tym, co konwertuje ciągi na liczbę (i odwrotnie) i obsługuje usuwanie wszystkich spacji i zer wiodących. Będzie również obsługiwać liczby ujemne, jeśli -będzie znajdować się bezpośrednio przed pierwszą cyfrą. Następnie Equal's Cornersprawdza dwie wartości względem siebie i Writer's Depotudostępnia dane wyjściowe w formacie ciągu. Wyjście jest 1dla prawdy i 0dla falsey.

Inżynier Toast
źródło
1
Niezłe! Właśnie z ciekawości, dlaczego okno debugowania pokazuje komunikat error: The boss couldn't find your taxi in the garage. You're fired!?
Charlie,
6
@Charlie Taxi wymaga od Ciebie powrotu do garażu taksówek po zakończeniu trasy. Jeśli nie przywrócisz samochodu, zostaniesz zwolniony. (Musisz także koniecznie zatrzymać się i uzupełnić paliwo co jakiś czas, albo zabraknie Ci paliwa.) W pytaniach związanych z golfem , które nie uniemożliwiają wyjścia do STDERR, generalnie nie martwię się o zwolnienie. Możesz to dodać, aby pozbyć się błędu, jeśli nie chcesz stracić pracy:Go to Taxi Garage:n 1 r 1 l 1 r.
Inżynier Toast
Ta odpowiedź i jej komentarze są całkowicie surrealistyczne. Kocham tę społeczność.
Prawa noga
@RightLeg Mój ulubiony program Taxi , który napisałem, zajął mi dwa tygodnie i dużo debugowania. Ale naprawdę chcesz wycieczkę? Sprawdź Szekspira .
Engineer Toast
10

C (gcc) , 27 bajtów

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

Z -O0 (co jest ustawieniem domyślnym).

Wypróbuj online!

C, 32 bajty

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

Wypróbuj online!

Steadybox
źródło
2
@Charlie W C łańcuchy są tablicami char, a kiedy przekazujesz tablicę do funkcji, faktycznie przekazujesz wskaźnik do pierwszego elementu tablicy. Tutaj wskaźniki do chartablic są domyślnie konwertowane na liczby całkowite po przekazaniu do funkcji, a liczby całkowite są konwertowane z powrotem na wskaźniki podczas wywoływania atoi.
Steadybox
1
który może wybuchnąć okropnie na platformie, na której wskaźniki są szersze niż ints ... po prostu mówiąc, oczywiście, że tutaj jest w porządku dla standardów strony :)
Felix Palmen
2
Jeśli chcesz użyć absurdalnego badziewia, s=foo;zamiast tego return foo;musisz oznaczyć to jako „x86 gcc z wyłączoną optymalizacją”, a nie tylko „C”, ponieważ ten kod nie zwraca wartości z wyjątkiem artefaktu implementacji.
Peter Cordes
2
Poszedłem sprawdzić, czy są jakieś architektury, w których s=retval;zamiast się return retval;zepsuć. Wygląda na to, że wewnętrzna logika gcc (z -O0tylko) faktycznie traktuje ostatnie wyrażenie jako wartość zwracaną, być może w ten sam sposób, w jaki działa wyrażenie wyrażenia GNU C. (Ale to wymaga s=). Na ARM32 oblicza ==wynik r3, a następnie używa dodatkowej wartości, mov r0, r3aby uzyskać wartość zwracaną! Więc to nie jest hack specyficzny dla x86, to gcc -O0hack, który gcc wydaje się dawać z siebie wszystko.
Peter Cordes,
2
@ KenY-N Brakuje Ci całego punktu golfa C Code. Chodzi o znalezienie konkretnych przypadków hacky edge, w których można wprowadzić minimalną ilość kodu i uzyskać pożądane wyniki, nie zapewniając przenośnego doświadczenia.
8

J , 4 bajty

=&do

Porównaj =po &dokonaniu oceny do. Może być również =&". Wypróbuj online!

FrownyFrog
źródło
Co ciekawe, zadziała to zarówno dla negatywów, ponieważ inne języki je rozumieją (np. -10), Jak i negatywów, gdy J je rozumie (np. _10) Ze względu na sposób działania monadycznego -.
cole
6

Siatkówka , 11 bajtów

.+
$*
D`
¶$

Wypróbuj online!

Dane wejściowe są oddzielone od linii, ale zestaw testów używa separacji przecinków dla wygody. Wydruki1 dla równości i 0nierówności.

Wyjaśnienie

.+
$*

Konwertuj każdą linię na unary. To ignoruje wiodące zera i spacje.

D`

Deduplikacja: wyczyść drugą linię, jeśli obie są takie same.

¶$

Sprawdź, czy łańcuch kończy się teraz na linii.

Martin Ender
źródło
3

Trójkątność , 17 bajtów

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

Wypróbuj online!

Trójkątność jest raz konkurencyjna!

Jak to działa

Trójkątność wymaga, aby kod miał trójkątny rozkład kropek. Oznacza to, że długość każdego wiersza musi być równa liczbie wierszy pomnożonej przez 2 i zmniejszonej, a każdy wiersz musi mieć (z każdej strony) liczbę kropek równą swojej pozycji w programie (dolny wiersz to wiersz 0, ten powyżej to rząd 1 i tak dalej). Mając to na uwadze, przeanalizujmy, jak działa kod:

..).. || 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.
Pan Xcoder
źródło
3

Alice , 7 bajtów

X/n
o@i

Wypróbuj online!

Działa dowolny separator inny niż cyfrowy. Wydruki1 dla równości i0 nie tylko.

Wyjaśnienie

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.
Martin Ender
źródło
3

Japt , 3 bajty

¥Vn

Spróbuj

Konwertuje drugie wejście na liczbę całkowitą i porównuje równość z pierwszym.

Kudłaty
źródło
3

jq, 24 znaki

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

2 ciągi znaków są przekazywane jako elementy tablicy.

Przykładowy przebieg:

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

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

Wypróbuj online! ( Wszystkie przypadki testowe )

człowiek w pracy
źródło
3

Łuska , 3 bajty

¤=r

Wypróbuj online!

Wyjaśnienie

¤    -- combine both arguments of ..
 =   -- .. equality ..
  r  -- .. with read
ბიმო
źródło
1
Jeśli weźmiesz dane wejściowe jako listę dwuelementową, Ërrównież działa.
Zgarb
3

PowerShell , 20 bajtów

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

Podobne do odpowiedzi JavaScript, tylko dłużej, ponieważ PowerShell nie ma curry. Używa +rzutowania pierwszego ciągu na liczbę całkowitą, a następnie-eq uals automatycznie rzuca drugi ciąg na liczbę całkowitą. Dane wyjściowe to prawda / fałsz.

Wypróbuj online!

AdmBorkBork
źródło
3

PowerShell , 19 bajtów

$args-join'-eq'|iex

Wypróbuj online!

-jointablica argumentów ( $args) z reprezentacją ciągu operatora porównania ( -eq), a następnie oceń wyrażenie za pomocą Invoke-Expression( iex).

briantist
źródło
Ciekawy. Zastanawiam się, jak sobie +radzisz bez potrzeby rzucania na liczbę całkowitą, podczas gdy moje łamie się, jeśli usunę, ponieważ wykonuje sprawdzanie równości ciągów.
AdmBorkBork
@AdmBorkBork, ponieważ generuję kod programu PowerShell, a następnie go wykonuję, a ponieważ początkowe zera i początkowe / końcowe spacje nie mają znaczenia dla interpretera, „po prostu działa”. Jeśli dwie liczby są, 00009 a 077 wynikowy kod to 00009 -eq077 , doskonale poprawny fragment kodu. W czasie wykonywania masz do czynienia bezpośrednio z ciągiem, więc musisz rzucić go najpierw, aby operacja została wykonana na liczbach.
briantist
Tak, to ma sens. Dziękuję za wyjaśnienie.
AdmBorkBork
3

Q (Kdb +), 13 bajtów

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

Wyjaśnienie

(x; y): lista dwóch danych wejściowych.

„J” $: rzutowanie każdego wejścia na długi (7j) typ z ciągu (10c), który może poprawnie interpretować
białe znaki i początkowe zera.

= /: sprawdza równość elementów na liście (każda kolejna para).
Ponieważ jest tylko jedna para, zwraca pojedynczy boolian 0b / 1b.

Sidney
źródło
Witamy w PPCG! Zazwyczaj docenia się link do interpretera / kompilatora online, a jeśli nie jest to oczywiste, również wyjaśnienie.
FantaC
Dzięki! Dodano wyjaśnienie. Wątpię, czy istnieje interpreter online dla q, rzuciłem okiem i nie mogłem go znaleźć.
Sidney
Powiedziałbym, że należy to zapisać jako lambda, w tym nawiasy klamrowe, tj. {=/["J"$(x;y)]}Dla 15 bajtów ... Chociaż dla 8 bajtów można to mieć: (~/)"J"$jeśli tylko używasz REPL i przekazujesz dane wejściowe jako listę ciągów .. lub {(~/)"J"$x}dla 11 jako funkcji.
streetster
3

T-SQL, 35 bajtów

Zgodnie z naszymi standardami dane są wprowadzane za pomocą wcześniej istniejącej tabeli tz varcharpolami ai b.

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

Zwraca, 1jeśli pasują, jeśli nie pasują 0.

Kilka funkcji matematycznych (w tym SQL ABS, FLOORi CEILING) zrobi niejawna konwersja do numeryczny jeśli podane parametry ciąg ten jest krótszy niż jawne CAST(a AS INT)lub CONVERT(INT,b)i działa w tym przypadku, ponieważ wiemy, że wartości wejściowe są zawsze pozytywne.

IIF jest specyficzny dla MS SQL 2012 i wyższych, więc nie ma gwarancji na inne implementacje.

BradC
źródło
3

Excel VBA, 27 16 bajtów

-9 Dzięki @Nayrb i @TaylorScott

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

Gdzie wpisujesz wartości w komórkach za pomocą 'string.

Gdzie xi ysą wejściowymi ciągami znaków i zsą wynikiem logicznym.

Jeśli CInt (x) = CInt (y) to z = 1

Korzystanie z CInt

danieltakeshi
źródło
1
Dlaczego nie: z = xy = 0?
Nayrb
Niestety to rozwiązanie jest nieprawidłowe, ponieważ nie wymaga danych wejściowych i opiera się raczej na posiadaniu predefiniowanych wartości ( które uznano za niezgodne z regułami społeczności ) i generowaniu danych wyjściowych do zmiennej ( która jest również niezgodna z regułami społeczności )
Taylor Scott
Ponieważ dla prawidłowej roztworu być może vbe natychmiastowe funkcji okna, jak na przykład ?[Int(A1)=Int(B1)], że wykonuje wejściowe z przedziałów A1i B1i wyjścia do bezpośredniego okna VBE
Taylor Scott
3

R , 28 27 bajtów

!diff(as.double(scan(,'')))

Odczytuje liczby jako ciągi znaków, konwertuje je na liczby podwójne i sprawdza, czy ich różnica nie jest równa zero.

Wypróbuj online!

-1 bajt dzięki Giuseppe

Robert Hacken
źródło
Po prostu ""wystarczy
Giuseppe
2

Haskell, 20 bytes

-11 bajtów dzięki Laikoni. -2 bajty dzięki Zgarb.

a#b=0+read a==read b

Wypróbuj online!

totallyhuman
źródło
1
@Laikoni It's even better to not bind read: a#b=0+read a==read b
Zgarb
2

Gema, 21 characters

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

No boolean in Gema. As the @get-switch{}/@set-switch{} functions use 0 and 1 to represent switch statuses, also used 0 and 1.

The 2 strings are passed on separate input lines.

Sample run:

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
manatwork
źródło
2

Stacked, 8 bytes

[#~\#~=]

Try it online!

Explanation

[#~\#~=]   anonymous function
 #~        eval TOS
   \       swap top two
    #~     eval TOS
      =    push equality of top two
Conor O'Brien
źródło
2

Attache, 11 bytes

Same@Map&:N

Try it online!

This takes an array of strings, such as V["0001", "1 "]. Simply stated, Map&:N is a function that maps N over its argument, and Same checks that the array contains only equal members. (Fun fact: this function works for more than 2 string arguments.)

Conor O'Brien
źródło
2

SNOBOL4 (CSNOBOL4), 42 bytes

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

Try it online!

Outputs 1 for truthy, nothing for falsey. Since (space) is the concatenation operator in SNOBOL, EVALing a number with leading/trailing spaces yields the number itself, and it also neatly takes care of any leading zeroes. EQ tests for numerical equality, conditionally setting OUTPUT to 1 on Success.

Giuseppe
źródło
2

Sinclair ZX81/Timex TS1000/1500 BASIC, ~29 tokenized BASIC bytes

New solution thanks to Neil (thanks for the tip).

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

This solution requires user input, so enter in two strings with white spaces and/or leading zeros, or enter two strings of non-equal numeric value; 0 is false and 1 is true once line three has compared the value of each string entered.

Old solution: Sinclair ZX81/Timex TS1000/1500 BASIC, ~46 tokenized BASIC bytes

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

The actual check is done in line three, which is only ~16 tokenized BASIC bytes; so entering each test case pair using direct mode will save ~30 bytes from the listing. Note that this byte count does not include the var stack.

Shaun Bebbers
źródło
1
Shouldn't you use INPUT A$ and INPUT B$? Also I don't think you need the ()s.
Neil
Yes, I could use that also - I just wanted a proof of concept
Shaun Bebbers
2

APL (NARS2000), 7 bytes

=⍥⍎

Well, yes, I do know NARS2000 can't compete over Dyalog here since it uses Unicode, but I thought I'd rather show off (called Composition in NARS2000, even though it's actually unrelated to function composition), something Dyalog doesn't have as a built-in and I haven't ever seen used here. In Dyalog, it has to be implemented as {(⍵⍵⍺)⍺⍺⍵⍵ ⍵}. What it does is call the right operand monadic function on both the left and right argument, and then call the left operand dyadic function on the results.

Here, the right operand is (Execute, i.e. eval) and the left operand is = (Equal To, i.e. check if its arguments are equal).

Erik the Outgolfer
źródło
Are composition and execute supposed to render as whitespace?
John Dvorak
@JohnDvorak um, no? They're not whitespace, the second char is U+2365 APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS and the third is U+234E APL FUNCTIONAL SYMBOL DOWN TACK JOT.
Erik the Outgolfer
@JohnDvorak Whatever font you're viewing this in may not have symbols for those codepoints.
Οurous
@Οurous I highly suspect that's the case too, but if you're using well-updated software you shouldn't have any problem viewing such chars.
Erik the Outgolfer