Objetivo
O código Morse é frequentemente representado como som. Dado um fluxo de bits que representam se o som está ativado ou desativado, traduza o fluxo em letras, números e espaços.
Específicos
- O fluxo de bits é analisado com base no comprimento dos bits ON / OFF repetidos.
- 1 bit ON é um ponto
- 3 bits ON são um traço
- 1 bit OFF delimita pontos e traços
- 3 bits OFF delimita caracteres
- 7 bits OFF delimita palavras (espaço)
- A entrada pode ser uma sequência ou matriz. Apenas dois caracteres / valores exclusivos de sua escolha são permitidos na entrada. (por exemplo, 0/1, verdadeiro / falso, vírgula / espaço)
- A saída retorna uma sequência ou é impressa na saída padrão.
Exemplo
Input: 101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
Analysis: \--H--/ E \---L---/ \---L---/ \----O----/\-- --/\---W---/ \----O----/ \--R--/ \---L---/ \--D--/
Output: HELLO WORLD
Suposições
- O fluxo sempre inicia e termina com um bit ON.
- Não há espaços em branco à esquerda ou à direita.
- A entrada é sempre válida.
- Todas as letras (sem distinção entre maiúsculas e minúsculas) e dígitos são suportados.
Casos de teste
101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
HELLO WORLD
10100000001011100011101110000000101110000000101011101000101000101010001010101
I AM A FISH
1010111011101110001110111011101110111000101110111011101110001110111010101
2017
101010001110111011100010101
SOS
Pontuação
Isso é código de golfe. O código de contagem de bytes mais baixo a esta hora da próxima semana vence.
Respostas:
APL (Dyalog) ,
65626057 bytes-3 graças a ngn.
Função de prefixo tácito.
Experimente online! Cabeçalho,
f←
e Rodapé são apenas para permitir a chamada da função de Entrada, mantendo a contagem de bytes do TIO. Em uma sessão normal de APL (correspondente ao campo de entrada do TIO), isso não seria necessário .⎕CY'dfns'
c op y os NDR espaço de trabalho (biblioteca)(
…)
Aplique esta função tácita:'1+|(00)+'⎕S 1
PCRE S pesquisa 1 séries e pares pares 0 e retorna o6|
restante da divisão dos comprimentos das partidas quando dividido por 6⊃∘'/. -'¨
para cada duração da partida, escolha o caractere correspondente dessa string'/|[-.]+'⎕S'&'∘
Barras de pesquisa PCRE S e traço / ponto -runs e retorna aquelesmorse
traduzidos do código Morse para o texto normalfonte
Python 2 ,
142135 bytesExperimente online!
Explicação:
Divide a sequência em letras
000
(0
significa espaço)Substitui cada um
111
por3
e converte na base 16.Cada número é modificado por
57
, o que fornece um intervalo de0..54
, qual é o índice do caractere atual.Versão anterior que foi convertida na base 3:
Python 2 ,
273252247 bytesExperimente online!
Versão anterior que foi convertida em binário:
Python 2 ,
282261256 bytesExperimente online!
fonte
Ruby , 123 bytes
Experimente online!
Divida a sequência de entrada no limite de caracteres. Use 3 ou 4 bits OFF para que os espaços sejam convertidos em cadeias vazias. Pegue o valor base 2 de cada personagem e leve a um intervalo razoável (menos de 60 valores possíveis) usando o módulo em 3 divisões sucessivas.
fonte
0?
do Regexp, ele ainda funcionará para os quatro casos de teste.Python ,
175168 bytesPrimeiro converta a string na lista de 0 (traço) / 1 (ponto), adicione um prefixo
1
(para evitar zeros à esquerda e lidar com espaços em branco) e depois converta para binário.Como todo código tem um comprimento não superior a 5, o resultado varia de 0 a 63 e pode ser listado em uma sequência.
fonte
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
!Geléia ,
6762 bytesExperimente online!
fonte
Visual Basic .NET (.NET Core) , 252 bytes
-7 bytes graças a @recursive
Uma função que leva uma série de
1
s e0
s, e retorna um string. (Na verdade, apenas o0
para oOFF
é uma exigência difícil. Tudo o que nãoOFF
é consideradoON
).O literal da cadeia de caracteres é a configuração do código Morse como uma pilha binária no formato de matriz. O VB.NET permite indexar cadeias de caracteres como matrizes de caracteres. A
\
divisão é inteiro, levando a sub-pilha esquerda para1
ou a sub-pilha direita por111
.Eu usei
!
como um espaço em branco para quando não há um valor nesse ponto de pilha. Só é necessário preencher adequadamente os índices.O VB.NET permite retornar atribuindo um valor ao nome da função (nesse caso,
A
). Eu apenas iterativamente faço concatenações de strings (&
) para criar a string de saída. Na primeira vez em que preciso usar, o&
uso de+
deixa um caracter nulo inicial, mas em qualquer outro momento em que eu possa usar+
, que se comporta da mesma forma que&
para seqüências de caracteres.Experimente online!
fonte
"!ETIANMSURWDKGOHVF!L!PJBXCYZQ!!5473!!8290!!!!!16"
e, em seguida, indexar usandoM(c-c\48*22)
e, em seguida, você pode salvar outros 4 nem usandoM
, mas apenas usando a string literal inline.M(c-c\48*22)
, obtenho o índice fora dos limites no caso de 2017. Eu acho que o VB fará divisão e multiplicação na mesma precedência; estou faltando parênteses?c\48*22
será ou0
ou22
. É uma maneira de subtrair condicionalmente 22 dec
, paraM
encurtar "dobrando" o final da corda. Se isso não funcionar, você sempre pode remover os parênteses deA &=(" ")
outros 2 bytes. :)&=
para+=
e remover outros dois espaços.JavaScript (ES6),
170131 bytesComo funciona:
Se você alterar os pontos para 0s e os traços para 1s e o prefixo com 1, obterá números binários que, quando convertidos em decimal, fornecem:
Elas podem ser convertidas nas letras corretas, indexando em
' ETIANMSURWDKGOHVF L PJBXCYZQ'
.Se usarmos esses números no módulo 11, obtemos os números 0 - 8 e 10, que podem ser convertidos nos números corretos por indexação em
'473168290 5'
.O programa divide-se em caracteres e converte cada caractere em pontos e traços, que são convertidos na saída apropriada com base nas regras acima.
Casos de teste:
Mostrar snippet de código
fonte
Python 2 , 127 bytes
Experimente online!
Desenvolvendo a solução do TFeld removendo a substituição e trabalhando na base 10, ao custo de um xor bit a bit e uma string de referência mais longa.
fonte
PHP,
321284 bytesGuardado 37 bytes graças a @ovs
Versão anterior (321 bytes)
Experimente online!
Versão não destruída:
fonte
Java (OpenJDK 8) , 370 bytes
Experimente online!
fonte
GNU sed , 261 + 1 = 262 bytes
+1 byte para
-r
sinalizador.Experimente online!
Explicação
Esta é uma solução de tabela de pesquisa muito básica.
As três primeiras linhas transformam a entrada para que os traços sejam se os
_
pontos sejam1
s. Primeiro,000
s são substituídos por;
, para que os caracteres sejam separados por;
e as palavras por;;0
. Então,111
s são substituídos por_
e todos os0
s restantes são descartados, deixando1
s para pontos.A próxima linha anexa a tabela de pesquisa. Ele assume a forma
cmcmcm...
ondec
está um caractere em
é a sequência de_
s e1
s que o representam.i
é substituído1
na tabela por desambiguação. Como as expressões regulares no sed são sempre gananciosas, a tabela é classificada do código mais longo ao mais curto (por exemplo,1_
corresponde aoA1_
invés dei1____
).Em seguida, num ciclo, cada sequência de
_
s e1
s (e a subsequente;
) é substituído pelo carácter correspondente:Por fim, cleanup:
i
s são substituídos por1
s,;
s restantes são espaços e a tabela de pesquisa é excluída:fonte
Geléia , 67 bytes
Experimente online!
fonte
JavaScript (ES6),
10410210199 bytesCasos de teste
Mostrar snippet de código
Quão?
Como a conversão de bytes de custos binários para decimais, usamos uma função hash que funciona diretamente em blocos binários interpretados na base 10.
Exemplo
fonte
n*p%m0%m1
porRetina ,
144138130103 bytesExperimente online! O link inclui casos de teste. Explicação:
Altere os dígitos binários para outros caracteres, porque 0 e 1 são saídas válidas.
Insira um espaço antes de cada caractere e dois espaços entre as palavras.
Suponha que todos os caracteres sejam Es.
Traduza todas as letras, assumindo que serão seguidas por um ponto. Por exemplo, se temos um E, e vemos um segundo ponto (consumimos o primeiro quando inserimos o E), ele se traduz em um I. Para letras que só podem ser seguidas legalmente por um traço, elas são traduzidas com esse suposição e, em seguida, o traço é consumido no próximo estágio. Outras letras são excluídas (mantendo
L
custos em um byte).Se parecer que eles foram seguidos de fato, corrija os erros de tradução. Isso também consome o traço quando foi assumido no estágio anterior. Ambas as traduções são repetidas até que todos os pontos e traços sejam consumidos.
fonte
Perl 5 , 241 + 1 (
-p
) = 242 bytesExperimente online!
fonte
PHP, 181 + 1 bytes
Execute como pipe
-nR
ou experimente online .fonte
ES6 , 268 bytes
Usa a codificação ASCII após o mapeamento de uma representação base36 do morse para uma posição de índice. Não é o meu melhor dia de golfe, mas levou apenas 15 minutos.
Mais fácil de ler (meio):
fonte
Língua Wolfram (Mathematica) , 288 bytes
Pensou em ler os dados como binários de um arquivo, mas isso fica difícil de explicar. A base 36 parecia uma boa maneira de comprometer o armazenamento eficiente dos dados de maneira lexical.
Toma uma sequência de 0 e 1 como entrada. Faz uma série de substituições, começando com 7 zeros, depois 3, e as letras binárias mais longas até as menores. A ordem de substituição é importante.
Experimente online!
fonte
Perl 5 , 195 bytes
Código de 194 bytes + 1 para
-p
.Eu não conseguia fazer isso funcionar com apenas uma string binária padrão, eu tinha que escapar dos caracteres de bytes mais altos, caso contrário eu estaria no 171, se alguém sabe o que eu perdi ou por que está quebrando isso seria ótimo !
Experimente online!
Explicação
A string binária é uma lista
pack
ed dos números relacionados aos caracteres morse (101011101
-349
paraF
etc) e é compactada com os intervalosA..Z,0..9
e usada como uma pesquisa. Ass///
expressões substituem todas as execuções de sete0
s por espaço e, em seguida, todas as execuções de dígitos, separadas por três0
s ou limites de palavras\b
, pela chave correspondente do%h
hash.fonte