Ya hemos definido un número plegable aquí .
Pero ahora vamos a definir un Número Super Plegable. Un número Super Plegable es un número que, si se pliega suficientes veces, eventualmente alcanzará uno menos que una potencia de dos. El método de plegado es ligeramente diferente al de la pregunta de número de plegado.
El algoritmo de plegado es el siguiente:
Toma la representación binaria
por ejemplo 5882
1011011111010
Se derramó en tres particiones. Primera mitad, última mitad y medio dígito (si tiene un número impar de dígitos)
101101 1 111010
Si el dígito del medio es cero, este número no se puede plegar
Invierta la segunda mitad y superpuesta en la primera mitad
010111 101101
Agrega los dígitos en su lugar
111212
- Si hay 2 en el resultado, el número no se puede plegar; de lo contrario, el nuevo número es el resultado del algoritmo de plegado.
Un número es un número Super Plegable si se puede plegar en una cadena continua de unos. (Todos los números plegables también son números súper plegables)
Su tarea es escribir código que tome un número y genere un valor verdadero si el número es un número Super Plegable y falso de lo contrario. Se le puntuará según el tamaño de su programa.
Ejemplos
5200
Convierte a binario:
1010001010000
Partir a la mitad:
101000 1 010000
El medio es uno, así que continuamos Superponiendo las mitades:
000010
101000
Los agregó:
101010
No hay dos, así que continuamos Split por la mitad:
101 010
Doblez:
010
101
111
El resultado es 111
(7 en decimal), por lo que este es un Número Super Plegable.
Casos de prueba
Los primeros 100 números super plegables son:
[1, 2, 3, 6, 7, 8, 10, 12, 15, 20, 22, 28, 31, 34, 38, 42, 48, 52, 56, 63, 74, 78, 90, 104, 108, 120, 127, 128, 130, 132, 142, 150, 160, 170, 178, 192, 204, 212, 232, 240, 255, 272, 274, 276, 286, 310, 336, 346, 370, 400, 412, 436, 472, 496, 511, 516, 518, 524, 542, 558, 580, 598, 614, 640, 642, 648, 666, 682, 704, 722, 738, 772, 796, 812, 852, 868, 896, 920, 936, 976, 992, 1023, 1060, 1062, 1068, 1086, 1134, 1188, 1206, 1254, 1312, 1314, 1320, 1338, 1386, 1440, 1458, 1506, 1572, 1596]
3
colarse en los casos de prueba? No puedo ver cómo se puede plegar, ya que se divide1 1
, dando inmediatamente un2
. ¿O estás diciendo que doblarlo cero veces también cuenta?Respuestas:
Aquí está mi primer tiro en el golf de código:
Python 3, 167 bytes
167 bytes si se usan tabulaciones o espacios individuales para la sangría
Editar: ¡Gracias a la ayuda de todos a continuación, el código anterior se ha reducido de un tamaño original de 232 bytes!
fuente
:
s, y regresando0
y en1
lugar deTrue
yFalse
.Java 7, 202 bytes
Hizo falta un poco de esfuerzo para hacer que la antigua función de plegado sea recurrente, pero aquí está. Es feo como el pecado, para ser honesto. Tendré que echar un vistazo por la mañana para ver si puedo seguir jugando al golf, ya que apenas puedo soportar mirarlo en este momento.
Con saltos de línea:
fuente
CJam ,
4744 bytesPruébalo en línea! o generar una lista de números súper plegables hasta un número dado.
Los intentos de golf se pueden ver aquí .
El código se desglosa en las siguientes fases:
EDITAR: Esta versión toma más o menos un enfoque de la Ley de De Morgan a la versión anterior.
* El problema con la ejecución en singletons es que nos quedamos atrapados con una cadena vacía después del corte.
** Si un número binario es super plegable, su imagen espejo (con ceros a la izquierda si es necesario) es. Esto ahorra un byte sobre tomar la mitad derecha.
fuente
JavaScript, 149 bytes
Define una función recursiva.
Explicación:
fuente
m=l>>1
,/2/.test(n)
,n.slice(l-m)
(O cortar la cadena inversa). Creo que si cambia los casos de falla y éxito, entonces puede usar/0/.test(n)?f(...):1
.JavaScript (ES6),
113109108 bytesFormateado y comentado
Manifestación
fuente
Perl,
7170 bytesIncluye +1 para
-p
Dar número en STDIN
superfolding.pl
:fuente
Python 2, 151 bytes
ideona
Una función doblemente recursiva que toma un número entero
n
, y devuelve0
o1
.Se
r
mantiene una variable para permitir tanto el resultado del plegamiento como para saber si actualmente: tenemos un número entero (solo el primero); tener una nueva cadena binaria para intentar doblar (exterior); o son plegables (interior).En el primer paso
n
es un número entero, que está<''
en Python 2, por lo que la recursión comienza convirtiéndose en una cadena binaria.La próxima ejecución tiene
r=''
y, por lo tanto, la prueba{'1'}==set(n)
se ejecuta para verificar una cadena continua de1
s (el RHS no puede ser,{n}
ya que es posible que necesitemos pasar este punto más adelante conr=''
un vacíon
cuando sería un diccionario que no sería igual{'1'}
, un conjunto).Si esto no se cumple, se prueba el criterio de la cola interna (incluso si no es necesario): si
n in'1'
se evaluará como Verdadero cuando sen
trata de una cadena vacía o una sola1
, con lo cual se inicia una nueva recursión externa colocandor
, por la cadena binaria doblada, enn
y''
dentror
. El literal2
se agrega al resultado de esta llamada de función para no permitir la caída a la siguiente parte (a la derecha de una lógicaor
) que se corrige más adelante.Si ese no es un valor verdadero (todos los enteros distintos de cero son verdaderos en Python), se prueba el criterio de recursión de la cola externa:
n!=0
excluye el caso con un medio0
y se prueban los dos caracteres externos que no suman2
por la concatenación de cadenas'11'!=n[0]+n[-1]
; si estos dos son verdaderos, los bits externos se descartan den
conn[1:-1]
, y luego1
se agrega ar
si hay uno en el exterior; de lo contrario, a0
es, usando el hecho de que'1'>'0'
en Python conmax(n[0],n[-1])
.Finalmente, la adición de
2
en cada recursión interna se corrige con%2
.fuente
PHP, 113 bytes
sale con error (código
1
) si el argumento no es superpliegue, codifique lo0
contrario. Corre con-r
.La entrada
0
devolverá verdadero (código0
).Descompostura
fuente
PHP, 197 bytes
Expandido
Valores verdaderos <10000
fuente