Un "número de Giza", también conocido coloquialmente como un número de Timmy, es cualquier número donde los dígitos representan una pirámide ( A134810 ). Por ejemplo, "12321" es un número de giza porque se puede visualizar así:
3
2 2
1 1
Sin embargo, algo como "123321" no es un número de Giza porque hay dos dígitos en la parte superior de la pirámide
33
2 2
1 1
En otras palabras, un número es un número de Giza si se cumplen todas las siguientes condiciones:
Tiene un número impar de dígitos, y el dígito central es el más grande.
Es palindrómico (la misma lectura hacia adelante o hacia atrás), y
La primera mitad de los dígitos aumenta estrictamente en uno. (Dado que debe ser palindrómico, esto significa que la segunda mitad de los dígitos debe estar disminuyendo estrictamente en uno)
Debe escribir un programa completo o una función que tome un entero positivo como entrada, y determinar si es un número de Giza o no. Puede tomar la entrada como una cadena o como un número. Si es un número de Giza, genera un valor verdadero . De lo contrario, un valor falso.
Hay un total de 45 números de Giza, por lo que cualquiera de estas entradas debería dar como resultado un valor verdadero:
1
2
3
4
5
6
7
8
9
121
232
343
454
565
676
787
898
12321
23432
34543
45654
56765
67876
78987
1234321
2345432
3456543
4567654
5678765
6789876
123454321
234565432
345676543
456787654
567898765
12345654321
23456765432
34567876543
45678987654
1234567654321
2345678765432
3456789876543
123456787654321
234567898765432
12345678987654321
Cualquier otra entrada debe dar un valor falso. Por supuesto, no tiene que manejar entradas no válidas, como números no positivos, no enteros o no números.
Como de costumbre, este es el código de golf , por lo que las lagunas estándar están prohibidas y la respuesta más corta en bytes gana.
fuente
Respuestas:
Python 2,
484746 bytesPruébalo en Ideone .
Cómo funciona
En Python, una comparación encadenada devuelve True si y solo si todas las comparaciones individuales hacen lo mismo. En este caso específico, nuestra lambda devuelve True si y solo si se cumplen todas las siguientes condiciones.
s[~len(s)/2:]in'987654321'
Para una cadena s de longitud 2n + 1 ,
~len(s)/2
devuelve ~ (2n + 1) / 2 = - (2n + 2) / 2 = - (n + 1) , por lo ques[~len(s)/2:]
produce los n + 1 caracteres más a la derecha de s .Del mismo modo, para una cadena s de longitud 2n ,
~len(s)/2
devuelve ~ (2n) / 2 = - (2n + 1) / 2 = - (n + 1) (la división entera siempre se redondea hacia -∞ , por lo ques[~len(s)/2:]
una vez más se obtiene el n + más a la derecha 1 caracteres de sLa comparación devuelve True si y solo si los n + 1 más a la derecha forman una subcadena de
987654321
.Tenga en cuenta que si lo hacen y s tiene 2n caracteres, s no puede ser un palíndromo; el n º y (n + 1) th personajes de la derecha será distinto, y el segundo es el n º personaje de la izquierda.
'987654321'>s
Esto compara las cadenas lexicográficamente. Como 9 es el único número de Giza que comienza con 9 , todos los números de Giza satisfacen esta comparación.
Tenga en cuenta que comparar estas cadenas no forma parte de nuestro problema de decisión;
>s
es simplemente tres caracteres más cortos queand s
.s==s[::-1]
Esto devuelve True si y solo si s es un palíndromo.
fuente
Perl,
39374239 + 1 = 40 bytesUsando un nuevo método, logré reducir una gran cantidad de bytes. Corre con la
-n
bandera. Acepta la entrada repetidamente en tiempo de ejecución, imprimiendo 0 o 1 en consecuencia.Tuve que agregar 5 bytes porque me di cuenta de que sin él, el código funcionaba para entradas como 1234567900987654321, que no es un número de Giza. Como los números de Giza nunca contienen el dígito 0 (y todos los falsos positivos necesariamente contendrían el dígito 0), estos 5 bytes explican eso.
Explicación:
El propósito de la expresión regular de sustitución es construir una cadena de 1s cuya longitud es la mitad de la longitud de la entrada, redondeada hacia arriba. Por lo tanto, una entrada de
12321
producirá la cadena111
, que luego se eleva al cuadrado (explicación a continuación). Las entradas de longitud uniforme producirán cadenas que son demasiado pequeñas para garantizar que la expresión regular final sea exitosa.La razón por la que funciona este código se debe a lo siguiente:
Podemos ver claramente que el número de 1 en RHS es igual a 1/2 más de la mitad del tamaño de LHS. (1 más si truncamos). Adicionalmente:
567898765 - 123454321 = 444444444, que es solo 4 repeticiones. Entonces, cuando restamos nuestro cuadrado de nuestro número, si obtenemos un repdigit, nuestro número original es un número de Giza.
Código antiguo y método antiguo (58 + 1 = 59 bytes)
Guardado 1 byte gracias a @Dada
Ejecutar con la
-n
bandera, el texto de la tubería al usarecho
Calcula el número único de giza determinado por la longitud y el entero principal, y ve si coincide con la entrada.
Ejecutar como
echo -n "123454321" | perl -M5.010 -n giza.pl
devoluciones1
si es un número de Giza, de lo contrario es nulo.fuente
Gelatina ,
1076 bytesGenera los 45 números de números de Giza, luego prueba la membresía.
Pruébalo en línea! o ver los números generados .
Cómo funciona
fuente
JavaScript (ES6),
46454241 bytesToma la entrada como una cadena y devuelve una cadena de un solo dígito para verdadero,
0
para falso.La idea básica es verificar algunas cosas:
fuente
Java 7,
128119105bytes¡No más cuerdas! Entonces, ahora empiezo generando un
111...
número de la misma longitud que input (a
), y uno más corto a square (b
). Luego puede restarb*b
de la entrada y verificar la divisibilidad pora
.c
solo está ahí para verificar impar / par, no le prestes atenciónEspacio en blanco:
Método antiguo, 119 bytes
Recorre la matriz y comprueba una diferencia de 1 (o -1, según la mitad) entre cada dígito. Luego solo verifica que la longitud sea extraña.
Espacio en blanco:
fuente
char[]
cuenta como una cadena aquí, por lo que diría que es válida.05AB1E ,
98 bytesLa verdad es 1 , la falsedad es 0 .
Utiliza la codificación CP-1252 . Pruébalo en línea!
fuente
2ä¬û¹Q
también funcionaría y ahorra dos bytes.Python 2,
77, 76, 64, 63 bytesUna solución recursiva simple. Comprueba si el primer y el último dígito son iguales y el segundo dígito menos uno. Luego comprueba si el centro también es un número de Giza. Devuelve verdadero una vez que se reduce a un solo dígito.
¡Un byte guardado gracias a @Rod, una tonelada de bytes guardados gracias a DLosc y ETHProductions!
fuente
len(s)==1
con1==len(s)
al ahorro 1 byte en el espacio, también, losand
s se podrían sustituir por*
salvar 3 bytes1or
también funciona. (Mientras no sea un0
precedente, entonceso
Python cree que es un número octal)and
con*
cuando se requiere un comportamiento de cortocircuito, ya que está en una función recursiva. El primeroand
debe ser reemplazable, pero necesita dos conjuntos de paréntesis, lo que niega cualquier ahorro. (cc: @Rod)int()
alrededors[0]
o 2) usars[0]==`int(s[1])-1`
?s[-1]==s[0]==`int(s[1])-1`
(requiere Python 2 específicamente).PowerShell v3 +,
14710867 bytesEnfoque radicalmente cambiado. Genera todos los números posibles de Giza y luego verifica si la entrada
$args[0]
es-in
esa colección. A continuación se muestra cómo se forma la colección de números de Giza:Ejecuciones de ejemplo:
fuente
Python 3, 65 bytes
No estoy completamente seguro, pero creo que esto funciona.
fuente
0
, puede eliminar eso :) Tampoco habrá números más largos que 17 que satisfagan esa condición, por lo que tampoco necesita eso. Es esencialmente la misma solución que Dennis tiene :)Python 2,
687366 bytesabusando del hecho de que
11^2=121
,111^2=12321
y así sucesivamente, calculo esto y agrego1111..
suficientes veces como compensación.Ejemplos:
23432=111^2+11111*1
676=11^2+111*5
fuente
f
, no necesita nombrarlo realmente. Puede guardar dos bytes eliminandof=
1234567900987654321
devuelve verdadero, cuando debería ser falso.Perl, 41 bytes
40 bytes de código +
-p
banderas.Salidas 1 si la entrada es un número de Giza, nada de lo contrario. Proporcione la entrada sin nueva línea final para ejecutarla:
Explicaciones : primero,
s/(.)(?=(.))/$1-$2/ge
reemplace cada dígito$1
(seguido de$2
) por$1-$2
. Si es un número de Giza, entonces cada dígito es uno menos que el siguiente al principio y uno más al final, entonces la cadena debe contener solo-1
en la primera parte y1
en la segunda (excepto la última que no se modifica) . Eso es lo que/^(-1(?1)1|).$/
verifica la segunda parte : busca un-1
seguido de recursión seguido de a1
.-1 byte gracias a Martin Ender.
Mi versión anterior 15 bytes más (bastante diferente, así que lo dejaré aquí):
fuente
|
la segunda expresión regular.> <> PESCADO
57524948 bytesEditar 1: = devuelve 0 o 1 si es verdadero, por lo que eliminó una verificación y usó este valor para incrementar, luego verifica la igualdad después de todos modos. (guardado 6 bytes, perdido 1 para la nueva línea).
Editar 2: 3 marcadores direccionales eliminados y 11 colocados en el espacio para compensar la pila a una longitud uniforme para forzar falso (3 bytes guardados).
Edición 3: Duplique la longitud de la pila para verificar MOD por 2 y len (1), esto se hizo poniendo la longitud dos veces antes, pero ahora llena un espacio vacío en la línea 2 (1 byte guardado).
fuente
C #,
1208610810292 bytesPrograma completo con algunos casos de prueba:
¡Hurra por los condicionales de una sola línea, ahora superando la respuesta de Java :)! También pude escribir mis primeros comentarios explicativos, aunque probablemente se explica por sí mismo. Gracias a @Dada por encontrar un problema con mi algoritmo (fue cierto para los números que se reflejaron como 13631). Ahora sub 100 ya que aparentemente la comprobación de la longitud% 2 es redundante.
fuente
true
para números como13631
? Además, dado que realiza una llamada recursivax
, creo que debe incluirx=
en su recuento de bytes.Bash, 111 bytes
ACTUALIZAR
Tenga en cuenta que la normalización del número de entrada probablemente se puede omitir por completo, si solo agrega el primer dígito a su número GIZA generado , así:
y luego simplemente compárelo con la entrada directamente.
Descargo de responsabilidad: este no está realmente optimizado, por lo que es más una prueba de concepto que un verdadero contendiente
Golfed
Algoritmo
Cualquier número de GIZA se puede normalizar a su forma canónica, restando su primer dígito del resto:
y solo hay un número canónico GIZA de una longitud particular.
Sabiendo esto, podemos generar fácilmente un número canónico de GIZA basado en la longitud del número de entrada:
luego normalice el número de entrada:
y comparar
Prueba
fuente
En realidad , 22 bytes
Pruébalo en línea!
Toma la entrada como una cadena entre comillas (por ejemplo
"12321"
). La salida es un entero positivo para verdadero y0
para falso.Explicación:
fuente
Haskell, 62 bytes
La entrada se toma como una cadena.
Crea una lista de todos los números de Giza y comprueba si el número está en él. La lista se crea un bucle
i
a través'1'..'9'
y luegoj
a través'1'..i
y la creación de los elementosj .. i-1 , i , i-1 .. j
.fuente
> <> , 62 bytes
Pruébalo en línea!
Salidas 1 para un número de Giza; 0 de lo contrario. Funciona empujando la entrada a una cola (ok, técnicamente una pila reversible) y probando repetidamente ambos extremos para la igualdad, así como asegurándose de que sean exactamente uno más grande que el valor anterior.
fuente
CJam ,
2019 bytesBanco de pruebas.
Explicación
La idea básica es encontrar el dígito mínimo y máximo, luego crear un número de Giza a partir de ellos y luego verificar que sea equivalente a la entrada.
En lugar del carácter mínimo, también podemos usar el primer carácter, para el mismo número de bytes:
fuente
Mathematica,
626160 bytesSe guardaron 2 bytes debido a @MartinEnder .
Composición de funciones. Toma un número como entrada y devuelve
True
oFalse
como salida.fuente
Retina,
555436 bytesEl recuento de bytes asume la codificación ISO 8859-1.
Pruébalo en línea
Convierta cada dígito a unario, separado por dos puntos. Bucle, eliminando los dígitos externos coincidentes si el siguiente dígito es uno más. Une un solo dígito restante.
fuente
12312
PHP, 71 bytes
recupera el dígito más grande de la entrada y cuenta hacia atrás, agregando el nuevo dígito a una cadena de comparación hasta que la entrada y la cadena de comparación sean iguales, o lo
$i
sean0
.imprime el dígito más bajo para un número de Timmy, de lo
0
contrario.fuente
Pushy ,
3015 bytesMe desperté esta mañana y me di cuenta de que podía responder la mitad de mi respuesta ...
(no compite como el desafío de las fechas posteriores al idioma)
De entrada se da en la línea de comandos:
$ pushy gizas.pshy 3456543
. Salidas1
para la verdad y0
para la falsedad. Aquí está el desglose:El algoritmo se inspiró en la respuesta bash: primero, normalice el número, (
45654 -> 01210
), luego genere el número de giza normalizado de la misma longitud (solo hay uno) y compare.Antigua solución
fuente
Raqueta 292 bytes
Sin golf:
Pruebas:
Salida:
fuente
Java 8, 162 + 19 bytes
19 para
import java.util.*;
Enfoque diferente a la otra respuesta de Java, quería probar y usar el método de crear todos los números de Timmy posibles y verificar si nuestra cadena estaba contenida en ellos.
fuente
Octava, 56 bytes
Echa un vistazo a todos los casos de prueba aquí .
Esto sería dos bytes menos en MATLAB, ya que
diff(n)
funciona para cadenas. En Octave, lo necesitasdiff(+n)
.Explicación:
fuente
Mathematica, 56 bytes
Esto es un poco más corto:
fuente
Java 7,
129119109bytesViejo método recursivo, 119
-10 bytes gracias a Geobits. Nos
estamosataron ...Pruébalo en línea!
fuente
and
, creo que lo usó una vez pero no la otra vez? O lo estoy leyendo mal.java.util.Arrays.copyOfRange(...)
para omitir la línea de importación.Perl 6 ,
4334 bytesGracias a Jo King por -9 bytes.
Puerto de la solución Perl de Gabriel Benamy .
Pruébalo en línea!
fuente
Cjam, 35 bytes
Probablemente muy subóptima ... ¡Estoy un poco fuera de práctica!
Pruébalo en línea!
fuente
Python 2,
50828180 bytesEnfoque simple Simplemente divide la cadena por la mitad (omitiendo el carácter del medio o uno después del carácter del medio si es de longitud uniforme), invierte la segunda mitad y luego compara los dos y compara la primera mitad con una cadena del 1 al 9.
Editar
Publicado de nuevo después de comentarios constructivos de otros jugadores de golf y al darme cuenta y corregir mis errores.
-1 por perder un (desperdicio de) espacio
-1 para leer la pregunta nuevamente y darse cuenta de que no necesitamos tener 0 en cuenta. Realmente debe dejar de jugar al golf después de un largo día de trabajo.
fuente
13531
y6543456
ambos devuelven incorrectamente True.'0'
y'1'
ambas son verdaderas.