C'est un défi de flics et de voleurs . Le fil des flics à ce défi est ici
Une question intéressante à considérer est la suivante:
Si j'ai une séquence de nombres, combien dois-je fournir avant de savoir de quelle séquence je parle?
Par exemple, si je veux parler des entiers positifs dans l'ordre à partir de , je pourrais dire , mais est-ce vraiment suffisant?
J'ai une façon de répondre à cette question, et d'être un golfeur de code Cela implique le golf de code. Vous avez fourni suffisamment de termes d'une séquence si le code le plus court qui produit ces termes produit tous les termes de la séquence. Si nous pensons à cela en termes de code-golf, cela signifierait que vous avez fourni suffisamment de cas de test pour que le code le plus court qui réussit les cas de test fasse la tâche souhaitée.
Défi
Ce défi est un défi de flics et de voleurs . Dans lequel les flics présenteront des cas de test et les voleurs devront trouver un moyen plus court d'usurper les cas de test autres que la séquence prévue. Les flics présenteront les choses suivantes:
Un morceau de code qui prend un entier positif en entrée et produit un entier en sortie. Ce code peut être zéro ou un indexé, mais il doit être clair ce qu'est l'indexation. Ce code définira votre séquence.
Toute exigence de plate-forme ou de langue pertinente pouvant affecter la sortie, par exemple la taille de l'entier long.
Un nombre , ainsi que les n premiers termes de la séquence tels que calculés par le code. Ceux-ci serviront de "cas de test".
Les voleurs trouveront un programme dans le même langage qui est plus court que celui présenté et réussit tous les cas de test (produit la même sortie pour les premières entrées que le code du flic). Le code du voleur doit également différer en sortie du programme du flic pour un nombre supérieur à n .
Notation
Les voleurs seront notés dans le nombre de fissures qu'ils trouvent, plus il y a de fissures, mieux c'est. Une réponse peut être craquée à nouveau en trouvant une réponse valide plus courte que la fissure d'origine. Si une réponse est crackée une deuxième fois, le point est donné au deuxième cracker plutôt qu'au premier.
la source
Réponses:
cQuents , réponse de Stephen , 3 octets
Essayez-le en ligne!
Comment ça fonctionne
On dirait que les séquences doivent être identiques, mais cela donne
12345678910
pourn = 10
tout"::$
donne1234567891
.la source
JavaScript, la réponse de fəˈnɛtɪk (17 octets)
Eh bien, il était facile de coder en dur pour obtenir un score beaucoup plus faible ... Diffère de l'implémentation de référence pour toute entrée , indexée 0. Cela utilise une astuce de golf JS très connue: l'indexation dans une séquence avec un entier qui dépasse les limites de celle-ci renvoie une valeur fausse ( ), donc elle peut simplement être contrainte à une valeur par défaut en utilisant OU logique ( ), dans ce cas , gestion du dernier terme de la séquence mais aussi de ceux à suivre.x ≥ 6
undefined
||
22
Essai
Alternativement, essayez-le en ligne!
la source
Haskell , réponse de Laikoni , 15 octets
Essayez-le en ligne!
Je pointerais habituellement quelque chose comme ça dans un commentaire, mais ensuite je pensais que les flics et les voleurs étaient un peu plus acharnés.
Ceci est juste la réponse de BMO moins le cas spécial pour
b 42
. Parce que l'original de Laikoni passe par une virgule flottante, ce n'est pas nécessaire: il suffit de trouver un nombre suffisamment grand pour donner des erreurs d'arrondi, mais pas dans l'Integer
arithmétique exacte . Par exemple:la source
Python 2 , réponse de xnor , 43 octets
Essayez-le en ligne!
Crédits
Une grande partie du mérite de cette fissure doit aller à @ Mr.Xcoder qui a d'abord publié un commentaire sur une éventuelle attaque utilisant cette méthode, et à @PoonLevi qui a trouvé une solution de 44 octets.
Comment?
Théorie
En particulier, pour :a = 2
Il existe donc un entier positif tel que:k
Qui conduit à:
Cette dernière formule est celle dont le code Python est dérivé et vaut maintenant pour , même si n'est pas relativement premier avec lui-même.p = 2 2
Maintenant, pour la partie la plus importante: l'inverse du petit théorème de Fermat n'est pas vrai. Nous pouvons avoir pour un certain nombre composite . Ces nombres sont appelés pseudoprimes de Fermat pour fonder . Les pseudoprimes de Fermat à la base 2 sont également appelés nombres de Poulet .an−1≡1(modn) n a
Le premier pseudoprime de Fermat à base (ou premier nombre de Poulet) est , pour lequel nous avons:n = 341 = 11 × 312 n=341=11×31
2 341 - 1 ≡ 1
Cela signifie que notre algorithme va retourner au lieu du 69 e nombre attendu .347341 347
la mise en oeuvre
@PoonLevi a trouvé la solution de 44 octets suivante, qui est directement basée sur :(2)
En utilisant1 21−1≡0(mod1)
<2
au lieu de==1
, nous économisons 1 octet mais nous introduisons dans la séquence, car :2 1 - 1 ≡ 0Essayez-le en ligne!
En commençant par , nous obtenons les termes attendus de 1 car nous faisons une itération de moins:p=2
Essayez-le en ligne!
La dernière astuce consiste à utiliser à la
n<1or
place den and
. C'est tout aussi long, mais la dernière itération renvoie True au lieu de 0 , ajoutant ainsi le décalage manquant à chaque terme.la source
Python 3 , crashoz , 45 octets
Essayez-le en ligne!
L'expressionsin(x) x7
x*60-x**3*10+x**5/2-x**7/84
est la série de Taylor pour jusqu'au terme , multipliée par 60. C'est assez précis sur les entrées utilisées, mais pour des valeurs plus élevées, les deux divergent à mesure que les termes tronqués deviennent plus pertinents.x 7la source
JavaScript (ES6), la réponse d'Arnauld (10 octets)
Essayez-le en ligne!
la source
Haskell , réponse de Laikoni ,
2622 octets-4 octets en n'utilisant pas infix
div
, grâce à Laikoni !Essayez-le en ligne!
Explication
ceiling(realToFrac n/2)
div(n+1)2
la source
((n+1)`div`2)
->div(n+1)2
.> <> , réponse de crashoz 203 octets
Essayez-le en ligne!
J'allais faire quelque chose d'intelligent avec le fait que les nombres pairs / impairs ci
n=20
- dessus étaient les mêmes, sauf pour un élément répété au centre, mais il était plus facile de coder en dur chaque élément.L'entrée se fait via le
-v
drapeau. N'imprime rien pour les éléments supérieurs à 34.la source
Pascal (FPC) , réponse d'AlexRacer , 80 octets
Essayez-le en ligne!
Cela semble une réponse tardive, mais de toute façon merci @AlexRacer pour un bon puzzle!
la source
JavaScript, la réponse de fəˈnɛtɪk (12 octets)
Essai
Alternativement, essayez-le en ligne!
la source
JavaScript, la réponse de fəˈnɛtɪk (17 octets)
x=>Math.exp(x)|1
Essai
Alternativement, essayez-le en ligne!
la source
Husk , déchiffrant 5 octets de BMO avec
32 octets-1 grâce à BMO (
LdΣ
->LΣ
puisque, une fois donné unTnum
,L
effectue "la représentation de la longueur de chaîne")Essayez-le en ligne!
LΣ
←d+16
la source
L
etLd
sont équivalents, vous économisez un octet;)L
remplace comme "la longueur de la représentation des chaînes"Tnum
.> <> , Réponse d'Aiden F. Pierce , 36 octets
Essayez-le en ligne!
Une autre solution avec chaque valeur codée en dur par ligne. Étant donné que la réponse originale était également principalement codée en dur, je ne me sens pas trop coupable à ce sujet.
la source
JavaScript, réponse de fəˈnɛtɪk , 23 octets
Essayez-le en ligne!
Comment?
L'expression se
`${73211e9}`
développe dans la chaîne"73211000000000"
, fournissant une table de recherche de 14 valeurs qui sont soustraites de 14, ce qui donne la séquence attendue.21 octets
NaN
Essayez-le en ligne!
la source