Übersetzen Sie den Morsecode basierend auf der Tondauer

36

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.

Internationaler Morsecode

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.

Hand-E-Food
quelle
Kann die Ausgabe nachgestellte Leerzeichen enthalten?
Brian J

Antworten:

9

APL (Dyalog) , 65 62 60 57 Bytes

-3 danke an ngn.

Tacit-Präfix-Funktion.

CY'dfns'
morse'/|[-.]+'S'&'∘(⊃∘'/. -'¨6|'1+|(00)+'S 1)

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 den
6| 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, die
morse vom Morsecode in normalen Text übersetzt wurden

Adam
quelle
5
Wow, ich wusste nie, dass Dyalog einen eingebauten Morsecode hat.
Zacharý
@ Zacharý Es gibt viele, viele eingebaute in der DFNS.
Erik der Outgolfer
@ Zacharý Prüfe immer dfns !
Adám,
Sie verlinken auf eine ältere Version.
Erik der Outgolfer
Eine BF-Funktion ...> _ <, wow.
Zacharý
8

Python 2 , 142 135 Bytes

lambda s:''.join(' E-T----Z-Q---RSWU--2FH-V980NIMA--1CBYX-6--GDOK534PLJ-7'[int('0'+l.replace('111','3'),16)%57]for l in s.split('000'))

Probieren Sie es online!

Erläuterung:

Teilt den String in Buchstaben auf 000( 0bedeutet also Leerzeichen)

Ersetzt jeweils 111mit 3und konvertiert in Basis 16.

Dann wird jede Zahl durch modifiziert 57, was einen Bereich von ergibt 0..54, der der Index des aktuellen Zeichens ist.


Vorherige Version, die auf Basis 3 konvertiert wurde:

Python 2 , 273 252 247 Bytes

lambda s:''.join(chr(dict(zip([0,242,161,134,125,122,121,202,229,238,241]+[2]*7+[5,67,70,22,1,43,25,40,4,53,23,49,8,7,26,52,77,16,13,2,14,41,17,68,71,76],[32]+range(48,91)))[int('0'+l.replace('111','2').replace('0',''),3)])for l in s.split('000'))

Probieren Sie es online!

Vorherige Version, die in eine Binärdatei konvertiert wurde:

Python 2 , 282 261 256 Bytes

lambda s:''.join(chr(dict(zip([0,489335,96119,22391,5495,1367,341,1877,7637,30581,122333]+[2]*7+[23,469,1885,117,1,349,477,85,5,6007,471,373,119,29,1911,1501,7639,93,21,7,87,343,375,1879,7543,1909],[32]+range(48,91)))[int('0'+l,2)])for l in s.split('000'))

Probieren Sie es online!

TFeld
quelle
5

Ruby , 123 Bytes

->s{s.split(/0000?/).map{|r|r[0]?"YE9_0IZTO_BHKU58V_GR_SFA__1_4NP_60X_____C__D_ML7WQ3__2__J"[r.to_i(2)%253%132%74]:" "}*""}

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).

GB
quelle
Sehr schön gemacht.
Setzen Sie Monica iamnotmaynard
2
Ich bin mir sicher, ob es in allen Fällen funktioniert, aber wenn Sie es 0?aus der Regexp entfernen, funktioniert es immer noch für die vier Testfälle.
Jordanien
4

Python , 175 bis 168 Bytes

s=lambda t,f=''.join:f('; TEMNAIOGKDWRUS;;QZYCXBJP;L;FVH09;8;;;7;;;;;;;61;;;;;;;2;;;3;45'[int('1'+f('0'if j[1:]else j for j in i.split('0')),2)]for i in t.split('000'))

Konvertieren 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.

Colera Su
quelle
1
Ich habe unabhängig im Grunde die gleiche Lösung, aber 169 Bytes: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'))
Alex Varga
@AlexVarga Gute Verwendung von Python 2 filter!
Colera So
3

Jelly , 67 62 Bytes

ṣ0L€«2ḅ2“>.&" þ/7;=¥çı¿¢×ÆФ怌©¦Çß÷µ¬£®Ñ½ðȷñ‘iịØB;⁶¤
œṣ0ẋ3¤Ç€

Probieren Sie es online!

Erik der Outgolfer
quelle
Warten Sie, die Link-Nummerierung dreht sich um?
Zacharý
@ Zacharý Ja, Line-Links haben modulare Indizes.
Erik der Outgolfer
3

Visual Basic .NET (.NET Core) , 252 Byte

-7 Bytes dank @recursive

Function A(i)
For Each w In i.Split({"0000000"},0)
For Each l In w.Split({"000"},0)
Dim c=0
For Each p In l.Split("0")
c=c*2+1+p.Length\2
Next
A &="!ETIANMSURWDKGOHVF!L!PJBXCYZQ!!54!3!!!2!!!!!!!16!!!!!!!7!!!8!90"(c)
Next
A+=" "
Next
End Function

Eine Funktion, die eine Zeichenfolge von 1s und 0s akzeptiert und eine Zeichenfolge zurückgibt. (Eigentlich ist nur das 0für die OFFeine harte Anforderung. Alles was nicht sein OFFsoll ON).

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ür 1oder den rechten Sub-Heap für annimmt 111.

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!

Brian J
quelle
1
Sie können 7 Bytes sparen, indem Sie verwenden "!ETIANMSURWDKGOHVF!L!PJBXCYZQ!!5473!!8290!!!!!16"und dann mit indexieren M(c-c\48*22), und Sie können weitere 4 Bytes sparen, indem Sie nicht einmal verwenden M, sondern nur das Zeichenfolgenliteral inline verwenden.
rekursive
@recursive Ich verstehe den 4-Byte-Trick, danke für die Hilfe! Ich habe Probleme zu verstehen, wie Sie den Index ändern. Wenn ich das Zeichenfolgenliteral ersetze und dann verwende 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?
Brian J
Sie haben Recht mit Vorrang. c\48*22wird entweder 0oder sein 22. Es ist eine Möglichkeit, 22 von czu subtrahieren , um sie zu Mverkürzen, indem das Ende der Zeichenfolge "gefaltet" wird. Wenn das für Sie nicht funktioniert, können Sie die Parens immer A &=(" ")für weitere 2 Bytes entfernen . :)
rekursive
Dann können Sie &=zu +=zwei weiteren Leerzeichen wechseln und diese entfernen.
rekursive
@recursive Oh, duh! zu viele zusätzliche Parens. Das Problem beim Wechseln zu Plus ist, dass ich am Anfang meiner Zeichenfolge ein führendes Nullzeichen habe. Vielleicht ist das aber keine große Sache.
Brian J
3

JavaScript (ES6), 170 131 Byte

s=>s.split`000`.map(e=>'  ETIANMSURWDKGOHVF L PJBXCYZQ'[c=+`0b${1+e.replace(/0?(111|1)/g,d=>+(d>1))}`]||'473168290 5'[c%11]).join``


Wie 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:

  1. Buchstaben: 2 - 18, 20 und 22 - 29.
    Diese können durch Indizieren in die richtigen Buchstaben umgewandelt werden ' ETIANMSURWDKGOHVF L PJBXCYZQ'.
  2. Zahlen: 32, 33, 35, 39, 47, 48, 56, 60, 62 und 63.
    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:

Rick Hitchcock
quelle
3

Python 2 , 127 Bytes

lambda s:''.join("IVMB  T  K 9LZF 1HWO3 GUS4 8 7A  E QR 26   NJX    Y0P 5D  C"[(int('0'+l)^2162146)%59]for l in s.split('000'))

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.

Joe
quelle
2

PHP, 321 284 Bytes

37 Bytes dank @ovs eingespart

$a=array_flip([242,161,134,125,122,121,202,229,238,241,5,67,70,22,1,43,25,40,4,53,23,49,8,7,26,52,77,16,13,2,14,41,17,68,71,76]);foreach(split('0000000',$argv[1])as$w){foreach(split('000',$w)as$m){echo($v=$a[base_convert(str_replace([111,0],[2,],$m),3,10)])>9?chr($v+55):$v;}echo' ';}  

Vorherige Version (321 Bytes)

$a=array_flip([22222,12222,11222,11122,11112,11111,21111,22111,22211,22221,12,2111,2121,211,1,1121,221,1111,11,1222,212,1211,22,21,222,1221,2212,121,111,2,112,1112,122,2112,2122,2211]);foreach(split('0000000',$argv[1])as$w){foreach(split('000',$w)as$m){echo($v=$a[str_replace([111,0],[2,],$m)])>9?chr($v+55):$v;}echo' ';}

Probieren Sie es online!

Ungolfed-Version:

$a=array_flip(
// Building an array $a with every Morse letter representation (1=dot, 2=dash) and flip it
               [22222,12222,11222,11122,11112,
                // 01234
                11111,21111,22111,22211,22221,
                // 56789
                12,2111,2121,211,1,1121,221,
                // ABCDEFG
                1111,11,1222,212,1211,22,
                // HIJKLM
                21,222,1221,2212,121,111,2,
                // NOPQRST
                112,1112,122,2112,2122,2211]);
                // UVWXYZ
foreach (split('0000000', $argv[1]) as $w){
// for each word (separate with 7 consecutive zeroes)
    foreach (split('000',$w) as $m){
    // for each letter (separate with 3 consecutive zeroes)
        echo ($v = $a[str_replace([111,0],[2,],$m)]) > 9
        // Replace '111' with '2' and '0' with nothing and find $v, the corresponding entry in the array $a
            ? chr($v+55)
            // If > 9th element, then letter => echo the ASCII code equal to $v+55
            : $v;
            // Else echo $v
    }
    echo ' ';
    // Echo a space
}
roberto06
quelle
2

Java (OpenJDK 8) , 370 Byte

s->{String r="";for(String t:s.split("0000000")){for(String u:t.split("000"))for(int x[]={1,7,5,21,29,23,87,93,119,85,117,341,375,343,373,471,477,349,469,1877,1367,1909,1879,1501,1911,1885,7637,5495,7543,7639,6007,30581,22391,122333,96119,489335},i=x.length;i-->0;)if(u.equals(Long.toString(x[i],2)))r+="ETISNAURMHD5WVLKGFB64ZXPOC73YQJ82910".charAt(i);r+=" ";}return r;}

Probieren Sie es online!

  • 3 Bytes gespart dank @Jeutnarg.
Olivier Grégoire
quelle
1
kann einige abschneiden, indem Long.toString (x [i], 2) anstelle von Integer.toString (x [i], 2) verwendet wird
Jeutnarg 16.11.17
2

GNU sed , 261 + 1 = 262 Bytes

+1 Byte für -rFlag.

s/000/;/g
s/111/_/g
s/0//g
s/$/;:51111141111_3111__211___i1____6_11117__1118___119____10_____H1111V111_F11_1L1_11P1__1J1___B_111X_11_C_1_1Y_1__Z__11Q__1_S111U11_R1_1W1__D_11K_1_N__1G__1O___I11A1_M__E1T_/
:
s/([1_]+);(.*([^1_])\1)/\3\2/
t
y/i/1/
s/;/ /g
s/:.*//g

Probieren Sie es online!

Erläuterung

Dies ist eine sehr einfache Nachschlagetabellenlösung.

Die ersten drei Zeilen transformieren die Eingabe, sodass Bindestriche _s und Punkte 1s sind. Zuerst werden 000s durch ersetzt ;, sodass Zeichen durch ;und Wörter durch getrennt werden ;;0. Dann wird 111s durch ersetzt _und alle verbleibenden 0s werden verworfen, wobei 1s für Punkte übrig bleibt .

s/000/;/g
s/111/_/g
s/0//g

In der nächsten Zeile wird die Nachschlagetabelle angehängt. Es nimmt die Form an, cmcmcm...bei der ces sich um ein Zeichen handelt, und mist die Folge von _s und 1s, die es darstellen. iwird 1in 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_Übereinstimmungen A1_statt i1____).

s/$/;:51111141111_3111__211___i1____6_11117__1118___119____10_____H1111V111_F11_1L1_11P1__1J1___B_111X_11_C_1_1Y_1__Z__11Q__1_S111U11_R1_1W1__D_11K_1_N__1G__1O___I11A1_M__E1T_/

Als nächstes wird in einer Schleife jede Folge von _s und 1s (und die folgende ;) durch das entsprechende Zeichen ersetzt:

:
s/([1_]+);(.*([^1_])\1)/\3\2/
t

Schließlich werden die Aufräumaktionen idurch " 1s" ersetzt, die verbleibenden " ;s" sind Leerzeichen, und die Nachschlagetabelle wird gelöscht:

y/i/1/
s/;/ /g
s/:.*//g
Jordan
quelle
1

Jelly , 67 Bytes

ŒrḌṣ7ṣ€3ṣ€€1’H_4F€€ḅ3i@€€“ṗƙ⁶}zyȮẓŀȯ¦CFæ¢+ı(¥5ç1®¬ȷ4MÑÆ£Ç)×DGL‘ịØBK

Probieren Sie es online!

HyperNeutrino
quelle
1

JavaScript (ES6), 104 102 101 99 Byte

s=>s.split`000`.map(n=>" _T__9VEFO0K7MX_CGS__LU1RYIJ845__Z_B_D6QP_3__AHNW2"[n*1741%8360%51]).join``

Testfälle

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

dot dash dot dot = 101110101
101110101 * 1741 = 176032685841
176032685841 % 8360 = 3081
3081 % 51 = 21

--> The 21st character in the lookup table is 'L' (0-indexed).
Arnauld
quelle
Ich mag diesen einstufigen Ansatz sehr. Wie groß war die Suche, die Sie durchgeführt haben, um diese 37 Ausgaben in einen perfekten Hash der Größe 50 mit einer ausreichend kurzen Funktion zu integrieren?
Jayprich
n*p%m0%m11p<100001<m0<100001<m1<100
1

Retina , 144 138 130 103 Bytes

T`d`@#
^|@@@

 @?#
E
{T`L#@`R6_BI_Z5S1C_GD8__\L\HNF3P__7_`\w@#
T`589B-INPRSZ#@`490XYKT2\OVAMJWUQ_`\w##

Probieren Sie es online! Link enthält Testfälle. Erläuterung:

T`d`@#

Ä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.

 @?#
E

Angenommen, alle Zeichen sind Es.

{T`L#@`R6_BI_Z5S1C_GD8__\L\HNF3P__7_`\w@#

Ü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 ( Lkostet ein Byte).

T`589B-INPRSZ#@`490XYKT2\OVAMJWUQ_`\w##

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.

Neil
quelle
0

Perl 5 , 241 + 1 ( -p) = 242 Bytes

%k=map{(23,469,1885,117,1,349,477,85,5,6007,471,373,119,29,1911,1501,7639,93,21,7,87,343,375,1879,7543,1909,489335,96119,22391,5495,1367,341,1877,7637,30581,122333)[$i++]=>$_}A..Z,0..9;map{$\.=$k{oct"0b$_"}for split/000/;$\.=$"}split/0{7}/}{

Probieren Sie es online!

Xcali
quelle
0

PHP, 181 + 1 Bytes

foreach(explode(_,strtr($argn. 0,[1110=>1,10=>0,"0000"=>_A,"00"=>_]))as$t)echo$t<A?~$t[-5]?(10+substr_count($t,0)*(1-2*$t[-5]))%10:__ETIANMSURWDKGOHVF_L_PJBXCYZQ[bindec("1$t")]:" ";

Laufen Sie als Pipe mit -nRoder probieren Sie es online aus .

Titus
quelle
0

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.

s=>s.split('00000').map(w=>String.fromCharCode.apply({},w.split('000').map(c=>"ahkn,225z,h9z,48n,11z,9h,1g5,5w5,nlh,2me5,,,,,,,,n,d1,1gd,39,1,9p,d9,2d,5,4mv,d3,ad,3b,t,1h3,15p,5w7,2l,l,7,2f,9j,af,1g7,1h1".split(',').indexOf(parseInt(c,2).toString(36))+48))).join(' ')

Einfacher zu lesen (irgendwie):

s=>
s
.split('00000')
.map(w=>
	String.fromCharCode.apply({},
		w.split('000')
			.map(c=>
				"ahkn,225z,h9z,48n,11z,9h,1g5,5w5,nlh,2me5,,,,,,,,n,d1,1gd,39,1,9p,d9,2d,5,4mv,d3,ad,3b,t,1h3,15p,5w7,2l,l,7,2f,9j,af,1g7,1h1"
				.split(',')
				.indexOf(
					parseInt(c,2).toString(36)
				)+48)
			)
	).join(' ')

binarymax
quelle
0

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.

StringReplace[#,Thread@Rule[Join[{"0000000","000"},#~FromDigits~36~IntegerString~2&/@StringSplit@"ahkn 2me5 225z nlh h9z 5w7 5w5 5tj 4mv 48n 1h3 1h1 1gd 1g7 1g5 15p 11z d9 d3 d1 af ad 9p 9j 9h 3b 39 2l 2f 2d t n l 7 5 1"],Insert[Characters@" 09182Q7YJ3OZCX6P4GKBWLFV5MDRUHNASTIE","",2]]]&

Probieren Sie es online!

Kelly Lowder
quelle
Warten Sie, in Mathematica ist kein Morsecode integriert.
Zacharý
Noch nicht! Ich überprüfte.
Kelly Lowder
0

Perl 5 , 195 Bytes

194 Byte Code + 1 für -p.

%h=map{$_,(A..Z,0..9)[$i++]}unpack"S26I2S7I","\xd5]u]\xddUw\xd7uww\xdd\xd7]WWwWwuwwwwwWwWUU\xd5uw\xdd\xdd";s/0{7}/ /g;s/(\d+?)(000|\b)/$h{oct"0b$1"}/ge

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 packed Liste der Zahlen, die auf die Morsezeichen beziehen ( 101011101- 349für Fetc) , und dies ist mit den Bereichen Reißverschluss A..Z,0..9und verwendet als Nachschlag. Die s///Ausdrücke ersetzen alle Läufe von sieben 0s durch Leerzeichen und dann alle durch drei 0s oder Wortgrenzen getrennten Ziffernläufe \bmit dem entsprechenden Schlüssel aus dem %hHash.

Dom Hastings
quelle