Escriba el programa más corto para transformar la entrada estándar en código Morse . Los caracteres que no están en la tabla deben imprimirse tal como están.
32
Escriba el programa más corto para transformar la entrada estándar en código Morse . Los caracteres que no están en la tabla deben imprimirse tal como están.
Respuestas:
Golfscript - 74 caracteres
Esta respuesta solo admite mayúsculas y dígitos. Las letras están separadas por líneas nuevas y las palabras están separadas por 2 líneas nuevas.
Análisis
Golfscript - 85 caracteres
Esto es más corto que mi respuesta SO debido a los requisitos relajados aquí. La entrada debe estar en mayúsculas / dígitos y los caracteres de puntuación ".,?"
Dado que la puntuación ni siquiera se requiere aquí, puedo acortar la respuesta aún más
Mi respuesta de SO
Golfscript - 107 caracteres
la nueva línea al final de la entrada no es compatible, así que use algo como esto
echo -n Hello, Codegolfers| ../golfscript.rb morse.gs
Las letras son un caso especial y se convierten a minúsculas y se ordenan en sus posiciones binarias. Todo lo demás se hace mediante una tabla de traducción.
fuente
C # (213 caracteres)
Estoy seguro de que esto no durará mucho, pero al menos obtuve la técnica aquí primero.
Y en formato legible:
Para una breve explicación, la cadena de caracteres es un montón en el que el elemento secundario izquierdo es un punto y el elemento secundario derecho es un guión. Para construir la letra, retrocede e invierte el orden.
fuente
ETIAN...
allí, supuse que funcionaba igual que el script de golf, pero tiene una forma diferente de interpretar la secuencia. Creo que es equivalente, pero agrego 1 al índice y uso la representación binaria para obtener los puntos y guiones para todos los dígitos después del 1 "F=>18=>0b10010=>..-.
String[] a
tr + sed (347)
fuente
/g;s/
convierte en,
- más un poco de sobrecarga).y
comando de sed en su lugarHaskell -
314292291 caracteresUna forma más legible por el usuario:
Ejecución de muestra:
Hay un solo espacio en blanco entre dos letras y siete espacios en blanco entre dos palabras.
fuente
fromJust.elemIndex c
se puede escribir comohead.findIndices(==c)
. Ese es un personaje más, pero luego puede deshacerse de élimport Data.Maybe
, por lo que ahorrará 17 caracteres en total. También puede guardar dos caracteres eliminando el espacio delante de la cadena cada vez que llame a intercalate. Y otros pocos caracteres haciendoi=intercalate
al principio y reemplazando las dos llamadasintercalate
coni
.intercalate
y he guardado otros 6 personajes! :-)w=words
, lo que ahorra un personaje si no me equivoco. Y en lugar del c=...
ymap l
, debería hacerlomap\c->...
(ni siquiera necesita parens alrededor de la lambda ya que de todos modos ya hay un par de cierre después).l c=...
me salvó 1 personaje, pero no pude ponerlo sin parens, solo comomap(\c->...)
. GHC versión 6.12.3.Posdata
(310)(462)(414)(319) incluyendo (46) para la mesa.Números y letras combinados con una codificación ternaria. ¡5 dígitos ternarios caben en un byte! Esto elimina esos bucles de diferencia tontos y los números de carcasa especial por completo.
ASCII85 corta 1/3 de cada tabla. Y simplificar el código (¡finalmente!) Vuelve a ser inferior a 400!
Salida de muestra
Ungolfed y comentó. Estoy muy orgulloso de este. Siento que es elegante, haciendo que los números hagan el trabajo. :)
Las tablas (33) + (13) = (46)
Así es como las cadenas codifican la tabla. Cada byte representa un número ternario de 5 dígitos. Y los bytes se codifican aún más en ASCII85 (que PostScript puede decodificar automáticamente).
fuente
Rubí, 161
Codifica cada dígito en un único carácter, donde 1 es un guión, 0 es un punto, con un 1 inicial como un bit marcador (más un desplazamiento para mantenerlo imprimible). Utiliza matemáticas ASCII para usar los caracteres de entrada como índices de búsqueda.
fuente
VB.NET, 233 bytes
Esa última función es malvada.
editar Un par de mejoras.
fuente
Lisp (
532466 caracteres)Esto codifica letras minúsculas y las secuencias de código Morse se imprimen con un espacio final
fuente
En Java, 475 caracteres.
Traduce az, AZ y 0-9.
Editar:
O en 447 caracteres, si no le importa que Java arroje un error después de la traducción.
fuente
Perl6 (238)
Versión legible
fuente
sed, 159 bytes
Comenzamos reduciendo la línea completa (porque
y
no se pueden realizar conversiones que no distingan entre mayúsculas y minúsculas); reste 10 bytes si solo vamos a manejar la entrada en minúsculas. Luego preprocesar los dígitos0
,2
,8
y9
para emitir sus símbolos finales.El bucle genera el símbolo final para cada carácter de entrada, luego traduce cada carácter para la siguiente iteración. Esto es equivalente a subir la tabla de búsqueda dicotómica muestra en el artículo de Wikipedia; Se puede ver que los dígitos que necesitaban un tratamiento especial tienen padres que no están en nuestros alfanuméricos ASCII.
El ciclo termina cuando todos los caracteres han alcanzado el espacio de terminación (después de 'e' o 't').
Por ejemplo, la carta
k
se transforma en tres pases:k
=>k-
=>n-
n-
=>n.-
=>t.-
t.-
=>t-.-
=>-.-
fuente
Python 3, 99 caracteres
Funciona en mayúsculas y minúsculas.
fuente
C,
162160 caracteres(Con espacios en blanco no significativos despojados, sin nueva línea final)
M
es una tabla de búsqueda donde los patrones de bits de los caracteres corresponden a puntos y guiones en el código morse. Caracteres[0-9A-Z]
se decodifican en morse usando esta tabla (con un espacio agregado después del código morse), otros caracteres simplemente se pasan sin cambios.Ejecución de muestra:
fuente
Perl (489 caracteres)
Se puede ejecutar a través de la línea de comando de esta manera.
Editar: ¡Gracias @tobyodavies por señalar que mi solución original tenía la traducción al revés!
fuente
%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 caracteres
Sus 462 caracteres si toda la entrada está en mayúscula:
fuente
<?$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 (no competidor)
Pruébalo en línea!
Convierta patrones de letras a base-3, patrones de números a base-2, use transliteración ascii indexada a cero para llegar a puntos y guiones. No funciona en minúsculas.
fuente
Jalea , 50 bytes
Un programa completo que acepta una cadena con formato Python como argumento de línea de comando que imprime la salida delimitada por espacios.
Pruébalo en línea!
fuente
Powershell, 142 bytes
Menos guión de prueba de golf:
Salida:
Nota: La salida contiene espacios finales.
fuente
+mazzy+
es un relleno descaradoAPL (NARS), 71 caracteres, 142 bytes
prueba:
cada letra está separada de un espacio, cada palabra estaría separada de 3 espacios. La tabla se basa en una cadena alfanumérica
⎕A,⎕D
y caracteres de 16 bits'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ䴫쩸穼蚠'
que se dividen en caracteres de 8 bits , cada uno convertido en base 3 con dígitos invertidos.fuente
05AB1E , 52 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 184 bytes
Para ambas versiones, colocarán espacios entre los caracteres. Los conversos 0-9 y az (sin distinción entre mayúsculas y minúsculas) se convierten. Un espacio se convierte en 3.
Reemplazar
\n
con un carácter de nueva línea (0x0a
). No muestra un par de caracteres no imprimibles debido a SE. Entrar en modo edición lo muestra.Aquí está el hechizo:
Sin golf
Versión legible, 234 bytes.
Sin golf
fuente
Python 2,
283274 bytesCreé una cadena de caracteres alfanuméricos de modo que su ubicación en la cadena describe su representación del código Morse. Originalmente iba a usar binario, pero
01
sería lo mismo que1
. Entonces usé ternary con- = 1
y. = 2
. Por lo tanto, el carácterc
está en el índice1121
de esta cadena, su representación del código Morse es--.-
.Arnés de prueba
Actualizar
[NOTA: siempre hay un espacio en blanco al final, pero el espacio en blanco representa una pausa, así que invito a que esté bien ]
fuente
PHP,
157150157 bytestoma la entrada del primer argumento de la línea de comando. sin pausa entre letras. Corre con
-nr
.Descompostura
Superando JavaScript, Python2, C, Ruby y sed. Estoy feliz.
4to paso: desagrupar la asignación para manejar caracteres en minúsculas sin usar
strtoupper
.Versión anterior:
fallar en letras minúsculas; +12 bytes para arreglar: reemplazar
$argv[1]
constrtoupper($argv[1])
.traducción de cadena simple, 254 bytes
sencillo: traduce toda la cadena a la vez, carácter a código morse.
Guardar en archivo para ejecutar o reemplazar
<?=
conecho
y correr con-r
.interpretación decimal de códigos morse, 184 bytes (-70)
primer paso de golf: códigos morse codificados en binario con una ventaja adicional
1
para preservar los ceros a la izquierda. Recorre los personajes y los traduce uno por uno. Corre con-nr
.decimales codificados a caracteres, 157 bytes (-27)
segundo golf: agregado 60 al valor decimal y codificado al carácter.
mapeo combinado, 150 bytes (-7)
tercer golf: mapeo combinado de dígitos y letras en una sola cadena.
fuente
SmileBASIC,
194190 bytesfuente