Como todos sabemos, son tortugas hasta el fondo . Pero, ¿está bien preparado también?
Un número se considera un "primo de tortuga" si cumple las siguientes condiciones:
1) It is prime.
2) It is possible to remove a single digit leaving a prime number.
3) Step 2 can be repeated until left with a single digit prime.
Por ejemplo, 239
es un "tortuga-prime", ya que se puede reducir a 23
continuación, ya sea 2
o 3
, ambos de los cuales son primos. También se puede reducir a 29
entonces 2
. 151
no es un primo de tortuga, ya que se reduce a 15
(no primo), 51
(no primo) o 11
. 11
es primo, pero solo puede reducirse a 1
, que no lo es.
Dado un número entero positivo, determine si es un "primo de tortuga". Su salida puede ser de cualquier forma siempre que proporcione la misma salida para cualquier valor verdadero o falso.
Casos de prueba:
input -> output
1 -> false
2 -> true
17 -> true
19 -> false
239 -> true
389 -> false
Tanteo
Este es el código de golf , por lo que gana la respuesta más corta en cada idioma.
Respuestas:
Jalea , 16 bytes
Pruébalo en línea!
Cómo funciona
fuente
Haskell ,
1041029998979591 bytesPruébalo en línea!
Explicación
Primero configuramos una prueba de primalidad
Esto utiliza el teorema de Wilson para determinar la primalidad de una entrada.
Luego declaramos un caso base, que afirmará que la cadena vacía es verdadera.
Ahora definimos la función real
Utilizamos un guardia patrón para unen
zip[0..]x
ay
, porque tenemos que utilizar dos veces más tarde. Luego afirmamos que la respuesta es[[snd b|b<-y,b/=a]|a<-y]
son todos los números que son un dígito eliminado de nuestra entrada. Por lo tanto, estamos afirmando que al menos uno de estos números es verdaderof
. Para garantizar que los números compuestos sean falsos, agregamosprime$read x
. Si el número no es primo, la lista quedará vacía y elany
de una lista vacía es falso.fuente
any f[[
↦or[f[
[b|(i,b)<-y,i/=a]|(a,_)<-y
↦[snd b|b<-y,b/=a]|a<-y
R,
1241221201139593106105 bytesLo que evalúa la función:
Solución recursiva. Toma la entrada como una lista de dígitos.
Tiene 2 declaraciones lógicas:
¿Es
x
primo cuando se concatena?Es alguno de los siguientes
TRUE
:¿Es la longitud de
x
cero? Esta es nuestra condición final de terminación.Es
f
TRUE
para cualquier subconjunto dex
?La primera declaración asegura que seguimos trabajando solo con números primos. El segundo hace la recursión real.
Ahorré dos bytes gracias a @Giuseppe.
Tuve que revertir algunos de mis campos de golf debido a un error, donde estaba probando con una definición de función previa por accidente.
R, 98 bytes, no competidores
Como mencioné en los comentarios, hice un paquete . Dado que el desafío es anterior a esto, esto no es competitivo, pero quería mostrarlo un poco. No es mucho hasta ahora, pero llegaremos allí.
C()
es la primera función del paquete y se encarga de concatenar dígitos en un número.fuente
sum(x*10^(((l<-sum(x|1))-1):0))
) son muuuuy vergonzosas. Realmente estoy considerando crear un paquete de golf paraR
.sapply
... También creo que es posible que desee hacerf=pryr::f(...)
o de lo que necesita para utilizarf
en elsapply
.g
o algo así?el(strsplit(x,''))
ahorraría una tonelada de bytes.Jalea , 19 bytes
Pruébalo en línea!
Cómo funciona
Recursión sin caja base ftw.
fuente
Gelatina ,
2726 bytesUn enlace monádico que toma y devuelve enteros (
1
para tortuga de lo0
contrario).Pruébalo en línea!
¿Cómo?
fuente
Ruby ,
7257 + 8 =8065 bytesUsa la
-rprime
bandera. -15 bytes de histocrat!Pruébalo en línea!
fuente
&&!!
con solo&
, convertirá el resultado en un booleano. Su llamada recursiva también puede acortarse un poco usando perlismos:!n.scan(/./){f[$`+$']&&break}}
n.scan
truco funciona como lo hace?.scan.find
, pero podemos salir del ciclo manualmente en caso de éxito. Si rompemos,scan
regresanil
, de lo contrario, devuelve la cadena que siempre es verdadera.Java, 220 bytes
Pruébalo en línea!
Golfizado:
Sin golf:
fuente
boolean t(String n){int l=n.length(),x=new Integer(n),i;for(i=2;i<x;x=x%i++<1?0:x);if(x>1)if(l<2)return 1>0;else for(i=0;i<l;)if(t(n.substring(0,i)+n.substring(++i,l)))return 1>0;return 1<0;}
f
viene?>0
para convertir el int a un booleano) que debería ahorrar 2 * 2 + 1 * 4 = 8 bytes en la versión de Kevin Cruijssen.05AB1E ,
2827 bytesSolución iterativa.
Pruébalo en línea!
Explicación
fuente
Python 2 ,
132124119 bytes-8 Gracias a @WheatWizard
-5 Gracias a @LeakyNun
Pruébalo en línea!
No se me ocurre nada para afinarlo sin algún corrector de primer orden incorporado. Toma el número como una cadena (supuse que esto dado que el OP permitió una lista de dígitos, pero si no, entonces +14 bytes para otra lambda), y calcula recursivamente la tortuga de cada número "torturado".
fuente
f=lambda n,i=0:n==''or p(int(n))and i<len(n)and(f(n[:i]+n[i+1:])or f(n,i+1))
guarda un byte. Alguien con mejores habilidades de golf en Python probablemente podría acortar eso aún más.C #, 355 bytes
Pruébalo en línea!
Mi primer código de golf, así que espero haberlo hecho bien. No se me ocurrió una forma de hacerlo aún más pequeño (aparte de usar int en lugar de BigInteger, pero lo hice para que funcione para todos los casos de prueba proporcionados). De todos modos, aquí está el mismo formateado correctamente:
fuente
Perl 6 , 65 bytes
Pruébalo en línea!
fuente
PHP , 164 bytes
Pruébalo en línea!
Comienza probando el número de primalidad, luego recorre los dígitos como una matriz, saca cada uno y une el resto nuevamente y los alimenta recursivamente a través de la función nuevamente. Cada enlace hacia abajo hace un OR lógico con las rutas inferiores, solo regresa
true
si existe al menos una ruta de todos los números primos.fuente
Javascript 167 bytes
Explicación
Mostrar fragmento de código
fuente