Sea f
la función que asigna un bitfield ( {0 1}
) de tamaño n+1
a bitfield de tamaño n
al aplicar XOR
el i
th y i+1
th bit y escribir el resultado en el nuevo bitfield.
Ejemplo: f("0101") = "111"
Cálculo informal:
0 XOR 1 = 1
1 XOR 0 = 1
0 XOR 1 = 1
Dejado f_inverse
ser la función inversa de f
. Como el inverso no es único, f_inverse
devuelve una solución válida.
Entrada: campo de bits como cadena (es decir "0101111101011"
) y un número natural dadok
Salida: campo de bits como cadena, de modo que la cadena contenga el resultado si f_inverse
se aplica k
veces al campo de bits de entrada. (es decir f_inverse(f_inverse(f_inverse(input)))
)
Criterios ganadores: menos personajes
Prima:
-25
Caracteres si f_inverse
no se aplica de forma recursiva / iterativa, en su lugar, la cadena de salida se calcula directamente
Testscript:
a = "011001"
k = 3
def f(a):
k = len(a)
r = ""
for i in xrange(k-1):
r += str(int(a[i]) ^ int(a[i+1]))
return r
def iterate_f(a, k):
print "Input ", a
for i in xrange(k):
a = f(a)
print "Step " + str(i+1), a
iterate_f(a, k)
Puede pegarlo, por ejemplo, aquí y luego probarlo.
{0-1}
-Bitfields? Además, no entiendo la definición def
, ¿de dóndei
viene? ¿Cuál es el segundo argumento de XOR? ¿Cómo podemos llegar111
a0101
?i
?"0 XOR 1" = 1 "1 XOR 0" = 1 "0 XOR 1" = 1
no explica nada: sé cómo funciona XOR, pero ¿qué es exactamente XORing y dónde almacenamos el resultado?f([a,b,c,d]) = [a^b, b^c, c^d]
. Y quiere que el inverso de la función, es decir,f'([x,y,z]) = [a,b,c,d]
de tal manera quea^b=x
,b^c=y
,c^d=z
.Respuestas:
Pyth
3330-25 = 5 bytesEjecútelo por entrada de stdin like (intérprete en línea: https://pyth.herokuapp.com/ ):
y el resultado se escribirá en stdout.
Esta es una traducción directa de:
Python 2,
12711879-25 = 54 bytesLlámalo como
i("111", 3)
, y el resultado se escribirá en stdout.Tenga en cuenta que esperamos que k no sea demasiado grande, ya que para el código de golf, el bucle interno se ejecutará O (2 k ) veces.
Creo que generalmente llamamos a esta operación "xorshift" o algo así. Si expresamos la entrada como enteros big-endian, entonces la función f es simplemente:
Si aplicamos f dos veces obtendremos:
Sin embargo, aplicar 3 veces tendrá un patrón diferente:
Aplicando 4 veces vuelve a la forma básica:
Y así:
Tenga en cuenta que si elegimos un 2 k lo suficientemente grande , entonces (x ≫ 2 k ) = 0, lo que significa f 2 k (x) = x, ¡y la inversa es trivialmente la función de identidad!
Por lo que la estrategia para encontrar f k (x) sin llamar a f -1 (x) en absoluto es:
Encuentra K tal que:
Exprese f -k (x) = f -K + (Kk) (x) = f -K (f K-k (x)) = f K-k (x)
Por lo tanto, el resultado se
f
llama Kk veces25 caracteres de beneficio: p
Actualización 1 : Se utilizó la representación octal en lugar de la binaria para poder usar el
%
formato para guardar muchos bytes.Actualización 2 : Explotar la estructura periódica de
f
. Retiró la versión iterativa ya que la no iterativa es más corta incluso sin la bonificación de -25 bytes.Actualización 3 : reducción de 3 bytes de Pyth, ¡gracias isaacg!
fuente
Jiz8K+lzQ%"%0*o",KuxG/G8rQ^2KJ
CJam,
1514 bytesToma entrada como
Pruébalo aquí.
Explicación
El resultado se imprime automáticamente al final del programa.
Digo "cadena / matriz", porque empiezo con una cadena (que es solo una matriz de caracteres), pero sigo tomando XOR entre ellos y también entre números.
Character Character ^
da un número entero (basado en el XOR de los puntos de código)Character Integer ^
yInteger Character ^
da un carácter (basado en el XOR del número con el punto de código, interpretado como un punto de código). Y,Integer Integer ^
por supuesto, solo da un número entero.Entonces, los tipos están volando por todo el lugar, pero afortunadamente, cada vez que tengo un número entero es
0
o1
y cada vez que tengo un personaje que es ya sea'0
e'1
y el resultado es siempre el uno deseado (en cualquier tipo). Dado que las cadenas son solo matrices de caracteres, mezclar caracteres con números no es un problema en absoluto. Y al final, cuando todo se imprime, los caracteres no obtienen delimitadores especiales, por lo que la salida no se ve afectada por qué bit se representa como un número o un carácter.fuente
J, 17 caracteres
Siempre usando 0 como el primer dígito.
Comenzando desde el estado 128 1 de la fila superior (izquierda) y un estado aleatorio (derecha), que muestra los últimos 128 dígitos hasta la primera iteración 129.
fuente
APL 11
Explicación:
Probar en tryapl.org
fuente
≠\
no funcionaría en lugar de2|+\
?((0,≠\)⍣⎕)⎕
, obtengo un token no válido. ¿Tryapl no puede manejar entradas?CJam, 25-25 = 0 bytes
Este es solo un puerto directo de CJam de la respuesta de GolfScript a continuación, ya que, después de leer la respuesta de Martin Büttner , me di cuenta de que podía guardar un byte debido al manejo de CJam de tipos enteros y de caracteres. (Básicamente, CJam no necesita el
1&
usado para forzar caracteres ASCII en bits en el código GolfScript, pero requiere un antecedenteq
para leer la entrada). Normalmente consideraría que un puerto tan trivial es un truco barato, pero lograr un puntaje cero hizo OMI vale la pena.En cualquier caso, este programa funciona exactamente como el programa GolfScript original a continuación, por lo tanto, consulte su descripción y las instrucciones de uso. Como de costumbre, puede probar la versión de CJam utilizando este intérprete en línea .
GolfScript, 26-25 = 1 byte
Esta solución itera sobre la cadena de entrada solo una vez, por lo que creo que califica para la bonificación de −25 bytes. Funciona manteniendo internamente una matriz de elementos k que almacena el bit actual de cada una de las k iteraciones previas.
La entrada debe darse a través de stdin, en el formato
"1111111" 3
, es decir, como una cadena entre comillas0
y1
caracteres, seguida del número k . La salida será stdout, como una cadena de bits sin comillas.Prueba este código en línea. (Si el programa se agota, intente volver a ejecutarlo; el servidor Web GolfScript es conocido por los tiempos de espera aleatorios).
Aquí hay una versión ampliada de este programa, con comentarios:
Básicamente, como la mayoría de las soluciones iterativas, se puede entender que este código aplica la recurrencia
b i , j : = b i , ( j −1) ⊕ b ( i −1), ( j −1) ,
donde b 0, j es el j -ésimo bit de entrada (para j ≥ 1), b k , j es el j -ésimo bit de salida, y b i , 0 = 0 por supuesto. La diferencia es que, mientras que las soluciones iterativas, en efecto, calculan la recurrencia "fila por fila" (es decir, primero b 1, j para todo j , luego b 2, j , etc.), esta solución en cambio la calcula "columna por columna "(o, más exactamente," diagonal por diagonal "), primero computando b i , i para 1 ≤ i≤ k , luego b i , i +1 , luego b i , i +2 , etc.
Una ventaja (teórica) de este enfoque es que, en principio, este método puede procesar una cadena de entrada arbitrariamente larga utilizando solo almacenamiento O ( k ). Por supuesto, el intérprete de GolfScript lee automáticamente todas las entradas en la memoria antes de ejecutar el programa de todos modos, sobre todo negando esta ventaja.
fuente
Python,
9478Se ejecutará al menos una vez y, por lo tanto, da el mismo resultado para
n=0
yn=1
Versión anterior que convierte la cadena en una matriz numérica y "integra" el módulo 2
fuente
Pitón 2, 68
Una solución totalmente recusiva. Es más fácil de entender si se divide en dos funciones.
donde
f
calcula diferencias sucesivas yg
componef
consigo mismo n veces.La función
f
calcula las sumas XOR acumulativas del
, que es la operación inversa a las sucesivas diferencias XOR. Dado que la entrada se da como una cadena, necesitamos extraerint(l[0])
, pero hacerlo más corto con la comparación de cadenasl>='1'
.Pitón 2, 69
Una solución iterativa usando un
exec
bucle resultó 1 char más tiempo.Tal vez hay una forma más corta de lidiar con la cuerda. Si pudiéramos tener entradas / salidas como listas de números, ahorraríamos 5 caracteres
fuente
Perl 5, 34
Parámetros dados en la entrada estándar separados por un espacio.
fuente
Javascript ES6, 47 caracteres
Por cierto, no hay efectos secundarios :)
fuente
C # -
178161115 caracteresSin golfista con arnés
fuente
CJam, 20 bytes
La entrada es como
"111" 3
Pruébalo en línea aquí
fuente