Reto:
Escriba un programa que produzca el siguiente resultado:
. E .. I ... S .... H
...- V
..- U ..-. F
..--
.- A .-. R .-.. L
.-.-
.-- W .--. P
.--- J
- T -. N -.. D -... B
-..- X
-.- K -.-. C
-.-- Y
-- M --. G --.. Z
--.- Q
--- O ---.
----
Esta es una tabla formateada de los códigos Morse de las letras de la A a la Z. Cada columna está separada por tres espacios.
Hay cuatro espacios faltantes, que son utilizados por los juegos de caracteres internacionales. Su programa debe escribir un espacio allí.
La salida debe consistir en espacios ASCII, puntos, guiones, letras mayúsculas y nuevas líneas (ya sea LF o CRLF) solamente.
Su programa no acepta entradas.
El siguiente es un programa de Python de muestra que produce el resultado deseado:
b = "."
out = []
last = 0
ch = "EISHVUF ARL WPJTNDBXKCYMGZQO "
cx = 0
while b:
if last >= len(b):
print(" ".join(out))
out = [" ", " ", " ", " "][0:len(b) - 1]
out.append(b + " " + ch[cx])
cx += 1
last = len(b)
if len(b) < 4:
b += "."
elif b[-1] == ".":
b = b[0:-1] + "-"
else:
i = len(b) - 1
while b[i] == "-":
i -= 1
if i < 0:
break
if i < 0:
break
b = b[0:i] + "-"
print(" ".join(out))
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
code-golf
ascii-art
kolmogorov-complexity
morse
Locoluis
fuente
fuente
Respuestas:
Jalea , 85 bytes
Un programa completo que imprime la hoja de trucos.
Pruébalo en línea!
¿Cómo?
Nota: Creo que puede haber una forma de recortar esto formando una lista que se formatee correctamente mediante el uso del átomo de cuadrícula
G
, pero no puedo entender cómo.fuente
Python 3.6,
201197193187 bytesUtiliza algo de formato, desembalaje y magia A000918 .
fuente
f'{i//k:0{j}b}'.replace(*'0.').replace(*'1-')
tiene la misma duración que''.join('.-'[int(x)]for x in f'{i//k:0{j}b}')
Retina , 125 bytes
Pruébalo en línea! Debería tener 121 bytes, pero era demasiado vago para lidiar con el espacio en blanco al principio y al final. Explicación:
Las letras cuyo código comienza con
.
y-
respectivamente están precargadas. (Teóricamente es posible evitar precargar el.-
pero ahorra bytes de esta manera). Los_
s se usan en lugar de espacios, ya que se consideran letras, lo que hace que sean más fáciles de combinar a continuación.Aquí dividimos cada línea en cinco partes:
.
)-
)Las piezas se vuelven a montar en dos líneas:
.
sufijo, la primera mitad de las letras restantes-
sufijo, la segunda mitad de las letras restantesLas nuevas líneas siguen el mismo formato que la línea existente, solo con un prefijo Morse adicional y la mitad de las letras restantes para procesar. Esto se repite hasta que cada línea tenga solo una letra.
Los
_
s se vuelven a convertir en espacios.fuente
JavaScript (ES6),
154147145 bytesfuente
PHP, 208 bytes
Pruébalo en línea!
PHP, 229 bytes
Pruébalo en línea!
fuente
Perl 5,
158156bytesfuente
PHP,
184 183181 bytesEjecutar
-nr
o probarlo en línea .Descompostura
-7 bytes con espacios iniciales: reemplazar
ltrim("$r\n")
con"$r\n"
y28
con31
.171 (= -10) bytes con espacios finales :
desglose probarlo en línea
fuente
for(;$y<16;$y++,print str_pad(ltrim("$r\n"),28," ",0))for($r="",$c="03231323"[$y&7];$c++<4;)$r.=strtr(sprintf(" %0${c}b ",$y>>4-$c),10,"-.")."EISHVUF ARL WPJTNDBXKCYMGZQO "[$i++];
debería guardar 2 bytes.----
no coincide con el resto."EISHVUF ARL WPJTNDBXKCYMGZQO "
debe tener 2 espacios al final.APL (Dyalog) , 92 bytes
Necesidades, lo
⎕IO←0
cual es predeterminado en muchos sistemas.Pruébalo en línea!
{
...}¨'
...'
aplique la siguiente función anónima a cada una de las cadenas:⍪⍵
hacer el argumento en una columna' ',
anteponer un espacio (en cada fila)'.-'[
...],
anteponer la cadena después de que se haya indexado con:≢⍵
la longitud del argumento⍳
los índices de eso (0, 1, 2, ..., longitud -1)2⊥⍣¯1
anti-base-2 (usa tantos bits como sea necesario)⍉
transposición (de una representación en cada columna a una en cada fila)(
...)⍀
expandir por (inserte filas en blanco como se indica con ceros en):≢⍵
la longitud del argumento16÷
dividir dieciséis por eso1↑⍨
(over) take from one (hace una lista de uno seguido de 1- n ceros)16⍴
reciclar ese patrón hasta que tenga dieciséis elementos' ',
anteponer un espacio⍕
formato (la lista de tablas en una sola tabla, rellenando cada una con un espacio en cada lado)¯1⌽
gire un paso hacia la derecha (moviendo así el espacio posterior hacia el frente)0 3↓
suelte cero filas y tres columnas (eliminando así los tres espacios iniciales)fuente
16÷⍨
aparece en tu código?SOGL ,
106105102 bytesSi se permiten espacios previos,
10299 bytes141 bytes, compresión
solo quería ver qué tan bien podía hacer SOGL con solo compresión (bueno, tiene más que solo compresión, pero es 97% cadenas comprimidas)
fuente
JavaScript (205 bytes)
fuente
Ruby,
144 143141 bytesSin golf
fuente
Pyth , 106 bytes
¡Pruébalo en línea!
Explicación
En pocas palabras, lo que hago aquí es generar la tabla columna por columna y luego transponer la tabla antes de imprimirla. Notamos que en una columna, los códigos morse para las letras se pueden representar como cadenas binarias (reemplazar
.
por0
y-
por1
) al contar desde cero hasta el índice de la última letra en la columna.El algoritmo se basa en una función de la que doy un ejemplo a continuación (para la segunda columna):
Explicación del código
Corté el código en dos. La primera parte es la función descrita anteriormente, la segunda parte es cómo uso la función:
(1) : en la tabla morse, en la primera columna, hay siete líneas después de cada línea que contiene una letra ("E" y "T"). En la segunda columna, son tres líneas. Luego uno (tercera columna), luego cero (última columna). Ahí es
16 / n - 1
donden
está el número de letras en la columna (que estáN
en el código anterior). Eso que hace el código en la línea (1) :Bien, ahora tenemos una buena función útil
h
que básicamente genera una columna de tabla a partir de una secuencia de caracteres. Vamos a usarlo (tenga en cuenta los dos espacios finales en el código a continuación):El código aún se puede acortar; tal vez volveré sobre eso más tarde.
fuente
C,
199195 bytesLive on coliru (con #include para evitar el mensaje de advertencia).
ACTUALIZACIÓN : Guardado cuatro caracteres al mover la "declaración" de
m
fuera de la función, como lo sugiere @zacharyTUtiliza lo que parece ser una estrategia estándar: mantener las letras en un árbol binario codificado en matriz, de modo que los elementos secundarios del elemento
i
sean2*i
y2*i+1
. Este árbol tiene sus raíces en 2 en lugar de 1 porque la aritmética funcionó un poco más corta, creo. Todo lo demás es golf.Sin golf:
fuente
int m
para estarm;
fuera de la función?Chicle , 133 bytes
Comprimido como una secuencia LZMA.
fuente
C, 291 bytes
Probar en línea
Cómo funciona
Primero analicé la cadena en C, contando espacios que son menos de 26, así que los codifiqué en minúsculas
a, b, .. z
con este pequeño programaLuego escribí un analizador para esa codificación, donde
/
hay una nueva línea, y una letra minúscula representat[i] - 'a'
espaciosfuente
Bash (con utilidades), 254 bytes
fuente
Dyalog APL, 159 bytes (no competidor)
fuente
⎕IO←0
(predeterminado en muchos sistemas) y usando⍨
(conmutar) .JavaScript (ES7),
242240238 bytesPruébalo en línea!
–2 bytes gracias a Zachary .
fuente
a!='0'
aa!=0
.join('')
con.join<insert backtick here><insert backtick here>
? (<insert backtick here>
siendo reemplazado pora!='0'
aa!=0
, eso debería funcionar.''
caso.