Suchen Sie die Übersetzungstabelle

17

Suchen Sie bei zwei gegebenen Zeichenfolgen die Übersetzungstabelle ( Substitutionsschlüssel) ) zwischen den beiden, und geben Sie false aus, wenn die Übersetzung nicht möglich ist. Die Antwort muss minimiert und von links nach rechts erstellt werden. Das erste zwischen Wörtern zu übersetzende Zeichen muss das erste in der Übersetzungstabelle sein. Darüber hinaus sollte jeder Buchstabe, der nicht übersetzt wurde (an der gleichen Stelle wie ursprünglich), NICHT in der Übersetzungstabelle enthalten sein.

Wahrscheinlich am einfachsten durch Beispiele zu definieren:

Gültige Fälle

"bat", "sap" => ["bt","sp"]

Beachten Sie die Bestellung, eine Ausgabe von ["tb","ps"]ist für diese Challenge nicht gültig.

"sense", "12n12" => ["se","12"]

Beachten Sie, dass das nnicht übersetzt wird, da es sich um eine 1: 1-Beziehung handelt.

"rabid", "snail" => ["rabd","snal"]

Beachten Sie, dass das inicht übersetzt wird, da es sich um eine 1: 1-Beziehung handelt.

"ass", "all" => ["s","l"]

A ist nicht enthalten, es bleibt gleich, skann laufgrund der Musterübereinstimmung zugeordnet werden.

"3121212", "ABLBLBL" => ["312","ABL"]

Passt perfekt zum Muster.

Falsche Fälle

"banana", "angular" => false

(nicht die gleiche Länge, unmöglich).

"animal", "snails" => false

(Jedes Zeichen kann nur EINMAL auf jeder Seite der Übersetzung verwendet werden.)

"can","cnn" => false

(n wird implizit in der Übersetzung verwendet, daher wäre die Definition einer Übersetzungstabelle mit n-> a ungültig.)

Somit [aimal,sails]ist eine ungültige Antwort, die dies falsch macht.

"a1", "22" => false

Siehe "Vorbehalte", dies wird als falsch aufgeführt. In diesem Fall ist es , weil aund 1nicht beide abbilden können 2. (Jedes Zeichen kann nur EINMAL auf jeder Seite der Übersetzung verwendet werden.)


Diese Antwort scheint ein guter Maßstab zu sein: /codegolf//a/116807/59376

Wenn Sie Fragen zur Funktionalität von zwei nicht aufgelisteten Wortpaaren haben, verschieben Sie diese Implementierung.


I / O-Regeln

  • Die Eingabe kann als 2-Element-Array oder als 2 separate Eingaben erfolgen.
  • Die Ausgabe kann als Array oder durch Zeilenumbrüche / Leerzeichen begrenzt sein, ähnlich wie ich es gezeigt habe.
  • Falsche Ausgabe kann 0, -1 oder falsch sein. Fehlerhafte / leere Ausgabe ist auch in Ordnung.
  • Sie sind garantiert, dass anicht gleich bund weder anoch bleer sein wird.
  • aund bsind druckbare ASCII-Buchstabenfolgen.

Vorbehalte

  • Übersetzungen müssen von links nach rechts erfolgen, siehe Beispiel 1.
  • Sie dürfen keine Zeichen ausgeben, die gleich bleiben.
  • Ihr Programm kann nur zwei Zeichenfolgen enthalten aund b.
  • Jedes Zeichen kann nur EINMAL auf jeder Seite der Übersetzung verwendet werden. Dies macht die Übersetzung von snailsnach animalsunmöglich.
  • Rekursive Ersetzungen sollten nicht auftreten. Beispiel für rekursives Ersetzen: "a1","22"->[a1,12]Wenn a zuerst durch eine 1 ersetzt wird, werden beide resultierenden Einsen durch Zweisen ersetzt. Dies ist nicht korrekt, vorausgesetzt, alle Übersetzungen erfolgen unabhängig voneinander, was bedeutet, dass dies falsch ist. Bedeutung: "a1" mit Übersetzungstabelle von [a1,12] ergibt 12 (nicht 22)
Magische Kraken-Urne
quelle
Die Bezeichnung dieser "Übersetzung" als einfache Ersatzchiffre könnte helfen, die Absicht zu verdeutlichen.
Greg Martin
Sind assoziative Arrays als Ausgabe zulässig? Es könnte mir ein paar Bytes ersparen
Jörg Hülsermann
@ JörgHülserman Ich bin mir nicht ganz sicher, welche Auswirkungen dies haben kann, vielleicht mache ich 2 Versionen, damit ich den Unterschied sehe? Ich bearbeite es, wenn ich der Meinung bin, dass es der Herausforderung nicht schadet.
Magic Octopus Urn
Schau dir meine erste Lösung als String an und die zweite hat als Ausgabe ein assoziatives Array
Jörg
@ JörgHülsermann ahhh ... Ich sehe, wie Sie es jetzt verwenden, ich denke, ich werde das nicht zulassen, nicht alle Sprachen unterstützen Hash-ähnliche Strukturen.
Magic Octopus Urn

Antworten:

7

JavaScript (ES6), 128 Byte

f=
(s,t)=>!t[s.length]&&[...s].every((c,i)=>n[d=t[i]]==c||d&&!m[c]&&!n[d]&&(n[m[c]=d]=c,c==d||(a+=c,b+=d)),m={},n={},a=b='')&&[a,b]
<div oninput=o.textContent=f(s.value,t.value)><input id=s><input id=t><pre id=o>

Neil
quelle
Funktioniert nicht für assund allsollte sein s,l.
Magic Octopus Urn
Ja, das ist ein Schnipsel, auch bestätigt, es ist in Ordnung.
Magic Octopus Urn
1
@carusocomputing Es war ein Variablennamen-Konflikt - er wurde behoben. Das tut mir leid.
Neil
7

JavaScript (ES6), 108 107 105 106 Bytes

Bearbeiten : "22" / "a1"Behoben, dass Eingaben , die falsch sein sollten, unterstützt werden.


Gibt entweder einen 0oder ein Array mit zwei Zeichenfolgen zurück.

f=(a,b,x)=>[...a].some((c,i)=>d[C=b[i]]?d[C]!=c:(d[C]=c)!=C&&(s+=c,t+=C,!C),s=t='',d=[])?0:x||f(b,a,[s,t])

Formatiert und kommentiert

f = (                       // given:
  a,                        // - a = first string
  b,                        // - b = second string
  x                         // - x = reference result from previous iteration,
) =>                        //       or undefined
  [...a].some((c, i) =>     // for each character c at position i in a:
    d[                      //   if we already have a translation
      C = b[i]              //   of the character C at the same position in b,
    ] ?                     //   then:
      d[C] != c             //     return true if it doesn't equal c
    :                       //   else:
      (d[C] = c) != C &&    //     store the translation C -> c in the dictionary
      (                     //     if the characters are different:
        s += c, t += C,     //       append them to the translation strings s and t
        !C                  //       return true if C is undefined
      ),                    //
    s = t = '', d = []      //   initialize s, t and d  
  ) ?                       // if some() returns true:
    0                       //   there was a translation error: abort
  :                         // else:
    x ||                    //   if this is the 2nd iteration, return x
    f(b, a, [s, t])         //   else do a recursive call with (b, a)

Testfälle

Arnauld
quelle
f('22')('a1')sollte auch falsch sein.
Neil
Hoffentlich habe ich es diesmal richtig gemacht.
Arnauld
1
Es ist immer praktisch, wenn sich herausstellt, dass Ihr Bugfix auf etwas Kürzeres vereinfacht!
Neil
7

PHP> = 7.1, 130 Bytes

18 Bytes von @Titus gespeichert

for([,$x,$y]=$argv;a&$o=$y[$i];)$o==($p=$x[$i++])?:$k[$c[$p]=$o]=$p;echo$y==strtr($x,$c)&$x==strtr($y,$k)?join($k)." ".join($c):0;

Testfälle

Erweitert

for([,$x,$y]=$argv;a&$o=$y[$i];)
$o==($p=$x[$i++])?:$k[$c[$p]=$o]=$p; # if char string 1 not equal char string 2 make key=char1 value=char2 and key array
echo$y==strtr($x,$c) # boolean replacement string 1 equal to string 2
    &$x==strtr($y,$k) # boolean replacement string 2 equal to string 1
    ?join($k)." ".join($c) # output for true cases
:0; #Output false cases

PHP> = 7.1, 148 Bytes

Gibt 0 für false aus. Ausgabe true als String

for([,$x,$y]=$argv;a&$o=$y[$i];$i++)$x[$i]==$o?:$c[$x[$i]]=$o;echo$y==strtr($x,($f=array_flip)($k=$f($c)))&$x==strtr($y,$k)?join($k)." ".join($c):0;

Testfälle

Erweitert

for([,$x,$y]=$argv;a&$o=$y[$i];$i++)
$x[$i]==$o?:$c[$x[$i]]=$o; # if char string 1 not equal char string 2 set key=char1 value=char2
echo$y==strtr($x,($f=array_flip)($k=$f($c))) # boolean replacement string 1 equal to string 2
&$x==strtr($y,$k) # boolean replacement string 2 equal to string 1
    ?join($k)." ".join($c) # output for true cases
:0; #Output false cases

PHP> = 7.1, 131 Bytes

Die zweite Antwort kann hiermit kurzgeschlossen werden, wenn assoziative Arrays zulässig sind

Gibt 0 für false aus. Ausgabe true als assoziatives Array anstelle von string

for([,$x,$y]=$argv;a&$o=$y[$i];$i++)$x[$i]==$o?:$c[$x[$i]]=$o;print_r($y==strtr($x,($f=array_flip)($f($c)))&$x==strtr($y,$k)?$c:0);

Testfälle

PHP> = 7.1, 227 Bytes

gibt 0 für falsch aus

[,$x,$y]=$argv;echo strlen($x)==strlen($y)?strtr($x,$c=array_filter(($f=array_flip)($z=$f(array_combine(($p=str_split)($x),$p($y)))),function($v,$k){return$k!=$v;},1))==$y&$x==strtr($y,$z)?join(array_keys($c))." ".join($c):0:0;

Testfälle

Erweitert

[,$x,$y]=$argv; # 
echo strlen($x)==strlen($y) #compare string lengths
?strtr($x,  # replace function
$c=array_filter( # filter 
($f=array_flip)($z=$f( # # remove doubles like in testcase: a1 => 22
    array_combine(($p=str_split)($x),$p($y))  # replacement array keys string 1 values string 2 
))
    ,function($v,$k){return$k!=$v;},1)) # remove all keys that equal to values in array
    ==$y # boolean replacement string 1 equal to string 2
&$x==strtr($y,$z) # boolean replacement string 2 equal to string 1        
?join(array_keys($c))." ".join($c) # output for true cases
    :0 # Output if replacement from string 1 is not equal to string 2
:0; #Output for different lengths
Jörg Hülsermann
quelle
1
@carusocomputing Danke für das Kompliment. Ich habe einen kleinen Trick vergessen. Ich weiß, dass es hier viele Menschen gibt, die besser sind als ich
Jörg Hülsermann
2
Sie sind definitiv gut darin, Lösungen +1 zu finden, aber das array_values()Innere join()ist völlig unbrauchbar und kann fallengelassen werden.
Christoph
1
Damit ist der a1 22 => falseTestfall nicht bestanden. Außerdem scheint Ihr erstes Programm im Online-Tester nicht zu funktionieren.
mbomb007
1
Halte den Mund, halt den Rand, Halt die Klappe. Es ist wunderbar.
Titus
1
Die Flipper können gehen: Sparen Sie 18 Bytes mit ($p=$x[$i])==$o?:$k[$c[$p]=$o]=$p;in die Schleife und $y==strtr($x,$c)für den ersten Test.
Titus
5

Jelly , 18 Bytes

ẠaQ⁼µ€Ạ
z0EÐḟQZẋÇ$

Unbenannter monadischer Link (One-Input-Funktion), der eine Liste erstellt, die
Folgendes zurückgibt: eine leere Liste in den Falsey-Fällen; oder
eine Liste mit zwei Listen von Zeichen in den wahrheitsgemäßen Fällen.

Probieren Sie es online! (In der Fußzeile wird die Liste durch ein Leerzeichen getrennt, um das Drucken einer verschwommenen Darstellung zu vermeiden.)
... oder eine Testsuite anzeigen.

Wie?

ẠaQ⁼µ€Ạ - Link 1, valid?: mapping list
    µ€  - perform the code to the left for €ach mapping entry
Ạ       -     none of mapping entry falsey? (this & Main's z0 handle unequal input lengths)
  Q     -     deduplicate mapping entry
   ⁼    -     is equal to mapping list? (non-vectorising)
 a      -     and
      Ạ - none falsey (both mapping lists must pass that test)
        - The whole function returns 1 if the mapping list is acceptable, 0 if not

z0EÐḟQZẋÇ$ - Main link: list of strings
z0         - transpose with filler 0 (unequal lengths make pairs containing zeros)
   Ðḟ      - filter discard:
  E        -     all equal? (removes the untranslated character pairs)
     Q     - deduplicate (removes the repeated translation pairs)
      Z    - transpose (list of pairs to pair of lists)
         $ - last two links as a monad:
       ẋ   -     repeat list this many times:
        Ç  -         call last link (1) as a monad
Jonathan Allan
quelle
5

Netzhaut , 194 191 185 229 225 241 Bytes

.+
$&;$&
+`^\w(\w*;)\w
$1
^;\w.*|.+;;.*|;;

^((.)*)(.)(.*;(?<-2>.)*(?(2)(?!)))\3
$1$4
+`((.)(.)*)\2((.)*;.*(.)(?<-3>.)*(?(3)(?!)))\6((?<-5>.)*(?(5)(?!)))$
$1$4$7
^(.)*(.)(.)*(\2)?.*;(?<-1>.)*(?(1)(?!))(.)(?<-3>.)*(?(3)(?!))(?(4)(?!\5)|\5).*

Probieren Sie es online!

Nimmt die Eingabe ;getrennt. Die Ausgabe wird ebenfalls ;getrennt. Falsche Eingaben werden durch leere Ausgaben angezeigt.

Ich weiß, das ist schmerzlich wortreich, ich versuche immer noch, Bytes zu reduzieren. Die meisten dieser Bytes werden zum Löschen falscher Eingaben verwendet.

Bearbeitungen

  • Es stellt sich heraus, dass ich einen signifikanten Fehler in meinem Programm hatte. Es ist jetzt behoben, aber auf Kosten von über 40 Bytes.

  • Es wurde ein weiterer Fehler gefunden, bei dem mein Programm die Eingabe nicht für a1;22falsch erklärt hat, aber ich konnte das Programm nach der Korrektur unter 250 Byte halten

Erläuterung

(Eine ausführlichere Erklärung wird in Kürze folgen.)

Zuerst müssen wir prüfen, ob die Länge der Saiten stimmt a und bgleich sind oder nicht. Wenn nicht, löschen wir alles.

Dupliziert die Eingabe, um sie bei einigen Längentests beizubehalten.

.+                      Matches everything
$&;$&                   $& indicates the match, so $&;$& will duplicate the match and separate it with a semi-colon

Jetzt löschen wir in einer Schleife das erste Zeichen von aund das erste Zeichen von, bbis eine der Zeichenfolgen leer wird.

+`                     Repeatedly (until no more substitutions could be made) replace
  ^\w                   A word character (letter or number) at the beginning
     (\w*;)             Capture Group 1: matches any number of word characters and a semicolon
           \w           And a word character after the semi-colon
                       with
$1                      The result of the first capture group

Nun gibt es Möglichkeiten für den "Musterraum".

  • ;;abc Beide Saiten sind gleich lang
  • def;;abc a ist länger als b
  • ;def;abc b ist länger als a

Jetzt müssen wir die Eingabe leeren, wenn die Zeichenfolgen nicht die gleiche Länge haben (Szenarien 2 und 3). Dies ist, was diese Ersetzung unten tut. Es wird Text entfernt, der den Szenarien 2 und 3 entspricht.

^;\w.*|.+;;.*|;;

Dadurch werden Zeichen entfernt, die in Strings aund nicht transliteriert sind b. abc;1b2=>ac;12

^((.)*)(.)(.*;(?<-2>.)*(?(2)(?!)))\3
$1$4

Danach müssen wir doppelte Zeichen entfernen. sese;1212=> se;12, aber das erhält Eingaben wieaba;123

+`((.)(.)*)\2((.)*;.*(.)(?&lt;-3&gt;.)*(?(3)(?!)))\6((?&lt;-5&gt;.)*(?(5)(?!)))$
$1$4$7

Schließlich löschen wir die Eingabe, wenn es doppelte Zeichen gibt, die verschiedenen Zeichen wie aba;123oder zugeordnet sind a1;22.

^(.)*(.)(.)*(\2)?.*;(?.)*(?(1)(?!))(.)(?.)*(?(3)(?!))(?(4)(?!\5)|\5).*

Und schließlich entfernen Sie doppelte Zeichen.

Kritixi Lithos
quelle
Mit diesen Bilanzkreisen sehe ich!
Neil
@ Neil In der Tat! Ich habe auch das benutzt, was (?(1)(?!))ich aus deiner Antwort gelernt habe :)
Kritixi Lithos
Ich frage mich, ob es kürzer wäre, zuerst Duplikate zu entfernen und dann die verbleibenden Sätze zu validieren - es sollte nur noch einer von jedem Buchstaben auf jeder Seite der Liste übrig sein ;.
Neil
@Neil Ich habe einen Fehler in meinem Code gefunden, der damit experimentiert hat. Ich werde es am Morgen genauer untersuchen.
Kritixi Lithos
4

Jelly , 28 26 Bytes

QL$€⁼L€
EÐḟQZK0Ç?
ZÇ0L€E$?

Probieren Sie es online!

QL$€⁼L€      Checks validity of mapping
QL$€          number of unique characters in mapping
    ⁼         equals
     L€       number of characters in mapping

EÐḟQZK0Ç?  Writes valid mapping or 0
EÐḟ           filter maps where a = b
   Q          filter duplicate maps
    Z         zip by column [["ac"],["bd"]] => ["ab","cd"]
     K0Ç?   print if valid map, else print 0

ZÇ0L€E$?      main link: takes an array of 2 strings
Z              zip by column: ["ab", "cd"] => [["ac"],["bd"]]
 Ç     ?       print mapping if
   L€E$         all pairs are same length (returns 0 if initial strings were
  0             else 0
layagyasz
quelle
1
Willkommen bei PPCG! Woher zum Teufel kennst du Jelly schon mit nur 21 Punkten? Sehr beeindruckend!
Magic Octopus Urn
2
Vielen Dank. Wir haben uns ein bisschen auf der Website umgesehen und es schien eine nette Sprache zu sein, die man lernen sollte.
Layagyasz
05AB1E ist ein weiteres einfaches und unterhaltsames Gerät, das Sie ausprobieren können.
Magic Octopus Urn
3

Ruby, 133 Bytes

->a,b{a.size!=b.size||(m=a.chars.zip b.chars).any?{|i,j|m.any?{|k,l|(i==k)^(j==l)}}?0:m.select{|x,y|x!=y}.uniq.transpose.map(&:join)}

Probieren Sie es online!

Besser lesbar:

->a, b{
    # Pair the letters in each string - [AB, AB, AB,...]
    pairs = a.chars.zip(b.chars)

    # If there's any combination of two pairs that share one character but not both,
    # or if the strings have different lengths, then the input's invalid.
    if a.size != b.size || pairs.any?{|i,j| pairs.any? {|k, l| (i==k)!=(j==l) }} 
        return 0 # 0 isn't actually falsy in Ruby, but this challenge allows it anyway
    end
    return pairs.select{|x,y| x != y} # Remove unchanged letters
                .uniq                 # Remove duplicates
                .transpose            # Change [AB, AB, AB] form to [AAA, BBB] form.
                .map(&:join)          # Convert the arrays back into strings
}

Nur zum Spaß, hier ist eine 84-Byte-Version in Goruby, Ruby, aber mit einem Golf-Flag, das beim Kompilieren des Interpreters gesetzt wird. Unter anderem können Sie Methodenaufrufe auf ihre kürzeste eindeutige Kennung abkürzen.

->a,b{a.sz!=b.sz||(m=a.ch.z b).ay?{|i,j|m.y?{|k,l|(i==k)^(j==l)}}?0:m.rj{|x,y|x==y}.u.tr.m(&:j)}
Tutleman
quelle
Warum nicht eine zweite Antwort mit der Goruby-Implementierung posten? Ist es keine akzeptierte Golfsprache?
Magic Octopus Urn
@carusocomputing Es ist total; Es schien mir nur, als hätte es keine eigene Antwort verdient - es ist genau die gleiche wie meine Hauptantwort, nur mit abgekürzten Methodennamen. Wenn ich einen Weg finde, mehr von Gorubys Unterschieden zu profitieren, werde ich vielleicht eine separate Antwort veröffentlichen.
Tutleman
3

Python 2 , 198, 193, 189, 182, 179, 175 , 169, 165 Bytes

def f(a,b):
 r=([""]*2,0)[len(a)!=len(b)]
 for u,v in zip(a,b):
	if r:
		q,w=r
		f=q.find(u)
		if u!=v:r=(([q+u,w+v],r)[f>-1 and w[f]==v],0)[f<0 and v in w]
 print r

Probieren Sie es online!

  • -4 Bytes! danke an mbomb007 für den vorschlag der verwendung von tab anstelle von space.

  • das Eingabeformat geändert, nochmal dank mbomb007.

Keerthana Prabhakaran
quelle
Was meinst du damit? Bitte hören Sie auf, ungewollte Änderungen vorzunehmen, die keine Antwort mehr bringen!
Keerthana Prabhakaran
Tab gespeichert um 4 Bytes! Vielen Dank!
Keerthana Prabhakaran
Lassen Sie uns diese Diskussion im Chat fortsetzen .
mbomb007
Und ich habe dafür gesorgt, dass in Ihrem Programm jeder Testfall in einer einzigen Zeile angezeigt wird, was für jeden, der Ihr Programm testet, äußerst hilfreich ist.
mbomb007
Es wäre besser, wenn du das in deinem Bearbeitungskommentar erwähnt hättest!
Keerthana Prabhakaran
3

Python 3.6, 211 185 181 178 Bytes

Beendet mit einem Fehler für falsche Ergebnisse.

def f(x,y,d={}):
    for a,b in zip(x,y):1/(a not in d or b==d[a]or len(x)-len(y));d[a]=b;1/([*d.values()].count(b)<2)
    return map(''.join,zip(*[x for x in d.items()if x[0]!=x[1]]))

Dies erfordert Python 3.6, die Sie in einer Shell ausführen können hier .

Sie können es ohne die richtige Ausgabereihenfolge auf TIO testen hier . (TIO hat 3.6 nicht).

Ungolfed:

from collections import*
d=OrderedDict()                     # keep order
x,y=input()
if len(x)!=len(y):1/0               # equal lengths
for a,b in zip(x,y):
    if a in d and d[a]!=b:1/0       # no duplicate keys
    else:d[a]=b
    if d.values().count(b)>1:1/0    # no duplicate values
print map(''.join,zip(*[x for x in d.items()if x[0]!=x[1]])) # format, no no-ops

Wenn nur die Bestellung keine Rolle spielen würde ...

mbomb007
quelle
Sollte nicht a1,12zurückkehren a1,12statt False? Im Abschnitt Vorsichtsmaßnahmen heißt es, dass "a1" mit der Übersetzungstabelle von [a1,12] 12 ergibt .
Fergusq
1
Nun, das Programm in Ihrem TIO-Link kehrt zurück False. 1a 21wäre auch falsch, da der oeder erhalten bleiben muss.
Fergusq
@fergusq Behoben. Beachten Sie jedoch, dass Sie einen Tippfehler in Ihrem Kommentar haben, wenn dies der Testfall ist, auf den Sie sich beziehen, da Sie dies a1,12anstelle von gesagt haben a1,22.
mbomb007
Ich habe dich missverstanden. Sie haben in Ihrer Fragebearbeitung auf den Abschnitt Vorsichtsmaßnahmen verwiesen, aber der Abschnitt Vorsichtsmaßnahmen behandelt tatsächlich einen anderen Fall - nicht die Bijektionsregel. Das hat mich verwirrt.
Fergusq
Es behandelt eine andere Regel, aber es heißt immer noch, dass das Ergebnis dieses Testfalls falsch ist, worauf es ankam.
mbomb007
2

Röda , 108 119 Bytes

{c=[{_<>_|[[_,_]]|orderedUniq}()]d=[]e=[]c|_|{{d+=a;e+=b}if[a!=b]}for a,b[d,e]if[0,1]|{|n|c|[_[n]]|sort|count|[_2=1]}_}

Probieren Sie es online!

Dies ist eine Funktion, die zwei Listen mit Zeichen aus dem Stream entnimmt und zwei Listen in den Stream überträgt.

Dies könnte sorter sein, wenn ich Paare zurückgeben durfte.

Erklärung (veraltet):

{
    c=[{
        _<>_|       /* pull two lists and interleave them */
        [[_,_]]|    /* "unflat", create lists from pairs */
        orderedUniq /* remove duplicates */
    }()]            /* c is a list of the pairs */
    d=[]
    e=[]
    c| /* push the pairs to the stream */
    _| /* flat */
    {  /* for each pair (a, b): */
        { /* if a != b (remove "1-to-1 relations"):  */
            d+=a;
            e+=b
        }if[a!=b]
    }for a,b
    /* return d and e if no character is mapped to more than one character */
    [d,e]if c|[_[0]]|sort|count|[_2=1]
}

Hier ist eine Unterstrich-Lösung, die keine Variablen enthält (114 Bytes):

{[[{_<>_}()|[[_,_]]|unorderedUniq]]|[[_()|_|[_]if[_1!=_2]],[_1()|_|[_2]if[_1!=_2]]]if[[_1()|_][::2],[_1()|_][1::2]]|[sort(_)|count|[_2=1]]}

Das ist eine Menge Unterstriche.

fergusq
quelle
Was macht der <>?
Kritixi Lithos
@KritixiLithos Dies ist der Interleave-Operator. a() <> b()ist dasselbe wie interleave([a()], [b()])(oder nur interleave(a, b), wenn aund bsind Arrays).
Fergusq
Damit ist der a1 22 => falseTestfall nicht bestanden. "Alle Übersetzungen erfolgen unabhängig voneinander, was bedeutet, dass dies falsch ist."
mbomb007
@ mbomb007 Ich verstehe nicht ganz was du sagst? Meinen Sie, es muss eine Biktion sein, dh. dürfen nicht zwei Zeichen demselben Zeichen zugeordnet werden?
Fergusq
Ja. Das sagt die Frage. ( Jedes Zeichen kann nur
EINMAL
1

AWK, 140 Bytes

BEGIN{RS="(.)"}RT~/\W/{S=1}RT~/\w/&&S{if(RT!=x=A[++b]){if(B[z=RT]==""){B[z]=x
c=c x
d=d z}a=B[z]!=x?0:a}}!S{A[++a]=RT}END{if(a==b)print c,d}

Verwendung: Code eingeben in FILEdann:

awk -f FILE <<< "string1 string2"

Die Eingabezeichenfolgen müssen durch Leerzeichen getrennt sein.

Die Ausgabe ist leer, wenn sie fehlschlägt, oder zwei durch ein Leerzeichen getrennte Zeichenfolgen.

Robert Benson
quelle
1

k, 28 Bytes

{$[(y?y)~x?x;+?(~=/)#x,'y;]}

Erläuterung:

{                          } /function that takes in two strings, x and y
 $[         ;            ;]  /if statement (to check if there is a mapping)
         x?x                 /first index of [each letter in x] in x
   (y?y)                     /first index of [each letter in y] in y
        ~                    /make sure they match
                     x,'y    /zip together the two strings
               (~=/)#        /remove equal pairs
              ?              /unique pairs only
             +               /transpose ("unzip", in a way)
zgrep
quelle
1

APL (Dyalog) mit AGL , 22 Bytes

{≡/⍳⍨¨⍺⍵:↓⍉↑∪⍺(≠é,¨)⍵}

Probieren Sie es online!

{} Anonyme Funktion:

 Wenn…

  ⍺⍵ die Argumente

  ⍳⍨¨ wenn selbstindiziert (dh das erste Vorkommen ihrer Elemente in sich selbst)

  ≡/ sind gleichwertig

: dann:

  ⍺()⍵ Wenden Sie die folgende implizite Funktion auf die Argumente an:

    entsprechende Elemente verketten (Fehler bei nicht übereinstimmenden Längen)

   é dann filtere nach ( éist nur die primitive Funktion/ )

    wo die Saiten unterschiedlich sind

   einzigartig (Duplikate entfernen)

  ↓⍉↑ Transponiere Liste-von-Paaren in Paar-von-Listen (Lit. Mix in Tabelle, Transponiere Tabelle, Split in Listen)

 sonst nichts tun

Adam
quelle
1
wartet geduldig auf die Erklärung dieser Antwort : P
Magic Octopus Urn
1
@carusocomputing Ich bin dabei.
Adám
@carusocomputing OK?
Adám
Ich habe diese Antwort verpasst, sorry! ↓⍉↑hat mich noch ein wenig verwirrt.
Magic Octopus Urn
1
@carusocomputing Vielleicht hilft das? Beachten Sie, dass in APL und J eine Matrix nicht mit einer Liste von Listen identisch ist.
Adám
0

CJam, 38 Bytes

{_:,~={1\/;}:K~z{)\c=!},L|z_{_L|=K}%;}

Eingabe und Ausgabe sind Arrays auf dem Stapel.

Esolanging Fruit
quelle
0

PHP (> = 7.1), 165 Bytes

for([,$x,$y]=$argv;a&$c=$x[$i];$t[$c]=$d)$z+=($d=$y[$i++])&&$d==($t[$c]??$d);foreach($t as$a=>$b)$a==$b?:$r[$a]=$b;print_r($z<$i|array_unique($r)<$t||a&$y[$i]?0:$t);

druckt 0für falsches, assoziatives Array sonst. Laufen Sie mit-r oder testen Sie es online .

Nervenzusammenbruch

for([,$x,$y]=$argv;         # import arguments to $x and $y
    a&$c=$x[$i];            # loop through $x
    $t[$c]=$d)                  # 2. add pair to translation
$z+=                            # 1. increment $z if
    ($d=$y[$i++])&&             # there is a corresponding character in $y and
    $d==($t[$c]??$d);           # it equals a possible previous replacement
                            # remove identities from translation
foreach($t as$a=>$b)$a==$b?:$r[$a]=$b;
print_r(
    $z<$i                   # if not all tests passed
    |array_unique($t)<$t    # or there are duplicates in the translation
    ||a&$y[$i]              # or $y has more characters
    ?0                      # then print 0
    :$r                     # else print translation
);
Titus
quelle
Sind assoziative Arrays als Ausgabe zulässig? Könnten Sie bitte hinzufügen, dass es über Version 7.1 funktioniert
Jörg Hülsermann
@ JörgHülsermann Output can be as an array or ..., also würde ich ja sagen. Die aktuelle PHP-Version ist für alle meine Postings implizit. aber wenn ich etwas wichtiges zum bearbeiten finde, füge ich die version hinzu.
Titus
Die gültigen Fälle zeigen nur eine Bedeutung der Array-Ausgabe. Wenn auch assoziative Arrays erlaubt sind, kann ich ein paar Bytes sparen. Wenn es erlaubt ist und array_unique($r)!=$rin jedem Fall ist, array_unique($r)<$rwerde ich deinen Beitrag alleine für diesen Trick verbessern. Im Moment bin ich auf der Suche nach einer Erklärung
Jörg Hülsermann
@ JörgHülsermann array_unique($t)<$t(musste das ändern, weil canto cnnungültig ist) funktioniert, weil Arrayvergleiche ( anders als Stringvergleiche) Längen vor allem anderen vergleichen.
Titus
Der Test canauf cnnkostet mich 17 Bytes Forget meinen Vorschlag
Jörg Hülsermann