Écrivez le programme le plus court pour transformer l'entrée standard en code Morse . Les caractères ne figurant pas dans le tableau doivent être imprimés tels quels.
32
Écrivez le programme le plus court pour transformer l'entrée standard en code Morse . Les caractères ne figurant pas dans le tableau doivent être imprimés tels quels.
Réponses:
Golfscript - 74 caractères
Cette réponse ne prend en charge que les majuscules et les chiffres. Les lettres sont séparées par des retours à la ligne et les mots sont séparés par 2 retours à la ligne
Une analyse
Golfscript - 85 caractères
Ceci est plus court que ma réponse SO en raison des exigences assouplies ici. L'entrée doit être en majuscules / chiffres et les caractères de ponctuation ".,?"
Comme la ponctuation n'est même pas requise ici, je peux raccourcir encore plus la réponse
Ma réponse de SO
Golfscript - 107 caractères
la nouvelle ligne à la fin de l'entrée n'est pas prise en charge, utilisez donc quelque chose comme ceci
echo -n Hello, Codegolfers| ../golfscript.rb morse.gs
Les lettres sont un cas spécial et converties en minuscules et ordonnées dans leurs positions binaires. Tout le reste est fait par une table de traduction
la source
C # (213 caractères)
Je suis sûr que cela ne durera pas longtemps, mais au moins j'ai eu la technique ici en premier!
Et dans un format lisible:
Pour une brève explication, la chaîne de caractères est un tas dans lequel l'enfant gauche est un point et l'enfant droit est un tiret. Pour construire la lettre, vous remontez et inversez l'ordre.
la source
ETIAN...
dedans, j'ai supposé qu'il fonctionnait de la même manière que le golfscript, mais vous avez une façon différente d'interpréter la corde. Je pense que c'est équivalent mais j'ajoute 1 à l'index et j'utilise la représentation binaire pour obtenir les points et les tirets pour tous les chiffres après le 1 "par exempleF=>18=>0b10010=>..-.
String[] a
tr + sed (347)
la source
/g;s/
devient,
- plus un peu de surcharge).y
commande de sed à la placeHaskell -
314292291 caractèresUn formulaire plus lisible par l'utilisateur:
Échantillon échantillon:
Il y a un seul espace entre deux lettres et sept espaces entre deux mots.
la source
fromJust.elemIndex c
peut être écrit commehead.findIndices(==c)
. C'est un personnage de plus, mais vous pouvez ensuite vous en débarrasserimport Data.Maybe
, vous économiserez donc 17 caractères au total. Vous pouvez également enregistrer deux caractères en supprimant l'espace devant la chaîne chaque fois que vous appelez intercaler. Et encore quelques personnages en faisanti=intercalate
au début et en remplaçant les deux appels àintercalate
pari
.intercalate
et j'ai sauvé 6 autres personnages! :-)w=words
, ce qui enregistre un personnage si je ne me trompe pas. Et au lieu del c=...
etmap l
, vous devriez le fairemap\c->...
(vous n'avez même pas besoin de parens autour du lambda car il y a déjà une paren de fermeture après tout).l c=...
m'a sauvé 1 caractère, mais je ne pouvais pas le mettre sans parens, seulement commemap(\c->...)
. GHC version 6.12.3.Postscript
(310)(462)(414)(319) dont (46) pour le tableau.Chiffres et lettres combinés avec un codage ternaire. 5 chiffres ternaires tiennent dans un octet! Cela élimine complètement ces boucles de différence stupides et les nombres de casse spéciale.
ASCII85 coupe 1/3 de chaque table. Et simplifier le code (enfin!) Revient sous 400!
Exemple de sortie
Non golfé et commenté. Je suis très fier de celui-ci. Je pense que c'est élégant, que les chiffres font le travail. :)
Les tableaux (33) + (13) = (46)
Voici comment les chaînes codent la table. Chaque octet représente un nombre ternaire à 5 chiffres. Et les octets sont encore encodés en ASCII85 (que le postscript peut décoder automatiquement).
la source
Rubis, 161
Encode chaque chiffre en un seul caractère, où 1 est un tiret, 0 est un point, avec un 1 en tête comme bit de marqueur (plus un décalage pour le garder imprimable. Utilise les mathématiques ASCII pour utiliser les caractères d'entrée comme indices de recherche.
la source
VB.NET, 233 octets
Cette dernière fonction est mauvaise.
modifier Quelques améliorations.
la source
Lisp (
532466 caractères)Cela encode les lettres minuscules et les séquences de code morse sont imprimées avec un espace de fin
la source
En Java, 475 caractères.
Traduit az, AZ et 0-9.
Modifier:
Ou en 447 caractères, si cela ne vous dérange pas que Java lance une erreur après la traduction.
la source
Perl6 (238)
Version lisible
la source
sed, 159 octets
Nous commençons par réduire la ligne entière (parce que
y
nous ne pouvons pas faire de conversions insensibles à la casse); soustrayez 10 octets si nous ne devons gérer que les entrées en minuscules. Ensuite , nous prétraiter les chiffres0
,2
,8
et9
d'émettre leurs symboles finaux.La boucle génère le symbole final pour chaque caractère saisi, puis traduit chaque caractère pour l'itération suivante. Cela équivaut à remonter le tableau de recherche dichotomique présenté dans l'article Wikipedia; les chiffres qui nécessitaient un traitement spécial peuvent être considérés comme ayant des parents qui ne sont pas dans nos alphanumériques ASCII.
La boucle se termine lorsque tous les caractères ont atteint l'espace de terminaison (après «e» ou «t»).
Par exemple, la lettre
k
se transforme en trois passes:k
=>k-
=>n-
n-
=>n.-
=>t.-
t.-
=>t-.-
=>-.-
la source
Python 3, 99 caractères
Fonctionne en majuscules et minuscules.
la source
C,
162160 caractères(Avec des espaces non significatifs supprimés, pas de nouvelle ligne de fin)
M
est une table de correspondance où les motifs binaires des caractères correspondent aux points et tirets du code morse. Les caractères[0-9A-Z]
sont décodés en morse à l'aide de ce tableau (avec un espace ajouté après le code morse), les autres caractères sont simplement transmis sans modification.Échantillon échantillon:
la source
Perl (489 caractères)
Peut être exécuté via la ligne de commande comme ça.
Edit: Merci @tobyodavies d'avoir souligné que ma solution d'origine avait la traduction à l'envers!
la source
%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 caractères
Ses 462 caractères si toutes les entrées sont en majuscules:
la source
<?$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 octets (non concurrent)
Essayez-le en ligne!
Convertissez les modèles de lettres en base-3, les modèles de nombres en base-2, utilisez la translittération ascii indexée zéro pour accéder aux points et aux tirets. Ne fonctionne pas en minuscules.
la source
Gelée , 50 octets
Un programme complet acceptant une chaîne au format Python comme argument de ligne de commande qui imprime une sortie délimitée par des espaces.
Essayez-le en ligne!
la source
Powershell, 142 octets
Script de test moins golfé:
Sortie:
Remarque: La sortie contient des espaces de fin.
la source
+mazzy+
est un rembourrage effrontéAPL (NARS), 71 caractères, 142 octets
tester:
chaque lettre est séparée d'un espace, chaque mot serait séparé de 3 espaces. Le tableau est construit sur une chaîne alphanumérique
⎕A,⎕D
et des caractères 16 bits'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ䴫쩸穼蚠'
qu'ils divisent en caractères 8 bits chacun converti en base 3 avec des chiffres inversés.la source
05AB1E , 52 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 184 octets
Pour ces deux versions, ils mettront des espaces entre les caractères. Les conversions 0-9 et az (insensible à la casse) sont converties. Un espace est converti en 3.
Remplacez
\n
par un caractère de nouvelle ligne (0x0a
). Il n'affiche pas quelques caractères non imprimables à cause de SE. Passer en mode édition le montre.Voici l'hexagone:
Ungolfed
Version lisible, 234 octets
Ungolfed
la source
Python 2,
283274 octetsJ'ai créé une chaîne alphanumérique de telle sorte que leur placement dans la chaîne décrit leur représentation en code Morse. À l'origine, j'allais utiliser le binaire, mais ce
01
serait le même que1
. J'ai donc utilisé le ternaire avec- = 1
et. = 2
. Ainsi, le caractèrec
est à l'index1121
dans cette chaîne, sa représentation en code Morse est--.-
.Harnais de test
Mise à jour
[REMARQUE: Il y a toujours un espace blanc à la fin, mais l'espace blanc représente une pause, donc je vous invite, c'est ok ]
la source
PHP,
157150157 octetsprend l'entrée du premier argument de ligne de commande. pas de pause entre les lettres. Courez avec
-nr
.panne
Battre JavaScript, Python2, C, Ruby et sed. Je suis heureux.
4ème étape: dé-fusionner le mappage pour gérer les caractères en minuscules sans utiliser
strtoupper
.Versions précédentes:
échec pour les lettres minuscules; +12 octets à corriger: remplacer
$argv[1]
parstrtoupper($argv[1])
.traduction de chaîne simple, 254 octets
simple: traduit la chaîne entière à la fois, caractère en morse.
Enregistrer dans un fichier pour exécuter ou remplacer
<?=
parecho
et exécuter avec-r
.interprétation décimale des codes morse, 184 octets (-70)
première étape de golf: codes morse codés en binaire avec un début supplémentaire
1
pour conserver les zéros de tête. Boucle à travers les caractères et les traduit un par un. Courez avec-nr
.décimales codées en caractère, 157 octets (-27)
deuxième golf: ajouté 60 à la valeur décimale et encodé en caractère.
mappage fusionné, 150 octets (-7)
troisième golf: mappage fusionné des chiffres et des lettres sur une seule chaîne.
la source
SmileBASIC,
194190 octetsla source