Objectif
Le code Morse est souvent représenté sous forme de son. Si un flux de bits indique si le son est activé ou non, traduisez-le en lettres, en chiffres et en espaces.
Détails
- Le flux de bits est analysé en fonction de la longueur des bits ON / OFF répétés.
- 1 bit ON est un point
- 3 ON bits sont un tiret
- 1 bit OFF délimite les points et les tirets
- 3 bits OFF délimite les caractères
- 7 bits OFF délimitent les mots (espace)
- L'entrée peut être une chaîne ou un tableau. Seuls deux caractères / valeurs uniques de votre choix sont autorisés dans l'entrée. (par exemple, 0/1, vrai / faux, virgule / espace)
- La sortie renvoie une chaîne ou est imprimée sur la sortie standard.
Exemple
Input: 101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
Analysis: \--H--/ E \---L---/ \---L---/ \----O----/\-- --/\---W---/ \----O----/ \--R--/ \---L---/ \--D--/
Output: HELLO WORLD
Hypothèses
- Le flux commence et finit toujours avec un bit ON.
- Il n'y a pas d'espaces de début ou de fin.
- L'entrée est toujours valide.
- Toutes les lettres (insensibles à la casse) et les chiffres sont pris en charge.
Cas de test
101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
HELLO WORLD
10100000001011100011101110000000101110000000101011101000101000101010001010101
I AM A FISH
1010111011101110001110111011101110111000101110111011101110001110111010101
2017
101010001110111011100010101
SOS
Notation
C'est du code golf. Le code de nombre d'octets le plus bas à cette heure-là la semaine prochaine l'emporte.
Réponses:
APL (Dyalog) ,
65626057 octets-3 grâce à ngn.
Fonction de préfixe tacite.
Essayez-le en ligne! Header,
f←
et Footer servent uniquement à appeler la fonction depuis Input tout en conservant le nombre d'octets de TIO. Dans une session APL normale (correspondant au champ d'entrée de TIO), cela ne serait pas nécessaire .⎕CY'dfns'
c op y l' espace de travail dfns (bibliothèque)(
...)
appliquer cette fonction tacite:'1+|(00)+'⎕S 1
PCRE S earch 1-runs et même longueur 0 points fixes et les longueurs de matches retour6|
le reste de la division lorsqu'il est divisé par 6⊃∘'/. -'¨
pour chaque longueur de correspondance, choisir le caractère correspondant de cette chaîne'/|[-.]+'⎕S'&'∘
PCRE S les barres obliques de et tableau de bord / point -runs et renvoyer ceuxmorse
traduits du code Morse en texte normalla source
Python 2 ,
142135 octetsEssayez-le en ligne!
Explication:
Divise la chaîne en lettres
000
(0
signifie donc espace)Remplace chacun
111
par3
et se transforme en base 16.Ensuite, chaque nombre est modifié par
57
, ce qui donne une plage de0..54
, qui est l'index du caractère actuel.Version précédente convertie en base 3:
Python 2 ,
273252247 octetsEssayez-le en ligne!
Version précédente convertie en binaire:
Python 2 ,
282261256 octetsEssayez-le en ligne!
la source
Ruby , 123 octets
Essayez-le en ligne!
Fractionner la chaîne d'entrée sur la limite de caractères. Utilisez 3 ou 4 bits OFF pour que les espaces soient convertis en chaînes vides. Prenez la valeur de base 2 de chaque caractère et ramenez-la dans une plage raisonnable (moins de 60 valeurs possibles) en utilisant modulo sur 3 divisions successives.
la source
0?
de l’expression rationnelle, cela fonctionne toujours pour les quatre cas de test.Python ,
175168 octetsCommencez par convertir la chaîne en liste de chaînes 0 (tiret) / 1 (point), ajoutez un préfixe
1
(pour éviter les zéros non significatifs et pour gérer les espaces), puis convertissez-la en binaire.Étant donné que chaque code n'a pas plus de 5 caractères, le résultat est compris entre 0 et 63 et peut être répertorié dans une chaîne.
la source
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
!Gelée ,
67 à62 octetsEssayez-le en ligne!
la source
Visual Basic .NET (.NET Core) , 252 octets
-7 octets grâce à @recursive
Une fonction qui prend une chaîne de
1
s et0
s et retourne une chaîne. (En fait, seul le0
pour leOFF
est une exigence absolue.OFF
On suppose que tout ne l' est pasON
).Le littéral de chaîne correspond à la configuration du code Morse en tant que segment binaire sous forme de tableau. VB.NET vous permet d'indexer des chaînes en tant que tableaux de caractères. le
\
division est un entier, prenant le sous-tas de gauche pour1
ou le sous-tas de droite pour111
.j'ai utilisé
!
comme un blanc pour quand il n'y a pas de valeur dans cet endroit tas. Il est seulement nécessaire de remplir correctement les index.VB.NET vous permet de revenir en affectant une valeur au nom de la fonction (dans ce cas,
A
). Je viens de faire des concaténations de chaînes (&
) de manière itérative pour construire la chaîne de sortie. La toute première fois que je dois utiliser&
parce que l’utilisation+
laisse un caractère nul de tête, mais je peux l’utiliser à tout autre moment+
, ce qui se comporte de la même manière que&
pour les chaînes.Essayez-le en ligne!
la source
"!ETIANMSURWDKGOHVF!L!PJBXCYZQ!!5473!!8290!!!!!16"
indexation, puis l'indexationM(c-c\48*22)
, puis 4 autres en ne l'utilisant même pasM
, mais en utilisant simplement le littéral de chaîne en ligne.M(c-c\48*22)
, j'obtiens un index hors limites pour le cas 2017. Je pense que VB fera la division et la multiplication à la même priorité; est-ce qu'il me manque une parenthèse?c\48*22
sera soit0
ou22
. C'est une manière de soustraire conditionnellement 22 àc
, deM
raccourcir en "pliant" la fin de la chaîne. Si cela ne fonctionne pas pour vous, vous pouvez toujours supprimer les parens deA &=(" ")
2 autres octets. :)&=
pour+=
et enlever deux autres espaces.JavaScript (ES6),
170131 octetsComment ça marche:
Si vous modifiez les points en 0 et les tirets en 1 et en préfixant 1, vous obtenez des nombres binaires qui, convertis en décimales, vous donnent:
Celles-ci peuvent être converties en lettres correctes en indexant en
' ETIANMSURWDKGOHVF L PJBXCYZQ'
.Si nous prenons ces nombres, module 11, nous obtenons les nombres 0 - 8 et 10, qui peuvent être convertis en nombres corrects avec indexation dans
'473168290 5'
.Le programme se divise en caractères, puis convertit chaque caractère en points et en tirets, qui sont convertis en sortie appropriée en fonction des règles ci-dessus.
Cas de test:
Afficher l'extrait de code
la source
Python 2 , 127 octets
Essayez-le en ligne!
Tirer parti de la solution de TFeld en supprimant replace , en travaillant en base 10, au prix d’un xor au niveau des bits et d’une chaîne de référence plus longue.
la source
PHP,
321284 bytesSaved 37 bytes thanks to @ovs
Previous version (321 bytes)
Try it online!
Ungolfed version :
la source
Java (OpenJDK 8), 370 bytes
Try it online!
la source
GNU sed, 261 + 1 = 262 bytes
+1 byte for
-r
flag.Try it online!
Explanation
This is a very basic lookup table solution.
The first three lines transform the input so dashes are
_
s and dots are1
s. First,000
s are replaced with;
, so characters are separated by;
and words by;;0
. Then111
s are replaced by_
and all remaining0
s are discarded, leaving1
s for dots.The next line appends the lookup table. It takes the form
cmcmcm...
wherec
is a character andm
is the sequence of_
s and1
s representing it.i
is substituted for1
in the table for disambiguation. Since regular expressions in sed are always greedy, the table is sorted from longest to shortest code (so e.g.1_
matchesA1_
instead ofi1____
).Next, in a loop, each sequence of
_
s and1
s (and the subsequent;
) is replaced by the corresponding character:Finally, cleanup:
i
s are replaced with1
s, remaining;
s are spaces, and the lookup table is deleted:la source
Jelly, 67 bytes
Try it online!
la source
JavaScript (ES6),
10410210199 bytesTest cases
Show code snippet
How?
Because converting from binary to decimal costs bytes, we use a hash function which works directly on binary blocks interpreted in base 10.
Example
la source
n*p%m0%m1
forRetina,
144138130103 bytesTry it online! Link includes test cases. Explanation:
Change the binary digits to other characters because 0 and 1 are valid outputs.
Insert a space before every character and two spaces between words.
Assume that all characters are Es.
Translate all letters assuming that they will be followed by a dot. For instance, if we have an E, and we see a second dot (we consumed the first when we inserted the E) then it translates to an I. For letters that can only be legally followed by a dash, they are translated with that assumption, and then the dash is consumed by the next stage. Other letters are deleted (keeping
L
costs a byte).If it transpires that they were in fact followed by a dash, then fix up the mistranslations. This also consumes the dash when it was assumed by the previous stage. Both translations are repeated until all of the dots and dashes are consumed.
la source
Perl 5, 241 + 1 (
-p
) = 242 bytesTry it online!
la source
PHP, 181+1 bytes
Run as pipe with
-nR
or try it online.la source
ES6, 268 bytes
Uses ASCII encoding after mapping from a base36 representation of the morse to an index position. Not my best golf day, but it only took around 15 mins.
Easier to read (kinda):
la source
Wolfram Language (Mathematica), 288 bytes
Thought about reading in the data as binary from a file but that gets hard to explain. Base 36 seemed like a good compromise way to store the data efficiently lexically.
Takes a string of 0's and 1's as input. Does a series of replacements, starting with the runs of 7 zeros, then the runs of 3, then the longest binary letters down to the shortest. Order of replacement is important.
Try it online!
la source
Perl 5, 195 bytes
194 bytes code + 1 for
-p
.I couldn't get this working with just a standard packed binary string, I had to escape the higher-byte chars otherwise I'd be on 171, if anyone knows what I've missed, or why it's breaking that'd be great!
Try it online!
Explanation
The binary string is a
pack
ed list of the numbers that relate to the morse characters (101011101
-349
forF
etc) and this is zipped with the rangesA..Z,0..9
and used as a lookup. Thes///
expressions replace all runs of seven0
s with space and then all runs of digits, separated with three0
s or word boundaries\b
, with their corresponding key from the%h
hash.la source