Como todos sabemos, são tartarugas até o fim . Mas também é primo?
Um número é considerado "primo da tartaruga" se atender às seguintes condições:
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 exemplo, 239
é um "prime de tartaruga", pois pode ser reduzido para 23
um 2
ou outro 3
, ambos os quais são primos. Também pode ser reduzido para 29
então 2
. 151
não é um primo de tartaruga, pois se reduz a 15
(não primo), 51
(não primo) ou 11
. 11
é primo, mas só pode reduzir para 1
, o que não é.
Dado um número inteiro positivo, determine se é um "primo da tartaruga". Sua saída pode ser de qualquer forma, desde que ela seja igual para qualquer valor de verdade ou falsey.
Casos de teste:
input -> output
1 -> false
2 -> true
17 -> true
19 -> false
239 -> true
389 -> false
Pontuação
Isso é código-golfe , então a resposta mais curta em cada idioma vence!
Respostas:
Gelatina , 16 bytes
Experimente online!
Como funciona
fonte
Haskell ,
1041029998979591 bytesExperimente online!
Explicação
Primeiro montamos um teste de primalidade
Isso usa o Teorema de Wilson para determinar a primalidade de uma entrada.
Em seguida, declaramos um caso base, que afirmará que a cadeia vazia é verdadeira.
Agora vamos definir a função real
Nós usamos um guarda padrão para vincular
zip[0..]x
ay
, porque precisamos usá-lo duas vezes mais tarde. Em seguida, afirmamos que a resposta é[[snd b|b<-y,b/=a]|a<-y]
são todos os números que são um dígito removido da nossa entrada. Portanto, estamos afirmando que pelo menos um desses números é verdadeirof
. A fim de garantir que os números compostos sejam falsos, adicionamosprime$read x
. Se o número não for primo, a lista ficará vazia e aany
lista vazia será falsa.fonte
any f[[
↦or[f[
[b|(i,b)<-y,i/=a]|(a,_)<-y
↦[snd b|b<-y,b/=a]|a<-y
R,
1241221201139593106105 bytesQue avalia a função:
Solução recursiva. Recebe a entrada como uma lista de dígitos.
Possui 2 declarações lógicas:
É
x
primo quando concatenado?É um dos seguintes
TRUE
:O comprimento é
x
diferente de zero? Esta é a nossa condição final de rescisão.É
f
TRUE
para qualquer subconjunto dex
?A primeira declaração garante que continuemos trabalhando apenas com números primos. O segundo faz a recursão real.
Economizou dois bytes graças a @Giuseppe.
Eu tive que reverter alguns dos meus tacos por causa de um bug, onde estava testando com uma definição de função anterior por acidente.
R, 98 bytes, não concorrente
Como mencionei nos comentários, fiz um pacote . Como o desafio antecede isso, isso não é competitivo, mas eu queria mostrar um pouco. Não é muito até agora, mas vamos chegar lá.
C()
é a primeira função no pacote e cuida da concatenação de dígitos em um numérico.fonte
sum(x*10^(((l<-sum(x|1))-1):0))
) são muitíssimo ruins. Estou realmente pensando em criar um pacote de golfe paraR
.sapply
entender o ... Também acho que você pode querer fazerf=pryr::f(...)
ou precisa usarf
osapply
.g
ou algo assim?el(strsplit(x,''))
economizar uma tonelada de bytes.Geléia , 19 bytes
Experimente online!
Como funciona
Recursão sem base ftw.
fonte
Geléia ,
2726 bytesUm link monádico que recebe e retorna números inteiros (
1
para tartarugas0
).Experimente online!
Quão?
fonte
Ruby ,
7257 + 8 =8065 bytesUsa a
-rprime
bandeira. -15 bytes de histocrat!Experimente online!
fonte
&&!!
por just&
, ele converterá o resultado em um booleano. Sua chamada recursiva também pode ficar um pouco mais curta usando perlismos:!n.scan(/./){f[$`+$']&&break}}
n.scan
truque funciona da maneira que funciona?.scan.find
, mas podemos interromper manualmente o ciclo do sucesso. Se quebrarmos,scan
retornanil
, caso contrário, retorna a string que é sempre verdadeira.Java, 220 bytes
Experimente online!
Golfe:
Ungolfed:
fonte
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;}
( 191 bytes )f
vem?>0
para converter o int em um booleano), que deve salvar 2 * 2 + 1 * 4 = 8 bytes na versão de Kevin Cruijssen.05AB1E ,
2827 bytesSolução iterativa.
Experimente online!
Explicação
fonte
Python 2 ,
132124119 bytes-8 Obrigado a @WheatWizard
-5 Obrigado a @LeakyNun
Experimente online!
Não consigo pensar em nada para aperfeiçoá-lo sem um verificador principal embutido. Pega o número como uma string (presumi que, dado que o OP permitia uma lista de dígitos, mas, se não fosse, +14 bytes para outro lambda), e recursivamente calcula a turtleness de cada número "enrolado".
fonte
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))
salva um byte. Alguém com melhores habilidades de golfe em Python provavelmente poderia diminuir ainda mais isso.C #, 355 bytes
Experimente online!
Meu primeiro código de golfe, então espero ter feito tudo certo. Não consegui pensar em uma maneira de torná-lo ainda menor (exceto usar int em vez de BigInteger, mas fiz isso para que funcionasse em todos os casos de teste fornecidos). Enfim, aqui está o mesmo formatado corretamente:
fonte
Perl 6 , 65 bytes
Experimente online!
fonte
PHP , 164 bytes
Experimente online!
Começa testando o número de primalidade e, em seguida, percorre os dígitos como uma matriz, abrindo cada um e juntando o restante novamente e alimentando-os recursivamente através da função novamente. Cada link para baixo faz um OR lógico com os caminhos inferiores, retornando apenas
true
se existir pelo menos um caminho de todos os números primos.fonte
Javascript 167 bytes
Explicação
Mostrar snippet de código
fonte