Die Aufgabe
In dieser Herausforderung besteht Ihre Aufgabe darin, ein Programm in einer Programmiersprache L zu schreiben , die eine positive ganze Zahl n annimmt und die Summe der richtigen Teiler von n ausgibt ( Sequenz A001065 auf OEIS). Es sollte die korrekte Ausgabe für 1 ≤ n ≤ 10 000 zurückgeben . Hier sind die ersten 10 Ausgänge:
0, 1, 1, 3, 1, 6, 1, 7, 4, 8
Außerdem muss Ihr Programm ein gefälschter Polyglot sein , was Folgendes bedeutet. Es ist ein gültiges Programm in einer anderen Programmiersprache L ' und gibt für jede Eingabe 1 ≤ n ≤ 10 (die obigen Testfälle) die Summe der richtigen Teiler von n zurück , es gibt jedoch einige 11 ≤ n ≤ 10 000 für die es gibt nicht das richtige Ergebnis zurück. Es kann etwas Falsches zurückgeben, eine Endlosschleife bilden, abstürzen usw. Es kann ein falsches Ergebnis für alle n ≥ 11 geben , für einige von ihnen oder nur für einen.
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben und in den beiden Sprachen unterschiedliche Ein- und Ausgabemöglichkeiten haben. Die niedrigste Byteanzahl gewinnt. Es gelten die Standardregeln für Code-Golf . Bei dieser Herausforderung werden verschiedene Hauptversionen oder Implementierungen einer Sprache als unterschiedlich betrachtet.
Beachten Sie, dass bei Verwendung von Programmiersprachen mit Nicht-ASCII-Codierungen (wie dies auf dieser Site häufig der Fall ist) für beide Sprachen dieselbe Bytefolge verwendet werden muss. Dies bedeutet, dass Sie entweder zwischen potenziell unterschiedlichen Codepages konvertieren müssen oder Strafen für Mehrbyte-Unicode-Zeichen erleiden müssen.
Zusätzliche Testfälle
20 -> 22
36 -> 55
180 -> 366
997 -> 1
2875 -> 869
10000 -> 14211
Python 2 und Python 3, 58 Bytes
TIO für Python 2
TIO für Python 3
Es funktioniert in Python 2, aber für jedes n> 10 würde es in Python 3 0 ausgeben. Dies liegt
an unterschiedlichen Ansätzen beim Vergleichen von Strings mit Bytes:
'' == b''
'' != b''
quelle
JavaScript (Node.js) und PHP ,
73-70ByteIn beiden Sprachen ist dies eine anonyme Funktion. JavaScript liefert das richtige Ergebnis, aber PHP liefert 0 für alle n> = 11 .
Probieren Sie es aus JS!
Probieren Sie es aus PHP!
Wie es funktioniert
Beide Sprachen machen zunächst das Gleiche: Iterieren Sie von 1 bis n-1 und behalten Sie dabei eine laufende Summe aller Zahlen i bei, für die n% i = 0 ist .
Was den Unterschied im Verhalten verursacht, ist der letzte Teil:
In JavaScript
"$n"
ist dies nur ein String-Literal. Der Vergleich>
mit10
wandelt es implizit in eine Zahl um, aber da es nicht wie eine Zahl aussieht, wird es zu NaN. NaN gibt falsch, wenn es mit einer Zahl in irgendeiner Weise verglichen wird. Infolgedessen$d
wird immer zurückgegeben.In PHP
"$n"
ist dies jedoch eine Zeichenfolge, die den Wert von enthält$n
. Wenn PHP dies in eine Zahl umwandelt, wird es einfach zum Wert von$n
. Wenn es größer als ist10
,0
wird anstelle von zurückgegeben$d
.quelle
05AB1E / Jelly ,
98 BytesDer Byte-Code (hexadezimal):
Mit Jelly - Code-Seite gibt falsche Ergebnisse für jede übermäßige Zahl (zB eine Eingabe von 12 zurückkehrt ,
12
statt16
):Probieren Sie es online!
Bei Verwendung der Codepage von 05AB1E werden korrekte Ergebnisse zurückgegeben:
Probieren Sie es online!
Wie?
05AB1E parst bis einschließlich
71
(q
), das zum Beenden auffordert, und beendet dann das Parsen:Jelly analysiert das gesamte Programm im Voraus als drei Verknüpfungen, da die Bytes ohne zugewiesene Bedeutung wirken
ƭ
undq
als Begrenzer fungieren. Der Einstiegspunkt eines Programms ist das letzte Glied:quelle
ÆḌSD
Speichert ein Byte.ÆḌSṚ
.Python 3 / Python 2 ,
646058 BytesVielen Dank an @officialaimm für 2 Bytes aus
In Python 3 liefert dies die richtigen Ergebnisse. In Python 2 ist die Ausgabe bei Eingaben über falsch
10
. Der Code nutzt die Rundung des Bankers, die von Python 3, aber nicht von Python 2 ausgeführt wird.Probieren Sie es online! Python 3 (richtig), Python 2 (falsch für
n > 10
).quelle
[ ]
.Python 3 / Python 2 , 47 Bytes
Eine unbenannte Funktion, die in Python 2 gefälscht ist.
Probieren Sie es online für Python 3 oder Python 2
In Python 2
/
ist es eine Ganzzahldivision mit Ganzzahlargumenten, während es in Python 3 eine Division ist.Wenn 10
n
überschritten wird , ergibt dies in Python 2 den Wert 0, in Python 3 jedoch einen kleinen positiven Wert (dies gilt sicherlich bis zu dem von mindestens 10.000 geforderten Maximum ).10/n
Als solche
10/n>0
ausgewertetTrue
für Python und 3range(10/n>0,n)
entspricht ,range(1,n)
während in Python 210/n>0
ausgewertet ,False
wennn
mehr als 10 , woraufhinrange(10/n>0,n)
auf äquivalente wirdrange(0,n)
bewirkt ,n%d
um zu versuchen modulo Null Arithmetik durchzuführen, eine AnhebungZeroDivisionError
.quelle
Jelly / 05AB1E , 12 Bytes
Was Jelly sieht:
Probieren Sie es online!
Erläuterung:
q
wird in Jelly nicht unterstützt, daher "sieht" Jelly nur, was nach demq
.Was 05AB1E sieht:
Probieren Sie es online!
Erläuterung:
Natürlich passiert nicht alles nach dem "Beenden".
quelle
ÆḌS
wäre für sich allein gültig gewesen ... Außergewöhnliche Antwort!мλS
das in 05AB1E funktionieren würde.