Twoje zadanie jest proste . Ustalić, czy jeden ciąg jest równy Pozostałe (adres, wartość) bez użycia operatorów równości (takich jak ==
, ===
lub .equal()
) lub nierówność ( !=
, !==
), coś podobnego do innych języków. Oznacza to wszędzie! Nie możesz używać tych operatorów nigdzie w kodzie. Możesz jednak używać przełączników, takich jak !exp
bezpośrednie porównywanie exp != with something else
.
Ponadto nie można używać żadnych funkcji, takich jak strcmp , strcasecmp itp.
Jak dla operatorów porównania ( >=
, <=
, >
, <
), są również zabronione . Zdaję sobie sprawę, że niektóre odpowiedzi to obejmują, ale naprawdę chciałbym zobaczyć więcej odpowiedzi, które nie ograniczają operatora równości.
Pokazano przykład użycia PHP:
<?php
$a = 'string';
$b = 'string';
$tmp = array_unique(array($a, $b));
return -count($tmp) + 2;
Po prostu zwróć true lub false (lub coś, co ocenia w języku na true lub false, np. 0 lub 1), aby wskazać, czy ciągi pasują do siebie. Ciągi powinny być zakodowane na stałe, jak pokazano w powyższym przykładzie. Ciągi nie powinny być liczone w golfie, więc jeśli zadeklarujesz zmienną przed ręką, nie licz deklaracji.
Odpowiedzi:
Python
49 45 18 22 1514(+ 3, jeśli brane są pod uwagę zmienne łańcuchowe)
Łańcuch powinien być zakodowany na stałe przy dwóch wystąpieniacha
i jednym wystąpieniub
otoczony cudzysłowami.a
ib
powinien być wstępnie zainicjowany na ciągi.Powłoka Python, 9
(+ 3, jeśli brane są pod uwagę zmienne łańcuchowe)
Dane wyjściowe w powłoce
Wyjaśnienie
Tworzy dict (tablicę skrótów) z kluczem pierwszego i drugiego łańcucha. Jeśli drugi ciąg znaków jest taki sam, wartość pierwszego jest zastępowana wartością drugiego. Na koniec wypisujemy wartość pierwszego klucza.
EDYCJA: OP dozwolone 0/1 zamiast False / True, a także przy użyciu wstępnie zainicjowanych zmiennych.
źródło
a
ib
nie należy ich włączać, ciągi powinny być tam na stałe zakodowane, dlatego dodałem + 2 * len (str1) + len (str2) + 6 (')Python (
1711):(Sprawdza, czy b jest zawarte w a, a a jest zawarte w b, jeśli nie było to jednoznaczne z kodu).
Alternatywny python: (
87)pochodzące z rozwiązania Go Verelst's:
Bonus: działa dla każdego typu.
EDYTOWAĆ:
Poczekaj chwilę, po prostu przeczytaj, że możesz również bezpośrednio programować ciągi i nie musisz liczyć cytatów ... (a przynajmniej tego, co robi golfscript). Więc ... Python na równi z golfscript? O mój!
Alternatywny alternatywny Python (
54):(dzięki Claudiu)
oryginalny:
Alternative Alternative Alternative Bendy-ruly Python (2):
Nic nie powiedziano o słowach kluczowych do porównania (to nie jest poważne przesłanie, tylko coś, co przyszło mi do głowy ...)
źródło
b in a in b
.in
i[a]
. to znaczyb in[a]
powinno działać.JavaScript,
1110Ciągi muszą być przechowywane w punktach a i b.
Edycja: dzięki Danny za wskazanie,
|
wystarczy zamiast||
źródło
|
?Ruby, 11 lat
Sprawdza, czy każdy ciąg jest zawarty w drugim.
źródło
!(a<b||b<a)
byłoby tak samo ...Python - 11 (bez ciągów znaków)
źródło
a<=b<=a
tylko 7 znaków. Chociaż nie wiem, czy porównanie<=
byłoby uważane za „nierówność”. Z pytania wynika, że każde porównanie, które nie jest sprawdzeniem równości, jest w porządku, co pozwoliłoby<=
.GolfScript (5 znaków)
Dość prosty port implementacji referencji PHP. Pozostawia
0
(= fałsz) na stosie, jeśli ciągi są takie same, lub1
(= prawda), jeśli są różne.źródło
1
jeśli ciąg znaków jest taki sam, a2
jeśli są różne.'string1''string1'].&,1&
działaJavaScript (45 bajtów):
Oto inne rozwiązanie w JavaScript.
Przestrzeń jest ważna.
c
powinno byćtrue
.źródło
!a.replace(b,'')
liczy. Tak więc liczba znaków powinna wynosić 16. Właściwie niektórzy nawet liczą 14, ponieważ możesz bezpośrednio określić ciąg.C ++,
635856źródło
auto
zamiastconst char*
?coreutils: uniq -d
Wystarczy wpisać dwa ciągi jako standardowe wejście potoku i
uniq -d | grep -q .
nic nie wydrukuje, ale zwróci wartość sukcesu lub błędu. Jeśli chcesz wydrukować wartość logiczną, po prostu zamień nauniq -d | grep -c .
Ile postaci? Pozwalam ci liczyć;
uniq -d|grep -q .
bez dodatkowych spacji ma 17 znaków, ale ponieważ całe zadanie jest wykonywane przez uniq, powiedziałbym, że to rozwiązanie jest 0-znakowe w ...uniq
własnym języku!W rzeczywistości
uniq -d
wypisze jedną linię, jeśli dwa ciągi są identyczne, i nic, jeśli będą różne.źródło
Ciągi muszą być przechowywane w punktach a i b. Nie będzie działać, jeśli którykolwiek z nich jest
null
.C #, 53
C #, 28
źródło
PHP - 49 znaków
źródło
!strlen(str_replace($a,'',$b));
powinno działać: powinien zwrócić 1, jeśli dwa ciągi znaków są równe?$a == 'foo'
i$b = 'foofoo'
:)!strlen(preg_replace("/{$a}/", '', $b, 1));
i ma 45 znaków?APL (
89)Aktualizacja: stary nie działa dla ciągów o różnych długościach.
↑⍺⍵
: utwórz matrycę⍺
w pierwszej linii i⍵
drugiej linii, wypełniając puste miejsca spacjami.∊⌿
: Dla każdej kolumny sprawdź, czy górny wiersz zawiera dolny wiersz (jak w starej wersji).∧/
: Weź logiczną wartośćand
wszystkich wartości.Stary:
⍺∊¨⍵
: dla każdej kombinacji elementów w⍺
i⍵
sprawdź, czy element from⍺
zawiera element from⍵
. Ponieważ w ciągu wszystkie będą to pojedyncze znaki, a ciąg zawiera sam siebie, jest to w zasadzie porównanie każdej pary znaków.∧/
: weź logikę i wszystkie wartości (jeśli wszystkie znaki pasują, ciągi znaków są równe)źródło
Python - 12
To rozwiązanie wykorzystuje zestawy. Po odjęciu równych zbiorów wynik będzie pusty, który ma wartość logiczną False. Negowanie spowoduje, że wartość True dla aib będzie równa ciągom znaków.
Edycja: Podziękowania dla Petera Taylora za wskazanie niepotrzebnych białych znaków.
źródło
a="s", b="ss"
?"s"!="ss"
tego czasu będzie generowanyFalse
. Zachowana jest również wrażliwość na wielkość liter. To nawet działaa="", b="s"
. Kod nie konwertuje ciągów znaków na zestawy, ale tworzy zestawy zawierające ciągi znaków.{}
to nie to samo coset()
. Możesz zapisać 1 znak, usuwając białe znaki.{a}
jest równoważne zset([a])
.not {a}-{b}
?C - 62
Przetestowany. Zadzwoń jako
e(str1, str2)
Pomyśl o tym, jeśli nie policzysz
char*p,char*q
, co wydaje się sprawiedliwe, to tylko 49 bajtów :)źródło
np
inq
. Jedna pętla zrobi, ponieważ jeśli dojdziesz do końca jednego łańcucha przed drugim, będą miały inną wartość.*p&*q
może zbyt wcześnie zatrzymać pętlę (np.'0'&'A'==0
)*p=='0'
&*q=='A'
, chcemy, aby pętla zatrzymała się wcześniej, ponieważ wiemy, że łańcuchy nie są równe.Haskell - 9
Zauważ, że podobnie jak wiele wpisów tutaj jest to tylko wyrażenie. To nie jest program Haskell.
źródło
Java -
162147 znakówChodzi o porównanie różnicy każdego bajtu, te same bajty będą miały różnicę 0. Program będzie rzucał,
java.lang.ArrayIndexOutOfBoundsException
gdy bajty są różne (spróbuj uzyskać dostęp do indeksu ujemnego) lub gdy łańcuchy mają różną długość. Złapie wyjątek i zwróci 0 (łańcuchy nie są równe) lub zwróci 1 w przeciwnym razie (łańcuchy równe).Sprężony:
Normalna:
źródło
PHP
Ten skrypt może nie mieć żadnego narzędzia, ale przynajmniej zapewnia sposób porównywania ciągów.
PHP
Inny:
źródło
Prolog 7
Wykorzystuje to funkcję dopasowania wzorca w Prologu, aby ujednolicić 2 argumenty z predykatem, który skutecznie sprawdza równość równoważności, gdy nie ma zmiennej niezwiązanej .
Przykładowe użycie:
Technicznie rzecz biorąc, zachowanie tego rozwiązania jest
=/2
raczej zachowaniem operatora unifikacyjnego niż tego==/2
, który sprawdza równoważność terminu. Różnica pokazuje, kiedy zaangażowane są zmienne niezwiązane. W tym rozwiązaniu, po podaniu zmiennej niezwiązanej, predykat zwróci się,true
gdy unifikacja się powiedzie. Dla porównania==/2
porówna kolejność terminu bez unifikacji.źródło
PHP, 21
Ten wykonuje zadanie przy użyciu zmiennej pośredniej.
Lub, jeśli nie potrzebujesz, to być bool
EDYCJA : Zapomniałem obsługiwać przypadku, w którym próbujesz porównać dwa puste ciągi, więc kod jest teraz
czyli 21 znaków.
źródło
CPython: 6
Użycie
is
jest oczywiście dość podejrzane, ale ponieważ zadanie wyraźnie wzywa do ustalenia równości wartości, a nie odniesienia, iis
porównuje tylko tożsamość obiektu, wydaje mi się, że może nie znaleźć się na liście zabronionych operatorów.Oczywiście istnieje również pytanie, czy jest to w ogóle poprawne; działa na wszystkich moich systemach, ale jest specyficzne dla implementacji i prawdopodobnie nie zawsze będzie działać, jeśli ciągi znaków nie zostaną zdefiniowane ręcznie w interaktywnym tłumaczu.
źródło
Język Mathematica / Wolfram, 15 bajtów
Dość zrozumiałe, ustawia każdy ciąg jako zestaw, a następnie sprawdza długość połączenia dwóch zestawów. Jeśli ciągi są takie same, zwraca 1, w przeciwnym razie zwraca 0. Jeśli wolno mi zwrócić „2” dla „różnych” i „1” dla „tych samych”, odejmij dwa bajty.
źródło
C 342 grał w golfa
Uwaga: Visual Studio narzeka, jeśli nie używasz ich bezpiecznych metod, np. Gets_s. CodeBlocks z mingw kompiluje się bez ostrzeżeń.
C 655 nie grał w golfa
Kod tworzy ważoną sumę znaków dla każdego łańcucha. Jeśli różnica wynosi zero, są one równe, w tym 2 puste ciągi:
źródło
Pyton
Jest długi i nie jest piękny, ale to mój pierwszy wpis!
źródło
PHP, 68 bajtów
Zakładam, że zabronione jest używanie jakichkolwiek operatorów porównania. Tak
<
lub>
są uwzględnione.Chodzi o bitowe XOR. W różnych językach ten operator ma inną składnię - pokażę przykład dla PHP. Tam jest dostępny z
^
. Niestety, jego zachowanie względem łańcuchów nie jest tak dobre, jak mogłoby być, więc musisz wcześniej sprawdzić długość łańcucha. Jest tak, ponieważ w PHP xor spowoduje usunięcie dłuższego łańcucha do długości krótszego łańcucha.Następną rzeczą jest poprawna praca z ciągami, ponieważ pojedynczy
xor
nie da wyniku, dostępnego do dalszych operacji w PHP. Właśnie dlategounpack()
został użyty. Tak więc kod będzie:Jest dłuższy niż opcja z
<
/,>
ale nie będzie ich używać. Ważna jest także żonglerka typu PHP (więc do pustej tablicy zostanie rzutowanefalse
). A może istnieje prostszy sposób, aby sprawdzić, czy tablica zawiera niezerowe elementy ( Edytuj : podczas pisania tego, jest dobratrim()
odpowiedź w innej odpowiedzi, dzięki czemu możemy pozbyć się operacji tablicowych)Ale wierzę, że istnieją języki, w których możemy to zrobić
a ^ b
- dosłownie, uzyskując wynik. Jeśli jest0
(traktowane ze wszystkich uzyskanych bajtów) - nasze ciągi są równe . To bardzo proste, a nawet więcej niż proste<
lub>
rzeczy.źródło
grep 14 znaków
Oczywiście liczę tylko kod grep; dwa ciągi znaków znajdują się w dwóch kolejnych wierszach na wejściu (potoku lub pliku, a nawet sesji interaktywnej).
źródło
Matlab: 12 znaków (po ciągach znaków w zmiennych)
Kod zawierający zadania będzie:
źródło
Bardzo szalony sposób
Po prostu dla zabawy, ale na wiele sposobów, aby się nie udać, jeśli się nad tym zastanowić. Co więcej, nie zapominaj, że łańcuchy zostaną WYKONANE przez powłokę.
Dobrym kontrprzykładem jest porównywanie „łańcucha” jako pierwszego łańcucha i „rm -Rf /” jako drugiego łańcucha; po prostu sprawdź jako root i zobacz: powie „true”, chociaż oba łańcuchy oczywiście nie są takie same.
źródło
JavaScript [18 bajtów]
LUB
Zwróci to
true
jeślia == b
ifalse
jeślia =/= b
. Logika polega na tworzeniu obiektu o wartościa
jako właściwości i zwracaniu1
lubundefined
w przypadku, gdy właściwośćb
wartości istnieje lub nie istnieje w tym obiekcie.źródło
!!
nie jest to konieczne1
lubundefined
(lub obiekt /undefined
w drugim przypadku).18-2 = 16 bytes
.JavaScript [15 bajtów]
Zwróci to
true
jeślia == b
ifalse
jeślia =/= b
. Skrypt szuka wartościb
w tablicy, która zawiera pojedynczy element wartościa
.źródło
C -
8683Obvioulsy nie jest najkrótszy, ale to nie działa ze zmiennymi ciągów i zamiast tego przyjmuje ciągi jako dane wejściowe z konsoli. Poza tym podobają mi się rekurencyjne main, nawet jeśli oczywiście nie jest to najkrótsza wersja. Ale z pewnością najmniej wskazane.
źródło
char** v
można zapisać jakochar**v
. Istnieją pewne wyjątki (jak42 / *pointer
), ale w większości przypadków spacje można bezpiecznie usunąć w pobliżu znaków specjalnych.