Em todos os anos em que faço esse desafio, 2017 é o primeiro ano em que é um número primo. Portanto, a questão será sobre números primos e suas propriedades.
Sua tarefa é produzir um programa ou função que receba um número inteiro positivo arbitrariamente grande como entrada e produza ou retorne com ou sem número friável de 2.017 - ou seja, se o maior fator primordial nesse número é 2.017 ou menos.
Alguns exemplos de entradas e suas saídas:
1 (has no prime factors)
true
2 (= 2)
true
80 (= 2 x 2 x 2 x 2 x 5)
true
2017 (= 2017)
true
2019 (= 3 x 673)
true
2027 (= 2027)
false
11111 (= 41 x 271)
true
45183 (= 3 x 15061)
false
102349 (= 13 x 7873)
false
999999 (= 3 x 3 x 3 x 7 x 11 x 13 x 37)
true
1234567 (= 127 x 9721)
false
4068289 (= 2017 x 2017)
true
Seu programa não precisa literalmente produzir true
e false
- quaisquer valores verdadeiros ou falsos e, de fato, quaisquer duas saídas diferentes que são consistentes entre casos verdadeiros e falsos são boas.
No entanto, você não pode usar números primos no seu código-fonte. Primes vêm em dois tipos:
Caracteres ou sequências de caracteres que representam literais de números primos.
Os personagens
2
,3
,5
, e7
são ilegais em línguas onde os números são tokens válidos.O número
141
é ilegal porque contém41
, embora1
e4
são de outra maneira válida.Os caracteres
B
eD
(oub
ed
) são ilegais nos idiomas em que geralmente são usados como 11 e 13, como CJam ou Befunge.
Caracteres que possuem valores Unicode com valor inicial ou contêm bytes com valor inicial em sua codificação.
Os caracteres
%)+/5;=CGIOSYaegkmq
são ilegais no ASCII, assim como o caractere de retorno de carro.O caractere
ó
é ilegal no UTF-8 porque sua codificação está0xb3
nele. No entanto, na ISO-8859-1, sua codificação é simples0xf3
, composta e, portanto, correta.
O código mais curto para fazer o acima em qualquer idioma vence.
=
regras a maioria das linguagens de padrão ...Respostas:
Gelatina , 8 bytes
Experimente online! Observe que os casos de teste 11111 e acima são um pouco demais para o TIO.
Verificação
O caso de teste 999999 está em execução há 13 horas. Sou pessimista em relação à computação 2025! 4068289 ...
Como funciona
fonte
(2^n)!
. Isso também exige entradas de seis tamanhos, mas pelo menos as entradas estão em um alfabeto decimal e não em um binário.Gelatina , 8 caracteres, 14 bytes de UTF-8
Experimente online!
O Jelly normalmente usa sua própria página de códigos para programas. No entanto, a maioria de seus buildins relacionados ao prime começa com
Æ
, que é o codepoint 13; não é muito útil. Felizmente, o intérprete também suporta UTF-8, que possui uma codificação mais amigável.Verificação
Este programa, em UTF-8, hexdumps como este:
Verificação de que todos os bytes são compostos:
Verificação de que todos os pontos de código Unicode são compostos:
O único token analisado como um número é
90
. Nenhum de9
,0
e90
são primos.Explicação
A principal visão matemática aqui é que 45² é 2025, que cai ordenadamente entre 2017 (o ano atual) e 2027 (o próximo primo). Assim, podemos obter a raiz quadrada de todos os fatores primos do número e ver se algum excede 45. Infelizmente, não podemos escrever
45
devido ao literal5
; portanto, precisamos dobrá-lo e comparar com 90.fonte
u
é composto, por isso seria apenas uma questão de mudar a pontuação em vez de algo que invalida.)Mathematica,
625855 bytesOs últimos três bytes salvos são totalmente devidos a Martin Ender!
Função sem nome, usando um argumento inteiro positivo e retornando
True
ouFalse
.Algoritmo recursivo, por
#4<4
ser o caso base verdadeiro (precisamos apenas retornarTrue
na imput 1, mas os casos base extras estão corretos). Caso contrário, calculamos o segundo menor divisor (que é necessariamente primo) da entrada comDivisors[#][[6-4]]
; se for maior que 2024 (44*46
), sairemos comFalse
, caso contrário, chamaremos a função recursivamente (usando#6
set para#0
) na entrada dividida por esse pequeno fator primo#
(que devemos expressar como#^-1
vezes a entrada#4
, pois/
não é permitida).Estruturalmente, a primeira metade
#4<4||#<44*46&[#^-1#4]&
é uma função anônima de seis argumentos, sendo chamado com argumentosDivisors[#][[6-4]]
,Null
,Null
,#
,Null
, e#0
; este é para contornar a proibição dos personagens2
,3
e5
.Versão anterior, que salvou quatro bytes substituindo
8018-6000
por44*46
, inspirada na resposta Jelly do ais523 (Martin Ender também parecia inspirado no comentário do ais523):Isso foi bastante desagradável: ainda não sei como definir uma variável no Mathematica sob essas restrições! Ambos
=
e oe
inSet
são proibidos. Evitar+
e)
também foi um problema, mas não muito difícil de contornar à custa de mais bytes.fonte
#2
também seria anulado, por isso você tem que ter cuidado com a forma como seus lambdas aninhados, ea falta de parênteses pode fazer essa difícil.)#4<4||#<44*46&[#^-1#4]&[Divisors[#][[6-4]],,,#,,#0]&
lança vários avisos, porque agora tentaDivisors[#][[2]]
antes garantir que a entrada seja maior que 1 (ou 3), mas o resultado ainda está correto.Haskell,
4847 bytesBasicamente, uma tradução da resposta de Dennis 'Jelly . O xnor salvou um byte.
Usa
[…]!!0
como parênteses porque)
é banido esnd
+divMod
porque om
inmod
erem
é banido.fonte
!!0<1
com<[1]
. Mas parece que está em curto para usardiv
como[\p n->p^n`div`n*n>p^n-1]!!0$product[1..44*46]
.\n->[0|p<-[product[1..44*46]^n],0<-[p,p-n..0]]
que usam essas saídas apenas para serem consistentes.Pyke,
10879 bytesExperimente aqui!
Economizou 1 byte usando a maneira de Dennis gerar 2025
fonte
Braquilog ,
910 bytesExperimente online!
Basicamente, usando o mesmo algoritmo da minha outra resposta.
$ph
encontra o primeiro (h
) fator primo ($p
); esse é o maior fator primordial, pois as listas de fatores primários de Brachylog vão do maior para o menor. Então pego a raiz quadrada ($r
), o dobro (*
) e testo para ver se é menor que 90 (<90
).Eu tive que dobrar a entrada primeiro porque 1 não possui fatores primos (e, portanto, nenhum primeiro fator primo). Isso adiciona um fator primo extra de 2, que não pode afetar se um número é friável para 2017, mas evita uma falha ao manipular 1.
fonte
Na verdade , 9 bytes
Obrigado ao Dennis por muitos bytes!
Experimente online!
Explicação:
fonte
Mathematica,
6674 bytesAgradecemos a Dennis por apontar que
U+F4A1
é proibido.Explicação:
Divisors@#
: Lista de divisores inteiros do primeiro argumento#
.0<1
: Golf forTrue
(também evita o uso da letrae
).Divisors@d^0
: Lista do formulário{1, 1, ..., 1}
com comprimento igual ao número de divisores ded
.Tr
: Para uma lista simples,Tr
retorna a soma dessa lista. Assim,Tr[Divisors@d^0]
retorna o número de divisores ded
.Function[{x,d},And[x,Tr[Divisors@d^0]>6-4||d<44*46]]
: Função anônima com dois argumentosx
ed
. A idéia é qued
é um divisor de#
e testamos para ver se é composto ou menor que ou igual a2017
(inclusive).2017
-friabilidade é equivalente a todos os divisores que satisfazem essa condição. Como o ais523 descobriu, ser um número primo menor ou igual a2017
é equivalente a ser um número primo menor que2025
. Como apontou Greg Martin , basta testar se é menor que2024=44*46
. O argumentox
atua como um acumulador para saber se todos os divisores encontrados até o momento satisfazem essa propriedade. Em seguida, deixamosFold
essa função através de todos os divisores de#
com valor inicialTrue
, já que temos acesso a nemMap
nem/@
.fonte
05AB1E , 10 bytes
Retorna 1 se verdadeiro, 0 caso contrário.
Experimente online!
Explicação
fonte
MATL , 15 bytes
Saídas
0
para não-2017-friable ou1
para 2017-friable.Experimente online! Ou verifique todos os casos de teste .
Este programa verifica se todos os bytes são compostos.
Explicação
fonte
Bash, 144 bytes
Codificação ASCII:
Como de costume no shell, o código de saída indica sucesso (0) ou falha (não-0).
Esta é efetivamente uma grafia diferente de
Temos o maior fator com
factor $1|grep -o '[0-9]*$'
; otr -d :
é um caso especial para input =1
.A expressão é
$[6*6*69-466]
avaliada para 2018.Era complicado usar
tr
os nomes de comando e ainda usar a substituição de comando - como eu não conseguia usar o formulário de aninhamento$( )
, acabei inserindo outro Bash para avaliar o resultado.Resultado dos testes:
Confirmação dos códigos de caracteres:
fonte
Pitão, 11 bytes
Experimente online. Suíte de teste.
Usa o truque de Dennis para obter 2025 e verifica se nenhum fator primordial de entrada é maior.
fonte
Julia 0.4 ,
843837 bytesEspera um BigInt como argumento.
Experimente online! ou verifique se nenhum byte é primo .
fonte
Japonês , 14 bytes
Retorna 1 se verdadeiro, 0 se falso.
Experimente aqui .
fonte
k
tem um valor primordialBraingolf , 11 bytes [muito pouco competitivo]
Experimente online!
Ilegível devido aos
ߢ
quais aparafusa os números, no entanto ainda funciona em um intérprete.Eu nem percebi as restrições de caracteres quando escrevi isso, mas tudo que eu tinha a fazer era mudar o estranho caractere unicode de 2017 para 2018.
Dado que 2018 não é primo, qualquer primo
<= 2018
também é<= 2017
Explicação
fonte