Esta es una pregunta de seguimiento a mi pregunta de Puzzling.SE : pregunté si hay una función f que asigne cadenas booleanas a cadenas booleanas, de modo que f (f (b)) = reversa (b) para todas las cadenas de entrada b . (Por reversa , me refiero a la función que invierte el orden de los bits).
El enlace anterior contiene una respuesta positiva, con prueba, por la gran f '' , pero es posible que desee reflexionar sobre la pregunta antes de buscar.
Implemente dicha función f en la menor cantidad de bytes posible.
Puede leer la entrada de STDIN o tomar un argumento de función; y escribe la cadena de resultado en STDOUT o la devuelve.
De cualquier manera, puede trabajar con cadenas reales de dos bytes distintos o caracteres de su elección (digamos
0
y1
, o\x00
y\x01
), o con matrices / listas de valores de verdad y falsedad . Sin embargo, elija dos valores y quédese con ellos.El resultado de una sola aplicación de f debe ser una cadena binaria en sí misma: no hay respuestas tontas como
b -> if b starts with 'x' then reverse(b[1:]) else 'x' + b
...Tu función debe ser total ; en particular, la entrada puede ser la cadena vacía, o un bit de largo, etc. No hay límite superior para la longitud de la cadena.
También debe ser puro : no mantenga ningún estado global entre llamadas a funciones; la cadena de entrada debe determinar completamente la cadena de salida.
Respuestas:
CJam, 32 bytes
Pruébalo en línea.
Demasiado largo...
fuente
Python 2, 64
69bytesSin golf:
Esto encuentra el período de la cadena, es decir, el mínimo
p
tal ques
es una cadena de longitudp
repetidan
veces (encontré un método de golf en SO). Entonces, sin
es extraño, agrega una repetición más del período. Sin
es par, elimina una repetición del período y lo invierte.Gracias a @ Sp3000 por ayudarnos a implementar la asignación de funciones entre 1 <-> 2, 3 <-> 4, etc.fuente
Perl,
4947 bytesIncluye +2 para
-lp
Basado en el muy buen algoritmo de @feersum
Ejecutar con entrada en STDIN, p. Ej.
halfreverse.pl
:Explicación
fuente