Desafio:
Dado um número, obtenha o maior número primo estritamente menor que ele, subtraia-o desse número, faça-o novamente para esse novo número com o maior número primo menor e continue fazendo isso até que seja menor que 3. Se atingir 1, seu o programa deve gerar um valor verdadeiro; caso contrário, o programa deve gerar um valor falsey.
Exemplos:
Tudo isso deve dar um valor verdadeiro:
3
4
6
8
10
11
12
14
16
17
18
20
22
23
24
26
27
29
30
32
34
35
37
38
40
41
42
44
46
47
48
50
Todos estes devem dar valores falsey:
5
7
9
13
15
19
21
25
28
31
33
36
39
43
45
49
Regras:
- Você pode escrever um programa ou função.
- Você pode assumir que a entrada é maior que 2.
- Aplicam-se brechas padrão
- Isso é código-golfe, então a resposta mais curta vence!
code-golf
number
primes
decision-problem
Loovjo
fonte
fonte
9/10
as2^(-1) 3^2 5^(-1)
está pensando em termos deste último)Respostas:
Geléia ,
98 bytesExperimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Retina , 31 bytes
Imprime
0
(falsy) ou1
(truth).Experimente online! (A primeira linha ativa um conjunto de testes separado por avanço de linha.)
Explicação
Converta a entrada em unário, transformando a entrada
N
emN
cópias de1
.Remova repetidamente o maior número primo menor que a entrada. Isso é baseado no teste de primalidade padrão com regex .
Verifique se o resultado é único
1
.fonte
Pitão,
181514 bytesObrigado a @Maltysen por -1 byte
Um programa que recebe entrada no STDIN e imprime
True
ouFalse
conforme apropriado.Experimente online
Como funciona
Versão antiga com redução, 18 bytes
Experimente online
Como funciona
fonte
St
temU
15 caracteresJavaScript (ES6),
6463 bytesGuardado 1 byte graças a @Neil
Escrevi isso em 2 minutos ... e funcionou perfeitamente da primeira vez. Primeiro usuário a encontrar o bug inevitável vence ....
Experimente
Mostrar snippet de código
Como funciona
Primeiro, definimos g (x) como a função que encontra o primeiro número primo p <= x . Isso é feito usando o seguinte processo:
A solução para esse desafio, f (x) , agora é bastante direta:
fonte
too much recursion
para o console do navegador no Firefox 48, então acho que a recursão ultrapassa o limite de recursão da FF.x%2
você deve economizar um bytex==1
.Pyke,
1511 bytesExperimente aqui!
Retorna
1
se verdadeiro e gera uma exceção se falsofonte
Julia, 32 bytes
Embora não seja a solução mais curta entre os idiomas, essa pode ser a menor das legíveis por humanos ...
Ou, para colocar em termos um pouco mais claros
Chamado com, por exemplo
!37
,.fonte
Mathematica, 32 bytes
Esta é uma função sem nome que pega um número inteiro e retorna um booleano.
Explicação
Há muita sintaxe e ordem de leitura engraçada aqui, então ...
fonte
#+0~Min~NextPrime@-#&~FixedPoint~#==1&
(36 bytes). Bom uso de//.
!<2
no final.Python3,
102 92 90 8988 bytesSugestões de golfe são bem-vindas! Vejo que
gmpy
contém uma funçãonext_prime
, mas ainda não posso testá-la :(-2 bytes, graças a @ JonathanAllan !
-1 byte, graças a @Aaron !
Casos de teste
A saída é 13 valores reais e 13 valores falsey.
s
contém os casosh
verdadeiros e os falsos.fonte
if all(x%y for...
funcionan<3 else
->n<3else
para obter mesmo comprimento que o meu;)Python, com sympy, 60 bytes
Meu método anterior era de 83 bytes sem sympy usando recursão, mas entendi truthy / falsey como distinto e consistente, mas fui informado de que é uma interpretação incorreta. Não consigo salvá-lo devido à cauda, mas vou deixá-lo aqui, caso alguém saiba como fazê-lo:
fonte
2
não é um valor falsey.Vitsy,
2826 bytesDefinitivamente, isso pode ser reduzido.
O que outras pessoas estão dizendo
Experimente online!
fonte
MATL , 13 bytes
Experimente online! Ou verifique todos os casos de teste de uma só vez .
Explicação
fonte
CJam ,
2116 bytesAgradecimentos a Dennis por salvar 4 bytes.
Experimente online!
Explicação
fonte
ri_{_1|{mp},W=-}*
Deveria trabalhar.1|
é realmente inteligente. :) (E eu sempre esqueço que{...},
faz uma escala implícita ...)Perl, 42 bytes
Inclui +1 para
-p
Executar com entrada em STDIN
reach1.pl
:Usa o regex de primalidade clássico
fonte
Regex .NET, 38 bytes
Apenas para mostrar que ele pode ser verificado em um único regex.
A entrada é assumida como unária.
Explicação
Ele simplesmente implementa o requisito da palavra, removendo repetidamente o maior número primo e verifica se o restante é 1.
(?>(?<=(.*))..+(?<!^\1\2+(.+.)|$))+
: O grupo sem backtracking garante que a maior prime encontrada não seja substituída e+
simplesmente repita o processo de combinar a maior prime.(?<=(.*))..+(?<!^\1\2+(.+.)|$)
: Corresponde ao maior número primo menor que o número restante(?<=(.*))
: Registre quanto subtraímos para estabelecer um ponto "âncora" para a afirmação...+
: Procure o maior número ...(?<!^\1\2+(.+.)|$)
: ... que é primo e menor que o número restante.(?<!^\1\2+(.+.))
: A rotina usual de testes principais, com^\1
tachas na frente para garantir que estamos verificando o valor correspondente a..+
(?!<$)
: Afirmar menos que o número restantefonte
(?<=(.*))
parte é bastante desajeitada. Não tenho certeza se existe uma maneira melhor. Além disso, estou curioso para saber se existe uma solução no PCRE.Perl 6 ,
54 53 5251 bytesExplicação:
Exemplo:
fonte
Irregular , 63 bytes
Eu criei esse idioma há dois dias e as premissas básicas são que não existem loops integrados, os únicos recursos são aritmética básica e tomada de decisão, e a avaliação do programa é baseada em expressões regulares.
Explicação
Esta parte converte a entrada em unária. Subtrai repetidamente 1 da entrada até que seja igual a 0, acrescentando
1_
cada vez. Em seguida, remove todos os_
s. Se eu não tivesse esquecido umbreak
no meu código, poderia ser escrito da seguinte maneira:A próxima parte remove repetidamente o maior número primo da entrada até que seja igual a
1
ou11
,11
sendo substituído por0
.Eu usei o regex da resposta de Martin Ender .
fonte
Haskell, 79 bytes
Não é realmente curto, mas sem sentido :)
fonte
PowerShell v2 +, 81 bytes
Recebe entrada
$n
. Insere umwhile
loop desde que$n
seja imóvel3
ou maior. Cada iteração subtrai um número de$n
. O número é o resultado do teste de primalidade regex aplicado em um intervalo($n-1)..2
via operadorWhere-Object
(?
) e, em seguida, o primeiro[0]
dos resultados (como o intervalo está diminuindo, o resultado é o maior selecionado). Depois de concluir o loop,$n
ele será1
ou2
, por definição, então pré-decréscimo$n
(transformando-o em um0
ou em1
) e pegamos o Booleano - não!
. Isso é deixado no pipeline e a produção está implícita.Exemplos
fonte
Matlab, 51 bytes
Isso é MUITO semelhante à solução JS6 da ETHProductions , mas precisa que a variável esteja no espaço de trabalho.
fonte
Python 2.7:
8887 bytesThx @TuukkaX por -1 mais byte!
fonte
n<2
vez den==1
.Floróide ,
45 3029 bytesfonte
Clojure, 125 bytes
Caramba, esse é um longo pedaço de código. A linguagem mais detalhada ataca novamente!
Ungolfed:
fonte