Diese Frage beinhaltet die Eingabe in Morsecode als. (Punkt) und - (Minuszeichen), mit Leerzeichen, um die Eingabe zu trennen. Ihre Aufgabe ist es, den Code in die Standardausgabe umzuwandeln. Sie können davon ausgehen, dass die einzige Eingabe Zeichensymbole enthält, die im internationalen Morsecode-Alphabet enthalten sind, das hier zu finden ist: http://en.wikipedia.org/wiki/Morse_code#Letters.2C_numbers.2C_punctuation .
Alle Ausgaben sollten Kleinbuchstaben verwenden. Ein doppeltes Leerzeichen sollte als ein Wortraum interpretiert werden.
Beispieleingabe:
. -..- .- -- .--. .-.. . .-.-.- ... --- ...
Ausgabe:
example. sos
Kürzester Code nach zwei Wochen gewinnt.
Antworten:
Mathematica 62
Mathematica erlaubt uns zu betrügen
Die ersten beiden Symbole
.
und.-
sind notwendig, um kleine Codes richtig zu interpretieren.quelle
f=ToLowerCase@StringDrop[WolframAlpha[". .- "<>#,"Result"],2]&
für Kleinbuchstaben geändert werden.Drat, ich hatte gehofft, hierher zu kommen, bevor die GolfScripter ankamen :-(
Wie auch immer ...
C: 228 Zeichen:
Ich dachte, ich würde eine Erklärung hinzufügen, wie das funktioniert.
Die Eingabedaten werden anhand der Baumdaten in analysiert
*c
, die wie folgt erweitert werden können (·
zur Darstellung eines freien Knotens):Beginnen Sie oben am Baum und arbeiten Sie sich nach unten, während Sie sich für einen Punkt nach links und für einen Strich nach rechts bewegen. Geben Sie dann das Zeichen aus, an dem Sie sich gerade befinden, wenn die Eingabezeichenfolge endet (dh wenn ein Leerzeichen auftritt). Zum Beispiel führen drei Punkte und ein Bindestrich zu
v
viae
,i
unds
. Anstatt explizit nach Punkten (ASCII\x2e
) und Bindestrichen (ASCII\x2d
) zu suchen , müssen wir nur das letzte Bit (m[n]&1
) überprüfen , das 0 für.
und 1 für ist-
.Sechs Zeilen reichen aus, um alles zu codieren, mit Ausnahme von
$
7 Punkten / Strichen :...-..-
. Da die Eingabedaten jedoch garantiert gültig sind, kann dies leicht behoben werden, indem die Eingabe auf 6 Zeichen (m[6]=0
) gekürzt...-..
und$
stattdessen als interpretiert wird. Wir können auch die letzten 7 Bytes aus den Baumdaten entfernen, da sie alle leer sind und nicht benötigt werden, wenn die Eingabe gültig ist.quelle
c
einzulesen. Vielleicht könnten Sie Modulo & ein Offset verwenden, um zu versuchen, die höheren Werte zusammenzudrücken; Das ist, was ich in meiner Lösung mache. Wie auch immer, gute Arbeit!GolfScript (
116 11397 Zeichen)Dies schließt nicht druckbare Zeichen ein, die in einer Nachschlagetabelle verwendet werden. Daher gebe ich sie als xxd-Ausgabe aus:
Dies dekodiert zu einem Programm, das äquivalent zu ist
Das ist im Wesentlichen
Hierbei wird ein (nicht minimaler) perfekter Hash verwendet, der auf der Kernidee eines optimalen Algorithmus zum Erzeugen minimaler perfekter Hash-Funktionen basiert . Tscheche, Havas und Majewski; 1992 . Ihre Grundidee ist, dass Sie zwei Hash-Funktionen verwenden
f1
undf2
zusammen mit einer Nachschlagetabelleg
und dem perfekten Hash(g[f1(str)] + g[f2(str)]) % m
(wom
ist die Anzahl der Zeichenfolgen, die wir unterscheiden möchten); Das Schlaue ist die Art, wie sie baueng
. Betrachten Sie alle Wertef1(str)
undf2(str)
Zeichenfolgenstr
von Interesse als Knoten in einem ungerichteten Diagramm und fügen Sie eine Kante zwischenf1(str)
und hinzuf2(str)
für jede Zeichenfolge. Sie erfordern nicht nur, dass jede Kante unterschiedlich ist, sondern dass der Graph azyklisch ist; dann ist es nur ein DFS, den Knoten eine Gewichtung zuzuweisen (dh die Nachschlagetabelle aufzufülleng
), so dass jede Kante die erforderliche Summe hat.Czech et al erzeugt Zufallsfunktionen
f1
undf2
die über Lookup - Tabellen ausgedrückt werden, aber das ist eindeutig nicht gut: ich nach einem geeigneten Hash mit einfachen Basiskonvertierungen mit zwei verschiedenen Basen von -10 bis 9. suchte ich die azyklische Anforderung auch entspannt. Ich wollte nicht die Saiten auf Werte von 0 bis 54, aber mit den entsprechenden ASCII - Codes zuzuweisen, so anstatt nehmen(g[f1(str)] + g[f2(str)]) % m
wollte ich(g[f1(str)] + g[f2(str)]) % N
für einigeN > 'z'
. Dies ermöglicht es jedoch, verschiedene zu testenN
und festzustellen, ob eine gültige Nachschlagetabelle zulässig istg
, unabhängig davon, ob es Zyklen gibt. Im Gegensatz zu Czech et al ist es mir egal, ob die Suche nach der perfekten Hash-Funktion O (n ^ 4) ist.Die von
-4base
und5base
mod erzeugte Grafik59
ist:Das ist ziemlich gut, abgesehen von der größten verbundenen Komponente, die drei Zyklen mit der Länge 1 hat. Wir müssen aufsteigen,
N=233
bevor wir eineg
konsistente finden können.quelle
C 169 Zeichen
Ich konnte keine bessere Hash-Funktion finden.
(Ich habe den nicht vervollständigten Code gepostet, ihn aber als vervollständigt gezählt. Zum Vervollständigen einfach
:%s/ //g | %j!
in vim ausführen und dann das Leerzeichen im String-Literal zurücksetzen .)Testlauf
(
morse.in
ist nur das ganze Alphabet in Morse in getrennten Zeilen):Erläuterung
Dieser ist ziemlich einfach.
c < 33
findet ein Leerzeichen / Trennzeichen (,
\n
, EOF, ...).c % 2
Übersetzt einen Punkt oder Strich in ein Bit. Die Idee ist, eine eindeutige Nummer für jedes Zeichen zu erstellen, indem Sie es einfach als Binärzahl interpretieren (nachdem Sie der Variablenlänge 1 vorangestellt haben) (diese Interpretation ist derv*2 + c%2
Teil). Ich erhalte dann eine 137-Zeichen-LUT, die ich komprimiert habe, indem ich den resultierenden Wert (v < 64? v : v % 51 + 33
Konstanten, die durch Versuch und Irrtum gefunden wurden, und indem ich die Verteilung betrachte und versuche, eine große Lücke zu finden) hashe. Leider hat diese Hash-Funktion eine einzige Kollision, weshalb ich die40 → '&'
Zuordnung in Sonderfällen vornehmen muss.quelle
R , 145 Bytes
Übersetzte einen Punkt in eine 2, einen Strich in eine 1 und interpretierte die Zahl ternär und nahm den Mod 89, der eine eindeutige Zahl ergibt, die wir in einer Hash-Tabelle verwenden können. Das Vorhandensein einer 13 (111 Base-3) bedeutet das Hinzufügen von 1, da ASCII 13 in TIO nicht funktioniert.
Probieren Sie es online!
R , 236 Bytes (nicht konkurrierend)
Dies wird nicht wettbewerbsfähig sein, aber es ermöglicht uns, etwas Interessantes in R zu demonstrieren: Speichern Sie den Morse-Code-Baum in einer zitierten Sprachstruktur
m
und rufen Sie ihn aus dem Code von Punkten und Strichen ab, indem Sie einfach die Tatsache[[
verwenden, die rekursiv auf angewendet werden kann Listen. Ruft zum Beispielm[[c(2,2,3,2)]]
Punkt, Punkt, Strich, Punkt oder "f" ab.Probieren Sie es online!
quelle
Powershell, 193 Bytes
Weniger Golf Test-Skript:
Ausgabe:
quelle
JavaScript (165 Byte, nur vier Ebenen implementierend.)
Die Eingabe sollte zugewiesen werden
n
, führen Sie den folgenden Code aus, um die Ausgabe zu erhalten:quelle
Cannot read property '42' of undefined
und IdeOne meldet auch einen Fehler (allerdings ohne nützliche Meldung).. -..- .- -- .--. .-.. . .-.-.-
als Eingabe akzeptiert , da der letzte Code 6 Zeichen lang ist. Im Beispielskript lasse ich es weg und gehe mit. -..- .- -- .--. .-..
, welche Warnungen (example
).