Esta pregunta implica tomar la entrada en el código Morse como. (punto) y - (símbolo menos), con espacios para separar la entrada. Su tarea es convertir el código a salida estándar. Puede suponer que la única entrada contiene símbolos de caracteres que se encuentran en el alfabeto del Código Morse Internacional, que se encuentra aquí: http://en.wikipedia.org/wiki/Morse_code#Letters.2C_numbers.2C_punctuation .
Todos los resultados deben usar letras minúsculas. Un doble espacio debe interpretarse como un espacio de palabras.
Entrada de muestra:
. -..- .- -- .--. .-.. . .-.-.- ... --- ...
Salida:
example. sos
El código más corto después de dos semanas gana.
Respuestas:
Mathematica 62
Mathematica nos permite hacer trampa
Los dos primeros símbolos
.
y.-
son necesarios para interpretar los códigos pequeñas correctamente.fuente
f=ToLowerCase@StringDrop[WolframAlpha[". .- "<>#,"Result"],2]&
para minúsculas.Drat, esperaba llegar aquí antes de que llegaran los GolfScripters :-(
Anyhoo ...
C: 228 caracteres:
Pensé agregar una explicación de cómo funciona esto.
Los datos de entrada se analizan de acuerdo con los datos del árbol
*c
, que se pueden expandir de la siguiente manera (·
para representar un nodo vacante):Comenzando en la parte superior del árbol, trabaje hacia abajo mientras se mueve hacia la izquierda para un punto y hacia la derecha para un guión. Luego, muestre el carácter en el que se encuentre cuando termine la cadena de entrada (es decir, cuando se encuentre un carácter de espacio en blanco). Entonces, por ejemplo, tres puntos y un guión lo llevarán a
v
través dee
,i
ys
. En lugar de verificar explícitamente los puntos (ASCII\x2e
) y los guiones (ASCII\x2d
), solo necesitamos verificar el último bit (m[n]&1
), que es 0 para.
y 1 para-
.Seis filas son suficientes para codificar todo excepto
$
, que tiene 7 puntos / guiones:...-..-
pero, dado que se garantiza que los datos de entrada son válidos, esto se puede solucionar fácilmente truncando la entrada en 6 caracteres (m[6]=0
) e interpretándola...-..
en su$
lugar. También podemos cortar los últimos 7 bytes de los datos del árbol, ya que todos están vacíos y no son necesarios si la entrada es válida.fuente
c
Podría estar en línea. Tal vez podría usar el módulo y un desplazamiento para intentar juntar los valores más altos; Esto es lo que hago en mi solución. De todos modos, buen trabajo!GolfScript (
116 11397 caracteres)Esto incluye caracteres no imprimibles utilizados en una tabla de búsqueda, así que lo estoy dando como salida xxd:
Esto decodifica a un programa equivalente a
que es esencialmente
Utiliza un hash perfecto (no mínimo) basado en la idea central de Un algoritmo óptimo para generar funciones hash perfectas mínimas; Checo, Havas y Majewski; 1992 . Su idea básica es usar dos funciones hash
f1
yf2
, junto con una tabla de búsquedag
, y el hash perfecto es(g[f1(str)] + g[f2(str)]) % m
(¿dóndem
está el número de cadenas que deseamos distinguir?); lo inteligente es la forma en que construyeng
. Considere todos los valoresf1(str)
yf2(str)
para cadenasstr
de interés como nodos en un gráfico no dirigido, y agregue un borde entref1(str)
yf2(str)
para cada cuerda Requieren no solo que cada borde sea distinto, sino que el gráfico sea acíclico; entonces es solo un DFS para asignar pesos a los nodos (es decir, para llenar la tabla de búsquedag
) de modo que cada borde tenga la suma requerida.Czech et al generan funciones aleatorias
f1
yf2
se expresan a través de tablas de búsqueda, pero eso claramente no es bueno: busqué un hash adecuado utilizando conversiones de bases simples con dos bases distintas de -10 a 9. También relajé el requisito acíclico. No quería asignar las cadenas a valores del 0 al 54, sino a los códigos ASCII correspondientes, así que en lugar de tomar(g[f1(str)] + g[f2(str)]) % m
, quería(g[f1(str)] + g[f2(str)]) % N
algunosN > 'z'
. Pero eso permite libertad para probar variosN
y ver si alguno de ellos permite una tabla de búsqueda válidag
, independientemente de si hay ciclos. A diferencia de Czech et al., No me importa si la búsqueda de la función hash perfecta es O (n ^ 4).El gráfico generado por
-4base
y5base
mod59
es:lo cual es bastante bueno, aparte del componente conectado más grande, que tiene tres ciclos de longitud 1. Tenemos que subir
N=233
antes de poder encontrar unog
que sea consistente.fuente
C, 169 caracteres
No pude encontrar una mejor función hash ...
(Publiqué el código no minificado pero lo conté minificado; para minificar solo hazlo
:%s/ //g | %j!
en vim, luego coloca el espacio en la cadena literal de nuevo).Prueba de funcionamiento
(
morse.in
es solo el alfabeto completo en morse en líneas separadas):Explicación
Este es bastante sencillo.
c < 33
encuentra un espacio en blanco / separador (,
\n
, EOF, ...).c % 2
traduce un punto o guión en un bit. La idea es crear un número único para cada carácter simplemente interpretándolo como un número binario (después de ponerle el prefijo 1 para tratar con la longitud variable) (esta interpretación es lav*2 + c%2
parte). Luego obtengo un LUT de 137 caracteres, que compacté al descifrar el valor resultante (v < 64? v : v % 51 + 33
constantes encontradas mediante prueba y error y al mirar la distribución e intentar encontrar una gran brecha). Desafortunadamente, esta función hash tiene una sola colisión, por lo que tengo que hacer un40 → '&'
mapeo especial.fuente
R , 145 bytes
Tradujo un punto a 2, un guión a 1 e interpretó el número en ternario y tomó el mod 89, que da un número único que podemos usar en una tabla hash. La presencia de un 13 (111 base-3) significa sumar 1 porque ASCII 13 no funciona en TIO.
Pruébalo en línea!
R , 236 bytes (no competitivos)
Esto no va a ser competitivo, pero nos permite mostrar algo interesante en R: almacenar el árbol de código Morse dentro de una estructura de lenguaje citada
m
y recuperarlo del código de puntos y guiones simplemente usando el hecho de que[[
se puede aplicar recursivamente a liza. Por ejemplo,m[[c(2,2,3,2)]]
recupera punto, punto, guión, punto o "f".Pruébalo en línea!
fuente
Powershell, 193 bytes
Script de prueba menos golfizado:
Salida:
fuente
JavaScript (165 bytes, solo implementando cuatro planos).
La entrada debe asignarse a
n
, ejecute el siguiente código para obtener la salida:fuente
Cannot read property '42' of undefined
, e IdeOne también informa un error (aunque sin un mensaje útil).. -..- .- -- .--. .-.. . .-.-.-
como entrada, ya que el último código tiene una longitud de 6 caracteres. En el script de ejemplo, lo omito y voy con. -..- .- -- .--. .-..
, que alerta (example
).