Sur toutes les années où je fais ce défi, 2017 est la première année qui a été un nombre premier. La question portera donc sur les nombres premiers et leurs propriétés.
Votre tâche consiste à créer un programme ou une fonction prenant un nombre entier positif arbitrairement élevé en entrée et en sortie ou en renvoyant, que le nombre soit ou non friable de 2 017 , c'est-à-dire que le plus grand facteur premier de ce nombre soit de 2 017 ou moins.
Quelques exemples d'entrées et leurs sorties:
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
Votre programme n'a pas à produire littéralement true
et false
- toutes les valeurs de vérité ou de fausseté, et en fait, deux résultats différents qui sont cohérents entre les cas vrais et les cas faux sont acceptables.
Cependant, vous ne pouvez pas utiliser les nombres premiers dans votre code source. Les primes sont de deux types:
Caractères, ou séquences de caractères, qui représentent des littéraux en nombres premiers.
Les personnages
2
,3
,5
et7
sont illégales dans les langues où les nombres sont des jetons valides.Le nombre
141
est illégal car il contient41
, même si1
et4
sont par ailleurs valables.Les caractères
B
etD
(oub
etd
) sont illégaux dans les langues où ils sont généralement utilisés comme 11 et 13, tels que CJam ou Befunge.
Caractères comportant des valeurs Unicode à valeurs principales ou contenant des octets dans leur codage.
Les caractères
%)+/5;=CGIOSYaegkmq
sont illégaux en ASCII, ainsi que le caractère de retour chariot.Le caractère
ó
est illégal en UTF-8 car son encodage en contient0xb3
. Cependant, dans ISO-8859-1, son codage est simple0xf3
, composite et donc correct.
Le code le plus court pour faire ce qui précède dans n'importe quelle langue gagne.
=
règles sur la plupart des langages standard ...Réponses:
Gelée , 8 octets
Essayez-le en ligne! Notez que les cas de test 11111 et supérieurs sont un peu trop difficiles pour TIO.
Vérification
Le cas de test 999999 a duré 13 heures. Je suis pessimiste à propos de l'informatique 2025! 4068289 ...
Comment ça marche
la source
(2^n)!
. Cela nécessite également des entrées de six tailles, mais au moins les entrées sont dans un alphabet décimal plutôt que dans un alphabet binaire.Gelée , 8 caractères, 14 octets de UTF-8
Essayez-le en ligne!
Jelly utilise normalement sa propre page de codes pour les programmes. Cependant, la plupart de ses composants principaux liés commencent par le
Æ
code 13; pas très utile. Heureusement, l'interprète prend également en charge UTF-8, qui offre un codage plus convivial.Vérification
Ce programme, en UTF-8, hexdumps ressemble à ceci:
Vérification que tous les octets sont composites:
Vérification que tous les points de code Unicode sont composites:
Le seul jeton analysé en tant que nombre est
90
. Aucun de9
,0
et90
sont premiers.Explication
L’intérêt mathématique principal ici est que 45² correspond à 2025, ce qui se situe clairement entre 2017 (l’année en cours) et 2027 (le prochain nombre premier). Ainsi, nous pouvons prendre la racine carrée de chaque facteur premier du nombre et voir s'il en existe plus de 45. Malheureusement, nous ne pouvons pas écrire à
45
cause du littéral5
, nous devons donc le doubler et comparer à 90 à la place.la source
u
est composite, il s'agirait simplement de changer le score plutôt que de l'invalider.)Mathematica,
625855 octetsLes trois derniers octets enregistrés sont entièrement dus à Martin Ender!
Fonction sans nom prenant un argument entier positif et renvoyant
True
ouFalse
.Algorithme récursif, avec
#4<4
être le cas de base de la vérité (nous n’avons besoin que de revenirTrue
sur l’imput 1, mais les cas de base supplémentaires sont corrects). Sinon, nous calculons le deuxième plus petit diviseur (qui est nécessairement premier) de l'entrée avecDivisors[#][[6-4]]
; si elle est supérieure à 2024 (44*46
) alors nous sortons avecFalse
, sinon nous appelons la fonction récursive (en utilisant#6
set to#0
) sur l'entrée divisée par ce petit facteur premier#
(que nous devons exprimer en tant que#^-1
fois l'entrée#4
, car non/
autorisée).Structurellement, la première moitié
#4<4||#<44*46&[#^-1#4]&
est une fonction anonyme de six arguments, appelée avec des argumentsDivisors[#][[6-4]]
,Null
,Null
,#
,Null
, et#0
; est de contourner l'interdiction sur les personnages2
,3
et5
.La version précédente, qui économisait quatre octets en remplaçant
8018-6000
par44*46
, inspirée par la réponse de jelly d’ ais523 (Martin Ender semblait également inspirée par un commentaire d’ais523):C'était assez méchant: je ne connais toujours pas le moyen de définir une variable dans Mathematica avec ces restrictions! Les deux
=
et lee
dansSet
sont interdits. Éviter+
et)
était également un problème, mais pas trop difficile à contourner au détriment de plus d'octets.la source
#2
serait également interdit, vous devrez donc faire attention à la façon dont vos lambdas sont imbriqués, et le manque de parenthèses pourrait rendre cela difficile.)#4<4||#<44*46&[#^-1#4]&[Divisors[#][[6-4]],,,#,,#0]&
envoie une série d'avertissements, car elle tente maintenant deDivisors[#][[2]]
s'assurer que l'entrée est supérieure à 1 (ou 3), mais le résultat est toujours correct.Haskell,
48 à47 octetsFondamentalement, une traduction de la réponse de Dennis 'Jelly . xnor a sauvegardé un octet.
Utilise
[…]!!0
entre parenthèses car)
est interdit, etsnd
+divMod
parce quem
dansmod
etrem
est interdit.la source
!!0<1
avec<[1]
. Mais il semble qu'il est court - circuité ce à l' utilisationdiv
comme[\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]]
, qui utilise que les sorties doivent seulement être cohérentes.Pyke,
10879 octetsEssayez-le ici!
Sauvé 1 octet en utilisant la manière de Dennis de générer 2025
la source
Brachylog ,
9 à10 octetsEssayez-le en ligne!
Fondamentalement, en utilisant le même algorithme que mon autre réponse.
$ph
trouve le premier (h
) premier facteur ($p
); c'est le facteur le plus important, car les listes de facteurs premiers de Brachylog vont du plus grand au plus petit. Ensuite, je prends la racine carrée ($r
), double (*
) et teste pour voir si elle est inférieure à 90 (<90
).J'ai dû doubler l'entrée en premier parce que 1 n'a pas de facteurs premiers (et donc pas de premier facteur premier). Cela ajoute un facteur premier supplémentaire de 2, qui n'affecte pas le fait qu'un nombre soit friable pour 2017, mais empêche une défaillance lors de la manipulation 1.
la source
En fait , 9 octets
Merci à Dennis pour beaucoup d'octets!
Essayez-le en ligne!
Explication:
la source
Mathematica,
6674 octetsMerci à Dennis pour avoir signalé que
U+F4A1
c'est interdit.Explication:
Divisors@#
: Liste des diviseurs entiers du premier argument#
.0<1
: Golf pourTrue
(évite également l'utilisation de la lettree
).Divisors@d^0
: Liste des formulaires{1, 1, ..., 1}
de longueur égale au nombre de diviseurs ded
.Tr
: Pour une liste plate,Tr
retourne la somme de cette liste. AinsiTr[Divisors@d^0]
retourne le nombre de diviseurs ded
.Function[{x,d},And[x,Tr[Divisors@d^0]>6-4||d<44*46]]
: Fonction anonyme avec deux argumentsx
etd
. L'idée est qued
c'est un diviseur de#
et nous testons pour voir si il est composite ou inférieur ou égal à2017
(inclus).2017
-fiabilité est équivalente à tous les diviseurs satisfaisant cette condition. Comme ais523 l’a découvert, être premier inférieur ou égal à2017
équivaut à être inférieur à premier2025
. Comme l’a souligné Greg Martin , il suffit de vérifier si elle est inférieure à2024=44*46
. L'argumentx
agit comme un accumulateur pour déterminer si tous les diviseurs rencontrés jusqu'ici satisfont cette propriété. Nous avons ensuite quittéFold
cette fonction à travers tous les diviseurs de#
avec valeur initialeTrue
, puisque nous n’avons accès ni àMap
ni/@
.la source
05AB1E , 10 octets
Retourne 1 si vrai, 0 sinon.
Essayez-le en ligne!
Explication
la source
MATL , 15 octets
Sorties
0
pour non-2017-friables ou1
pour 2017-friables.Essayez-le en ligne! Ou vérifiez tous les cas de test .
Ce programme vérifie que tous les octets sont composites.
Explication
la source
Bash, 144 octets
Codage ASCII:
Comme d'habitude pour le shell, le code de sortie indique succès (0) ou échec (non-0).
C’est effectivement une orthographe différente de
Nous obtenons le facteur le plus important avec
factor $1|grep -o '[0-9]*$'
; letr -d :
est à cas particulier pour l'entrée =1
.L'expression est
$[6*6*69-466]
évaluée à 2018.Il était délicat à utiliser
tr
pour les noms de commande et utilisait toujours la substitution de commande - je ne pouvais pas utiliser le formulaire d'imbrication$( )
, alors j'ai fini par rediriger vers un autre Bash pour évaluer le résultat.Résultats de test:
Confirmation des codes de caractères:
la source
Pyth, 11 octets
Essayez-le en ligne. Suite de tests.
Utilise le truc de Dennis pour obtenir 2025, puis vérifie si aucun facteur premier d’entrée n’est plus grand.
la source
Julia 0.4 ,
843837 octetsS'attend à un BigInt comme argument.
Essayez-le en ligne! ou vérifiez qu'aucun octet n'est premier .
la source
Japt , 14 octets
Retourne 1 si vrai, 0 si faux.
Essayez ici .
la source
k
a une valeur primordialeBraingolf , 11 octets [très non compétitif]
Essayez-le en ligne!
Illisible en raison de la
ߢ
vis avec les chiffres, fonctionne toujours dans un interprète.Je n'ai même pas remarqué les restrictions de caractères lorsque j'ai écrit cela, mais tout ce que j'avais à faire, c'était de changer le caractère unicode étrange de 2017 à 2018.
2018 n’est pas un nombre premier, tout nombre
<= 2018
est également<= 2017
Explication
la source