Desafio:
Escreva um programa que produz a seguinte saída:
. 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 é uma tabela formatada dos códigos Morse das letras de A a Z. Cada coluna é separada por três espaços.
Existem quatro slots ausentes, usados por conjuntos de caracteres internacionais. Seu programa deve escrever um espaço lá.
A saída deve consistir em espaços ASCII, pontos, traços, letras maiúsculas e novas linhas (LF ou CRLF).
Seu programa não aceita entrada.
A seguir, é apresentado um exemplo de programa Python que produz a saída desejada:
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))
Isso é código-golfe , então a resposta mais curta em bytes vence.
code-golf
ascii-art
kolmogorov-complexity
morse
Locoluis
fonte
fonte
Respostas:
Geléia , 85 bytes
Um programa completo que imprime a folha de dicas.
Experimente online!
Quão?
Nota: Eu acho que pode haver uma maneira de reduzir isso, formando uma lista que formata corretamente usando o átomo da grade
G
, mas não consigo entender como.fonte
Python 3,6,
201197193187 bytesUsa alguma formatação, descompactação e magia A000918 .
fonte
f'{i//k:0{j}b}'.replace(*'0.').replace(*'1-')
é do mesmo comprimento que''.join('.-'[int(x)]for x in f'{i//k:0{j}b}')
Retina , 125 bytes
Experimente online! Deve ter 121 bytes, mas fiquei com preguiça de lidar com os espaços em branco no início e no final. Explicação:
As letras cujo código começa com
.
e-
respectivamente são pré-carregadas. (É teoricamente possível evitar pré-carregar o arquivo,.-
mas ele salva bytes dessa maneira.)_
S são usados em vez de espaços, pois são considerados letras, o que facilita a correspondência abaixo.Aqui, dividimos cada linha em cinco partes:
.
)-
)As peças são então remontadas em duas linhas:
.
sufixo, a primeira metade das letras restantes-
sufixo, a segunda metade das letras restantesAs novas linhas seguem o mesmo formato da linha existente, apenas com um prefixo Morse extra e metade do número de letras restantes para processar. Isso é repetido até que cada linha tenha apenas uma letra.
Os
_
s são então alterados novamente em espaços.fonte
JavaScript (ES6),
154147145 bytesfonte
PHP, 208 bytes
Experimente online!
PHP, 229 bytes
Experimente online!
fonte
Perl 5,
158156 bytesfonte
PHP,
184 183181 bytesCorra com
-nr
ou experimente online .demolir
-7 bytes com espaços à esquerda : Substitua
ltrim("$r\n")
por"$r\n"
e28
com31
.171 (= -10) bytes com espaços à direita :
avaria experimentá-lo online
fonte
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++];
deve salvar 2 bytes.----
não combina com o resto."EISHVUF ARL WPJTNDBXKCYMGZQO "
deve ter 2 espaços no final.APL (Dyalog) , 92 bytes
Precisa o
⎕IO←0
que é padrão em muitos sistemas.Experimente online!
{
...}¨'
...'
aplicar a seguinte função anônima a cada uma das strings:⍪⍵
transformar o argumento em uma coluna' ',
preceder um espaço (em cada linha)'.-'[
…],
Precede a sequência depois de ter sido indexada com:≢⍵
o comprimento do argumento⍳
os índices disso (0, 1, 2,…, comprimento -1)2⊥⍣¯1
anti-base-2 (usa quantos bits forem necessários)⍉
transpor (de uma representação em cada coluna para uma em cada linha)(
…)⍀
Expandir por (insira linhas em branco conforme indicado por zeros em):≢⍵
o comprimento do argumento16÷
dividir dezesseis por isso1↑⍨
(over) take de um (faz uma lista de um seguido de 1 n zeros)16⍴
reciclar esse padrão até ter dezesseis elementos' ',
preceder um espaço⍕
formato (a lista de tabelas em uma única tabela, preenchendo cada uma com um espaço de cada lado)¯1⌽
gire um passo para a direita (movendo o espaço à direita para a frente)0 3↓
elimine zero linhas e três colunas (removendo assim os três espaços à esquerda)fonte
16÷⍨
aparece no seu código ZSOGL ,
106105102 bytesSe espaços precedentes forem permitidos,
10299 bytes141 bytes, compactação
só queria ver o quão bem SOGL poderia fazer com apenas compactação (bem, tem mais do que apenas compactação, mas tem 97% de cadeias compactadas)
fonte
JavaScript (205 bytes)
fonte
Ruby,
144 143141 bytesUngolfed
fonte
Pitão , 106 bytes
Teste online!
Explicação
Em poucas palavras, o que faço aqui é gerar a tabela coluna por coluna e transpor a tabela antes de imprimi-la. Observamos que em uma coluna, os códigos morse das letras podem ser representados como cadeias binárias (substitua
.
por0
e-
por1
) ao contar de zero ao índice da última letra da coluna.O algoritmo se baseia em uma função da qual dou um exemplo executado abaixo (para a segunda coluna):
Explicação do código
Eu cortei o código em dois. A primeira parte é a função descrita acima, a segunda parte é como eu uso a função:
(1) : Na tabela morse, na primeira coluna, há sete linhas após cada linha contendo uma letra ("E" e "T"). Na segunda coluna, são três linhas. Em seguida, um (terceira coluna) e zero (última coluna). É
16 / n - 1
aí quen
está o número de letras na coluna (que estáN
no código acima). É o que o código da linha (1) :Tudo bem, agora temos uma função útil
h
que basicamente gera a coluna de uma tabela a partir de uma sequência de caracteres. Vamos usá-lo (observe os dois espaços à direita no código abaixo):O código ainda pode ser reduzido; talvez eu volte mais tarde.
fonte
C,
199195 bytesAo vivo no coliru (com #include para evitar a mensagem de aviso.)
UPDATE : salvou quatro caracteres movendo a "declaração" de
m
fora da função, conforme sugerido por @zacharyTUsa o que parece ser uma estratégia padrão: mantenha as letras em uma árvore binária codificada em matriz, para que os filhos do elemento
i
sejam2*i
e2*i+1
. Esta árvore está enraizada em 2 e não em 1 porque a aritmética funcionou um pouco mais curta, eu acho. Todo o resto é golfe.Ungolfed:
fonte
int m
para estarm;
fora da função?Chiclete , 133 bytes
Comprimido como um fluxo LZMA.
fonte
C, 291 bytes
Experimente on-line
Como funciona
Primeiro analisei a string em C, contando espaços menores que 26, então codifiquei-os em letras minúsculas
a, b, .. z
com este pequeno programaEm seguida, escrevi um analisador para essa codificação, onde
/
há uma nova linha e uma letra minúscula representat[i] - 'a'
espaçosfonte
Bash (com utilitários), 254 bytes
fonte
Dyalog APL, 159 bytes (não concorrente)
fonte
⎕IO←0
(padrão em muitos sistemas) e usando⍨
(comutar) .JavaScript (ES7),
242240238 bytesExperimente online!
-2 bytes graças a Zachary .
fonte
a!='0'
paraa!=0
.join('')
com.join<insert backtick here><insert backtick here>
? (<insert backtick here>
Sendo substituído com crase reais)a!='0'
paraa!=0
, isso deve funcionar.''
caso.