Cryptic Kicker //

12

Cryptic Kicker

Eine übliche, aber unsichere Methode zum Verschlüsseln von Text besteht darin, die Buchstaben des Alphabets zu permutieren. Mit anderen Worten, jeder Buchstabe des Alphabets wird im Text durch einen anderen Buchstaben ersetzt. Um sicherzustellen, dass die Verschlüsselung umkehrbar ist, werden keine zwei Buchstaben durch denselben Buchstaben ersetzt. Ihre Aufgabe ist es, mehrere verschlüsselte Textzeilen zu entschlüsseln, vorausgesetzt, jede Zeile verwendet einen anderen Satz von Ersetzungen und alle Wörter im entschlüsselten Text stammen aus einem Wörterbuch bekannter Wörter.

Eingang

Die Eingabe besteht aus Wörtern in Kleinbuchstaben in alphabetischer Reihenfolge. Diese Wörter bilden das Wörterbuch der Wörter, die im entschlüsselten Text vorkommen können. Nach dem Wörterbuch folgen mehrere Eingabezeilen. Jede Zeile wird wie oben beschrieben verschlüsselt.

Das Wörterbuch enthält nicht mehr als 1.000 Wörter. Kein Wort überschreitet 16 Buchstaben. Die verschlüsselten Zeilen enthalten nur Kleinbuchstaben und Leerzeichen und dürfen nicht länger als 80 Zeichen sein.

Ausgabe

Entschlüsseln Sie jede Zeile und drucken Sie sie auf die Standardausgabe. Wenn es mehrere Lösungen gibt, reicht jede aus. Wenn es keine Lösung gibt, ersetzen Sie jeden Buchstaben des Alphabets durch ein Sternchen.

Sample Input

and dick jane puff spot yertle

bjvg xsb hxsn xsb qymm xsb rqat xsb pnetfn
xxxx yyy zzzz www yyyy aaa bbbb ccc dddddd

Beispielausgabe

dick and jane and puff and spot and yertle
**** *** **** *** **** *** **** *** ******

Hier ist die Lösung. Bitte beachten Sie, dass ich bin kein Pferd im Rennen läuft für das kürzeste Bytes / Competitive - Programmierer. Ich mag nur Rätsel!

( Quelle )

Dhruv Ramani
quelle
1
Bitte lockern Sie Ihre Eingabebeschränkungen auf etwas, das für jede Sprache gilt. Zum Beispiel werden viele Sprachen es hassen und nicht zu schätzen wissen, dass das Format mit einer 6 beginnt. Ich würde vorschlagen, das Format völlig unspezifiziert zu lassen und nur zu sagen, dass die Eingabe eine Liste von Wörtern und eine Liste von zu verschlüsselnden Zeilen ist.
Orlp
Okay, los geht's!
Dhruv Ramani
1
Gibt es Laufzeitbeschränkungen dafür? Kann ich einfach jede mögliche Ersatzkombination durchlaufen, bis eine funktioniert (was wahrscheinlich Jahre dauern würde)?
Nathan Merrill
@ NathanMerrill Tun Sie das und wenn es Jahre dauern wird, drucken Sie es einfach in der Sternform. Vihan, es ist kein Duplikat. Bitte lies die Frage richtig durch.
Dhruv Ramani
Können wir die Wörter nur ausgeben oder müssen wir uns ihnen anschließen?
Downgoat

Antworten:

3

Python 3, 423 Bytes

import sys,re
S=re.sub
D,*L=sys.stdin.read().split('\n')
def f(W,M=[],V="",r=0):
 if len({d for(s,d)in M})==len(M):
  if[]==W:return V.lower()
  for d in D.split():p='([a-z])(?%s.*\\1)';m=re.match(S(p%'=',')\\1=P?(',S(p%'!',').>\\1<P?(',W[0].translate(dict(M))[::-1]))[::-1]+'$',d.upper());r=r or m and f(W[1:],M+[(ord(s),m.group(s))for s in m.groupdict()],V+d+" ")
  return r
for l in L:print(f(l.split())or S('\w','*',l))

Liest die Eingabe von STDIN und schreibt die Ausgabe in STDOUT. Dabei wird dasselbe Format wie für die Beispieleingabe / -ausgabe verwendet.

Erläuterung

Für jede Chiffretextzeile führen wir das folgende Verfahren durch:

Wir behalten eine Karte, M , aller Buchstabenumwandlungen, die wir bereits erstellt haben (die anfangs leer sind). Wir machen das so, dass die Quellbuchstaben alle Kleinbuchstaben und die Zielbuchstaben alle Großbuchstaben sind.

Wir verarbeiten die Wörter im Chiffretext der Reihe nach. Für jedes Wort finden wir alle Wörter im Wörterbuch, die möglicherweise übereinstimmen:

Angenommen, unser Wort w ist glpplppljjlund M die Regel enthält j -> P. Wir transformieren w zuerst unter Verwendung der bestehenden Regeln in M , bekommen glpplpplPPl. Wir wandeln w dann in folgenden Regex mit Python-Geschmack um:

(?P<g>.)(?P<l>.)(?P<p>.)(?P=p)(?P=l)(?P=p)(?P=p)(?P=l)PP(?P=l)

Die Regeln der Transformation lauten wie folgt:

  • Das erste Vorkommen jedes Kleinbuchstabens xwird durch ersetzt . Hiermit wird eine benannte Erfassungsgruppe definiert , die einem einzelnen Zeichen entspricht.(?P<x>.)x
  • Bei jedem weiteren Vorkommen wird jeder Kleinbuchstabe, durch x, ersetzt . Dies ist ein Rückverweis auf den Charakter, der zuvor von der genannten Gruppe erfasst wurde .(?P=x)x

Wir führen diese Transformation durch, indem wir w umkehren und dann die beiden folgenden regulären Substitutionen anwenden:

s/([a-z])(?!.*\1)/)>\1<P?(/
s/([a-z])(?=.*\1)/)\1=P?(/

und dann das Ergebnis umkehren. Beachten Sie, dass die zuvor von M transformierten Zeichen als Großbuchstaben angezeigt werden und daher unverändert bleiben.

Wir gleichen den resultierenden regulären Ausdruck mit jedem der Wörterbuchwörter ab, wobei die Wörterbuchwörter in Großbuchstaben angezeigt werden. Beispielsweise würde der obige reguläre Ausdruck mit dem Wort übereinstimmen MISSISSIPPI. Wenn wir eine Übereinstimmung finden, extrahieren wir die neuen Transformationsregeln daraus und fügen sie zu M hinzu . Die neuen Transformationsregeln sind einfach die Zeichen, die von jeder Erfassungsgruppe erfasst werden. In dem obigen regex, die Gruppe gübereinstimmt M, das lGruppenspiel I, und die Gruppe pStreichhölzer S, uns die Regeln zu geben g -> M, l -> I, p -> S. Wir müssen sicherstellen, dass die resultierenden Regeln konsistent sind, dh, dass keine zwei Quellbuchstaben demselben Zielbuchstaben zugeordnet sind. Andernfalls lehnen wir das Spiel ab.

Wir fahren dann mit dem nächsten Wort fort und verwenden die erweiterten Transformationsregeln. Wenn wir mit diesem Verfahren alle Chiffretextwörter abgleichen können, haben wir den Text entschlüsselt. Wenn wir kein Wort mit einem der Wörterbuchwörter vergleichen können, werden wir zurückverfolgen und versuchen, die vorherigen Wörter mit verschiedenen Wörterbuchwörtern zu vergleichen. Wenn dieser Vorgang fehlschlägt, gibt es keine Lösung und wir drucken eine Reihe von Sternchen.

Ell
quelle
2

CJam, 62 56 Bytes

qN%Sf/(f{\:C,m*{C..+`Sa`m2/Q|z_''f-Qf|=},C:,'*f*a+0=S*N}

Ziemlich langsam und speicherhungrig, funktioniert aber für den Testfall mit dem Java-Interpreter.

Beispiellauf

$ cat input; echo
and dick jane puff spot yertle

bjvg xsb hxsn xsb qymm xsb rqat xsb pnetfn
xxxx yyy zzzz www yyyy aaa bbbb ccc dddddd
$ time cjam kicker.cjam < input
dick and jane and puff and spot and yertle
**** *** **** *** **** *** **** *** ******

real    5m19.817s
user    6m41.740s
sys     0m1.611s
Dennis
quelle