Sprawdź, czy ciągi są równe

29

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 !expbezpoś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.

David Chen
źródło
1
Czy konieczne jest wyprowadzenie wyniku, czy po prostu napisanie funkcji zwracającej wartość bool? Jeśli wymagane jest napisanie kompletnego programu, który mógłby tworzyć lub łamać odpowiedzi w językach z (względnie) znaczącym szablonem do stworzenia działającego pliku wykonywalnego, takiego jak Java i C # (taka jest natura bestii, ale to wyzwanie ma niewielki wpływ konkretnych wytycznych, pozostawiając wiele do interpretacji / wyboru). A jak mamy wziąć sznurki? Twarde kodowanie, odczyt ze STDIN, przekazać jako argumenty wiersza poleceń?
Tony Ellis,
Czy to [code-golf] czy [konkurs popularności]? To nie może być jedno i drugie.
Gareth,
Przepraszam, zmodyfikowałem swoje pytania, aby uwzględnić oba komentarze.
David Chen
Więc nierówność jest dozwolona?
user80551
Jeśli ciągi mają być zakodowane na stałe więcej niż jeden raz (każdy), czy muszę liczyć ich długość?
user80551

Odpowiedzi:

34

Python 49 45 18 22 15 14

(+ 3, jeśli brane są pod uwagę zmienne łańcuchowe)

print{a:0,b:1}[a]

Łańcuch powinien być zakodowany na stałe przy dwóch wystąpieniach ai jednym wystąpieniu botoczony cudzysłowami.

ai bpowinien być wstępnie zainicjowany na ciągi.


Powłoka Python, 9

(+ 3, jeśli brane są pod uwagę zmienne łańcuchowe)

{a:0,b:1}[a]

Dane wyjściowe w powłoce

>>> a = 'string'
>>> b = 'string'
>>> {a:0,b:1}[a]
1
>>> a = 'string'
>>> b = 'stringgg'
>>> {a:0,b:1}[a]
0
>>> {'string':0,'string':1}['string']
1
>>> {'stringggg':0,'string':1}['stringggg']
0
>>> 

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.

użytkownik80551
źródło
@manatwork Golfscript i perl poniżej używają 0/1, czy nie mogę tego użyć?
user80551
@manatwork Gotowe
user80551
Dla twojego drugiego rozwiązania liczę 16 zamiast 13.
Abhijit
@Abhijit ai bnie należy ich włączać, ciągi powinny być tam na stałe zakodowane, dlatego dodałem + 2 * len (str1) + len (str2) + 6 (')
user80551
+1 za spryt, ale to już nie jest najkrótszy;)
avalancha
20

Python ( 17 11):

b in a in b

(Sprawdza, czy b jest zawarte w a, a a jest zawarte w b, jeśli nie było to jednoznaczne z kodu).

Alternatywny python: ( 8 7)

pochodzące z rozwiązania Go Verelst's:

b in[a]

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 ( 5 4):

(dzięki Claudiu)

"string"in["string"]

oryginalny:

"string" in["string"]

Alternative Alternative Alternative Bendy-ruly Python (2):

"string"is"string"

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

.ıʇǝɥʇuʎs
źródło
2
Możesz użyć b in a in b.
George
2
Teraz jest duplikatem odpowiedzi Willema .
manatwork
Możesz sprowadzić go do siedmiu znaków, usuwając spacje między ini [a]. to znaczy b in[a]powinno działać.
user3002473,
Nie wiedziałem o tym. Dzięki :)
13ıʇǝɥʇuʎs
Imponujący! Też nie wiedziałem o tym
Willem
14

JavaScript, 11 10

Ciągi muszą być przechowywane w punktach a i b.

!(a>b|a<b)

Edycja: dzięki Danny za wskazanie, |wystarczy zamiast||

Adam Szabo
źródło
5
Nie, używam więcej niż i mniej niż operatorów. Nie były one zabronione w konkursie.
Adam Szabo
2
+1. Działa to również w wielu innych językach.
Archetypal Paul
3
Mogę się mylić, ale nie możesz go usunąć |?
Danny
3
Zdecydowanie nadzór nad regułami - funkcje porównywania są zakazane, podobnie jak operatory równości i nierówności , ale operatory porównania nie są wspomniane.
user2357112 obsługuje Monikę
2
@philcolbourn Tak, zasady uległy zmianie wczoraj, ale odpowiedź ma 2 dni.
Bakuriu
8

Ruby, 11 lat

s = 'string'
t = 'string'
!!s[t]&t[s]

Sprawdza, czy każdy ciąg jest zawarty w drugim.

histocrat
źródło
1
!(a<b||b<a)byłoby tak samo ...
David Herrmann
z wyjątkiem tego, że nie możesz użyć <>
philcolbourn
8

Python - 11 (bez ciągów znaków)

>>> a = 'ss'
>>> b = 's'
>>> a in b in a
False
Willem
źródło
W tym samym duchu: a<=b<=atylko 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 <=.
Bakuriu
tak, to fajny @Bakuriu, i zgadzam się, nie jest całkowicie jasne, kiedy zasady są łamane, czy nie. „w” w końcu także także jak zawiera równe oświadczenie.
Willem,
6

GolfScript (5 znaków)

'string1''string1'].&,(

Dość prosty port implementacji referencji PHP. Pozostawia 0(= fałsz) na stosie, jeśli ciągi są takie same, lub 1(= prawda), jeśli są różne.

Peter Taylor
źródło
nie działa dla mnie: 1jeśli ciąg znaków jest taki sam, a 2jeśli są różne. 'string1''string1'].&,1&działa
guy777,
@ guy777, zakłada to, że stos jest pusty na początku. Pytanie jest raczej niejasne w odniesieniu do fragmentów programu. Prawdopodobnie testujesz go jako cały program i zaczynasz od pustego łańcucha na stosie od standardowego wejścia.
Peter Taylor
5

JavaScript (45 bajtów):

Oto inne rozwiązanie w JavaScript.

var a='string',b='string',c=!a.replace(b,'');

Przestrzeń jest ważna.

cpowinno być true.

Ismael Miguel
źródło
Tylko !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.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳
5

C ++, 63 58 56

const char* a = "string";
const char* b = "string";
int main(){while(*a**b*!(*a^*b))++a,++b;return!(*a^*b);}
mattnewport
źródło
2
Czy możesz uciec autozamiast const char*?
aldo
Myślę, że tak, ale ponieważ zasady mówią, że zmienne łańcuchowe nie są wliczane do liczby znaków, nie zawracałem sobie nimi głowy.
mattnewport
Czy mógłbyś złożyć przyrosty w teście while i pozostawić ciało puste? A jeśli wybierzesz c zamiast c ++, usuń int na początku.
Orion
Nie widzę żadnego sposobu na zmniejszenie liczby znaków poprzez złożenie przyrostów w teście while bez trafienia w ten sam błąd dostępu do łańcucha po końcu, który wskazałem w odpowiedzi C Abhijita. Chcesz zwiększyć wartość aib tylko wtedy, gdy oba testy zakończą się pomyślnie (ani a, ani b nie wskazują na terminator zerowy, a a jest równe b). Jest prawdopodobnie sposób na poprawę tego, ale nie udało mi się go znaleźć!
mattnewport
3

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 ... uniqwłasnym języku!

W rzeczywistości uniq -dwypisze jedną linię, jeśli dwa ciągi są identyczne, i nic, jeśli będą różne.

Thomas Baruchel
źródło
3

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

string.IsNullOrEmpty(a.Replace(b,"")+b.Replace(a,""))

C #, 28

a.Contains(b)&&b.Contains(a)
Adam Szabo
źródło
3

PHP - 49 znaków

!(strlen($a)^strlen($b)|strlen(trim($a^$b,"\0")))
Jacek
źródło
Czy coś takiego nie !strlen(str_replace($a,'',$b));powinno działać: powinien zwrócić 1, jeśli dwa ciągi znaków są równe?
Damir Kasipovic
@ D.Kasipovic Ciekawe, ale myślę, że to się nie udaje $a == 'foo'i $b = 'foofoo':)
Jack
To prawda, a co powiesz na to, że limit zastępuje jeden !strlen(preg_replace("/{$a}/", '', $b, 1));i ma 45 znaków?
Damir Kasipovic
Przypuszczam, że zamiast tego można użyć kotwic, ale co ważniejsze, wymagałoby to również preg_quote () :)
Jack
3

APL ( 8 9)

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ść andwszystkich 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)
marinus
źródło
3

Python - 12

not({a}-{b})

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.

>>> a="string1"
>>> b="string2"
>>> not({a}-{b})
False

>>> a="string"
>>> b="string"
>>> not({a}-{b})
True

Edycja: Podziękowania dla Petera Taylora za wskazanie niepotrzebnych białych znaków.

Varicus
źródło
Jakie wyniki daje to a="s", b="ss"?
Peter Taylor
@PeterTaylor: Od "s"!="ss"tego czasu będzie generowany False. Zachowana jest również wrażliwość na wielkość liter. To nawet działa a="", b="s". Kod nie konwertuje ciągów znaków na zestawy, ale tworzy zestawy zawierające ciągi znaków.
Varicus,
Ach, {}to nie to samo co set(). Możesz zapisać 1 znak, usuwając białe znaki.
Peter Taylor
@PeterTaylor: Dziękujemy za zwrócenie uwagi na niepotrzebne białe znaki. {a}jest równoważne z set([a]).
Varicus
Jak o not {a}-{b}?
Winston Ewert
3

C - 62

e(char*p,char*q){for(;*p&*q&&!(*p^*q);q++,p++);return!(*p^*q);}

Przetestowany. Zadzwoń jakoe(str1, str2)

Pomyśl o tym, jeśli nie policzysz char*p,char*q, co wydaje się sprawiedliwe, to tylko 49 bajtów :)

Mrówka
źródło
Witamy na stronie! W przypadku wyzwań związanych z golfem zachęcamy do przycięcia jak największej liczby bajtów z kodu i umieszczenia liczby bajtów w nagłówku odpowiedzi. Sprawdź Porady dotyczące gry w golfa w wątku C, aby uzyskać kilka dobrych pomysłów.
Jonathan Van Matre
Naprawdę nie potrzebujesz npi nq. Jedna pętla zrobi, ponieważ jeśli dojdziesz do końca jednego łańcucha przed drugim, będą miały inną wartość.
Peter Taylor
Dzięki. Zdaję sobie z tego sprawę. Pracowałem nad moją skróconą wersją (powyżej). Wracając, aby sprawdzić, czy mogę to jeszcze bardziej skrócić.
Emmet
*p&*qmoże zbyt wcześnie zatrzymać pętlę (np. '0'&'A'==0)
ugoren
@ugoren: Jeśli *p=='0'& *q=='A', chcemy, aby pętla zatrzymała się wcześniej, ponieważ wiemy, że łańcuchy nie są równe.
Emmet
2

Haskell - 9

elem a[b]

Zauważ, że podobnie jak wiele wpisów tutaj jest to tylko wyrażenie. To nie jest program Haskell.

Rhymoid
źródło
2

Java - 162 147 znaków

Chodzi o porównanie różnicy każdego bajtu, te same bajty będą miały różnicę 0. Program będzie rzucał, java.lang.ArrayIndexOutOfBoundsExceptiongdy 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:

String a = "12345";
String b = "12345";
byte[]x=a.getBytes(),y=b.getBytes();int z,i=a.length()-b.length();try{for(byte d:x){z=d-y[i];z=x[-z*z];i++;}}catch(Exception e){return 0;}return 1;

Normalna:

String a = "12345";
String b = "12345";
byte[] byteArrA = a.getBytes();
byte[] byteArrB = b.getBytes();

int byteDifference = 0;
int i = a.length() - b.length();

try {
    for (byte aByte : byteArrA) {
        byteDifference = aByte - byteArrB[i];
        byteDifference = byteArrA[-byteDifference*byteDifference];
        i++;
    }
} catch (Exception e){
    return 0;
}

return 1;
Hopper Hunter
źródło
Operatory porównania istnieją w pętli.
ζ--
Dziękuję @hexafraction, zaktualizowałem odpowiedź, aby ich nie uwzględnić.
Hopper Hunter
2

PHP

    $string = 'string';
    isset( ${'string'} );

Ten skrypt może nie mieć żadnego narzędzia, ale przynajmniej zapewnia sposób porównywania ciągów.

PHP

Inny:

    $string = 'something';
    $text   = 'something';
    return count( array( $string => 1 , $text => 1 ) ) % 2;
Hamid Sarfraz
źródło
1
Wow, bardzo urocze. I robienie tego w ten sposób może umożliwić użycie dowolnego łańcucha (ze spacjami i Unicode).
David Chen
2

Prolog 7

e(A,A).

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:

?- e("abcd", "Abcd").
false.

?- e("abcd", "abcd").
true.

Technicznie rzecz biorąc, zachowanie tego rozwiązania jest =/2raczej 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ę, truegdy unifikacja się powiedzie. Dla porównania ==/2porówna kolejność terminu bez unifikacji.

n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳
źródło
2

PHP, 21

Ten wykonuje zadanie przy użyciu zmiennej pośredniej.

$$a=$b;!!$$b;

Lub, jeśli nie potrzebujesz, to być bool

$$a=$b;$$b;

EDYCJA : Zapomniałem obsługiwać przypadku, w którym próbujesz porównać dwa puste ciągi, więc kod jest teraz

$$a=$b;!($a.$b)||$$b;

czyli 21 znaków.

Flonk
źródło
Spodziewałem się, że spowoduje to błędy, gdy otrzymam ciągi, które nie są prawidłowymi identyfikatorami, ale ku mojemu zaskoczeniu tak nie jest.
Peter Taylor
Dwa problemy: 1. Zwraca wartość true podczas porównywania „0” i „”. 2. Zwraca true, gdy $ b jest nazwą istniejącej zmiennej (w bieżącej tabeli symboli) o wartości, która przekształca się w true (np. „GLOBALS” lub „_SERVER” w zakresie globalnym lub „b” w dowolnym zakresie), nawet gdy $ b nie jest równe $ a.
PleaseStand
2

CPython: 6

a is b

>>> a = 'string'
>>> b = 'string'
>>> c = 'STRING'
>>> a is b
True
>>> a is c
False

Użycie isjest oczywiście dość podejrzane, ale ponieważ zadanie wyraźnie wzywa do ustalenia równości wartości, a nie odniesienia, i isporó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.

Henry Keiter
źródło
2

Język Mathematica / Wolfram, 15 bajtów

2 - Length[{a} ∪ {b}]

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.

Michael Stern
źródło
2

C 342 grał w golfa

#include <stdio.h>
#define N 100
#define P(x) printf("%s\n",x)
#define G(x) gets(x)
void e(int x){x?P("y"):P("n");}
int main(){
char s[N],t[N];char *p,*q;int r=0; int n=0,m=0;int i=1;p=s,q=t;
if((p=G(s))&&(q=G(t))){while (*p){n+=i*(int)*p;m+=i*(int)*q;i++;p++;q++;if(!(*q)){break;}}
if(!*p&!*q){if(!(m-n)){r=1;}}e(r);}
return 0;
}

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:

    #include <stdio.h>
#define N 100
#define P(x) printf(x)
#define G(x) gets_s(x)

void e(int x){ x ? P("equal\n") : P("not equal\n"); }
int main()
{
    char s[N], t[N];//words
    char *p = 0, *q = 0;
    int r = 0; //result 0=false
    int n=0, m=0; //weighted sums
    int i = 1; //char pos start at 1
    if ((p=gets_s(s)) &&
        (q=gets_s(t)))
    {
        while (*p)
        {
            n += i*(int)*p;
            m += i*(int)*q;
            i++;
            p++;
            q++;
            if (!(*q)){
                break;
            }
        }

        if (!*p && !*q){ //both same length strings
            if (!(m - n)){ r = 1; } //weighted sums are equal           
        }//else r=0, false=>not equal

        e(r);
    }
    else{
        P("error\n");
    }
    getchar();
}
Bacchusbeale
źródło
Dobra robota, ale prawdopodobnie powinieneś zagrać w golfa.
Hosch250,
Nie mogę skompilować twojego zgłoszenia. Dostaję „Niezdefiniowane symbole dla architektury x86_64:„ _gets_s ”, do których odwołuje się: _main w golf-310cf2.o ld: nie znaleziono symboli dla architektury x86_64”
Stephen Melvin
2

Pyton

Jest długi i nie jest piękny, ale to mój pierwszy wpis!

def is_equal(a,b):
    i=0
    a,b=list(a),list(b)
    if len(a)>len(b):
        c=a
        lst=b
    else:
        c=b
        lst=a
    try:
        while i<len(c):
            for j in c:
                if j not in lst[i]:
                    return False
                i+=1
    except IndexError:
        return False
    return True
yung galbanum
źródło
2

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 xornie da wyniku, dostępnego do dalszych operacji w PHP. Właśnie dlatego unpack()został użyty. Tak więc kod będzie:

return !(strlen($a)^strlen($b)) & !array_filter(unpack('c*', $a^$b))

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 rzutowane false). A może istnieje prostszy sposób, aby sprawdzić, czy tablica zawiera niezerowe elementy ( Edytuj : podczas pisania tego, jest dobra trim()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 jest 0(traktowane ze wszystkich uzyskanych bajtów) - nasze ciągi są równe . To bardzo proste, a nawet więcej niż proste <lub >rzeczy.

Alma Do
źródło
1

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

$ echo -e 'string\nstring' | grep -cPzo "(?s)^(\N*).\1$"
1
$ echo -e 'string\nstring1' | grep -cPzo "(?s)^(\N*).\1$"
0
$ echo -e 'string1\nstring' | grep -cPzo "(?s)^(\N*).\1$"
0
Thomas Baruchel
źródło
1

Matlab: 12 znaków (po ciągach znaków w zmiennych)

~(x*x'-y*y')

Kod zawierający zadania będzie:

x='string1'
y='string2'
~(x*x'-y*y')
Dennis Jaheruddin
źródło
1

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

$ echo -e 'string\nstring1' | sed -e '1s/^/#define /' | cpp | sh 2>/dev/null && echo true
$ echo -e 'string\nstring' | sed -e '1s/^/#define /' | cpp | sh 2>/dev/null && echo true
true
$ echo -e 'string1\nstring' | sed -e '1s/^/#define /' | cpp | sh 2>/dev/null && echo true

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.

Thomas Baruchel
źródło
1

JavaScript [18 bajtów]

(_={})[a]=1,!!_[b]

LUB

!!((_={})[a]=_)[b]

Zwróci to truejeśli a == bi falsejeśli a =/= b. Logika polega na tworzeniu obiektu o wartości ajako właściwości i zwracaniu 1lub undefinedw przypadku, gdy właściwość bwartości istnieje lub nie istnieje w tym obiekcie.

Wizja
źródło
Reguły mówią, że możesz zwrócić obiekt, który ma wartość prawda lub fałsz, więc !!nie jest to konieczne
James_pic
@James_pic Tak, ale w przeciwnym razie zwróci 1lub undefined(lub obiekt / undefinedw drugim przypadku).
VisioN
Zinterpretowałem te reguły jako powiedzenie, że wartości prawda-y i fałsz-y byłyby zgodne z prawdą i fałszem, więc pomyślałem, że 1 lub nieokreślone były wystarczająco dobre.
James_pic
@James_pic Po prostu chciałem być po bezpiecznej stronie :) Jeśli tak, to 18-2 = 16 bytes.
VisioN
1

JavaScript [15 bajtów]

![a].indexOf(b)

Zwróci to truejeśli a == bi falsejeśli a =/= b. Skrypt szuka wartości bw tablicy, która zawiera pojedynczy element wartości a.

Wizja
źródło
1

C - 86 83

main(int i,char**v){return*v[1]&!(*v[1]++^*v[2]++)?main(3,v):!(*--v[1]^*--v[2]);}

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

SBI
źródło
Nie potrzebujesz odstępów wokół wielu operatorów. Na przykład char** vmożna zapisać jako char**v. Istnieją pewne wyjątki (jak 42 / *pointer), ale w większości przypadków spacje można bezpiecznie usunąć w pobliżu znaków specjalnych.
Konrad Borowski
I za dużo i za dużo. Dzisiaj nie na topie.
SBI