Schreiben Sie das kürzeste Programm, um die Standardeingabe in Morsecode umzuwandeln . Zeichen, die nicht in der Tabelle enthalten sind, sollten so gedruckt werden, wie sie sind.
Sind sowohl Groß- als auch Kleinbuchstaben verschlüsselt?
Joey Adams
9
Könnten Sie auch eine Beispieleingabe und -ausgabe bereitstellen, um Details wie den Abstand zwischen Wörtern zu verdeutlichen?
Joey Adams
Nun, in Morse gibt es keinen Unterschied zwischen Groß- und Kleinschreibung. Es gibt kein wirkliches Symbol für Leerzeichen (es ist nur eine 3/4-fache Stille), daher sollte es als Leerzeichen übersetzt werden.
Diese Antwort unterstützt nur Großbuchstaben und Ziffern. Die Buchstaben werden durch Zeilenumbrüche und die Wörter durch zwei Zeilenumbrüche getrennt
{." ETIANMSURWDKGOHVF L PJBXCYZQ"?)"?/'#! 08<>"@))10%=or 2base(;{!45+}%n}%
Analyse
{}% funktioniert wie gewohnt wie eine Karte über dem Array
. Schieben Sie eine Kopie des Zeichens auf den Stapel
"ETIAN ..." Dies ist eine Nachschlagetabelle für Großbuchstaben
? Wie ein String. Find gibt den Index des Zeichens im String zurück
oder -1 wenn es nicht gefunden wird (dh es ist eine Ziffer)
) diesen Index erhöhen, so dass E => 2 T => 3 I => 4 usw. feststellen, dass, wenn die
char ist kein Großbuchstabe oder Leerzeichen, dies ist jetzt 0 (False)
"? / '#! ..." Dies ist eine Nachschlagetabelle für die Ziffern. es wird in der verwendet werden
Umgekehrter Weg zur anderen Nachschlagetabelle.
@ Ziehe die Kopie, die wir vom Saibling gemacht haben, nach oben auf den Stapel
))% 10 wandle die ASCII-Ziffer in eine Zahl um, indem du 2 addierst und Mod 10 nimmst.
Es ist wichtig, dies so zu tun, weil alle Großbuchstaben
Buchstaben treffen auch diesen Code, und wir müssen sicherstellen, dass sie fallen
im Bereich 0..9 oder der nächste Schritt schlägt fehl.
= ziehe das n-te Zeichen aus dem String zB "Hallo" 1 = gibt "e"
oder denken Sie daran, wenn die Suche in Großbuchstaben fehlschlägt, haben wir das Ergebnis 0
Die Ziffernsuche wird verwendet
2base konvertiere zu Basis 2, also E => [1 0], T => [1 1], I => [1 0 0] usw.
(; Pop die Vorderseite der Liste und werfen Sie es weg, so dass E => [0], T => [1]
{! 45 +}% negieren jedes Bit und addieren 45, dies ergibt den ASCII-Wert von. und -
n Newline trennt jedes Wort. Dies könnte 32 sein, wenn Sie wollten
Trennen Sie die Wörter mit Leerzeichen für 1 Strich
Golfscript - 85 Zeichen
Dies ist aufgrund der lockeren Anforderungen hier kürzer als meine SO-Antwort. Die Eingabe muss in Großbuchstaben / Ziffern erfolgen und die Interpunktionszeichen ".,?"
Buchstaben sind Sonderfälle und werden in Kleinbuchstaben umgewandelt und in ihren Binärpositionen angeordnet. Alles andere erledigt eine Übersetzungstabelle
Die Reihenfolge Ihrer Codeblöcke verwirrt George's UserScript . Könnte ich Sie beunruhigen, neu zu ordnen? Und ich würde es gerne erklärt sehen. Ich bekomme den impliziten Baum, aber der Rest ist mir ein Rätsel.
dmckee
@dmckee, fertig. Georges Drehbuch bemerkte, dass meine Zählung um eins
fehlte
Upvotes sind erforderlich, um die Analyse zu sehen ... Boo! Die Analyse ist es, die Antworten die Gegenstimmen wert macht!
Nick Larsen
@ Nick, ok, ich denke es ist so kurz wie ich es kriegen kann, also werde ich an dieser Analyse arbeiten
gnibbler
20
C # (213 Zeichen)
Ich bin sicher, das wird nicht lange dauern, aber zumindest habe ich die Technik zuerst hier!
class P{static void Main(string[] a){foreach(var t in a[0]){var c="";for(int i=" ETIANMSURWDKGOHVF L PJBXCYZQ 54 3 2 16 7 8 90".IndexOf(t);i>0;i/=2)c="-."[i--%2]+c;System.Console.Write(c+" ");}}}
Und in lesbarem Format:
class P
{
static void Main(string[] a)
{
foreach(var t in a[0])
{
var c="";
for(int i=" ETIANMSURWDKGOHVF L PJBXCYZQ 54 3 2 16 7 8 90".IndexOf(t);i>0;i/=2)c="-."[i--%2]+c;
System.Console.Write(c+" ");
}
}
}
Für eine kurze Erklärung ist die Zeichenfolge ein Haufen, in dem das linke Kind ein Punkt und das rechte Kind ein Bindestrich ist. Um den Brief zu erstellen, müssen Sie die Reihenfolge rückgängig machen und rückgängig machen.
Dies ist die beste Idee, die ich bisher gesehen habe.
Alexandru
Und dann habe ich den verlinkten Thread gelesen und festgestellt, dass dies alles andere als original ist.
Nick Larsen
1
Als ich das ETIAN...dort sah , ging ich davon aus, dass es genauso funktioniert wie das Golfscript, aber Sie haben eine andere Art, die Saite zu interpretieren. Ich denke , es ist gleichwertig , aber ich hinzufügen 1 auf den Index und verwende die binäre Darstellung die Punkte und Striche für alle die Stellen hinter dem führenden 1" zum Beispiel zu bekommenF=>18=>0b10010=>..-.
Habe gerade die Frage von @dmckee "Code Golf: Morsecode" geprüft und keine Haskell-Version gefunden. Ich denke, kürzer als 314 wäre möglich.
Yasir Arsanukaev
fromJust.elemIndex ckann geschrieben werden als head.findIndices(==c). Das ist ein Zeichen mehr, aber Sie können es dann loswerden import Data.Maybe, sodass Sie insgesamt 17 Zeichen sparen. Sie können auch zwei Zeichen speichern, indem Sie bei jedem Aufruf von intercalate das Leerzeichen vor der Zeichenfolge entfernen. Und noch ein paar Zeichen, indem man i=intercalateam Anfang macht und die beiden Aufrufe intercalatedurch ersetzt i.
1.
@ sepp2k: Schöne Idee! Vielen Dank. Ich habe auch mit gespielt intercalateund weitere 6 Charaktere gespeichert! :-)
Yasir Arsanukaev
Sie können auch tun w=words, was ein Zeichen speichert, wenn ich mich nicht irre. Und anstelle von l c=...und map lsollten map\c->...Sie dies tun (Sie brauchen nicht einmal Parens um das Lambda, da es ohnehin schon eine abschließende Parens gibt).
1.
@ sepp2k: Inlining von l c=...hat mir 1 Charakter gerettet , aber ich konnte es nicht ohne Parens setzen, sondern nur als map(\c->...). GHC Version 6.12.3.
Yasir Arsanukaev
4
Nachsatz (310)(462)(414)(319) einschließlich (46) für die Tabelle.
Kombinierte Zahlen und Buchstaben mit ternärer Kodierung. 5 ternäre Ziffern passen in ein Byte! Dies eliminiert diese albernen Differenzschleifen und Sondergehäusenummern vollständig.
ASCII85 schneidet 1/3 jeder Tabelle. Und die Vereinfachung des Codes (endlich!) Kommt unter 400 zurück!
errordict/undefined{pop( )dup 0 4 3 roll put print{}}put<</*{{[exch/@ cvx]cvx 1
index 1 add}forall pop}def/C{<~#:VD<!AP07"A]ga#R),'7h?+2(./s-9e6~>*}def/#{load
exec}/P{print}0{}1{(.)P}2{(---)P}/S{( )P}48<~o'u/0b'A;]L7n~>* 65 C 97 C/@{5{dup
3 mod # S 3 idiv}repeat # S S S}>>begin{(%stdin)(r)file read not{exit}if #}loop
Ungolfed und kommentiert. Darauf bin ich sehr stolz. Ich finde es elegant, die Zahlen die Arbeit machen zu lassen. :)
%!
%Morse Code Translator (Simplified)
%if `load` signals /undefined in /#{load exec},
% pop --load--,
% print the char,
% leave dummy object for `exec` to find
errordict/undefined{pop( )dup 0 4 3 roll put print{}}put
<<
%create int->proc pairs
%from initial int and string values
/*{{[exch/@ cvx]cvx 1 index 1 add}forall pop}def
%the alpha map is applied to Upper and Lower case
/C{<~#:VD<!AP07"A]ga#R),'7h?+2(./s-9e6~>*}def
65 C 97 C
%the number map
48<~o'u/0b'A;]L7n~>*
/#{load exec} %execute a number
/P{print}
0{} % 0: nop
1{(.)P} % 1: '.' dit
2{(---)P} % 2: '---' dah
/S{( )P} % S: space
%execute a morse sequence, from the table
/@{5{dup 3 mod # S 3 idiv}repeat # S S S}
>>begin
%read and execute each char from stdin
{(%stdin)(r)file read not{exit}if #}loop
Die Tabellen (33) + (13) = (46)
So codieren die Zeichenfolgen die Tabelle. Jedes Byte steht für eine 5-stellige ternäre Zahl. Und die Bytes werden weiter in ASCII85 codiert (welches Postscript automatisch decodieren kann).
%The Morse Table in Ternary Encoding
% 3 ^4 ^3 ^2 ^1 ^0
% 81 27 9 3 1 Dec Hex dc ->ASCII85
% --------------- --- --- ---
% A 2 1 6+1 7 7 7 256*41+256*50+256*14+
% B 1 1 1 2 27+ 9+3+2 41 29 d85%n85/d85%n85/d85%n85/d85%n85/n
% C 1 2 1 2 27+18+3+2 50 32 2 25 53 35 27 chr(x+33)
% D 1 1 2 9+3+2 14 E # : V D <
% E 1 1 1 1
% F 1 2 1 1 27+18+3+1 49 31
% G 1 2 2 9+6+2 17 11 0 32 47 15 22
% H 1 1 1 1 27+ 9+3+1 40 28 ! A P 0 7
% I 1 1 3+1 4 4
% J 2 2 2 1 54+18+6+1 79 4F
% K 2 1 2 18+3+2 23 17 1 32 60 70 64
% L 1 1 2 1 27+ 9+6+1 43 2B " A ] g a
% M 2 2 6+2 8 8
% N 1 2 3+2 5 5
% O 2 2 2 18+6+2 26 1A 2 49 8 11 6
% P 1 2 2 1 27+18+6+1 52 34 # R ) , '
% Q 2 1 2 2 54+ 9+6+2 71 47
% R 1 2 1 9+6+1 16 10
% S 1 1 1 9+3+1 13 D 22 71 30 10 17
% T 2 2 2 2 7 h ? + 2
% U 2 1 1 18+3+1 22 16
% V 2 1 1 1 54+ 9+3+1 67 43
% W 2 2 1 18+6+1 25 19 7 13 14 82 12
% X 2 1 1 2 54+ 9+3+2 68 44 ( . / s -
% Y 2 2 1 2 54+18+3+2 77 4D 77 256*44+256*256*
% Z 1 1 2 2 27+ 9+6+2 44 2C 24 68 21 [23 36]
% 9 e 6 [ 8 E] (omit final 2)
% 0 2 2 2 2 2 162+54+18+6+2 242 F2
% 1 2 2 2 2 1 162+54+18+6+1 241 F1
% 2 2 2 2 1 1 162+54+18+3+1 238 EE 78 6 84 14 15
% 3 2 2 1 1 1 162+54+ 9+3+1 229 E5 o ' u / 0
% 4 2 1 1 1 1 162+27+ 9+3+1 202 CA
% 5 1 1 1 1 1 81+27+ 9+3+1 121 79
% 6 1 1 1 1 2 81+27+ 9+3+2 122 7A 65 6 32 26 60
% 7 1 1 1 2 2 81+27+ 9+6+2 125 7D b ' A ; ]
% 8 1 1 2 2 2 81+27+18+6+2 134 86 134 256*161+256*256*
% 9 1 2 2 2 2 81+54+18+6+2 161 A1 43 22 77 [50 40]
% L 7 n [ S I] (omit final 2)
d=proc{|x|x>1?d[x/2]+".-"[x&1]:' '}
$><<$<.gets.bytes.map{|i|
e=i>64?"-@B4*:68,?5</.7>E20+193ACD"[(i&95)-65]:i>47?"gWOKIHX`df"[i-48]:nil
e ?d[e.ord-40]:i.chr}*''
Kodiert jede Ziffer in ein einzelnes Zeichen, wobei 1 ein Strich, 0 ein Punkt und eine führende 1 ein Markierungsbit ist (zuzüglich eines Versatzes, um die Druckbarkeit zu gewährleisten). Verwendet ASCII-Mathematik, um die Eingabezeichen als Nachschlageindizes zu verwenden.
Module Module1
Sub Main(a$())
For Each c In a(0)
Dim i = "ETIANMSURWDKGOHVF L PJBXCYZQ 54 3 2 16 7 8 90".IndexOf(c)
If c <> " " And i >= 0 Then
Console.Write("{0} ", Morse(i))
Else
Console.Write(c)
End If
Next
End Sub
Function Morse(i) As String
Dim b = Math.Log(i) / Math.Log(2)
Return (From m In MorseSeq(If(Double.IsInfinity(b), 0, b)) Order By m.Length)(i)
End Function
Function MorseSeq(i) As IEnumerable(Of String)
Return If(i < 0, {}, From n In ".-" From m In MorseSeq(i - 1).DefaultIfEmpty
Select n & m)
End Function
End Module
Diese letzte Funktion ist böse.
Bearbeiten
Einige Verbesserungen.
Function Morse(i) As String
Return (From m In MorseSeq(i) Order By m.Length)(i)
End Function
Function MorseSeq(i) As IEnumerable(Of String)
Return If(i=0,{".","-"},From n In".-"From m In MorseSeq(i>>1) Select n & m)
End Function
# Split string on word breaks to create a hash
# I get an extra token at the beginning and end for some reason
# [1..72] is a slice without the extra pieces
my %h = "A.-B-...C-.-.D-..E.F..-.G--.H....I..J.---K-.-L.-..M--N-.O---P.--.Q--.-R.-.S...T-U..-V...-W.--X-..-Y-.--Z--..0-----1.----2..---3...--4....-5.....6-....7--...8---..9----."
.split(/<wb>/)[1..72];
# For each character in STDIN, print either the looked up value, or itself
while $*IN.getc -> $c {
print %h{$c.uc} || $c;
}
"Ich bekomme zu Beginn und am Ende aus irgendeinem Grund ein zusätzliches Token": Ich kenne Perl 6 nicht, aber ich schätze, es liegt daran, dass die leere Zeichenfolge vor der ersten Wortgrenze und nach der letzten übereinstimmt.
msh210
2
sed, 159 bytes
s/.*/\L&/
s/[02]/&-/g
s/[89]/&./g
:
s/[b-ilnprsz5-9]/&./g
s/[ajkmoqt-y0-4]/&-/g
y/abcdefghijklmnopqrstuvwxyz0123456789/edri umsewnrttmwkai isadkgojuvhhbzoo/
t
Wir fangen damit an, die gesamte Zeile zu verkleinern (da ykeine Konvertierungen ohne Berücksichtigung der Groß- und Kleinschreibung möglich sind). Subtrahieren Sie 10 Bytes, wenn nur Kleinbuchstaben eingegeben werden sollen. Dann vorverarbeiten wir die Ziffern 0, 2, 8und 9ihre endgültige Symbole zu emittieren.
Die Schleife generiert das letzte Symbol für jedes eingegebene Zeichen und übersetzt dann jedes Zeichen für die nächste Iteration. Dies ist gleichbedeutend mit dem Durchlaufen der dichotomen Suchtabelle , die im Wikipedia-Artikel angezeigt wird. Bei den Ziffern, die einer besonderen Behandlung bedurften, handelt es sich um Eltern, die nicht in unserer ASCII-Alphanumerik enthalten sind.
Die Schleife wird beendet, wenn alle Zeichen das Abschlusszeichen erreicht haben (nach 'e' oder 't').
Zum Beispiel wird der Brief kin drei Durchgängen transformiert:
char M[256]="_^\\XP@ACGO &15)\"4+0$>-2'%/6;*(#,8.9=3", v;
main(c){for(;
c = getchar(), v = M[c +208&255]-32,~c;
putchar(v-1? c :32))for(; v >1; v /=2) putchar(".-"[v &1]);}
(Ohne nicht signifikante Leerzeichen, keine nachgestellte Zeile)
Mist eine Nachschlagetabelle, in der die Bitmuster der Zeichen Punkten und Strichen im Morsecode entsprechen. Zeichen [0-9A-Z]werden mit dieser Tabelle zum Morsen dekodiert (mit einem Leerzeichen nach dem Morsencode), andere Zeichen werden einfach unverändert durchgereicht.
Das sind nicht 162 Zeichen ... bitte posten Sie die Golfversion.
Cyoce
@Cyoce Tut mir leid, ich habe keine nicht signifikanten Whitespaces entfernt, da dies ein langweiliger mechanischer Prozess ist und es nur schwieriger macht, den Quellcode zu lesen. Es wurde eine Version mit solchen Leerzeichen hinzugefügt, die für Sie entfernt wurden :).
Sie können dies auf 286 Zeichen %c=qw(A .- B -... C -.-. D -.. E . F ..-. G --. H .... I .. J .--- K -.- L .-.. M -- N -. O --- P .--. Q --.- R .-. S ... T - U ..- V ...- W .-- X -..- Y -.-- Z --.. 1 .---- 2 ..--- 3 ...-- 4 ..--- 5 ..... 6 -.... 7 --... 8 ---.. 9 ----. 0 -----);while(<>){print($c{$_}||$_)for split//}
Mit ein paar kleinen Tricks, die reduziert werden können auf:<?$a=strtoupper(fgets(STDIN));$m=array(65=>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)+array(48=>22222,12222,11222,11122,11222,11111,21111,22111,22211,22221)+array(32=>' ');while($a[$i++])echo strtr($m[ord($a[$i])],12,'.-');
Konvertieren Sie Buchstabenmuster in Basis-3, Zahlenmuster in Basis-2, und verwenden Sie nullindizierte ASCII-Transliteration, um Punkte und Bindestriche zu erhalten. Funktioniert nicht mit Kleinbuchstaben.
Ein vollständiges Programm, das eine mit Python formatierte Zeichenfolge als Befehlszeilenargument akzeptiert und eine durch Leerzeichen begrenzte Ausgabe ausgibt.
Jeder Buchstabe wird von einem Leerzeichen getrennt. Jedes Wort wird von drei Leerzeichen getrennt. Die Tabelle besteht aus einer alphanumerischen Zeichenfolge ⎕A,⎕Dund 16- 'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ䴫쩸穼蚠'Bit-Zeichen, die in 8-Bit-Zeichen aufgeteilt sind und jeweils in Basis 3 mit umgekehrten Ziffern konvertiert werden.
•1Ju&àøΘn₆δβαLmSÂZΘ=+BD1
÷ΓùwÒмVšh• push compressed number
… .-ÅвJ# convert to custom base " .-"
ðδJ append a space to each morse code
Ažh« ‡ transliterate
In beiden Versionen werden Leerzeichen zwischen den Zeichen eingefügt. Konvertierungen 0-9 und az (ohne Berücksichtigung der Groß- und Kleinschreibung) werden konvertiert. Ein Leerzeichen wird in 3 umgewandelt.
Ersetzen Sie \ndurch ein Zeilenvorschubzeichen ( 0x0a). Einige nicht druckbare Zeichen werden aufgrund von SE nicht angezeigt. Wenn Sie in den Bearbeitungsmodus wechseln, wird dies angezeigt.
Hier ist das Hex:
73 3d 3e 73 2e 73 70 6c 69 74 28 22 22 29 2e 6d 61 70 28 65 3d 3e 69 73 4e 61 4e 28 64 3d 70 61 72 73 65 49 6e 74 28 65 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28 29 2c 33 36 29 29 3f 65 3a 60 5f 4f 47 43 41 40 50 58 5c 5c 5e 05 18 1a 0c 02 12 0e 10 04 17 5c 72 14 07 06 0f 16 1d 0a 08 03 09 11 0b 19 1b 1c 60 2e 63 68 61 72 43 6f 64 65 41 74 28 64 29 2e 74 6f 53 74 72 69 6e 67 28 32 29 2e 73 75 62 73 74 72 28 31 29 2e 73 70 6c 69 74 28 22 22 29 2e 6d 61 70 28 65 3d 3e 22 2e 2d 22 5b 65 5d 29 2e 6a 6f 69 6e 28 22 22 29 29 2e 6a 6f 69 6e 28 22 20 22 29
Ungolfed
s=> //declare anonymous function
s.split("") //split into array of characters
.map( //for each character
e=> //declare anonymous function
isNaN( //is the character not in range 0-9a-zA-Z
d=parseInt(e.toLowerCase(),36)
//take it as base 36(digits are 0-9a-z) and assign to d
)?e: //if outside range, return as is
`_OGCA@PX\\^\r\n `
//table of the morse code as binary as code point with leading 1
.charCodeAt(d)//get the corresponding code
.toString(2) //convert to binary, 0=., 1=-, with an extra 1 bit
.substr(1) //remove the extra 1 bit
.split("") //split into each bit
.map( //for each bit
e=> //declare anonymous function
".-" //the corresponding symbol for bits
[e] //get it
)
.join("") //join the bits
)
.join(" ") //join the characters with a space between each character
s=> //declare anonymous function
s.split("") //split into array of characters
.map( //for each character
e=> //declare anonymous function
isNaN( //is the character not in range 0-9a-zA-Z
d=parseInt(e.toLowerCase(),36)
//take it as base 36(digits are 0-9a-z) and assign to d
)?e: //if outside range, return as is
[95,79,71,67,65,64,80,88,92,94,
5,24,26,12, 2,18,14,16, 4,23,
13,20, 7, 6,15,22,29,10, 8, 3,
9,17,11,25,27,28]
//table of the morse code as binary with leading 1
[d] //get the corresponding code
.toString(2) //convert to binary, 0=., 1=-, with an extra 1 bit
.substr(1) //remove the extra 1 bit
.split("") //split into each bit
.map( //for each bit
e=> //declare anonymous function
".-" //the corresponding symbol for bits
[e] //get it
)
.join("") //join the bits
)
.join(" ") //join the characters with a space between each character
Ich habe eine alphanumerische Zeichenfolge erstellt, deren Platzierung in der Zeichenfolge die Darstellung des Morsecodes beschreibt. Ursprünglich wollte ich binär verwenden, 01wäre aber das gleiche wie 1. Also habe ich ternär mit - = 1und verwendet . = 2. Somit befindet sich das Zeichen in dieser Zeichenfolge cam Index 1121, seine Morsecodedarstellung ist --.-.
Um Bytes zu sparen, habe ich Variablen für Leerzeichen, Bindestrich und Punkt erstellt.
Dann habe ich die 'Decoder'-Zeichenfolge mit ein paar Ersetzungsanweisungen hart codiert, um Leerzeichen zu reduzieren.
Der Teil der Funktion konvertiert einen Index in ein Array der ternären Ziffern
Die andere Teilfunktion verwendet eine Zeichenfolge und konvertiert jedes Zeichen in Morsecode mit 3 Leerzeichen nach den Buchstaben und 7 (4 zusätzliche) zwischen den Wörtern
q,d,D=" .-"
s=" TE MN AI.OG KD.WR US-.QZ.YC XB- JP L. F VH---.09 8..7-- 6---.1-- 2..3 45".replace(D,d*3).replace(d,q*4)lambda n:''.join(''.join([0,D,d][i]for i in[s.index(c)//3**i%3for i in range(5)if s.index(c)//3**i!=0][::-1])+q*3if c!=q else q*4for c in n.upper())
Geradeaus: Übersetzt den gesamten String auf einmal, Zeichen in Morsecode.
Speichern zu Datei auszuführen oder zu ersetzen <?=mit echound laufen mit -r.
Dezimalinterpretation von Morsecodes, 184 Bytes (-70)
erster Golfschritt: Morsecodes, die in Binärform codiert sind, mit einem zusätzlichen Leading 1, um führende Nullen zu erhalten. Durchläuft Zeichen und übersetzt sie einzeln. Laufen Sie mit -nr.
In Zeichen codierte Dezimalstellen, 157 Byte (-27)
Antworten:
Golfscript - 74 Zeichen
Diese Antwort unterstützt nur Großbuchstaben und Ziffern. Die Buchstaben werden durch Zeilenumbrüche und die Wörter durch zwei Zeilenumbrüche getrennt
Analyse
Golfscript - 85 Zeichen
Dies ist aufgrund der lockeren Anforderungen hier kürzer als meine SO-Antwort. Die Eingabe muss in Großbuchstaben / Ziffern erfolgen und die Interpunktionszeichen ".,?"
Da hier nicht einmal die Zeichensetzung erforderlich ist, kann ich die Antwort noch weiter kürzen
Meine Antwort von SO
Golfscript - 107 Zeichen
Zeilenumbruch am Ende der Eingabe wird nicht unterstützt, verwenden Sie also so etwas
echo -n Hello, Codegolfers| ../golfscript.rb morse.gs
Buchstaben sind Sonderfälle und werden in Kleinbuchstaben umgewandelt und in ihren Binärpositionen angeordnet. Alles andere erledigt eine Übersetzungstabelle
quelle
C # (213 Zeichen)
Ich bin sicher, das wird nicht lange dauern, aber zumindest habe ich die Technik zuerst hier!
Und in lesbarem Format:
Für eine kurze Erklärung ist die Zeichenfolge ein Haufen, in dem das linke Kind ein Punkt und das rechte Kind ein Bindestrich ist. Um den Brief zu erstellen, müssen Sie die Reihenfolge rückgängig machen und rückgängig machen.
quelle
ETIAN...
dort sah , ging ich davon aus, dass es genauso funktioniert wie das Golfscript, aber Sie haben eine andere Art, die Saite zu interpretieren. Ich denke , es ist gleichwertig , aber ich hinzufügen 1 auf den Index und verwende die binäre Darstellung die Punkte und Striche für alle die Stellen hinter dem führenden 1" zum Beispiel zu bekommenF=>18=>0b10010=>..-.
String[] a
tr + sed (347)
quelle
/g;s/
wird,
- plus ein bisschen Overhead).y
stattdessen den Befehl von sed verwendenHaskell -
314292291 ZeichenEine benutzerfreundlichere Form:
Probelauf:
Zwischen zwei Buchstaben befindet sich ein Leerzeichen, zwischen zwei Wörtern ein Leerzeichen von sieben.
quelle
fromJust.elemIndex c
kann geschrieben werden alshead.findIndices(==c)
. Das ist ein Zeichen mehr, aber Sie können es dann loswerdenimport Data.Maybe
, sodass Sie insgesamt 17 Zeichen sparen. Sie können auch zwei Zeichen speichern, indem Sie bei jedem Aufruf von intercalate das Leerzeichen vor der Zeichenfolge entfernen. Und noch ein paar Zeichen, indem mani=intercalate
am Anfang macht und die beiden Aufrufeintercalate
durch ersetzti
.intercalate
und weitere 6 Charaktere gespeichert! :-)w=words
, was ein Zeichen speichert, wenn ich mich nicht irre. Und anstelle vonl c=...
undmap l
solltenmap\c->...
Sie dies tun (Sie brauchen nicht einmal Parens um das Lambda, da es ohnehin schon eine abschließende Parens gibt).l c=...
hat mir 1 Charakter gerettet , aber ich konnte es nicht ohne Parens setzen, sondern nur alsmap(\c->...)
. GHC Version 6.12.3.Nachsatz
(310)(462)(414)(319) einschließlich (46) für die Tabelle.Kombinierte Zahlen und Buchstaben mit ternärer Kodierung. 5 ternäre Ziffern passen in ein Byte! Dies eliminiert diese albernen Differenzschleifen und Sondergehäusenummern vollständig.
ASCII85 schneidet 1/3 jeder Tabelle. Und die Vereinfachung des Codes (endlich!) Kommt unter 400 zurück!
Beispielausgabe
Ungolfed und kommentiert. Darauf bin ich sehr stolz. Ich finde es elegant, die Zahlen die Arbeit machen zu lassen. :)
Die Tabellen (33) + (13) = (46)
So codieren die Zeichenfolgen die Tabelle. Jedes Byte steht für eine 5-stellige ternäre Zahl. Und die Bytes werden weiter in ASCII85 codiert (welches Postscript automatisch decodieren kann).
quelle
Rubin, 161
Kodiert jede Ziffer in ein einzelnes Zeichen, wobei 1 ein Strich, 0 ein Punkt und eine führende 1 ein Markierungsbit ist (zuzüglich eines Versatzes, um die Druckbarkeit zu gewährleisten). Verwendet ASCII-Mathematik, um die Eingabezeichen als Nachschlageindizes zu verwenden.
quelle
VB.NET, 233 Bytes
Diese letzte Funktion ist böse.
Bearbeiten Einige Verbesserungen.
quelle
Lisp (
532466 Zeichen)Dadurch werden Kleinbuchstaben codiert und Morsecodesequenzen mit einem nachgestellten Leerzeichen gedruckt
quelle
In Java 475 Zeichen.
Übersetzt az, AZ und 0-9.
Bearbeiten:
Oder in 447 Zeichen, wenn Sie nichts dagegen haben, dass Java nach der Übersetzung einen Fehler auslöst.
quelle
Perl6 (238)
Lesbare Version
quelle
sed, 159 bytes
Wir fangen damit an, die gesamte Zeile zu verkleinern (da
y
keine Konvertierungen ohne Berücksichtigung der Groß- und Kleinschreibung möglich sind). Subtrahieren Sie 10 Bytes, wenn nur Kleinbuchstaben eingegeben werden sollen. Dann vorverarbeiten wir die Ziffern0
,2
,8
und9
ihre endgültige Symbole zu emittieren.Die Schleife generiert das letzte Symbol für jedes eingegebene Zeichen und übersetzt dann jedes Zeichen für die nächste Iteration. Dies ist gleichbedeutend mit dem Durchlaufen der dichotomen Suchtabelle , die im Wikipedia-Artikel angezeigt wird. Bei den Ziffern, die einer besonderen Behandlung bedurften, handelt es sich um Eltern, die nicht in unserer ASCII-Alphanumerik enthalten sind.
Die Schleife wird beendet, wenn alle Zeichen das Abschlusszeichen erreicht haben (nach 'e' oder 't').
Zum Beispiel wird der Brief
k
in drei Durchgängen transformiert:k
=>k-
=>n-
n-
=>n.-
=>t.-
t.-
=>t-.-
=>-.-
quelle
Python 3, 99 Zeichen
Funktioniert in Groß- und Kleinschreibung.
quelle
C
162-160Zeichen(Ohne nicht signifikante Leerzeichen, keine nachgestellte Zeile)
M
ist eine Nachschlagetabelle, in der die Bitmuster der Zeichen Punkten und Strichen im Morsecode entsprechen. Zeichen[0-9A-Z]
werden mit dieser Tabelle zum Morsen dekodiert (mit einem Leerzeichen nach dem Morsencode), andere Zeichen werden einfach unverändert durchgereicht.Probelauf:
quelle
Perl (489 Zeichen)
Kann wie folgt über die Kommandozeile ausgeführt werden.
Edit: Danke @tobyodavies für den Hinweis, dass meine ursprüngliche Lösung die Übersetzung rückwärts hatte!
quelle
%c=qw(A .- B -... C -.-. D -.. E . F ..-. G --. H .... I .. J .--- K -.- L .-.. M -- N -. O --- P .--. Q --.- R .-. S ... T - U ..- V ...- W .-- X -..- Y -.-- Z --.. 1 .---- 2 ..--- 3 ...-- 4 ..--- 5 ..... 6 -.... 7 --... 8 ---.. 9 ----. 0 -----);while(<>){print($c{$_}||$_)for split//}
PHP, 474 Zeichen
Seine 462 Zeichen, wenn alle Eingaben in Großbuchstaben erfolgen:
quelle
<?$a=strtoupper(fgets(STDIN));$m=array(65=>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)+array(48=>22222,12222,11222,11122,11222,11111,21111,22111,22211,22221)+array(32=>' ');while($a[$i++])echo strtr($m[ord($a[$i])],12,'.-');
05AB1E , 81 Bytes (nicht konkurrierend)
Probieren Sie es online!
Konvertieren Sie Buchstabenmuster in Basis-3, Zahlenmuster in Basis-2, und verwenden Sie nullindizierte ASCII-Transliteration, um Punkte und Bindestriche zu erhalten. Funktioniert nicht mit Kleinbuchstaben.
quelle
Gelee , 50 Bytes
Ein vollständiges Programm, das eine mit Python formatierte Zeichenfolge als Befehlszeilenargument akzeptiert und eine durch Leerzeichen begrenzte Ausgabe ausgibt.
Probieren Sie es online!
quelle
Powershell, 142 Bytes
Weniger Golf-Testskript:
Ausgabe:
Hinweis: Die Ausgabe enthält nachgestellte Leerzeichen.
quelle
+mazzy+
ist einige freche PolsterungAPL (NARS), 71 Zeichen, 142 Byte
Prüfung:
Jeder Buchstabe wird von einem Leerzeichen getrennt. Jedes Wort wird von drei Leerzeichen getrennt. Die Tabelle besteht aus einer alphanumerischen Zeichenfolge
⎕A,⎕D
und 16-'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ䴫쩸穼蚠'
Bit-Zeichen, die in 8-Bit-Zeichen aufgeteilt sind und jeweils in Basis 3 mit umgekehrten Ziffern konvertiert werden.quelle
05AB1E , 52 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6), 184 Byte
In beiden Versionen werden Leerzeichen zwischen den Zeichen eingefügt. Konvertierungen 0-9 und az (ohne Berücksichtigung der Groß- und Kleinschreibung) werden konvertiert. Ein Leerzeichen wird in 3 umgewandelt.
Ersetzen Sie
\n
durch ein Zeilenvorschubzeichen (0x0a
). Einige nicht druckbare Zeichen werden aufgrund von SE nicht angezeigt. Wenn Sie in den Bearbeitungsmodus wechseln, wird dies angezeigt.Hier ist das Hex:
Ungolfed
Lesbare Version, 234 Bytes
Ungolfed
quelle
Python 2,
283274 BytesIch habe eine alphanumerische Zeichenfolge erstellt, deren Platzierung in der Zeichenfolge die Darstellung des Morsecodes beschreibt. Ursprünglich wollte ich binär verwenden,
01
wäre aber das gleiche wie1
. Also habe ich ternär mit- = 1
und verwendet. = 2
. Somit befindet sich das Zeichen in dieser Zeichenfolgec
am Index1121
, seine Morsecodedarstellung ist--.-
.Testgeschirr
Aktualisieren
[HINWEIS: Es gibt immer Leerzeichen am Ende, aber Leerzeichen stellen eine Pause dar, also bin ich Gast, das ist in Ordnung ]
quelle
PHP,
157150157 BytesNimmt Eingaben vom ersten Befehlszeilenargument entgegen. Keine Pause zwischen den Buchstaben. Laufen Sie mit
-nr
.Nervenzusammenbruch
Schlagen Sie JavaScript, Python2, C, Ruby und sed. Ich bin froh.
4. Schritt: Mapping nicht zusammenführen, um Kleinbuchstaben ohne Verwendung von zu verarbeiten
strtoupper
.vorherige Versionen:
Fehler bei Kleinbuchstaben; +12 Bytes zum Reparieren: Ersetzen
$argv[1]
durchstrtoupper($argv[1])
.einfache Stringübersetzung, 254 Bytes
Geradeaus: Übersetzt den gesamten String auf einmal, Zeichen in Morsecode.
Speichern zu Datei auszuführen oder zu ersetzen
<?=
mitecho
und laufen mit-r
.Dezimalinterpretation von Morsecodes, 184 Bytes (-70)
erster Golfschritt: Morsecodes, die in Binärform codiert sind, mit einem zusätzlichen Leading
1
, um führende Nullen zu erhalten. Durchläuft Zeichen und übersetzt sie einzeln. Laufen Sie mit-nr
.In Zeichen codierte Dezimalstellen, 157 Byte (-27)
zweites Golfen: Addiert 60 zum Dezimalwert und kodiert zum Zeichen.
Zusammengeführtes Mapping, 150 Bytes (-7)
drittes Golfspiel: Zusammenführung von Ziffern und Buchstaben zu einer einzigen Saite.
quelle
SmileBASIC,
194190 Bytesquelle