Überprüfen Sie, ob Wörter Isomorphe sind


63

Zwei Wörter sind Isomorphe, wenn sie das gleiche Muster von Buchstabenwiederholungen aufweisen. Zum Beispiel beide ESTATEund DUELEDhaben 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 Nist 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


Sind die Längen der beiden Eingänge garantiert gleich?
Optimierer

@Optimizer Nein, die Längen können unterschiedlich sein.
xnor

@Jakube Nein, Ihr Code sollte theoretisch mit Eingaben beliebiger Länge funktionieren. Es ist jedoch in Ordnung, wenn große Eingaben auf der Hardware aufgrund von Problemen wie Speicherüberlauf oder Stapeltiefe fehlschlagen.
Am

Ok Dann lösche ich meine Antwort.
Jakube

Wichtiger Testfall: ABAB CD(für zip-ähnliche Ansätze)
Sp3000

Antworten:


95

J, 4 Bytes

-:&=

Verwendungszweck

   'THERMODYNAMICS' (-:&=) 'RAMBUNCTIOUSLY'  NB. parens are optional
1 

Erläuterung

  • = Mit 1 Argument wird eine Gleichheitstabelle erstellt, in der die Elemente der Eingabe und ihres Nubs verglichen werden.

    ='ESTATE' gives the binary matrix
    
    = | E S T A T E    
    --+------------
    E | 1 0 0 0 0 1
    S | 0 1 0 0 0 0
    T | 0 0 1 0 1 0
    A | 0 0 0 1 0 0
    
  • -: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&gWendet g separat auf beide Eingaben an und wendet dann f zusammen auf die beiden Ergebnisse an x f&g y == f(g(x), g(y)).

  • In unserem Fall vergleichen wir also die beiden Gleichheitstabellen.

Probieren Sie es hier online aus.


2
Ein interessanter und eleganter Ansatz. Ohne eine Entsprechung wäre &das Nächste, was Sie in K tun könnten, wahrscheinlich ~/{x=/:x}', was ein gutes Stück länger ist.
JohnE

17
Jesus. Dies muss ein Anwärter auf die Codegolf Hall of Fame sein.
Brian Gordon

Wow, =ich hatte nicht erwartet, dass classify eine andere Verwendung als das Zählen von Vorkommen hat.
Meilen

37

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:

  ="ABBAC"
(0 3
 1 2
 ,4)

  ="DCCDF"
(0 3
 1 2
 ,4)

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 :

  ~/=:'("RAMBUNCTIOUSLY";"THERMODYNAMICS")
1
  ~/=:'("BANANA";"SERENE")
0

15

Python 2, 41 Bytes

f=lambda a,b:map(a.find,a)==map(b.find,b)

4
Dies war die Lösung, die mich zu dieser Herausforderung inspiriert hat!
22.

12

CJam, 9 Bytes

r_f#r_f#=

Gibt aus, 1ob es sich bei den Wörtern um Isomorphe handelt und 0ob dies nicht der Fall ist.

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

r    e# Read a whitespace separated token from STDIN.
_    e# Push a copy.
f#   e# Get the indexes of all characters from the first copy in the second.
r_f# e# Repeat for the second word.
=    e# Check for equality.

10

JavaScript, ES7, 62 55 54 52 51 Byte

f=(x,y,g=z=>[for(i of z)z.search(i)]+0)=>g(x)==g(y)

Die Logik ist einfach. Ich konvertiere einfach beide Eingaben in die entsprechenden Zeichenindexwerte, konvertiere das Array in einen String und vergleiche.

f=(x, y,                  // Create a function named f which takes two arguments x and y
   g=                     // There is a third default argument to f which equals to
     z=>                  // and arrow function which takes argument z
     [                    // Return this array which is created using array comprehension
      for(i of z)         // For each character of z
      z.search(i)         // Use the index of that character in z in place of the character
     ]+0                  // And finally type cast that array to a string
                          // Here, the array elements are automatically joined by a ','
                          // and appended by a 0.
                          // Its funny how JS type casts Array + Number to a string
   )=>                    // Now the body of function f starts
      g(x)==g(y)          // It simply returns if index map of x equals index map of y

Probieren Sie den obigen Code mit dem folgenden Snippet aus.

2 Bytes gespart dank @ edc65


7
+1, Versucht es, funktioniert gut. +0statt +""?
Edc65

1
@ edc65 wow, typecasting WTF
Optimizer

1
Mir ist gerade aufgefallen, dass die Zeichenfolgen von A bis Z sind, sodass Sie ohne Bedenken die Suche anstelle von indexOf verwenden und 1 Byte mehr ausschneiden können.
edc65

Array-Verständnis wurde schließlich von es7 geschnitten? Wo funktioniert dieser Code? Ich denke nur in Mozilla
DanielIndie

8

Bash + Coreutils, 38

[ `tr $@<<<$1``tr $2 $1<<<$2` = $2$1 ]

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:

$ for t in "ESTATE DUELED" "DUELED ESTATE" "XXX YYY" "CBAABC DEFFED" "RAMBUNCTIOUSLY THERMODYNAMICS" "DISCRIMINATIVE SIMPLIFICATION" "SEE SAW" "ANTS PANTS" "BANANA SERENE" "BANANA SENSES" "AB CC" "XXY XYY" "ABCBACCBA ABCBACCAB"; do
> ./isomorph.sh $t
> echo $t $?
> done
ESTATE DUELED 0
DUELED ESTATE 0
XXX YYY 0
CBAABC DEFFED 0
RAMBUNCTIOUSLY THERMODYNAMICS 0
DISCRIMINATIVE SIMPLIFICATION 0
SEE SAW 1
ANTS PANTS 1
BANANA SERENE 1
BANANA SENSES 1
AB CC 1
XXY XYY 1
ABCBACCBA ABCBACCAB 1
$ 

8

Haskell, 33 29

BEARBEITEN:

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.

s%k=g s==g k
g s=(==)<$>s<*>s

Alte Version:

s%k=g s==g k
g s=[a==b|a<-s,b<-s]

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 wird Trueein 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


6

Haskell, 45 41 Bytes

h l=map(`lookup`zip l[1..])l
x!y=h x==h y

Rückgabe Trueoder FalsezB "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)]wo lookupimmer geholt a-> 1.

Edit: @Mauris hat 4 Bytes zum Speichern gefunden.


Sie können ersetzen (flip lookup$zip l[1..])durch (`lookup`zip l[1..]).
Lynn

6

Brainfuck, 169 168 162 144 140 131 130

Kompatibel 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 1für Isomorphe und 0Nicht-Isomorphe. Dies ist praktisch, um die Ergebnisse visuell zu überprüfen, obwohl dies nicht die kürzeste Option ist. ( Update: kürzere Version mit \x01und \x00als Ausgabe und \x00als 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:

STATES
123255

Die Indizierung im Code unterscheidet sich zwar geringfügig, verwendet jedoch dasselbe Prinzip.

Das Speicherlayout ist in 5er-Blöcken:

0 0 0 0 0 0 c 0 i p 0 c 0 i p 0 c 0 i p 0 0 0 0

csteht für Zeichen, ifür Index und pfür Vorheriges (Index). Wenn der erste String verarbeitet wird, sind alle pSlots Null. Die Zelle links von enthält ceine Kopie des aktuellen Zeichens, dessen Index wir suchen. In der Zelle links neben dem aktuellen iWert befindet sich ein -1Symbol 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:

,+
[                       while there is input
  -
  ---------
  >+<                   increment char (adjust later)
  [                     if not tab
    >>-<                set navigation flag
    [                   loop to find index
      <                 travel to copy
      [
        >+<             restore char
        <<<<-<+>>>>>-   compare chars and create copy
      ]
      ++[->+]           travel between navigation flags
      ->+[+<-]          increment index by 2 and go back
      >[<<<<]           proceed if not fallen off string
      <                 compare chars
    ]
    <[>+<-]             restore char (or no op)
    +[->+]              go back to navigation flag
    <->                 adjust char
    >>>                 alignment
  ]
  >
  [                     if tab
    [[-]<<<<<]          erase chars and go to beginning
    >>>>                alignment
  ]
  <,+
]
>>>+>+                  check string lengths and start loop
[
  [<->-]                compare indices
  <[>>>>>]              realign if not equal
  <<<<                  proceed
]
-<[>]                   cell to left is zero iff isomorphs
+++++++[<+++++++>-]
<.

Aktualisieren:

Hier ist eine Version, die \x01für Isomorphe und \x00fü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 \x00als Trennzeichen verwenden, um 10 Bytes zu sparen.

+
[
  -
  >+<
  [
    >>-<
    [
      <
      [
        >+<
        <<<<-<+>>>>>-
      ]
      ++[->+]
      ->+[+<-]
      >[<<<<]
      <
    ]
    <[>+<-]
    +[->+]
    <->
    >>>
  ]
  >
  [
    [[-]<<<<<]
    >>>>
  ]
  <,+
]
>>>+>+
[
  [<->-]
  <[>>>>>]
  <<<<
]
-<[>]
<+.

5

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 die hangewendete Funktion für beide Wörter dasselbe Ergebnis liefert.

f=(a,b,h=w=>0+[for(c of(n=k=[],w))k[c]=k[c]||++n])=>h(b)==h(a)

// TEST

;[
// True
 ['ESTATE','DUELED']
,['DUELED','ESTATE']
,['XXX','YYY']
,['CBAABC','DEFFED']
,['RAMBUNCTIOUSLY','THERMODYNAMICS']
,['DISCRIMINATIVE','SIMPLIFICATION']

// False:

,['SEE','SAW']
,['ANTS','PANTS']
,['BANANA','SERENE']
,['BANANA','SENSES']
,['XXY','XYY']
,['ABCBACCBA','ABCBACCAB']
]
.forEach(t=>(f(t[0],t[1])?OK:KO).innerHTML+=t+'\n')
Ok<br>
<pre id=OK></pre><br>
KO<br>
<pre id=KO></pre>


1
Manchmal ist einfach kürzer;)
Optimierer

5

R 78

function(x,y)identical((g=function(z)match(a<-strsplit(z,"")[[1]],a))(x),g(y))

Entgolft:

word_to_num <- function(word) {
   chars <- strsplit(word,"")[[1]]
   match(chars, chars)
}
are_isomorph <- function(word1, word2) identical(word_to_num(word1), 
                                                 word_to_num(word2))

schlagen Sie mich dazu! (+1)
shadowtalker

Ich denke, all( (g=...)(x)==g(y))ist kürzer als identical...
Giuseppe

5

Ruby, 83 Bytes

t=->x{y=0;z=?`;x.gsub!(y[0],z.succ!)while y=x.match(/[A-Z]/);x};f=->a,b{t[a]==t[b]}

Es ist eine Funktion f, die zwei Argumente akzeptiert und trueoder zurückgibt false.

Erläuterung:

test = -> str {
    y = nil  # we're just initializing this; it doesn't matter to what
             # this is the variable we use to store the `match' result
    z = '`'  # backtick is the ASCII character before `a'
    while y = str.match(/[A-Z]/) do  # while there is an uppercase letter in str
        str.gsub!(y[0], z.succ!)  # replace all instances of the uppercase letter
                                  # with the next unused lowercase letter
    end
    str  # return the new string
}
# self-explanatory
f=->a,b{test[a]==test[b]}

1
Dies sollte 4 Bytes einsparen 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]}
blutorange

5

Java, 107

(s,t)->java.util.Arrays.equals(s.chars().map(s::indexOf).toArray(),t.chars().map(t::indexOf).toArray())

Karten jedes Zeichen sund tseine Lage und prüft auf Gleichheit.

Erweitert:

class Isomorphs {
    public static void main(String[] args) {
        java.util.function.BiFunction<String, String, Boolean> f =
            (s, t) -> java.util.Arrays.equals(
                                              s.chars().map(s::indexOf).toArray(),
                                              t.chars().map(t::indexOf).toArray()
                                             )
           ;
        System.out.println(f.apply("XXY", "XYY"));
    }
}

Ich denke nicht, dass dies richtig funktioniert, wenn die Saiten unterschiedliche Längen haben.
JohnE

@ JohnE Ja, das tut es.
Ypnypn

Ah, ok - ich denke die "erweiterte" Version ist irreführend.
JohnE

4

Python 3, 85 Bytes

f=lambda a,b:''.join(map(lambda g:dict(zip(a,b))[g],a))==b
g=lambda a,b:f(a,b)&f(b,a)

Wo ist der Input / Output auf diesem?
DJMcMayhem

@ DJMcMayhem gist die Hauptfunktion, fist Helfer. Es gibt eine verwirrende Auswahl an Variablen im gInneren f, aber es ist eine nicht verwandte gebundene Variable. Die g=ist gemäß der Regel optional und erlaubt anon-Funktionen, wodurch zwei Zeichen gespart werden. '
xnor

4

Pyth, 9 Bytes

qFmmxdkdQ

Nimmt Eingaben in folgender Form vor:

"ESTATE", "DUELED"

Ist dies nicht akzeptabel, beträgt der folgende Code 10 Byte:

qFmmxdkd.z

und benutzt dieses Eingabeformular:

ESTATE
DUELED

Verwendet den Index von char in der Zeichenfolgendarstellung.


Das erste Eingabeformat ist in Ordnung. Ich bin daran interessiert, wie Sie reduzieren, um die Gleichheit zu überprüfen, aber ich bin nicht sicher, wie es Ffunktioniert. Was ist <binary>F?
xnor

@xnor <binary>F<seq>ist <binary>umgeklappt <seq>. Es ist gleichbedeutend mit dem Einfügen <binary>zwischen jedem Elementpaar von <seq>. Bei <binary>Feiner Sequenz mit 2 Elementen wird die Funktion einfach auf die Sequenz .*angewendet , was in Pyth oder *Python äquivalent ist .
isaacg

Ich dachte, das Trailing Qsei in Pyth impliziert?
Cyoce

@Cyoce Damals nicht - diese Funktion wurde im April 2016, fast ein Jahr später, hinzugefügt.
isaacg

4

Matlab, 50 Bytes

f=@(s,t)isequal(bsxfun(@eq,s,s'),bsxfun(@eq,t,t'))

Die Funktion ist als anonym definiert, um Platz zu sparen.

Beispiel:

>> f=@(s,t)isequal(bsxfun(@eq,s,s'),bsxfun(@eq,t,t'));
>> f('ESTATE','DUELED')
ans =
     1
>> f('ANTS','PANTS')
ans =
     0

4

Oktave, 26 Bytes

@(s,t)isequal(s==s',t==t')

3
Sieht interessant aus. Erläuterung?
stolzer Haskeller

==Gleichheit ist Matrixelement-weise, und da sund s'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 wiederholen sund Spaltens'
rakslice

Es ist der gleiche Ansatz wie bei der Matlab-Lösung von @ LuisMendo, aber dort ist die Erweiterung explizit.
Rakslice

4

05AB1E , 6 Bytes

εæδË}Ë

Probieren Sie es online!

Nimmt Eingaben als Liste: ['ESTATE', 'DUELED']

Erklärungen:

    εæδË}Ë   Full program
    ε        Apply on each
     æ         Powerset
      δË       For each generated substring: 1 if all equal, 0 otherwise
        }    End for each
         Ë   1 if all equal, 0 otherwise

4

APL (Dyalog) , 5 4 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 werden

Wenn wir die Wörter Aund nennen B, 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 jedem


Kannst du das innere Produkt sehen? :)
ngn

@ngn Ja natürlich. Wie dumm von mir.
Adám

Soll der Top-Link auf die alte Lösung verlinken?
Zacharý

Schade, dass dies auf Arrays mit höherem Rang nicht funktioniert: P
Zacharý

1
@ Zacharý wie versprochen: ngn.github.io/apl-codegolf-2017/readme.txt
ngn

3

Mathematica, 46 Bytes

Equal@@Values@*PositionIndex/@Characters@{##}&

3

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 01121usw. und vergleicht diese.

->x,y{g=->z{z.chars.map{|c|z=~/#{c}/}};g[x]==g[y]}

Testfälle auf Ideone Als zusätzlicher Bonus wird die Code-Hervorhebung von Ideone aufgehoben.


3

Schale , 5 Bytes

¤=´×=

Probieren Sie es online!

Erläuterung

       -- implicit input A, B (strings aka character lists)       | "ab" "12"
¤=     -- apply the following function to A & B, then compare:    | [1,0,0,1] == [1,0,0,1] -> 1
  ´×   --   Cartesian product with itself under                   | ["aa","ba","ab","bb"] ["11","21","12","22"]
    =  --   equality                                              | [ 1  , 0  , 0  , 1  ] [ 1  , 0  , 0  , 1  ]

3

PCRE, 84 Bytes

^((.)(?=.+ (\3.|)(.))(?=((?=(\2|)?+.* \3\4(\7?(?(?=.*+\6)(?!\4).|\4))).)+ ))+. \3..$ 

Betreff sollte zwei durch Leerzeichen getrennte Wörter sein, wie im OP. Hier ist eine flüchtige Erklärung:

Für jeden Buchstaben X im ersten Wort:

Schauen Sie vorwärts zum zweiten Wort und setzen Sie die Referenzen zurück, um sich daran zu erinnern, wie weit wir entfernt sind, sowie den Buchstaben Y im zweiten Wort, der X entspricht.

Für jeden Buchstaben Z nach der aktuellen Position im ersten Wort:

Stellen Sie ähnliche Rückverweise wie oben her.

Suchen Sie im zweiten Wort nach dem entsprechenden Buchstaben und prüfen Sie, ob Z = X und dann ein Y übereinstimmen. Anderenfalls stimmen Sie mit einem Buchstaben überein, der nicht Y ist.

Diese Iteration kann enden, wenn wir bis zum vorletzten Buchstaben im ersten Wort übereinstimmen. Da zu diesem Zeitpunkt keine weitere Validierung erforderlich ist, muss lediglich geprüft werden, ob die Wörter gleich lang sind (die Rückreferenz, die akkumulierende Teilzeichenfolgen des zweiten Wortes enthält, steht immer 1 Buchstabe dahinter).


2

Ruby, 31 Bytes

->a{!!a.uniq!{|s|s.tr s,'a-z'}}

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, sindem jeder Buchstabe durch den n-ten Buchstaben im Alphabet ersetzt wird. Dabei nhandelt es sich um den größten Index, mit dem dieser Buchstabe in der Zeichenfolge angezeigt wird. Zum Beispiel estatewird fbedef, wie es tut dueled.


1

Cobra, 72 Bytes

do(a='',b='')=(for i in a get a.indexOf(i))==for i in b get b.indexOf(i)

Sind Sie sicher, dass dies den AB CCTestfall Falsch markiert ?
21.

@xnor jetzt behoben
Οurous

1

JavaScript (ES5), 142 98

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


1
Könnten Sie nicht ;l=czu for(l=j=2;j--;einem Byte wechseln und es speichern?
Jonathan Frech

1

Perl, 38 Bytes

($_,$a)=@ARGV;eval"y/$_/$a/";say$_~~$a

Rennen wie perl -E '($_,$a)=@ARGV;eval"y/$_/$a/";say$_~~$a' RAMBUNCTIOUSLY THERMODYNAMICS

Gibt 1 aus, wenn wahr, nichts, wenn falsch.



1

C ++, 213 196 162 Bytes

-51 Bytes dank Zacharý

#include<map>
#define F(X,x)for(auto&e:X){if(x.end()==x.find(e))x[e]=65+x.size();e=x[e];}
auto i=[](auto a,auto b){std::map<int,int>c,d;F(a,c)F(b,d)return a==b;};

Um das Lambda aufzurufen, müssen Sie 2 Argumente vom std::stringDatentyp übergeben

Code zum Testen:

std::initializer_list<std::pair<std::string, std::string>> test{
    {"ESTATE","DUELED"},
    {"DUELED","ESTATE"},
    {"XXX","YYY"},
    {"CBAABC","DEFFED"},
    {"RAMBUNCTIOUSLY","THERMODYNAMICS"},
    {"DISCRIMINATIVE","SIMPLIFICATION"},
    {"SEE","SAW"},
    {"ANTS","PANTS"},
    {"BANANA","SERENE"},
    {"BANAnA","SENSES"},
    {"AB","CC"},
    {"XXY","XYY"},
    {"ABCBACCBA","ABCBACCAB"},
    {"ABAB","AC"}
};

for (const auto& a : test) {
    std::cout << "Test with " << a.first << " and " << a.second <<
        " outputs : " << (i(a.first, a.second)?"TRUE":"FALSE") << '\n';
}

für den Code, einschließlich Tests iostreamund stringHeader - Datei ist erforderlich


1
Es sieht nicht so aus, als ob Sie irgendetwas aus dem String-Header verwenden. Können Sie es also entfernen und vom Benutzer selbst einbinden lassen?
Zacharý

Funktioniert das für 161 Bytes?
Zacharý

@ Zacharý Wenn Sie das eals Argument hinzufügen find, ja, es funktioniert
HatsuPointerKun

In dem Moment, in dem du von Brainfuck geschlagen wirst> _ <
Zacharý

1

JavaScript (ES6), 52 51 50 Byte

Diese Version verwendet kein Array-Verständnis und nimmt Eingaben mithilfe der Currying-Syntax entgegen.

a=>b=>(f=x=>0+[...x].map(c=>x.search(c)))(a)==f(b)

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.