Zwei Wörter sind Isomorphe, wenn sie das gleiche Muster von Buchstabenwiederholungen aufweisen. Zum Beispiel beide ESTATE
und DUELED
haben Musterabcdca
ESTATE
DUELED
abcdca
da die buchstaben 1 und 6 gleich sind, sind die buchstaben 3 und 5 gleich und nichts weiter. Dies bedeutet auch, dass die Wörter durch eine Substitutionschiffre miteinander verbunden sind, hier mit der Übereinstimmung E <-> D, S <-> U, T <-> E, A <-> L
.
Schreiben Sie Code, der zwei Wörter enthält und prüft, ob es sich um Isomorphe handelt. Wenigste Bytes gewinnt.
Eingabe: Zwei nicht leere Zeichenfolgen mit Großbuchstaben A..Z
. Wenn Sie möchten, können Sie diese als Sammlung von zwei Zeichenfolgen oder als einzelne Zeichenfolge mit einem Trennzeichen verwenden.
Ausgabe: Ein konsistenter Wahrheitswert für isomorphe Paare und ein konsistenter Falsey-Wert, falls dies nicht der Fall ist . Zeichenfolgen unterschiedlicher Länge sind gültige Eingaben, die niemals isomorph sind.
Testfälle:
Wahr:
ESTATE DUELED
DUELED ESTATE
XXX YYY
CBAABC DEFFED
RAMBUNCTIOUSLY THERMODYNAMICS
DISCRIMINATIVE SIMPLIFICATION
Falsch:
SEE SAW
ANTS PANTS
BANANA SERENE
BANANA SENSES
AB CC
XXY XYY
ABCBACCBA ABCBACCAB
ABAB CD
Fühlen Sie sich frei, weitere Testfälle hinzuzufügen, die Sie nützlich finden.
Bestenliste
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
ABAB CD
(für zip-ähnliche Ansätze)Antworten:
J, 4 Bytes
Verwendungszweck
Erläuterung
=
Mit 1 Argument wird eine Gleichheitstabelle erstellt, in der die Elemente der Eingabe und ihres Nubs verglichen werden.-:
mit 2 Argumenten wird die Gleichheit überprüft (wie==
allgemein üblich). Dies funktioniert auch für Matrizen unterschiedlicher Größe (oder sogar für unterschiedliche Typen).f&g
Wendet g separat auf beide Eingaben an und wendet dann f zusammen auf die beiden Ergebnisse anx f&g y == f(g(x), g(y))
.In unserem Fall vergleichen wir also die beiden Gleichheitstabellen.
Probieren Sie es hier online aus.
quelle
&
das Nächste, was Sie in K tun könnten, wahrscheinlich~/{x=/:x}'
, was ein gutes Stück länger ist.=
ich hatte nicht erwartet, dass classify eine andere Verwendung als das Zählen von Vorkommen hat.K, 5 Bytes
Dies hat eine herrlich elegante Lösung in K!
Der "Gruppen" -Operator (monadisch
=
) erzeugt genau die Signatur, die wir für den Wortisomorphismus benötigen. Sammeln von Vektoren der Indizes jedes Elements eines Vektors, wobei die Gruppen nach Erscheinungsbild geordnet sind:Nehmen wir ein Paar von Strings als Vektor, müssen wir nur die Gruppe auf jedes Element anwenden (
=:'
) und dann mit "match" (~
) den Deep-Equality-Operator reduzieren :quelle
Python 2, 41 Bytes
quelle
CJam, 9 Bytes
Gibt aus,
1
ob es sich bei den Wörtern um Isomorphe handelt und0
ob dies nicht der Fall ist.Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
JavaScript, ES7,
62 55 54 5251 ByteDie Logik ist einfach. Ich konvertiere einfach beide Eingaben in die entsprechenden Zeichenindexwerte, konvertiere das Array in einen String und vergleiche.
Probieren Sie den obigen Code mit dem folgenden Snippet aus.
Code-Snippet anzeigen
2 Bytes gespart dank @ edc65
quelle
+0
statt+""
?Bash + Coreutils, 38
Beachten Sie, dass wir hier die übliche Shell-Idee von Wahr / Falsch verwenden - Null bedeutet ERFOLG oder WAHR und ungleich Null bedeutet Fehler oder FALSCH:
quelle
Haskell,
3329BEARBEITEN:
Das ist viel zu spät, aber ich habe diese Verbesserung mit Hilfe von Bewerbern festgestellt, die erst im März 2015 zum Auftakt hinzugefügt wurden.
Alte Version:
Die Prüffunktion ist
(%)
Dies funktioniert, indem für jeden String ein "Gleichheits-Datensatz" generiert wird: Für jeden der beiden Indizes ij wird aufgezeichnet, ob sie gleiche Zeichen haben. Der Datensatz ist so angeordnet, dass sich der Datensatz für zwei Indizes i, j immer an derselben Stelle befindet.
Beispiel: Der Gleichheitsnachweis von "ABC" lautet
[1,0,0,0,1,0,0,0,1]
(1 für wahr, 0 für falsch). Dort wirdTrue
ein Index mit sich selbst verglichen. irgendwo anders ist falsch. (Das Überspringen dieser Prüfungen ist zwar effizienter, aber in Bezug auf das Golfspiel schwieriger)* wenn die Saiten gleich lang sind. Andernfalls wird false zurückgegeben, nur weil die Datensätze unterschiedlich lang sind
quelle
Haskell,
4541 BytesRückgabe
True
oderFalse
zB"ESTATE" ! "DUELED"
->True
.Verwendet die Map-Char-To-First-Index-Methode, wie sie in vielen anderen Antworten verwendet wird. Assoziationslisten sind praktisch, weil frühere Einträge Trumpf sind.
"aba"
wird[(a,1),(b,2),(a,3)]
wolookup
immer geholta
->1
.Edit: @Mauris hat 4 Bytes zum Speichern gefunden.
quelle
(flip lookup$zip l[1..])
durch(`lookup`zip l[1..])
.Brainfuck,
169168162144140131130Kompatibel mit Alex Pankratovs BFF (Brainfuck-Interpreter für SPOJ und Ideone) und Thomas Corts BFI (für Anarchy Golf).
Die erwartete Eingabe besteht aus zwei durch ein Tabulatorzeichen getrennten Zeichenfolgen ohne Zeilenumbruch nach der zweiten Zeichenfolge. Die Ausgabe erfolgt
1
für Isomorphe und0
Nicht-Isomorphe. Dies ist praktisch, um die Ergebnisse visuell zu überprüfen, obwohl dies nicht die kürzeste Option ist. ( Update: kürzere Version mit\x01
und\x00
als Ausgabe und\x00
als Trennzeichen am Ende der Antwort.)Demonstration auf ideone.
Dieses Problem erweist sich für Brainfuck als sehr schön.
Die Grundidee bei der Indizierung besteht darin, vom Ende des aktuellen Zeichenfolgepräfixes aus rückwärts voranzugehen. Wenn das Zeichen noch nicht vorgekommen ist, können wir die Länge des Zeichenfolgepräfixes verwenden. Zum Beispiel:
Die Indizierung im Code unterscheidet sich zwar geringfügig, verwendet jedoch dasselbe Prinzip.
Das Speicherlayout ist in 5er-Blöcken:
c
steht für Zeichen,i
für Index undp
für Vorheriges (Index). Wenn der erste String verarbeitet wird, sind allep
Slots Null. Die Zelle links von enthältc
eine Kopie des aktuellen Zeichens, dessen Index wir suchen. In der Zelle links neben dem aktuelleni
Wert befindet sich ein-1
Symbol für eine einfache Zeigernavigation.Es gibt viele Bedingungen, die sorgfältig geprüft werden müssen. Am Ende überprüfen wir die Isomorphen durch Vergleichen der
(i,p)
Paare und erreichen den Cluster von Nullzellen links vom äußersten linken(i,p)
Paar genau dann, wenn die Zeichenfolgen Isomorphen sind. Hier ist eine kommentierte Version des Codes, um das Verfolgen zu erleichtern:Aktualisieren:
Hier ist eine Version, die
\x01
für Isomorphe und\x00
für Nicht-Isomorphe gedruckt wird . Dies ist wahrscheinlich eine genauere Interpretation von Truthy and Falsey für Brainfuck, aufgrund der Art[
und der]
Arbeitsweise. Der einzige Unterschied ist ganz am Ende.Zusätzlich: Jetzt
\x00
als Trennzeichen verwenden, um 10 Bytes zu sparen.quelle
JavaScript (ES6), 62
Verwenden einer Aux-Funktion
h
, die jedes Wort einem Array zuordnet, das die Position jedes Buchstabens im Wort enthält, zum Beispiel: PASS -> [1,2,3,3]. Geben Sie true zurück, wenn dieh
angewendete Funktion für beide Wörter dasselbe Ergebnis liefert.quelle
R 78
Entgolft:
quelle
all( (g=...)(x)==g(y))
ist kürzer alsidentical
...Ruby, 83 Bytes
Es ist eine Funktion
f
, die zwei Argumente akzeptiert undtrue
oder zurückgibtfalse
.Erläuterung:
quelle
t=->x{z=?`;x.chars.to_a.uniq.map{|c|x.gsub!(c,z.succ!)};x};f=->a,b{t[a]==t[b]}
, und Sie könnten es auf 68 reduzieren, wenn Sie einen Hash verwenden, um den Ersatz zu erhalten:t=->x{h={};i=9;x.gsub!(/./){|c|h[c]||h[c]=i+=1}};f=->a,b{t[a]==t[b]}
Java, 107
Karten jedes Zeichen
s
undt
seine Lage und prüft auf Gleichheit.Erweitert:
quelle
Python 3, 85 Bytes
quelle
g
ist die Hauptfunktion,f
ist Helfer. Es gibt eine verwirrende Auswahl an Variablen img
Innerenf
, aber es ist eine nicht verwandte gebundene Variable. Dieg=
ist gemäß der Regel optional und erlaubt anon-Funktionen, wodurch zwei Zeichen gespart werden. 'Pyth, 9 Bytes
Nimmt Eingaben in folgender Form vor:
Ist dies nicht akzeptabel, beträgt der folgende Code 10 Byte:
und benutzt dieses Eingabeformular:
Verwendet den Index von char in der Zeichenfolgendarstellung.
quelle
F
funktioniert. Was ist<binary>F
?<binary>F<seq>
ist<binary>
umgeklappt<seq>
. Es ist gleichbedeutend mit dem Einfügen<binary>
zwischen jedem Elementpaar von<seq>
. Bei<binary>F
einer Sequenz mit 2 Elementen wird die Funktion einfach auf die Sequenz.*
angewendet , was in Pyth oder*
Python äquivalent ist .Q
sei in Pyth impliziert?Matlab, 50 Bytes
Die Funktion ist als anonym definiert, um Platz zu sparen.
Beispiel:
quelle
Oktave, 26 Bytes
quelle
==
Gleichheit ist Matrixelement-weise, und das
unds'
unterschiedlich groß ist, die Oktaven „broadcasting“ automatisch versucht Matrizen von gleicher Größe zu erhalten , zu arbeiten auf - was in diesem Fall bedeutet die Zeile zu wiederholens
und Spaltens'
05AB1E , 6 Bytes
Probieren Sie es online!
Nimmt Eingaben als Liste:
['ESTATE', 'DUELED']
Erklärungen:
quelle
APL (Dyalog) ,
54 Bytes-1 dank ngns hinweis.
Anonyme implizite Präfixfunktion, die eine Liste von zwei Zeichenfolgen als Argument verwendet.
Probieren Sie es online!
Dies ist ein inneres Produkt, aber anstelle des Üblichen
+
und×
es verwendet≡
Identität.
und⍳
der ɩ ndex (das erste Vorkommen jedes Elements)⍨
mit der gesamten aus zwei Elementen bestehenden Liste von Wörtern, die als beide Argumente verwendet werdenWenn wir die Wörter
A
und nennenB
, können wir die vorherige Lösung wie folgt ableiten:≡.⍳⍨ A B
A B ≡.⍳ A B
(A⍳A) ≡ (B⍳B)
(⍳⍨A) ≡ (⍳⍨B)
≡/ ⍳⍨¨ A B
Vorherige Lösung
Anonyme implizite Präfixfunktion, die eine Liste von zwei Zeichenfolgen als Argument verwendet.
Probieren Sie es online!
≡
Identität/
über⍳
der ɩ ndex (das erste Vorkommen jedes Elements…)⍨
Selfie (… an sich)¨
von jedemquelle
Mathematica, 46 Bytes
quelle
Ruby, 50 Bytes
30 Bytes kürzerer Ruby-Code. Bevor ich mir die Lösungen anschaute, prüfte ich für jedes Zeichen beider Zeichenketten, ob der Index des ersten Auftretens des Zeichens übereinstimmt. dh transformiert einen String in seine normalisierte Form
01121
usw. und vergleicht diese.Testfälle auf Ideone Als zusätzlicher Bonus wird die Code-Hervorhebung von Ideone aufgehoben.
quelle
Schale , 5 Bytes
Probieren Sie es online!
Erläuterung
quelle
PCRE, 84 Bytes
Betreff sollte zwei durch Leerzeichen getrennte Wörter sein, wie im OP. Hier ist eine flüchtige Erklärung:
quelle
Ruby, 31 Bytes
Ein Proc, der ein Array von Zeichenfolgen verwendet und prüft, ob diese zueinander isomorph sind.
tr s,'a-z'
Mit diesen Argumenten wird eine Zeichenfolge normalisiert,s
indem jeder Buchstabe durch den n-ten Buchstaben im Alphabet ersetzt wird. Dabein
handelt es sich um den größten Index, mit dem dieser Buchstabe in der Zeichenfolge angezeigt wird. Zum Beispielestate
wirdfbedef
, wie es tutdueled
.quelle
Cobra, 72 Bytes
quelle
AB CC
Testfall Falsch markiert ?JavaScript (ES5),
14298Ziemlich groß, aber ich habe noch keine ES5-Version gesehen.
for(l=j=2;j--;){c=prompt();for(i=c.length;i--;)c=c.replace(RegExp(c[i],"g"),i);b=l==c;l=c}alert(b)
Ersetzt einfach jedes Vorkommen des ersten Buchstabens durch seinen umgekehrten Indexwert. Wiederholt dies für jeden Charakter.
Dies gilt auch für beide Eingaben und für den Vergleich des generierten Musters.
Der Vergleich ist ziemlich hässlich, aber ich möchte kein Array zum Speichern und Vergleichen verwenden.
quelle
;l=c
zufor(l=j=2;j--;
einem Byte wechseln und es speichern?Perl, 38 Bytes
Rennen wie
perl -E '($_,$a)=@ARGV;eval"y/$_/$a/";say$_~~$a' RAMBUNCTIOUSLY THERMODYNAMICS
Gibt 1 aus, wenn wahr, nichts, wenn falsch.
quelle
Common Lisp, 76 Bytes
Probieren Sie es online!
quelle
C ++,
213196162 Bytes-51 Bytes dank Zacharý
Um das Lambda aufzurufen, müssen Sie 2 Argumente vom
std::string
Datentyp übergebenCode zum Testen:
für den Code, einschließlich Tests
iostream
undstring
Header - Datei ist erforderlichquelle
e
als Argument hinzufügenfind
, ja, es funktioniertJavaScript (ES6),
525150 ByteDiese Version verwendet kein Array-Verständnis und nimmt Eingaben mithilfe der Currying-Syntax entgegen.
Code-Snippet anzeigen
quelle