Gol
El código Morse a menudo se representa como sonido. Dado un flujo de bits que representan si el sonido está activado o desactivado, traduzca el flujo a letras, números y espacios.
Detalles específicos
- El flujo de bits se analiza en función de la duración de la repetición de bits ON / OFF.
- 1 bit ON es un punto
- 3 bits ON son un guión
- 1 bit OFF delimita puntos y guiones
- 3 bits OFF delimitan caracteres
- 7 bits OFF delimita palabras (espacio)
- La entrada puede ser una cadena o matriz. Solo se permiten dos caracteres / valores únicos de su elección en la entrada. (ej. 0/1, verdadero / falso, coma / espacio)
- La salida devuelve una cadena o se imprime en la salida estándar.
Ejemplo
Input: 101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
Analysis: \--H--/ E \---L---/ \---L---/ \----O----/\-- --/\---W---/ \----O----/ \--R--/ \---L---/ \--D--/
Output: HELLO WORLD
Supuestos
- La transmisión siempre comienza y termina con un bit ON.
- No hay espacios en blanco iniciales o finales.
- La entrada siempre es válida.
- Todas las letras (sin distinción entre mayúsculas y minúsculas) y dígitos son compatibles.
Casos de prueba
101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
HELLO WORLD
10100000001011100011101110000000101110000000101011101000101000101010001010101
I AM A FISH
1010111011101110001110111011101110111000101110111011101110001110111010101
2017
101010001110111011100010101
SOS
Tanteo
Este es el código de golf. El código de conteo de bytes más bajo para esta fecha la próxima semana gana.
Respuestas:
APL (Dyalog) ,
65626057 bytes-3 gracias a ngn.
Función de prefijo tácito.
Pruébalo en línea! Encabezado,
f←
y Pie de página son solo para permitir llamar a la función desde Entrada mientras se retiene el recuento de bytes de TIO. En una sesión APL normal (correspondiente al campo de entrada de TIO), no sería necesario .⎕CY'dfns'
c op y el espacio de trabajo dfns (biblioteca)(
…)
Aplique esta función tácita:'1+|(00)+'⎕S 1
PCRE S earch 1-carreras y pares de longitud 0-carreras y devuelva el6|
resto de división de longitudes de partidos cuando se divide por 6⊃∘'/. -'¨
para cada longitud de partido, elija el carácter correspondiente de esta cadena'/|[-.]+'⎕S'&'∘
PCRE S earch slashes y dash / dot -ejecuta y devuelve losmorse
traducidos del código Morse al texto normalfuente
Python 2 ,
142135 bytesPruébalo en línea!
Explicación:
Divide la cadena en letras
000
(0
significa espacio)Reemplaza cada uno
111
con3
y se convierte en base 16.Luego, cada número es modificado por
57
, lo que da un rango de0..54
, que es el índice del carácter actual.Versión anterior que se convirtió a la base 3:
Python 2 ,
273252247 bytesPruébalo en línea!
Versión anterior que se convirtió a binario:
Python 2 ,
282261256 bytesPruébalo en línea!
fuente
Ruby , 123 bytes
Pruébalo en línea!
Divida la cadena de entrada en el límite de caracteres. Use 3 o 4 bits OFF para que los espacios se conviertan en cadenas vacías. Tome el valor base 2 de cada personaje y llévelo a un rango razonable (menos de 60 valores posibles) usando el módulo en 3 divisiones sucesivas.
fuente
0?
de Regexp, todavía funciona para los cuatro casos de prueba.Python ,
175168 bytesPrimero convierta la cadena en una lista de cadena 0 (guión) / 1 (punto), agregue un prefijo
1
(para evitar ceros a la izquierda y trate con espacios en blanco), luego convierta a binario.Como cada código tiene una longitud de no más de 5, el resultado varía de 0 a 63 y puede enumerarse en una cadena.
fuente
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
!Gelatina ,
6762 bytesPruébalo en línea!
fuente
Visual Basic .NET (.NET Core) , 252 bytes
-7 bytes gracias a @recursive
Una función que toma una cadena de
1
sy0
s, y devuelve una cadena. (En realidad, solo el0
para elOFF
es un requisito difícil. Cualquier cosa que noOFF
se supongaON
)El literal de cadena es la configuración del código Morse como un montón binario en forma de matriz. VB.NET le permite indexar cadenas como matrices de caracteres. La
\
división es entera, tomando el subheap izquierdo para1
o el subheap derecho para111
.Utilicé
!
como un espacio en blanco para cuando no hay un valor en ese lugar del montón. Solo es necesario rellenar correctamente los índices.VB.NET le permite regresar asignando un valor al nombre de la función (en este caso,
A
). Solo hago iterativamente concatenaciones de cadenas (&
) para construir la cadena de salida. La primera vez que necesito usar&
porque usar+
deja un carácter nulo principal, pero en cualquier otro momento puedo usar+
, que se comporta igual que&
para las cadenas.Pruébalo en línea!
fuente
"!ETIANMSURWDKGOHVF!L!PJBXCYZQ!!5473!!8290!!!!!16"
, y luego indexando usandoM(c-c\48*22)
, y luego puede guardar otros 4 ni siquiera usandoM
, sino simplemente usando la cadena literal en línea.M(c-c\48*22)
, obtengo un índice fuera de los límites en el caso de 2017. Creo que VB hará división y multiplicación con la misma precedencia; me estoy perdiendo un paréntesis?c\48*22
será cualquiera0
o22
. Es una forma de restar condicionalmente 22 dec
, paraM
acortar al "doblar" el final de la cadena. Si eso no funciona, siempre puede eliminar los parens deA &=(" ")
otros 2 bytes. :)&=
a+=
, y quitar otros dos espacios.JavaScript (ES6),
170131 bytesCómo funciona:
Si cambia los puntos a 0s y los guiones a 1s, y el prefijo con un 1, obtendrá números binarios, que cuando se convierten a decimal le dan:
Se pueden convertir a las letras correctas indexando en
' ETIANMSURWDKGOHVF L PJBXCYZQ'
.Si tomamos estos números módulo 11, obtenemos los números 0 - 8 y 10, que se pueden convertir a los números correctos por indexación en
'473168290 5'
.El programa se divide en caracteres, luego convierte cada carácter en puntos y guiones, que se convierten en la salida adecuada según las reglas anteriores.
Casos de prueba:
Mostrar fragmento de código
fuente
Python 2 , 127 bytes
Pruébalo en línea!
Partiendo de la solución de TFeld eliminando el reemplazo y trabajando en la base 10, a costa de un xor bit a bit y una cadena de referencia más larga.
fuente
PHP,
321284 bytesGuardado 37 bytes gracias a @ovs
Versión anterior (321 bytes)
Pruébalo en línea!
Versión sin golf:
fuente
Java (OpenJDK 8) , 370 bytes
Pruébalo en línea!
fuente
GNU sed , 261 + 1 = 262 bytes
+1 byte para
-r
bandera.Pruébalo en línea!
Explicación
Esta es una solución de tabla de búsqueda muy básica.
Las primeras tres líneas transforman la entrada de modo que los guiones son
_
sy los puntos son1
s. Primero, los000
s se reemplazan por;
, por lo que los caracteres se separan por;
y las palabras por;;0
. Luego, las111
s se reemplazan por_
y todas las0
s restantes se descartan, dejando1
s por puntos.La siguiente línea agrega la tabla de búsqueda. Toma la forma
cmcmcm...
en quec
es un carácter ym
es la secuencia de_
s y1
s representa.i
se sustituye1
en la tabla por desambiguación. Como las expresiones regulares en sed son siempre codiciosas, la tabla se ordena del código más largo al más corto (por ejemplo,1_
coincidencias enA1_
lugar dei1____
).A continuación, en un bucle, cada secuencia de
_
sys1
(y la posterior;
) se reemplaza por el carácter correspondiente:Finalmente, la limpieza: los
i
s se reemplazan por1
s, los;
s restantes son espacios y se elimina la tabla de búsqueda:fuente
Jalea , 67 bytes
Pruébalo en línea!
fuente
JavaScript (ES6),
10410210199 bytesCasos de prueba
Mostrar fragmento de código
¿Cómo?
Debido a que la conversión de binarios a bytes de costos decimales, utilizamos una función hash que funciona directamente en bloques binarios interpretados en la base 10.
Ejemplo
fuente
n*p%m0%m1
Retina ,
144138130103 bytesPruébalo en línea! El enlace incluye casos de prueba. Explicación:
Cambie los dígitos binarios a otros caracteres porque 0 y 1 son salidas válidas.
Inserte un espacio antes de cada carácter y dos espacios entre las palabras.
Suponga que todos los personajes son Es.
Traduzca todas las letras suponiendo que irán seguidas de un punto. Por ejemplo, si tenemos una E y vemos un segundo punto (consumimos el primero cuando insertamos la E), entonces se traduce en una I. Para las letras que solo pueden ser seguidas legalmente por un guión, se traducen con eso supuesto, y luego el guión se consume en la siguiente etapa. Se eliminan otras letras (manteniendo los
L
costos por byte).Si resulta que, de hecho, fueron seguidos por un guión, arregle las traducciones erróneas. Esto también consume el guión cuando fue asumido por la etapa anterior. Ambas traducciones se repiten hasta que se consuman todos los puntos y guiones.
fuente
Perl 5 , 241 + 1 (
-p
) = 242 bytesPruébalo en línea!
fuente
PHP, 181 + 1 bytes
Ejecutar como tubería
-nR
o probarlo en línea .fuente
ES6 , 268 bytes
Utiliza codificación ASCII después de la asignación de una representación base36 del morse a una posición de índice. No es mi mejor día de golf, pero solo me llevó unos 15 minutos.
Más fácil de leer (un poco):
fuente
Wolfram Language (Mathematica) , 288 bytes
Pensé en leer los datos como binarios de un archivo, pero eso es difícil de explicar. Base 36 parecía una buena forma de compromiso para almacenar los datos de manera eficiente léxica.
Toma una cadena de 0 y 1 como entrada. Hace una serie de reemplazos, comenzando con las corridas de 7 ceros, luego las corridas de 3, luego las letras binarias más largas hasta las más cortas. El orden de reemplazo es importante.
Pruébalo en línea!
fuente
Perl 5 , 195 bytes
Código de 194 bytes + 1 para
-p
.No pude hacer que esto funcionara solo con una cadena binaria empaquetada estándar, tuve que escapar de los caracteres de byte superior, de lo contrario estaría en 171, si alguien sabe lo que me he perdido, o por qué se rompe eso sería genial !
Pruébalo en línea!
Explicación
La cadena binaria es una lista
pack
ed de los números que se relacionan con los caracteres morse (101011101
-349
paraF
etc.) y se comprime con los rangosA..Z,0..9
y se usa como una búsqueda. Lass///
expresiones reemplazan todas las corridas de siete0
s con espacio y luego todas las corridas de dígitos, separadas con tres0
so límites de palabras\b
, con su clave correspondiente del%h
hash.fuente