Cette question implique de prendre des entrées en code Morse comme. (point) et - (symbole moins), avec des espaces pour séparer l'entrée. Votre tâche consiste à convertir le code en sortie standard. Vous pouvez supposer que la seule entrée contient des symboles de caractères trouvés dans l'alphabet International Morse Code, ici: http://en.wikipedia.org/wiki/Morse_code#Letters.2C_numbers.2C_punctuation .
Toutes les sorties doivent utiliser des lettres minuscules. Un double espace doit être interprété comme un espace de mots.
Exemple d'entrée:
. -..- .- -- .--. .-.. . .-.-.- ... --- ...
Production:
example. sos
Le code le plus court après deux semaines gagne.
Réponses:
Mathematica 62
Mathematica nous permet de tricher
Les deux premiers symboles
.
et.-
sont nécessaires pour interpréter correctement les petits codes.la source
f=ToLowerCase@StringDrop[WolframAlpha[". .- "<>#,"Result"],2]&
pour les minuscules.Drat, j'espérais arriver ici avant l'arrivée des GolfScripters :-(
Anyhoo ...
C: 228 caractères:
J'ai pensé ajouter une explication sur la façon dont cela fonctionne.
Les données d'entrée sont analysées en fonction des données d'arborescence dans
*c
, qui peuvent être développées comme suit (en utilisant·
pour représenter un nœud vacant):En commençant en haut de l'arbre, descendez en vous déplaçant vers la gauche pour un point et vers la droite pour un tiret. Ensuite, affichez le caractère auquel vous vous trouvez à la fin de la chaîne d'entrée (c'est-à-dire lorsqu'un caractère d'espacement est rencontré). Ainsi, par exemple, trois points et un tiret vous amèneront à
v
viae
,i
ets
. Au lieu de vérifier explicitement les points (ASCII\x2e
) et les tirets (ASCII\x2d
), nous avons seulement besoin de vérifier le dernier bit (m[n]&1
), qui est 0 pour.
et 1 pour-
.Six lignes suffisent pour tout coder sauf
$
, qui a 7 points / tirets:,...-..-
mais comme les données d'entrée sont garanties pour être valides, cela peut facilement être corrigé en tronquant l'entrée à 6 caractères (m[6]=0
) et en interprétant...-..
comme à la$
place. Nous pouvons également supprimer les 7 derniers octets des données de l'arborescence, car ils sont tous vides et ne sont pas nécessaires si l'entrée est valide.la source
c
Pourrait être aligné. Vous pourriez peut-être utiliser le modulo et un décalage pour essayer d’écraser ensemble les valeurs les plus élevées; c'est ce que je fais dans ma solution. Bref, beau travail!GolfScript (
116 11397 caractères)Cela inclut les caractères non imprimables utilisés dans une table de recherche, donc je le donne en sortie xxd:
Cela décode en un programme équivalent à
qui est essentiellement
Cela utilise un hachage parfait (non minimal) basé sur l'idée de base d' un algorithme optimal pour générer des fonctions de hachage parfaites minimales; Tchèque, Havas et Majewski; 1992 . Leur idée de base est que vous utilisez deux fonctions de hachage,
f1
etf2
, avec une table de rechercheg
, et le hachage parfait est(g[f1(str)] + g[f2(str)]) % m
(oùm
est le nombre de chaînes que nous souhaitons distinguer); la partie intelligente est la façon dont ils construisentg
. Considérez toutes les valeursf1(str)
et lesf2(str)
chaînesstr
d'intérêt en tant que nœuds dans un graphique non orienté, et ajoutez un bord entref1(str)
etf2(str)
pour chaque chaîne. Ils exigent non seulement que chaque arête soit distincte, mais que le graphe soit acyclique; alors c'est juste un DFS pour assigner des poids aux nœuds (c'est-à-dire pour remplir la table de rechercheg
) de telle sorte que chaque bord ait la somme requise.Czech et al génèrent des fonctions aléatoires
f1
etf2
qui sont exprimées via des tables de recherche, mais ce n'est clairement pas bon: j'ai cherché un hachage approprié en utilisant des conversions de base simples avec deux bases distinctes de -10 à 9. J'ai également assoupli l'exigence acyclique. Je ne voulais pas assigner les chaînes à des valeurs de 0 à 54, mais aux codes ASCII correspondants, donc plutôt que d'en prendre(g[f1(str)] + g[f2(str)]) % m
je voulais(g[f1(str)] + g[f2(str)]) % N
pour certainsN > 'z'
. Mais cela donne la liberté d'essayer diversN
et de voir si l'un d'eux autorise une table de recherche valideg
, qu'il y ait des cycles ou non. Contrairement à Czech et al, je me fiche que la recherche de la fonction de hachage parfaite soit O (n ^ 4).Le graphique généré par
-4base
et5base
mod59
est:ce qui est assez sympa à part le plus gros composant connecté, qui a trois cycles de longueur 1. Il faut remonter
N=233
avant de pouvoir trouver celuig
qui est cohérent.la source
C, 169 caractères
Je n'ai pas pu trouver une meilleure fonction de hachage ..
(J'ai posté le code non réduit, mais je l'ai compté réduit; pour réduire, faites simplement
:%s/ //g | %j!
dans vim, puis remettez l'espace dans la chaîne littérale.)Essai
(
morse.in
est juste l'alphabet entier en morse sur des lignes séparées):Explication
Celui-ci est assez simple.
c < 33
trouve un espacement / séparateur (,
\n
, EOF, ...).c % 2
traduit un point ou un tiret en un peu. L'idée est de créer un nombre unique pour chaque caractère simplement en l'interprétant comme un nombre binaire (après l'avoir préfixé avec 1 pour traiter la longueur variable) (cette interprétation est lav*2 + c%2
partie). J'obtiens ensuite une LUT de 137 caractères, que j'ai compactée en hachant la valeur résultante (v < 64? v : v % 51 + 33
, constantes trouvées par essais et erreurs et en regardant la distribution et en essayant de trouver un énorme écart). Malheureusement, cette fonction de hachage a une seule collision, c'est pourquoi je dois cas particulier le40 → '&'
mappage.la source
R , 145 octets
Traduit un point en 2, un tiret en 1 et interprète le nombre en ternaire et prend le mod 89, ce qui donne un nombre unique que nous pouvons utiliser dans une table de hachage. La présence d'un 13 (111 base-3) signifie ajouter 1 car ASCII 13 ne fonctionne pas dans TIO.
Essayez-le en ligne!
R , 236 octets (non concurrent)
Cela ne va pas être compétitif, mais cela nous permet de montrer quelque chose d'intéressant dans R: stocker l'arborescence du code Morse dans une structure de langage citée
m
et la récupérer du code de points et de tirets très simplement en utilisant le fait qui[[
peut être appliqué récursivement à listes. Par exemple,m[[c(2,2,3,2)]]
récupère le point, le point, le tiret, le point ou "f".Essayez-le en ligne!
la source
Powershell, 193 octets
Script de test moins golfé:
Production:
la source
JavaScript (165 octets, implémentant uniquement quatre plans.)
L'entrée doit être affectée à
n
, exécutez le code suivant pour obtenir la sortie:la source
Cannot read property '42' of undefined
, et IdeOne signale également une erreur (bien que sans message utile).. -..- .- -- .--. .-.. . .-.-.-
en entrée, car le dernier code a une longueur de 6 caractères. Dans l'exemple de script, je l'omet et je continue. -..- .- -- .--. .-..
, qui alerte (example
).