Dado un número entero positivo, genera un valor verdadero / falso en cuanto a si el número puede comerse solo.
Reglas
El extremo izquierdo es la cabeza, el extremo derecho es la cola.
Si la cabeza es mayor o igual que la cola, la cabeza se come la cola y la nueva cabeza se convierte en su suma.
Si , la cabeza se reemplaza por .
no se puede ignorar, sin embargo, el número de entrada nunca tendrá ceros a la izquierda.
Ejemplo:
number=2632
head-2, tail-2
2632 -> 463
head-4, tail-3
463 -> 76
head-7, tail-6
76 -> 3
If only one digit remains in the end, the number can eat itself.
Si en algún momento la cabeza no puede comer la cola, la respuesta será falsa.
number=6724
072
False (0<2)
Casos de prueba:
True:
[2632, 92258, 60282, 38410,3210, 2302, 2742, 8628, 6793, 1, 2, 10, 100, 55, 121]
False:
[6724, 47, 472, 60247, 33265, 79350, 83147, 93101, 57088, 69513, 62738, 54754, 23931, 7164, 5289, 3435, 3949, 8630, 5018, 6715, 340, 2194]
Este es el código de golf, por lo que gana el código más corto.
code-golf
decision-problem
Vedant Kandoi
fuente
fuente
Respuestas:
JavaScript (ES6),
52 5150 bytesGuardado 1 byte gracias a @tsh
Toma la entrada como una cadena. Devuelve un valor booleano.
Pruébalo en línea!
Comentado
fuente
f=n=>n>[n%10]?f(-(-n[0]-n)%10+n.slice(1,-1)):!n[1]
Jalea , 11 bytes
Pruébalo en línea!
Cómo funciona
fuente
Perl 6 ,
6362 bytesPruébalo en línea!
Explicación:
fuente
Java (JDK) , 83 bytes
Pruébalo en línea!
Créditos
fuente
/10
y%10
en un bucle. Tan bien hecho superando las respuestas de Python; +1 de mi parte :)r+=
ar=
y?1:0
hacia?1:r
.r=1
r&=h<n%10?0:r;return r;
Mathematica, 62 bytes
Primero llama
IntegerDigits
a la entrada para obtener una lista de sus dígitos, luego aplica repetidamente la siguiente regla:La regla se aplica hasta que el patrón ya no coincida, en cuyo caso solo queda un dígito (verdadero) o la cabeza es menor que la cola (falso).
En lugar de llamar
Length[__]==1
, podemos guardar algunos bytes con0(__)=={0}
, multiplicando todos los elementos en la lista0
y luego comparándolos con la lista{0}
.fuente
Python 3 , 50 bytes
Primera línea robada de la respuesta de Black Owl Kai .
Pruébalo en línea!
La salida es a través del código de salida. Falla (1) para entradas falsas y termina (0) para entradas verdaderas.
fuente
p%10<k>q
no arroja un NameError sip%10 >= k
?p%10<k>q
hace lo mismo quep%10<k and k>q
.Python 2 ,
1058281 bytesPruébalo en línea!
Muchas gracias por un masivo -23 de @ ØrjanJohansen
Gracias a @VedantKandoi (y @ ØrjanJohansen) por otro -1
fuente
for
con un corte inverso y también hacer lo%10
único cuando realice la prueba: ¡ Pruébelo en línea!if i[0]<i[-1]:x=0
y luegoelse:....
. @ ØrjanJohansen, en tu respuesta también.True
casos pero no para todosFalse
.Brachylog , 23 bytes
Pruébalo en línea!
Este es un ahorro de 1 byte sobre la solución de Fatalize . Esto utiliza un enfoque recursivo en lugar de un iterativo
Explicación
fuente
APL (Dyalog Unicode) , 33 bytes SBCS
Función de prefijo tácito anónimo que toma una cadena como argumento.
Pruébalo en línea!
⍎¨
evaluar cada caracter (esto nos da una lista de dígitos){
...}
aplique el siguiente "dfn" a eso;⍵
es el argumento (lista de dígitos):⌽⍵
invertir el argumento⊃
elige el primer elemento (esta es la cola)t←
asignar at
(para t ail)⍵<
para cada uno de los dígitos originales, vea si es menor que eso⊃
elige el primer verdadero / falso:
si es así:0
falso retorno⋄
luego:3::
si a partir de ahora, ocurre un error de índice (fuera de los límites):1
volver verdadero¯1↓⍵
soltar el último dígito⊢
producir eso (se separa1
y¯1
no formarán una sola matriz)t+@1
agregue la cola al primer dígito (la cabeza)10|
mod-10∇
recurseUna vez que lleguemos a un solo dígito,
¯1↓
haremos que sea una lista vacía y@1
provocará un error de índice ya que no hay un primer dígito, haciendo que la función regrese verdadero.fuente
Python 3 , 77 bytes
Pruébalo en línea!
Y mi vieja solución con un enfoque recursivo
Python 3 , 90 bytes
Pruébalo en línea!
Toma la entrada como una cadena.
fuente
Brachylog , 24 bytes
Pruébalo en línea!
Debería cambiar
ⁱ
el comportamiento predeterminado para que repita un número desconocido de veces (actualmente, itera 1 vez por defecto, lo que es completamente inútil). Entonces no necesitaría el[…];I[…]⁾
, ahorrando 3 bytesExplicación
Este programa contiene un tenedor feo dentro de un tenedor. También se necesita un poco de fontanería para trabajar en listas de dígitos en lugar de números (porque si eliminamos la cabeza y la cola
76
nos queda0
, lo que no funciona al contrario de[7,6]
donde terminamos[]
).fuente
,
en su lugar, podría eliminar 1 byte ¡ Pruébelo en línea!Haskell,
706460 bytesLa entrada se toma como una cadena.
Pruébalo en línea!
Editar: -6 bytes usando el truco de @ Laikoni de usar en
||
lugar de guardias separados. Otros -4 bytes gracias a @Laikoni.fuente
read[l b]
puede ser soloread b
porque solo miras el último dígito de todos modos. Ahorra 4 bytes más también en línealast
: ¡ Pruébelo en línea!Perl 5 , 64 bytes
Pruébalo en línea!
fuente
Python 2 ,
7567 bytesPruébalo en línea!
Enfoque lambda recursivo. Toma la entrada como una cadena. ¡Muchas gracias a Dennis por guardar 8 bytes!
fuente
Haskell ,
6964 bytesPruébalo en línea! Ejemplo de uso:
f 2632
rendimientosTrue
.Editar: -5 bytes porque
mod (h + mod n 10) 10 = mod (h + n) 10
fuente
||
, que también me ayudó a acortar mi respuesta. ¡Gracias!Rubí, 139 bytes
Pruébalo en línea! (tiene un código extra para procesar la entrada, ya que es una función)
Código sin golf:
fuente
Retina 0.8.2 , 42 bytes
Pruébalo en línea! Enlace incluye casos de prueba. Explicación:
Convierta los dígitos en unarios e inserte separadores.
Si el último dígito no es mayor que el primero, agréguelos juntos.
Reduzca el módulo 10 si corresponde.
Repita hasta que el último dígito sea mayor que el primero o solo quede un dígito.
Comprueba si solo queda un dígito.
fuente
05AB1E ,
262524 bytesProbablemente se pueda jugar un poco más de golf. Parece demasiado largo, pero tal vez el desafío es en términos de código más complejo de lo que pensaba de antemano.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
C ++ (gcc) , 144 bytes
Pruébalo en línea!
La primera vez que intento algo como esto, así que si formateé algo incorrecto, avíseme. No estoy 100% seguro de las reglas para cosas como usar el espacio de nombres para eliminar los 5 bytes "std ::", así que lo dejé.
Sin golf:
fuente
#include
declaraciones. Sin embargo, propondría programar en el subdialecto de instalaciones std lib de C ++ con#include "std_lib_facilities.h"
prepended, que también hace ausing namespace std;
. Ese encabezado fue escrito por el autor del lenguaje desde hace mucho tiempo (la última versión es 2010) para estudiantes nuevos en C ++.#import<string>
. Pruébalo en línea!#!/usr/bin/sh
newlinegcc -include "std_lib_facilities.h" $@
: si encuentro un curso de C ++ que proporciona ese script de shell, ¿eso contaría?-include iostream
, esto es de hecho 144 bytes.C #, 114 bytes
Pruébalo en línea
fuente
C (gcc) (con string.h) ,
110108 bytesPruébalo en línea!
Todavía es relativamente nuevo en PPCG, por lo que la sintaxis correcta para vincular bibliotecas como un nuevo idioma es extraña para mí. También tenga en cuenta que la función devuelve 0 o 1 para falso / verdadero, y la impresión de ese resultado en stdout requiere stdio. Si estamos siendo pedantes y el ejercicio requiere resultados, el lenguaje también requiere stdio .
Conceptualmente similar a la respuesta de @ BenH, pero en C, así que felicitaciones donde se deben (Bienvenido a PPCG, por cierto), pero usando la recursividad. También utiliza aritmética de puntero de matriz, porque el código sucio es más corto que el código limpio.
La función es recursiva de cola, con condiciones de salida si el primer número no puede comer el último o la longitud es 1, devolviendo falso o verdadero, respectivamente. Estos valores se encuentran desreferenciando un puntero a la cadena C (que da un carácter) al principio y al final de la cadena, y haciendo las comparaciones en ellos. La aritmética del puntero se realiza para encontrar el final de la cadena. finalmente, el último carácter se "borra" reemplazándolo con un terminador nulo (0).
Es posible que la aritmética del módulo se acorte en un byte o dos, pero ya necesito una ducha después de la manipulación del puntero.
Versión sin golf aquí
Actualización: se guardaron dos bytes reemplazando c == 1 con! C. Esto es esencialmente c == 0. Se ejecutará un tiempo adicional y se duplicará innecesariamente antes de eliminarse, pero ahorra dos bytes. Un efecto secundario es nulo o las cadenas de longitud cero no causarán una recursión infinita (aunque no deberíamos obtener cadenas nulas, ya que el ejercicio dice enteros positivos).
fuente
gcc
, aunque se generarán advertencias,gcc
compilarán su código sin#include
s. Además, puede guardar 4 bytes con-DR=return
. Finalmente, en su código de prueba, los\0
s son innecesarios, ya que la cadena literalmente ya los incluye implícitamente.b=case1?res1:case2?res2:res_else;
es lo mismo queif(case1)return res1;if(case2)return res2;return res_else;
c
: puede determinar si la cadena es de longitud cerohead-tail
.Powershell, 89 bytes
¡Importante! El guión se llama a sí mismo de forma recursiva. Así que guarde el script como
g.ps1
archivo en el directorio actual. También puede llamar a una variable de bloque de script en lugar de un archivo de script (consulte el script de prueba a continuación). Eso llama tiene la misma longitud.Nota 1: El script usa una evaluación perezosa de operadores lógicos
-or
y-and
. Si"$args"-notmatch'(.)(.*)(.)'
es,True
entonces-or
no se evalúa la subexpresión correcta de . Además, si($m=$Matches).1-ge$m.3
esFalse
así, la subexpresión correcta de-and
no se evalúa también. Entonces evitamos la recursión infinita.Nota 2: La expresión regular
'(.)(.*)(.)'
no contiene anclajes de inicio y fin porque la expresión(.*)
es codiciosa por defecto.Script de prueba
Salida:
Powershell, 90 bytes
Sin recursión Sin dependencia de nombre de archivo y sin dependencia de nombre de bloque de script.
Un Powershell convierte implícitamente un operando derecho en un tipo de operando izquierdo. Por lo tanto,
$s-ge$s%10
calcula el operando derecho$s%10
comointeger
y compárelo comostring
porque el tipo del operando izquierdo esstring
. Y2+$s[0]+$s
convierte un carácter$s[0]
y una cadena$s
eninteger
porque el operando izquierdo2
es entero.$s|% S*g 1($s.Length-2)
es un atajo para$s.Substring(1,($s.Length-2))
fuente
C # (compilador interactivo de Visual C #) , 69 bytes
Pruébalo en línea!
El éxito o el fracaso están determinados por la presencia o ausencia de una excepción . La entrada tiene la forma de una cadena.
Menos golf ...
Hay un par de bytes adicionales para tratar la conversión entre caracteres y dígitos, pero en general eso no afectó demasiado el tamaño.
fuente
Perl 5
-pF
, 53 bytesPruébalo en línea!
fuente
Brachylog , 18 bytes
Pruébalo en línea!
Toma tres bytes fuera de la solución de Fatalize por el solo hecho de superscriptless no determinista
ⁱ
existente ahora, pero pierde otros tres por hacer las cosas vagamente inspirados Jelly-conz₁
evitar el uso dec
,g
o inclusoh
. (También se inspiró al intentar y no utilizar una nueva característica diferente: elʰ
metapredicado).fuente
PowerShell ,
9491 bytesPruébalo en línea!
Script de prueba
Código sin golf:
fuente
$n[0]
sufor
estado de cuenta; solo verificar$n
debería ser suficiente.-6
lugar, podría usarlo-96
porque es suficiente parareturn
y guardar 7 bytesparam($n)
ofunction f($n)
.["1","2","3"]
una entrada no válida pero lo"123"
es. si @VedantKandoi tiene un problema, definitivamente puedo cambiarlo.