Meu amigo e eu temos esse jogo que brincamos com palavras. É um passatempo divertido e envolve "cancelar" letras em uma palavra até que não haja mais nada. Estou realmente cansado de ele ser muito mais rápido do que eu, então é seu trabalho implementá-lo e me deixar finalmente vencê-lo. Obviamente, como eu tenho que tornar o programa o mais fácil possível de ocultar, ele deve ser o menor possível.
Como esse jogo funciona?
O jogo é um algoritmo bastante simples. Reduz uma sequência alfabética até que não possa mais ser reduzida, tornando-a uma espécie de hash. O jogo real que nós humanos fazemos é muito difícil de implementar, mas pode ser simplificado no seguinte algoritmo:
Você começa dobrando o alfabeto ao meio e alinhando as duas peças da seguinte maneira:
a b c d e f g h i j k l m
z y x w v u t s r p q o n
Então, começando do meio, você atribui os números inteiros positivos à metade superior e o negativo à parte inferior:
a b c d e f g h i j k l m
13 12 11 10 9 8 7 6 5 4 3 2 1
z y x w v u t s r p q o n
-13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
Então você pega sua string (nós estaremos usando hello world
) e ignorando quaisquer caracteres não alfabéticos, traduza-a:
h e l l o w o r l d
6 9 2 2 -2 -10 -2 -5 2 10
Então você soma os valores das letras. Os que alinharam no diagrama anterior (por exemplo, d
e w
, l
e o
) irá cancelar para fora, enquanto os outros vão somar.
sum(6 9 2 2 -2 -10 -2 -5 2 10 )=12
12 é o número para b
, então o hash de hello world
éb
Para uma palavra que anula completamente fora (por exemplo love
), você saída "0 caráter": -
. Observe que, na entrada, -
ainda será desconsiderado. Só importa na saída.
Se a magnitude do número é maior do que 13, então você começa a dobrar-se sobre os a
's eo z
' s Você basicamente ter como muitos a
's ou z
de ajuste para o número e tomar tudo o que está à esquerda para a última carta assim:
code golf: 43.
Cabe 3 a
e tem 4 sobras:
aaa 4: j
result: aaaj
Dica: Esta parte é, basicamente, divmod
excepto que arredonda para zero, não -infinity
(por exemplo, -43 iria tornar-se 3 z
's e um e -4
que é p
por isso zzzp
).
Nota: o traço não vem se os a
's z
' se encaixam perfeitamente, apenas se for exatamente 0
.
Esclarecimentos:
- O hash é caso em sensível
- As brechas padrão não são permitidas
- A E / S pode estar em qualquer formato que não seja muito estranho, stdin, stdout, arg da linha de comando, função etc.
- Esse é o código-golfe, para que o menor tamanho em bytes seja alcançado.
Exemplos:
hello world --> b
love --> -
this is an example --> aak
hello *&*(&(*&%& world --> b
good bye --> ae
root users --> zzs
love
está vazia ...Respostas:
CJam, 46 bytes
Experimente online ou tente a suíte de testes online .
Explicação
O algoritmo funciona como o esperado: leia a entrada, converta para minúscula, mapeie cada caractere para um valor, some os valores e imprima caracteres e ajuste a soma de acordo até que a soma seja zero. Provavelmente, a otimização mais interessante (embora salve apenas dois bytes) é que, em vez disso, são utilizados mapeamentos de caracteres negados, pois isso evita a troca de argumentos de subtração para corrigir o sinal ao calcular o valor mapeado e evita a troca novamente ao mapear de volta para uma letra devido ao subtração de um valor negado sendo substituível por adição.
fonte
Pyth,
797877656158fonte
@Jz
vez def}YJz
Provavelmente há mais, mas preciso dormir agora. Boa sorte;)@
!Clipe 10 , 87
fonte
R, 258 bytes
Esse deve ser o código R mais bruto de todos os tempos. Imaginei que R poderia ser uma escolha decente, pois possui um vetor de todas as letras "a" a "z" como uma variável global interna. Mas o resto é uma bagunça.
Ungolfed + explicação:
Isso cria um objeto de função sem nome que aceita uma string como entrada e retorna o valor de hash associado. Para chamá-lo, dê um nome, por exemplo
f=function(s){...}
.Exemplos:
Experimente online!
Questões? Felizmente, darei qualquer outra explicação. Sugestões? Sugestões são mais que bem-vindas!
fonte
Haskell, 171 bytes
Execução de teste:
Como funciona:
l
é uma tabela de pesquisa de letras para o valor correspondente. Pesquise todos os caracteres da sequência de entrada e descarte aqueles não encontrados. Soma a lista resultante. Dependendo da somap
impressa,-
ou talvez primeiro, sea
ou se,z
finalmente, (inversa) procurar a letral
.fonte
R - 200
fonte