Neurotische Frösche entziffern
Jetzt, da Puzzling.SE endlich meine von Amphibien besessene Chiffre geknackt hat , schreiben wir ein Programm oder eine Funktion, um sie zu entschlüsseln!
(Wenn Sie sich das Puzzle ansehen möchten, bevor es für Sie verwöhnt wird, klicken Sie jetzt auf den obigen Link.)
Wie die Chiffre funktioniert
In Neurotic Frösche O ught Um Rel ein x in M ud Bäder ( „Neurotic Frösche“ abgekürzt), wird jeder Brief als ein oder zwei Wörter verschlüsselt:
- Die Länge eines nicht kursiv geschriebenen Wortes entspricht einem Buchstaben.
neurotic
=> 8 Buchstaben =>H
frogs
=> 5 Buchstaben =>E
perpendicular
=> 13 Buchstaben =M
- Ein Wort, das Kursivschrift enthält, ändert das folgende Wort und fügt 10 hinzu, wenn das kursiv geschriebene Wort ungerade lang war, oder 20, wenn das kursiv geschriebene Wort gerade lang war. Das Wort kann ganz oder teilweise kursiv geschrieben werden. Auf ein kursives Wort folgt immer ein nicht kursives Wort.
*o*ught to
=> ungerade, 2 => 12 =>L
lo*u*nging calms
=> gerade, 5 => 25 =>Y
Jedes Wort im Klartext entspricht einem Satz im Chiffretext, und jeder Satz im Klartext entspricht einem Absatz im Chiffretext.
Eingabeformat
Ihr Programm oder Ihre Funktion soll eine Nachricht in Neurotic Frogs eingeben, die in Markdown formatiert ist. Die Eingabe besteht nur aus druckbarem ASCII und Zeilenumbrüchen.
- Wörter sind Zeichenfolgen, die dem regulären Ausdruck entsprechen
[A-Za-z0-9']
.- Zahlen und Buchstaben zählen jeweils zur Länge eines Wortes.
QB64
darstelltD
. - HINWEIS: Apostrophe zählen nicht zur Länge eines Wortes.
Isn't
darstelltD
, nichtE
.
- Zahlen und Buchstaben zählen jeweils zur Länge eines Wortes.
- Kursiv geschriebene Buchstaben sind in zwei Sternchen (
*letters*
) eingeschlossen.- Ein oder mehrere aufeinanderfolgende Buchstaben können bis zu einem ganzen Wort (
masseus*es*
,*all*
) kursiv geschrieben werden . Es können auch mehrere nicht aufeinanderfolgende Buchstaben in einem Wort kursiv geschrieben werden (g*e*n*e*rates
). - Kursivschrift umfasst niemals mehrere Wörter, enthält niemals Satzzeichen und niemals Apostrophe.
- Nicht gepaarte Sternchen und mehrere benachbarte Sternchen werden niemals auftreten.
- Ein oder mehrere aufeinanderfolgende Buchstaben können bis zu einem ganzen Wort (
- Interpunktion ist eine der folgenden Zeichen:
.,?!:;-()"
.- Wörter innerhalb eines Satzes werden durch ein oder mehrere Interpunktionszeichen und / oder ein einzelnes Leerzeichen getrennt. Beispiele:
*all* welcomed
,toad*s*, newts
,Ever*y*one--frogs
,cap... bliss
,they're (I
- Sätze enden mit einem oder mehreren Interpunktionszeichen und werden durch ein doppeltes Leerzeichen getrennt:
Th*e* Montgomery A*m*phibian Salon! Come luxuriate today!
- Absätze werden durch eine neue Zeile getrennt. (Der letzte Satz eines Absatzes enthält am Ende noch ein oder mehrere Satzzeichen.)
- Wörter innerhalb eines Satzes werden durch ein oder mehrere Interpunktionszeichen und / oder ein einzelnes Leerzeichen getrennt. Beispiele:
Andere Zeichen werden in der Eingabe nicht angezeigt und müssen nicht behandelt werden.
Ihr Code kann nach eigenem Ermessen davon ausgehen, dass die Eingabe eine einzige nachgestellte Zeile enthält.
Ausgabeformat
Das Ergebnis der Entschlüsselung der Eingabe sind ein oder mehrere Sätze. Klartextbuchstaben können eine beliebige Kombination aus Groß- und Kleinschreibung sein. Wörter innerhalb eines Satzes müssen durch einzelne Leerzeichen getrennt werden. Sätze müssen mit einem Punkt ( .
) enden und durch ein Leerzeichen getrennt sein. Sie können nach dem letzten Satz ein Leerzeichen ausgeben. Ihre Ausgabe erfolgt alle in einer Zeile, Sie können jedoch eine nachfolgende neue Zeile ausgeben.
Verschiedene Details
Ihr Code kann eine der Standardeingabe- und -ausgabemethoden verwenden. Es muss Eingaben als mehrzeilige Zeichenfolge empfangen, keine Liste oder andere Datenstruktur, und es muss eine Zeichenfolge ausgeben.
Der kürzeste Code in Bytes gewinnt!
Testfälle
-->
Neurotic Frogs *O*ught To Rel*a*x In *M*ud Baths!
<--
HELLO.
-->
Business standards all*o*w only *adult* amphibians.
<--
HINT.
-->
Rejoice, *a*ll frogs an*d* toads also! Montgomery Sal*o*n opens up! Ha*pp*y throng fill*s* street ecstatically!
<--
GOOD JOB PPL.
-->
I like 3.1415926535897.
IM*O*, it's a *b*la*st*, yeah!
<--
ADAM. MAN.
-->
*I*, happily, *th*anks 2 u *e*ditin*g* specific wor*ding*--clarifying a *bit*--betterment :D!
<--
QUARTATA.
-->
Perpendicular l*ou*nging calms. *A* frog, a m*u*d cap... bliss! Wallowing g*e*n*e*rates happiness. Amphibian sp*a* isn't expensive--seventy d*o*llars--cheap! That'*s* not *a* large e*x*pens*e* from an*y* discerning fr*o*g's money, unlik*e* Super 8.
Ever*y*one--frogs, toad*s*, newts, *a*nd salamanders! G*e*t a wonderful shiat*s*u, or recei*v*e an other kind. Masseus*es* are her*e* today! Invite a fianc*e*e, supervisor, roommate, niece: *all* welcomed!
Y*o*u simply ne*v*er believed these p*o*ssibilitie*s*; they're (I *swear*) absolute truth! Th*e* Montgomery A*m*phibian Salon! Come luxuriate today!
<--
MY NAME IS INIGO MONTOYA. YOU KILLED MY FATHER. PREPARE TO DIE.
quelle
Antworten:
Perl, 72 Bytes
Zählt man den Shebang als einen, wird die Eingabe von stdin übernommen.
Beispielnutzung
quelle
JavaScript (ES6),
172169157150 Byte10 Bytes dank @Neil eingespart
Kann wohl noch weiter verbessert werden. Ausgaben in Kleinbuchstaben.
quelle
i=0
in das Feld bewegentoString
.x=>x.replace(/([\w*']+)[^\w\n*' ]* ?( ?)/g,(_,y,z)=>/\*/.test(y,l=y.replace(/'/g ,"").length)?(i=l%2||2,""):l+i*10+9).toString(36,i=0)+z,i=0).replace(/\n|$/g,". ")
.replace
und nur mit.match
gespeichert.Python 2,
238221218214207205 BytesVerwendet viel Regex, um die Verarbeitung durchzuführen. Wir wandeln den Doppelraum in einen um
~
und verwenden ihn, um ihn zu verarbeiten.~
und\n
werden speziell behandelt.Der größte Zeichengewinn ergibt sich aus der Vorverarbeitung der Eingabe in der
for
Zeile. Dies kann definitiv weiter golfen werden.Ideone es! (alle Testfälle)
7 Bytes gespart dank DLosc!
quelle
Pip ,
6564 BytesDie Punktzahl beträgt 62 Byte Code + 2 für die
-rs
Flags.Probieren Sie es online!
Erläuterung
Das
-r
Flag liest alle Zeilen von stdin und speichert eine Liste von ihnen ing
. Das-s
Flag setzt das Ausgabeformat von Listen auf Leerzeichen.Der einfachste Weg, diesen Code zu lesen, ist von außen in:
quelle
Python 2.7,
390342341339335 Bytes:Nimmt Eingaben im Format:
F('''Multi or Single-lined String''')
Kann viel mehr golfen werden, was ich tun werde, wenn ich die Chance dazu bekomme.
Repl.it mit allen Testfällen!
Erläuterung:
Verwendet die immense Kraft der in Python integrierten regulären Ausdrücke, um die Eingabe zu entschlüsseln. Dies ist der grundlegende Prozess, den die Funktion für jede Eingabe durchläuft:
Erstens werden alle
--
durch ein einzelnes Leerzeichen ersetzt, und jeder Apostroph wird entfernt. Dann werden alle Wörter mit kursiven Komponenten und das Wort ausgehend es sind beide in einer Saite abgestimmt und mit ersetzt10 + len(second word)
Anzahl aufeinanderfolgendera
s , wenn die Länge des ersten Wortes istodd
, und in20 + len(second word)
Folgea
s anders. Dabei wird der folgende reguläre Ausdruck verwendet:[^\w\s*]*\w*\*\w+\*.*?(?=\s) \w+
Wenn wir zum Beispiel den Satz haben
Perpendicular l*ou*nging calms.
,l*ou*nging calms
wird er durchaaaaaaaaaaaaaaaaaaaaaaaaa
oder 25a
s ersetzt, da erl*ou*nging
eine gerade Anzahl von Zeichen hat undcalms
5 hat20+5=25
.Jetzt wird die neu geänderte Eingabe an jedem Satzzeichen geteilt, gefolgt von einer neuen Zeile (
\n
), um die Absätze zu erhalten, dann wird jeder Absatz an jeder Interpunktion geteilt, gefolgt von zwei Leerzeichen, um die Sätze zu erhalten, und schließlich wird jeder Satz in Wörter aufgeteilt Interpunktion einschließlich Leerzeichen. Dann wird für jedes Wort (einschließlich der Läufe von aufeinanderfolgendena
s), fügen wir in einen String aufW
den Brief an den Unicode - Codepunkt entspricht64
(der Unicode - Codepunkt des Zeichens vorA
, das ist@
) zzgllen(word)
. Wir fügen dann einen einzigen Raum zuW
einmal alle Wörter eines Satzes erschöpft sind, und wenn alle die Sätze in einem Absatz erschöpft sind, wir fügen Sie.
durch ein Leerzeichen gefolgt.Schließlich wird, nachdem die gesamte Eingabe durchlaufen wurde
W
,stdout
als entschlüsselte Nachricht ausgegeben .quelle
re
, verwenden Siesub
anstelle vonstr.replace
. Allgemeiner Golf-Vorschlag: Es ist wahrscheinlich effizienter, alles, was kein Wort oder keine*
Interpunktion ist, zu behandeln. Spart große, riesige Charakterklassen.PHP, 196 Bytes
Wenn ich davon ausgehen könnte, dass in der Mitte eines Wortes nur ein Apostroph 194 Bytes steht
quelle
%0A
als Funktion urlencodiertrawurlencode("\n")
. Ich bevorzuge in diesem Fall ein Formular mit einem Textbereich für die Eingabe und so macht es meine HTML-Seite automatisch, den String zu kodieren<?
. Ein Fehler gehört dazu$_GET[s]
, funktioniert aber richtig ist$_GET["s"]
und es ist besser, die Variable$p=0;
vor der Schleife zu deklarieren und zu initialisieren . Jetzt ist meine Frage an Sie: Kann ich annehmen, dass in einem Wort nur ein Apostroph in der Mitte des Wortes steht?<?php
gearbeitet.<?
in der Realität noch nie benutzt . Ich benutze den kurzen Tag nur in meinem Beitrag hier. Jetzt weiß ich, dass es in einer leeren Seite wiedergegeben werden kann.PHP,
231226228 Bytesfür den Anfang
In Datei speichern, rund
php <scriptpath> <text>
. Escape-Zeilen im Text, damit es in der Shell funktioniert.quelle
$argv[1]
, als würde es Eingaben von lesen , aber ich weiß nicht, wie dieser Ansatz funktioniert, wenn Eingaben Zeilenumbrüche enthalten. Ich habe es"Neurotic Frogs *O*ught To Re*a*x In *M*ud Baths!"
als Kommandozeilenargument versucht undIFHCHCFF.
zur Ausgabe gebracht (sowie alsUndefined variable: d
Warnung).<?
, Speichern in eine Datei und das Aufrufen mitphp <filename> <string>
. Ich muss möglicherweise 2 zur Byteanzahl hinzufügen.<?
, können Sie auch mit enden?>.
, für einen Nettogewinn von 1. FWIW bekomme ichIFHCMFF.
für den ersten Testfall (mit PHP 5.5.21 64-Bit, VC14). Die Verwendung von$argn
mit-F
kann ebenfalls eine Option sein.php <filename> <string>
es möglich ist, wenn<string>
Zeilenumbrüche enthalten können.