Esta é uma pergunta de acompanhamento para minha pergunta Puzzling.SE : Perguntei se há uma função f mapeando seqüências de caracteres booleanas para seqüências de caracteres booleanas, de modo que f (f (b)) = reverse (b) para todas as seqüências de entrada b . (Por reverso , quero dizer a função que reverte a ordem dos bits.)
O link acima contém uma resposta positiva, com prova, do ótimo f '' , mas você pode ponderar a questão antes de procurar.
Implemente essa função f no menor número de bytes possível.
Você pode ler a entrada de STDIN ou usar um argumento de função; e escreva a sequência de resultados em STDOUT ou retorne-a.
De qualquer maneira, você pode trabalhar com cordas reais de dois bytes distintas ou personagens de sua escolha (dizer
0
e1
, ou\x00
e\x01
), ou com matrizes / listas de truthy e valores Falsas . Escolha dois valores e fique com eles, no entanto.O resultado de uma única aplicação de f deve ser uma string binária: nenhuma resposta boba como
b -> if b starts with 'x' then reverse(b[1:]) else 'x' + b
...Sua função deve ser total ; em particular, a entrada pode ser a sequência vazia, ou um pouco longa, etc. Não há limite superior para o comprimento da sequência.
Também deve ser puro : não mantenha nenhum estado global entre chamadas de função; a sequência de entrada deve determinar completamente a sequência de saída.
Respostas:
CJam, 32 bytes
Experimente online.
Demasiado longo...
fonte
Python 2, 64
69bytesUngolfed:
Ele encontra o período da string, ou seja, o mínimo
p
tal ques
é uma string de comprimentop
repetidon
vezes (eu encontrei um método de golfe no SO). Então, sen
for ímpar, adiciona mais uma repetição do período. Sen
for par, remove uma repetição do período e a reverte.Agradecemos ao @ Sp3000 por ajudar a implementar o mapeamento de funções entre 1 <-> 2, 3 <-> 4, etc.fonte
Perl,
4947 bytesInclui +2 para
-lp
Baseado no algoritmo muito bom do @ feersum
Execute com entrada no STDIN, por exemplo
halfreverse.pl
:Explicação
fonte