Tor
Morsecode wird oft als Ton dargestellt. Übersetzen Sie den Stream in Buchstaben, Zahlen und Leerzeichen, wenn ein Bit-Stream angegeben wird, der angibt, ob der Ton aktiviert oder deaktiviert ist.
Besonderheiten
- Der Bitstrom wird basierend auf der Länge der sich wiederholenden EIN / AUS-Bits analysiert.
- 1 EIN-Bit ist ein Punkt
- 3 ON-Bits sind ein Strich
- 1 AUS-Bit begrenzt Punkte und Striche
- 3 AUS-Bits begrenzen Zeichen
- 7 AUS-Bits begrenzen Wörter (Leerzeichen)
- Die Eingabe kann eine Zeichenfolge oder ein Array sein. In der Eingabe sind nur zwei eindeutige Zeichen / Werte Ihrer Wahl zulässig. (zB 0/1, wahr / falsch, Komma / Leerzeichen)
- Die Ausgabe gibt eine Zeichenfolge zurück oder wird auf die Standardausgabe gedruckt.
Beispiel
Input: 101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
Analysis: \--H--/ E \---L---/ \---L---/ \----O----/\-- --/\---W---/ \----O----/ \--R--/ \---L---/ \--D--/
Output: HELLO WORLD
Annahmen
- Der Stream beginnt und endet immer mit einem EIN-Bit.
- Es gibt kein führendes oder nachfolgendes Leerzeichen.
- Die Eingabe ist immer gültig.
- Alle Buchstaben (Groß- / Kleinschreibung wird nicht berücksichtigt) und Ziffern werden unterstützt.
Testfälle
101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
HELLO WORLD
10100000001011100011101110000000101110000000101011101000101000101010001010101
I AM A FISH
1010111011101110001110111011101110111000101110111011101110001110111010101
2017
101010001110111011100010101
SOS
Wertung
Das ist Code Golf. Der Code mit der niedrigsten Bytezahl gewinnt nächste Woche um diese Zeit.
Antworten:
APL (Dyalog) ,
65626057 Bytes-3 danke an ngn.
Tacit-Präfix-Funktion.
Probieren Sie es online! Header
f←
,, und Footer ermöglichen nur den Aufruf der Funktion von Input, während die Byteanzahl von TIO beibehalten wird. In einer normalen APL-Sitzung (entsprechend dem Eingabefeld von TIO) wäre dies nicht erforderlich .⎕CY'dfns'
c op y die DFNS Arbeitsbereichen (Bibliothek)(
… Wenden Sie)
diese implizite Funktion an:'1+|(00)+'⎕S 1
PCRE S uche nach 1-Läufen und geraden 0-Läufen und ermittle den6|
Rest der⊃∘'/. -'¨
Match-Länge, indem Sie für jede Match-Länge das entsprechende Zeichen aus dieser Zeichenfolge wählen.'/|[-.]+'⎕S'&'∘
PCRE S uche nach Schrägstrichen und Bindestrich / Punkt -runs und gib diese zurück, diemorse
vom Morsecode in normalen Text übersetzt wurdenquelle
Python 2 ,
142135 BytesProbieren Sie es online!
Erläuterung:
Teilt den String in Buchstaben auf
000
(0
bedeutet also Leerzeichen)Ersetzt jeweils
111
mit3
und konvertiert in Basis 16.Dann wird jede Zahl durch modifiziert
57
, was einen Bereich von ergibt0..54
, der der Index des aktuellen Zeichens ist.Vorherige Version, die auf Basis 3 konvertiert wurde:
Python 2 ,
273252247 BytesProbieren Sie es online!
Vorherige Version, die in eine Binärdatei konvertiert wurde:
Python 2 ,
282261256 BytesProbieren Sie es online!
quelle
Ruby , 123 Bytes
Probieren Sie es online!
Teilen Sie die Eingabezeichenfolge nach Zeichenbegrenzung. Verwenden Sie 3 oder 4 AUS-Bits, damit Leerzeichen in leere Zeichenfolgen konvertiert werden. Nehmen Sie den Basis-2-Wert jedes Zeichens und bringen Sie ihn mit Modulo in 3 aufeinanderfolgenden Divisionen in einen vernünftigen Bereich (weniger als 60 mögliche Werte).
quelle
0?
aus der Regexp entfernen, funktioniert es immer noch für die vier Testfälle.Python ,
175 bis168 BytesKonvertieren Sie zuerst die Zeichenfolge in eine Liste mit 0 (Bindestrich) / 1 (Punkt) Zeichenfolgen, fügen Sie ein Präfix hinzu
1
(um führende Nullen zu vermeiden und Leerzeichen zu behandeln) und konvertieren Sie dann in eine binäre Zeichenfolge .Da jeder Code nicht länger als 5 ist, reicht das Ergebnis von 0 bis 63 und kann in einer Zeichenfolge aufgelistet werden.
quelle
lambda s:''.join("_ TEMNAIOGKDWRUS__QZYCXBJP_L_FVH09_8___7_______61_______2___3_45"[int('1'+filter(int,l).replace('2','0'),2)]for l in s.replace('111','2').split('000'))
filter
!Jelly ,
6762 BytesProbieren Sie es online!
quelle
Visual Basic .NET (.NET Core) , 252 Byte
-7 Bytes dank @recursive
Eine Funktion, die eine Zeichenfolge von
1
s und0
s akzeptiert und eine Zeichenfolge zurückgibt. (Eigentlich ist nur das0
für dieOFF
eine harte Anforderung. Alles was nicht seinOFF
sollON
).Das Zeichenfolgenliteral ist Morsecode-Setup als binärer Heap in Array-Form. Mit VB.NET können Sie Zeichenfolgen als Arrays von Zeichen indizieren. Das
\
ist eine Ganzzahldivision, die den linken Sub-Heap für1
oder den rechten Sub-Heap für annimmt111
.Ich habe es
!
als Leerzeichen verwendet, wenn in diesem Heap-Spot kein Wert vorhanden ist. Es ist nur notwendig, die Indizes richtig auszufüllen.Mit VB.NET können Sie zurückkehren, indem Sie dem Funktionsnamen einen Wert zuweisen (in diesem Fall
A
). Ich führe nur iterativ Zeichenfolgenverkettungen (&
) durch, um die Ausgabezeichenfolge aufzubauen. Das allererste Mal, das ich verwenden muss,&
weil die Verwendung+
eines führenden Nullzeichens belässt, aber jedes andere Mal, das ich verwenden kann+
, verhält sich wie&
für Zeichenfolgen.Probieren Sie es online!
quelle
"!ETIANMSURWDKGOHVF!L!PJBXCYZQ!!5473!!8290!!!!!16"
und dann mit indexierenM(c-c\48*22)
, und Sie können weitere 4 Bytes sparen, indem Sie nicht einmal verwendenM
, sondern nur das Zeichenfolgenliteral inline verwenden.M(c-c\48*22)
, wird der Index für den Fall 2017 nicht mehr gültig. Ich denke, VB wird Division und Multiplikation mit der gleichen Priorität durchführen. Fehlt mir eine Klammer?c\48*22
wird entweder0
oder sein22
. Es ist eine Möglichkeit, 22 vonc
zu subtrahieren , um sie zuM
verkürzen, indem das Ende der Zeichenfolge "gefaltet" wird. Wenn das für Sie nicht funktioniert, können Sie die Parens immerA &=(" ")
für weitere 2 Bytes entfernen . :)&=
zu+=
zwei weiteren Leerzeichen wechseln und diese entfernen.JavaScript (ES6),
170131 ByteWie es funktioniert:
Wenn Sie die Punkte in 0s und die Bindestriche in 1s ändern und eine 1 voranstellen, erhalten Sie Binärzahlen, die bei der Konvertierung in Dezimalzahlen Folgendes ergeben:
Diese können durch Indizieren in die richtigen Buchstaben umgewandelt werden
' ETIANMSURWDKGOHVF L PJBXCYZQ'
.Wenn wir diesen Zahlenmodul 11 nehmen, erhalten wir die Zahlen 0 - 8 und 10, die durch in die richtigen Zahlen umgewandelt werden können Indizierung in
'473168290 5'
.Das Programm teilt Zeichen auf und konvertiert dann jedes Zeichen in Punkte und Bindestriche, die auf der Grundlage der obigen Regeln in die entsprechende Ausgabe konvertiert werden.
Testfälle:
Code-Snippet anzeigen
quelle
Python 2 , 127 Bytes
Probieren Sie es online!
Aufbau der TFeld -Lösung durch Entfernen von replace und Arbeiten in Base 10 auf Kosten eines bitweisen xor und einer längeren Referenzzeichenfolge.
quelle
PHP,
321284 Bytes37 Bytes dank @ovs eingespart
Vorherige Version (321 Bytes)
Probieren Sie es online!
Ungolfed-Version:
quelle
Java (OpenJDK 8) , 370 Byte
Probieren Sie es online!
quelle
GNU sed , 261 + 1 = 262 Bytes
+1 Byte für
-r
Flag.Probieren Sie es online!
Erläuterung
Dies ist eine sehr einfache Nachschlagetabellenlösung.
Die ersten drei Zeilen transformieren die Eingabe, sodass Bindestriche
_
s und Punkte1
s sind. Zuerst werden000
s durch ersetzt;
, sodass Zeichen durch;
und Wörter durch getrennt werden;;0
. Dann wird111
s durch ersetzt_
und alle verbleibenden0
s werden verworfen, wobei1
s für Punkte übrig bleibt .In der nächsten Zeile wird die Nachschlagetabelle angehängt. Es nimmt die Form an,
cmcmcm...
bei derc
es sich um ein Zeichen handelt, undm
ist die Folge von_
s und1
s, die es darstellen.i
wird1
in der Tabelle zur Disambiguierung durch ersetzt. Da reguläre Ausdrücke in sed immer gierig sind, wird die Tabelle vom längsten zum kürzesten Code sortiert (also z. B.1_
ÜbereinstimmungenA1_
statti1____
).Als nächstes wird in einer Schleife jede Folge von
_
s und1
s (und die folgende;
) durch das entsprechende Zeichen ersetzt:Schließlich werden die Aufräumaktionen
i
durch "1
s" ersetzt, die verbleibenden ";
s" sind Leerzeichen, und die Nachschlagetabelle wird gelöscht:quelle
Jelly , 67 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6),
10410210199 ByteTestfälle
Code-Snippet anzeigen
Wie?
Da die Konvertierung von binären in dezimale Kostenbytes erfolgt, verwenden wir eine Hash-Funktion, die direkt mit Binärblöcken arbeitet, die in Basis 10 interpretiert werden.
Beispiel
quelle
n*p%m0%m1
Retina ,
144138130103 BytesProbieren Sie es online! Link enthält Testfälle. Erläuterung:
Ändern Sie die Binärziffern in andere Zeichen, da 0 und 1 gültige Ausgaben sind.
Fügen Sie vor jedem Zeichen ein Leerzeichen und zwischen den Wörtern zwei Leerzeichen ein.
Angenommen, alle Zeichen sind Es.
Übersetzen Sie alle Buchstaben unter der Annahme, dass ihnen ein Punkt folgt. Wenn wir zum Beispiel ein E haben und einen zweiten Punkt sehen (den ersten haben wir verbraucht, als wir das E eingefügt haben), bedeutet dies ein I. Buchstaben, auf die nur ein Bindestrich legal folgen kann, werden damit übersetzt Annahme, und dann wird der Strich von der nächsten Stufe verbraucht. Andere Buchstaben werden gelöscht (
L
kostet ein Byte).Wenn sich herausstellt, dass sie tatsächlich von einem Bindestrich gefolgt wurden, beheben Sie die Fehlübersetzungen. Dies verbraucht auch den Gedankenstrich, als er von der vorherigen Stufe angenommen wurde. Beide Übersetzungen werden wiederholt, bis alle Punkte und Striche verbraucht sind.
quelle
Perl 5 , 241 + 1 (
-p
) = 242 BytesProbieren Sie es online!
quelle
PHP, 181 + 1 Bytes
Laufen Sie als Pipe mit
-nR
oder probieren Sie es online aus .quelle
ES6 , 268 Bytes
Verwendet ASCII-Codierung nach der Zuordnung von einer base36-Darstellung der Morse zu einer Indexposition. Nicht mein bester Golftag, aber es dauerte nur etwa 15 Minuten.
Einfacher zu lesen (irgendwie):
quelle
Wolfram Language (Mathematica) , 288 Byte
Ich dachte darüber nach, die Daten als Binärdaten aus einer Datei einzulesen, aber das ist schwer zu erklären. Base 36 schien ein guter Kompromiss zu sein, um die Daten effizient lexikalisch zu speichern.
Nimmt eine Zeichenfolge von 0 und 1 als Eingabe. Führt eine Reihe von Ersetzungen durch, beginnend mit den Läufen von 7 Nullen, dann den Läufen von 3, dann den längsten Binärbuchstaben bis zum kürzesten. Die Reihenfolge des Austauschs ist wichtig.
Probieren Sie es online!
quelle
Perl 5 , 195 Bytes
194 Byte Code + 1 für
-p
.Ich konnte das nicht mit nur einer Standard-gepackten Binärzeichenfolge zum Laufen bringen, ich musste mich den Zeichen mit höheren Bytes entziehen, sonst wäre ich auf 171, wenn jemand weiß, was ich vermisst habe oder warum es kaputt geht, wäre das großartig !
Probieren Sie es online!
Erläuterung
Die binäre Zeichenfolge ist eine
pack
ed Liste der Zahlen, die auf die Morsezeichen beziehen (101011101
-349
fürF
etc) , und dies ist mit den Bereichen ReißverschlussA..Z,0..9
und verwendet als Nachschlag. Dies///
Ausdrücke ersetzen alle Läufe von sieben0
s durch Leerzeichen und dann alle durch drei0
s oder Wortgrenzen getrennten Ziffernläufe\b
mit dem entsprechenden Schlüssel aus dem%h
Hash.quelle