Escreva o programa mais curto para transformar a entrada padrão em código Morse . Os caracteres que não estão na tabela devem ser impressos como estão.
32
Escreva o programa mais curto para transformar a entrada padrão em código Morse . Os caracteres que não estão na tabela devem ser impressos como estão.
Respostas:
Golfscript - 74 caracteres
Esta resposta suporta apenas maiúsculas e dígitos. As letras são separadas por novas linhas e as palavras são separadas por 2 novas linhas
Análise
Golfscript - 85 caracteres
Isso é mais curto do que minha resposta SO, devido aos requisitos relaxados aqui. A entrada deve estar em maiúsculas / dígitos e os caracteres de pontuação ".,?"
Como a pontuação nem é necessária aqui, posso encurtar ainda mais a resposta
Minha resposta do SO
Golfscript - 107 caracteres
A nova linha no final da entrada não é suportada; portanto, use algo como isto
echo -n Hello, Codegolfers| ../golfscript.rb morse.gs
As letras são um caso especial e convertidas para minúsculas e ordenadas em suas posições binárias. Tudo o resto é feito por uma tabela de tradução
fonte
C # (213 caracteres)
Tenho certeza que isso não vai durar muito, mas pelo menos eu tenho a técnica aqui primeiro!
E em formato legível:
Para uma breve explicação, a sequência de caracteres é uma pilha na qual o filho esquerdo é um ponto e o filho direito é um traço. Para criar a carta, você volta e inverte a ordem.
fonte
ETIAN...
vídeo lá dentro, presumi que funcionasse da mesma forma que o script de golfe, mas você tem uma maneira diferente de interpretar a string. Eu acho que é equivalente, mas eu adicionar 1 ao índice e usar a representação binária para obter os pontos e traços para todos os dígitos após o líder 1" , por exemploF=>18=>0b10010=>..-.
String[] a
tr + sed (347)
fonte
/g;s/
se torna,
- mais um pouco de sobrecarga).y
comando sed em vez dissoHaskell -
314292291 caracteresUm formulário mais legível pelo usuário:
Exemplo de execução:
Há um espaço em branco único entre duas letras e sete espaços em branco entre duas palavras.
fonte
fromJust.elemIndex c
pode ser escrito comohead.findIndices(==c)
. Esse é um caractere a mais, mas você pode se livrar deleimport Data.Maybe
e salvar 17 caracteres no total. Você também pode salvar dois caracteres removendo o espaço na frente da string sempre que chamar intercalar. E mais alguns caracteres fazendoi=intercalate
no início e substituindo as duas chamadasintercalate
pori
.intercalate
e salvei outros 6 personagens! :-)w=words
, o que salva um personagem se não me engano. E, em vez del c=...
emap l
, você deve fazermap\c->...
(você nem precisa de parênteses ao redor do lambda, pois já existe um parêntese de fechamento depois).l c=...
me salvou 1 personagem, mas eu não consegui colocar sem parênteses, apenas comomap(\c->...)
. GHC versão 6.12.3.Postscript
(310)(462)(414)(319) incluindo (46) para a tabela.Números e letras combinados com uma codificação ternária. 5 dígitos ternários cabem em um byte! Isso elimina totalmente os loops de diferença e os números de invólucro especial.
ASCII85 corta 1/3 de cada tabela. E simplificar o código (finalmente!) Fica abaixo de 400!
Saída de amostra
Ungolfed e comentou. Estou muito orgulhoso deste. Eu sinto que é elegante, fazendo os números fazerem o trabalho. :)
As tabelas (33) + (13) = (46)
Aqui está como as seqüências codificam a tabela. Cada byte representa um número ternário de 5 dígitos. E os bytes são ainda codificados em ASCII85 (que postscript pode decodificar automaticamente).
fonte
Ruby, 161
Codifica cada dígito em um único caractere, onde 1 é traço, 0 é ponto, com um 1 inicial como bit de marcador (mais um deslocamento para mantê-lo imprimível. Usa matemática ASCII para usar os caracteres de entrada como índices de pesquisa.
fonte
VB.NET, 233 bytes
Essa última função é má.
editar Algumas melhorias.
fonte
Lisp (
532466 caracteres)Isso codifica letras minúsculas e as seqüências de código morse são impressas com um espaço à direita
fonte
Em Java, 475 caracteres.
Traduz az, AZ e 0-9.
Editar:
Ou em 447 caracteres, se você não se importa que o Java gere um erro após a tradução.
fonte
Perl6 (238)
Versão legível
fonte
sed, 159 bytes
Começamos fazendo o downcasing de toda a linha (porque
y
não é possível fazer conversões que não diferenciam maiúsculas de minúsculas); subtraia 10 bytes se quisermos lidar apenas com entradas em minúsculas. Então nós pré-processar os dígitos0
,2
,8
e9
para emitir seus símbolos finais.O loop gera o símbolo final para cada caractere de entrada e depois converte cada caractere para a próxima iteração. Isso é equivalente a subir na tabela de pesquisa dicotômica mostrada no artigo da Wikipedia; os dígitos que precisavam de tratamento especial podem ter pais que não estão em nossos alfanuméricos ASCII.
O loop termina quando todos os caracteres atingem o espaço final (após 'e' ou 't').
Por exemplo, a letra
k
é transformada em três passagens:k
=>k-
=>n-
n-
=>n.-
=>t.-
t.-
=>t-.-
=>-.-
fonte
Python 3, 99 caracteres
Funciona em maiúsculas e minúsculas.
fonte
C,
162160 caracteres(Com espaço em branco não significativo removido, nenhuma nova linha à direita)
M
é uma tabela de pesquisa em que os padrões de bits dos caracteres correspondem a pontos e traços no código morse. Os caracteres[0-9A-Z]
são decodificados para morse usando esta tabela (com um espaço acrescentado após o código morse), outros caracteres são simplesmente passados inalterados.Exemplo de execução:
fonte
Perl (489 caracteres)
Pode ser executado via linha de comando, assim.
Edit: Obrigado @tobyodavies por apontar que minha solução original tinha a tradução para trás!
fonte
%c=qw(A .- B -... C -.-. D -.. E . F ..-. G --. H .... I .. J .--- K -.- L .-.. M -- N -. O --- P .--. Q --.- R .-. S ... T - U ..- V ...- W .-- X -..- Y -.-- Z --.. 1 .---- 2 ..--- 3 ...-- 4 ..--- 5 ..... 6 -.... 7 --... 8 ---.. 9 ----. 0 -----);while(<>){print($c{$_}||$_)for split//}
PHP, 474 caracteres
Seus 462 caracteres se todas as entradas estiverem em maiúsculas:
fonte
<?$a=strtoupper(fgets(STDIN));$m=array(65=>12,2111,2121,211,1,1121,221,1111,11,1222,212,1211,22,21,222,1221,2212,121,111,2,112,1112,122,2112,2122,2211)+array(48=>22222,12222,11222,11122,11222,11111,21111,22111,22211,22221)+array(32=>' ');while($a[$i++])echo strtr($m[ord($a[$i])],12,'.-');
05AB1E , 81 bytes (Não concorrente)
Experimente online!
Converta padrões de letras em base-3, padrões de números em base-2, use transliteração ascii indexada a zero para obter períodos e hífens. Não funciona em minúsculas.
fonte
Geléia , 50 bytes
Um programa completo que aceita uma string formatada em Python como um argumento de linha de comando que imprime a saída delimitada por espaço.
Experimente online!
fonte
Powershell, 142 bytes
Script de teste com menos golfe:
Saída:
Nota: A saída contém espaços à direita.
fonte
+mazzy+
é algum estofamento atrevidoAPL (NARS), 71 caracteres, 142 bytes
teste:
cada letra é separada de um espaço, cada palavra seria separada de três espaços. A tabela é construída com sequência alfanumérica
⎕A,⎕D
e caracteres de 16 bits'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ䴫쩸穼蚠'
, divididos em caracteres de 8 bits, cada um convertido na base 3 com dígitos invertidos.fonte
05AB1E , 52 bytes
Experimente online!
fonte
JavaScript (ES6), 184 bytes
Para ambas as versões, eles colocarão espaços entre qualquer caractere. Converte 0-9 e az (sem distinção entre maiúsculas e minúsculas) são convertidos. Um espaço é convertido em 3.
Substitua
\n
por um caractere de nova linha (0x0a
). Não está mostrando alguns caracteres não imprimíveis por causa do SE. Entrar no modo de edição mostra isso.Aqui está o hexadecimal:
Ungolfed
Versão legível, 234 bytes
Ungolfed
fonte
Python 2,
283274 bytesCriei uma sequência alfanumérica de forma que sua colocação na sequência descreva sua representação em código Morse. Originalmente eu ia usar binário, mas
01
seria o mesmo que1
. Então eu usei ternário com- = 1
e. = 2
. Assim, se o caracterec
está no índice1121
dessa sequência, sua representação do código Morse é--.-
.Equipamento de teste
Atualizar
[OBSERVAÇÃO: sempre há espaço em branco à direita, mas espaço em branco representa uma pausa .
fonte
PHP,
157150157 bytesrecebe entrada do primeiro argumento da linha de comando. sem pausa entre as letras. Corra com
-nr
.demolir
Batendo JavaScript, Python2, C, Ruby e sed. Eu estou feliz.
4º passo: descompacte o mapeamento para manipular caracteres minúsculos sem usar
strtoupper
.Versões prévias:
falha em letras minúsculas; +12 bytes para corrigir: Substitua
$argv[1]
porstrtoupper($argv[1])
.tradução simples de strings, 254 bytes
para a frente: traduz toda a cadeia de uma vez, caractere para código morse.
Salvar para arquivo para executar ou substituir
<?=
comecho
e correr com-r
.interpretação decimal de códigos morse, 184 bytes (-70)
primeiro passo do golfe: códigos morse codificados para binários com um adicional adicional
1
para preservar os zeros iniciais. Passa pelos personagens e os traduz um por um. Corra com-nr
.decimais codificados em caracteres, 157 bytes (-27)
segundo golfe: adicionado 60 ao valor decimal e codificado ao caractere.
mapeamento mesclado, 150 bytes (-7)
terceiro golfe: mapeamento mesclado de dígitos e letras em uma única sequência.
fonte
SmileBASIC,
194190 bytesfonte