La tâche
Dans ce défi, votre tâche consiste à écrire un programme dans un langage de programmation L qui prend un entier positif n et génère la somme des diviseurs appropriés de n ( séquence A001065 sur OEIS). Il doit renvoyer la sortie correcte pour tout 1 ≤ n ≤ 10 000 . Voici les 10 premières sorties:
0, 1, 1, 3, 1, 6, 1, 7, 4, 8
De plus, votre programme doit être un faux polyglotte , ce qui signifie ce qui suit. C'est un programme valide dans un autre langage de programmation L ' , et pour chaque entrée 1 ≤ n ≤ 10 (les cas de test ci-dessus), il retourne la somme des diviseurs propres de n , mais il en existe 11 ≤ n ≤ 10 000 pour lesquels il ne renvoie pas le résultat correct. Il peut renvoyer quelque chose de incorrect, boucler pour toujours, planter, etc. Il peut donner un mauvais résultat pour tous n ≥ 11 , pour certains d'entre eux ou un seul.
Règles et notation
Vous pouvez écrire un programme complet ou une fonction, et vous pouvez avoir différents moyens d'entrée et de sortie dans les deux langues. Le nombre d'octets le plus bas gagne. Les règles de code-golf standard s'appliquent. Dans ce défi, différentes versions principales ou implémentations d'un langage sont considérées comme distinctes.
Notez que si vous utilisez des langages de programmation avec des encodages non ASCII (comme beaucoup le font sur ce site), la même séquence d'octets doit être utilisée pour les deux langages. Cela signifie que vous devez soit convertir entre des pages de codes potentiellement différentes, soit subir des pénalités pour les caractères Unicode multi-octets.
Cas de test supplémentaires
20 -> 22
36 -> 55
180 -> 366
997 -> 1
2875 -> 869
10000 -> 14211
Python 2 et Python 3, 58 octets
TIO pour Python 2
TIO pour Python 3
Cela fonctionne en python 2, mais pour chaque n> 10, il produirait 0 en python 3.
Tout cela en raison d'approches différentes pour comparer les chaînes avec les octets:
'' == b''
'' != b''
la source
JavaScript (Node.js) et PHP ,
7370 octetsDans les deux langues, il s'agit d'une fonction anonyme. JavaScript donne le résultat correct, mais PHP donne 0 pour tout n> = 11 .
Essayez-le JS!
Essayez-le PHP!
Comment ça marche
Les deux langues font la même chose au début: itérer de 1 à n-1, en gardant une somme cumulée de tous les nombres i pour lesquels n% i = 0 .
Ce qui cause la différence de comportement est la dernière partie:
En JavaScript,
"$n"
est juste un littéral de chaîne. La comparaison>
avec le10
convertit implicitement en nombre, mais comme il ne ressemble pas à un nombre, il devient NaN. NaN donne faux par rapport à un nombre de quelque façon. En conséquence,$d
est toujours retourné.Cependant, en PHP,
"$n"
est une chaîne contenant la valeur de$n
. Lorsque PHP convertit cela en un nombre, cela devient simplement la valeur de$n
. S'il est supérieur à10
, il0
est renvoyé à la place de$d
.la source
05AB1E / Jelly ,
98 octetsLe code octet (hexadécimal):
L'utilisation de la page de codes de Jelly renvoie des résultats incorrects pour tout nombre excessif (par exemple, une entrée de 12 renvoie
12
plutôt que16
):Essayez-le en ligne!
L'utilisation de la page de codes de 05AB1E renvoie des résultats corrects:
Essayez-le en ligne!
Comment?
05AB1E analyse jusqu'à et y compris le
71
(q
) qui ordonne d'arrêter de fumer, puis arrête l' analyse:Jelly analyse l'ensemble du programme à l'avance comme trois liens en raison de l'effet des octets sans signification assignée
ƭ
etq
agissant comme des délimiteurs. Le point d'entrée d'un programme est son lien final:la source
ÆḌSD
enregistre un octet.ÆḌSṚ
.Python 3 / Python 2 ,
646058 octetsMerci à @officialaimm pour 2 octets de moins
En Python 3, cela donne les résultats corrects. En Python 2, la sortie est incorrecte pour les entrées dépassant
10
. Le code exploite l'arrondi bancaire, ce qui est fait par Python 3 mais pas par Python 2.Essayez-le en ligne! Python 3 (correct), Python 2 (mauvais pour
n > 10
).la source
[ ]
.Python 3 / Python 2 , 47 octets
Une fonction sans nom, fausse en Python 2.
Essayez-le en ligne pour Python 3 ou Python 2
En Python 2,
/
c'est la division entière avec des arguments entiers, tandis qu'en Python 3, c'est la division.Lorsque
n
dépasse 10, il est10/n
évalué à 0 en Python 2, mais à un petit nombre positif en Python 3 (cela est certainement vrai jusqu'au maximum requis de 10 000 au moins).En tant que tel, il
10/n>0
évalue àTrue
pour Python 3 etrange(10/n>0,n)
est équivalent àrange(1,n)
tandis que dans Python 2 il10/n>0
évalue àFalse
quandn
dépasse 10, après quoi ilrange(10/n>0,n)
devient équivalent àrange(0,n)
provoquern%d
une tentative d'effectuer une arithmétique modulo zéro, augmentant aZeroDivisionError
.la source
Gelée / 05AB1E , 12 octets
Ce que Jelly voit:
Essayez-le en ligne!
Explication:
q
n'est pas pris en charge dans Jelly, donc Jelly ne "voit" que ce qui est aprèsq
.Ce que 05AB1E voit:
Essayez-le en ligne!
Explication:
Bien sûr, tout ce qui se passe après "quitter" ne se produit pas.
la source
ÆḌS
aurait été valable en soi ... Réponse extraordinaire!мλS
cela fonctionnerait dans 05AB1E.