Entrada : una o dos cadenas de '0' y '1'. Si hay 2, están separados por un espacio. Todas las cadenas tienen una longitud de al menos 1.
Salida : si se ingresó una cadena, se emiten 2. Si se ingresaron 2, se emite 1. Las cadenas de salida pueden ser lo que quieras, pero si ejecutar tu programa con la entrada A te da B, entonces ejecutarlo con B debe dar A (si ingresar 111 11
da 00000
, entonces la entrada 00000
debe dar 111 11
).
Eso significa que si canaliza su programa a sí mismo, debería recuperar lo que ingresó. Si su programa se llama foo, puede probarlo así:
>echo 101 101|foo|foo
101 101
Para evitar el uso de técnicas de fuerza bruta, su código debe poder ejecutarse con cadenas de 1000 dígitos en menos de 10 segundos. Mi solución de Python para esto toma menos de 1 segundo en cadenas de 10,000 dígitos, por lo que esto no debería ser un problema.
El código más corto gana.
fuente
if x not in d:
conif(x in d)-1:
y guardar un byte.Python, 326
Ejemplo de entradas / salidas:
fuente
Perl 5, 197 caracteres
Con algunos saltos de línea:
Este programa opera componiendo dos biyecciones:
Se puede asignar un par de números naturales a una cadena binaria convirtiendo uno en un número base-2 y el otro en ceros iniciales extraños.
n
es esta función yN
es su inverso (excepto que seN
usa$_
como parámetro).Se puede asignar un par de números naturales a un solo número natural utilizando la función de emparejamiento de Cantor . El primer
map
bloque es esta función y el segundo es su inverso.Por lo tanto, dos cadenas binarias se dividen en cuatro números, se combinan en dos números y luego se combinan en una cadena binaria, o viceversa.
Probado en 100 entradas aleatorias de cada tipo con cadenas de hasta 8 símbolos de largo. He estado buscando muchas maneras de hacer esto un poco más corto, pero voy a parar y publicarlo. Si hay espacio para optimizar aún más, probablemente esté en las expresiones aritméticas.
fuente
1111111111111111111111111111111111111111111111111111111111111111
(641
s) parece fallar, y la entrada del par0
y 501
s da el mismo resultado que0
y 511
s, los cuales generan 641
s. Creo que hay algún tipo de desbordamiento con el número de0
s iniciales , por lo que una solución podría ser obtener elN
valor de salida de un emparejamiento Cantor deN
valores de entrada y eln
valor de un emparejamiento den
valores (o viceversa para el inverso). Sin embargo, soy un novato perl, así que podría haber hecho algo mal.Perl, 56 caracteres
Se agregó +1 caracteres para el
-p
interruptor de línea de comandofuente
Python, 394
Estoy seguro de que esto se puede jugar más, pero este monolito utiliza la función de emparejamiento de Cantor y su inverso.
Explicación
Existe una asociación natural entre una cadena binaria y un par de números naturales: el primer número de la imagen es el número de ceros iniciales, y el segundo es el valor entero del número binario. Sabiendo que tenemos:
S ~ N^2
y con la biyección de Cantor
N ~ N^2
por lo tanto:
S ~ N^2 ~ N^4 ~ S^2
S ~ S^2
Donde S es un conjunto de todas las cadenas binarias. Esta solución implementa la biyección entre S y S ^ 2.
fuente