Esta questão envolve receber entradas no código Morse como. (ponto final) e - (símbolo de menos), com espaços para separar a entrada. Sua tarefa é converter o código em saída padrão. Você pode assumir que a única entrada contém símbolos de caracteres encontrados no alfabeto Código Morse Internacional, encontrado aqui: http://en.wikipedia.org/wiki/Morse_code#Letters.2C_numbers.2C_punctuation .
Toda saída deve usar letras minúsculas. Um espaço duplo deve ser interpretado como um espaço de palavra.
Entrada de amostra:
. -..- .- -- .--. .-.. . .-.-.- ... --- ...
Resultado:
example. sos
O código mais curto após duas semanas vence.
Respostas:
Mathematica 62
Mathematica nos permite enganar
Os dois primeiros símbolos
.
e.-
são necessários para interpretar códigos pequenos corretamente.fonte
f=ToLowerCase@StringDrop[WolframAlpha[". .- "<>#,"Result"],2]&
para letras minúsculas.Drat, eu esperava chegar aqui antes da chegada dos GolfScripters :-(
Anyhoo ...
C: 228 caracteres:
Eu pensei em adicionar uma explicação de como isso funciona.
Os dados de entrada são analisados de acordo com os dados da árvore
*c
, que podem ser expandidos da seguinte forma (usando·
para representar um nó vago):Começando no topo da árvore, desça enquanto se move para a esquerda para um ponto e para a direita para um traço. Em seguida, imprima o caractere em que você estiver quando a sequência de entrada terminar (ou seja, quando um caractere de espaço em branco for encontrado). Por exemplo, três pontos e um traço levará você a
v
viae
,i
es
. Em vez de procurar explicitamente por pontos (ASCII\x2e
) e traços (ASCII\x2d
), precisamos apenas verificar o último bit (m[n]&1
), que é 0.
e 1 para-
.Seis linhas são suficientes para codificar tudo
$
, exceto 7 pontos / traços:...-..-
mas, como os dados de entrada são válidos, isso pode ser facilmente corrigido truncando a entrada em 6 caracteres (m[6]=0
) e interpretando...-..
como$
alternativa. Também podemos cortar os últimos 7 bytes dos dados da árvore, pois todos estão vazios e não são necessários se a entrada for válida.fonte
c
. Talvez você possa usar módulo e deslocamento para tentar juntar os valores mais altos; é isso que faço na minha solução. Enfim, bom trabalho!GolfScript (
116 11397 caracteres)Isso inclui caracteres não imprimíveis usados em uma tabela de pesquisa, por isso estou fornecendo-o como saída xxd:
Isso decodifica para um programa equivalente a
que é essencialmente
Isso usa um hash perfeito (não mínimo) com base na idéia central de Um algoritmo ideal para gerar funções de hash perfeitas mínimas; Tcheco, Havas e Majewski; 1992 . A idéia básica deles é que você use duas funções de hash
f1
ef2
, junto com uma tabela de pesquisag
, e o hash perfeito seja(g[f1(str)] + g[f2(str)]) % m
(ondem
está o número de strings que desejamos distinguir); a parte inteligente é a maneira como eles constroemg
. Considere todos os valoresf1(str)
ef2(str)
cadeiasstr
de interesse como nós em um gráfico não direcionado e adicione uma aresta entref1(str)
ef2(str)
para cada sequência. Eles exigem não apenas que cada aresta seja distinta, mas que o gráfico seja acíclico; então é apenas um DFS atribuir pesos aos nós (ou seja, para preencher a tabela de pesquisag
), de modo que cada borda tenha a soma necessária.Czech et al. Geram funções aleatórias
f1
ef2
são expressas por meio de tabelas de pesquisa, mas isso claramente não é bom: procurei um hash adequado usando conversões básicas simples com duas bases distintas de -10 a 9. Também relaxei o requisito acíclico. Eu não queria atribuir as strings a valores de 0 a 54, mas aos códigos ASCII correspondentes, então, ao invés de pegar o que(g[f1(str)] + g[f2(str)]) % m
eu queria(g[f1(str)] + g[f2(str)]) % N
para algunsN > 'z'
. Mas isso permite liberdade para tentar váriasN
e ver se alguma delas permite uma tabela de pesquisa válidag
, independentemente de haver ciclos. Ao contrário de Czech et al, não me importo se a busca pela função hash perfeita for O (n ^ 4).O gráfico gerado por
-4base
e5base
mod59
é:o que é bastante bom, exceto pelo maior componente conectado, que tem três ciclos de comprimento 1. Temos que ir até
N=233
que possamos encontrar umg
que seja consistente.fonte
C, 169 caracteres
Não consegui encontrar uma função de hash melhor ..
(Publiquei o código não minificado, mas contei como minificado; para minificar basta fazer
:%s/ //g | %j!
no vim e, em seguida, colocar o espaço na cadeia literal de volta.)Execução de teste
(
morse.in
é apenas o alfabeto inteiro em letras maiúsculas e minúsculas):Explicação
Este é bastante direto.
c < 33
encontra um espaço em branco / separador (,
\n
, EOF, ...).c % 2
traduz um ponto ou traço em um pouco. A idéia é criar um número único para cada caractere simplesmente interpretando-o como um número binário (depois de prefixá-lo com 1 para lidar com o comprimento da variável) (essa interpretação é av*2 + c%2
parte). Em seguida, recebo um LUT de 137 caracteres, que compactou com hash do valor resultante (v < 64? v : v % 51 + 33
constantes encontradas por tentativa e erro e olhando a distribuição e tentando encontrar uma lacuna enorme). Infelizmente, essa função hash tem uma única colisão, e é por isso que eu preciso especial-caso o40 → '&'
mapeamento.fonte
R , 145 bytes
Traduziu um ponto para um 2, um traço para um 1 e interpreta o número no ternário e pega o mod 89, que fornece um número único que podemos usar em uma tabela de hash. A presença de um 13 (111 base-3) significa adicionar 1 porque o ASCII 13 não funciona no TIO.
Experimente online!
R , 236 bytes (não concorrente)
Isso não será competitivo, mas nos permitirá mostrar algo interessante em R: armazenar a árvore de código Morse dentro de uma estrutura de linguagem citada
m
e recuperá-la do código de pontos e traços de maneira muito simples, usando o fato de que[[
pode ser aplicado recursivamente a listas. Por exemplo,m[[c(2,2,3,2)]]
recupera ponto, ponto, traço, ponto ou "f".Experimente online!
fonte
Powershell, 193 bytes
Script de teste com menos golfe:
Resultado:
fonte
JavaScript (165 bytes, implementando apenas quatro planos).
A entrada deve ser atribuída a
n
, execute o seguinte código para obter a saída:fonte
Cannot read property '42' of undefined
e o IdeOne também relata um erro (embora sem uma mensagem útil).. -..- .- -- .--. .-.. . .-.-.-
como entrada, pois o último código tem 6 caracteres. No script de exemplo, eu o omito e continuo com. -..- .- -- .--. .-..
quais alertas (example
).