Zadanie
W tym wyzwaniu Twoim zadaniem jest napisanie programu w języku programowania L, który przyjmuje dodatnią liczbę całkowitą n i wyprowadza sumę odpowiednich dzielników n ( sekwencja A001065 na OEIS). Powinien zwrócić poprawny wynik dla dowolnego 1 ≤ n ≤ 10 000 . Oto pierwsze 10 wyników:
0, 1, 1, 3, 1, 6, 1, 7, 4, 8
Co więcej, twój program musi być fałszywym poliglotą , co oznacza: Jest to poprawny program w innym języku programowania L ' i dla każdego wejścia 1 ≤ n ≤ 10 (przypadki testowe powyżej) zwraca sumę właściwych dzielników n , ale istnieje około 11 ≤ n ≤ 10 000, dla których nie zwraca poprawnego wyniku. Może zwrócić coś niepoprawnego, zapętlić na zawsze, zawiesić itp. Może dać zły wynik dla wszystkich n ≥ 11 , dla niektórych lub tylko jednego.
Zasady i punktacja
Możesz napisać pełny program lub funkcję i możesz mieć różne sposoby wprowadzania i wyświetlania w dwóch językach. Wygrywa najniższa liczba bajtów. Obowiązują standardowe zasady gry w golfa . W tym wyzwaniu różne główne wersje lub implementacje języka są uważane za odrębne.
Zauważ, że jeśli używasz języków programowania z kodowaniem innym niż ASCII (jak wiele osób robi to na tej stronie), w obu językach należy użyć tej samej sekwencji bajtów . Oznacza to, że musisz albo konwertować między potencjalnie różnymi stronami kodowymi, albo ponosić kary za wielobajtowe znaki Unicode.
Dodatkowe przypadki testowe
20 -> 22
36 -> 55
180 -> 366
997 -> 1
2875 -> 869
10000 -> 14211
Python 2 i Python 3, 58 bajtów
TIO dla Python 2
TIO dla Python 3
Działa w Pythonie 2, ale dla każdego n> 10 wyświetla 0 w Pythonie 3.
Wszystko z powodu różnych podejść do porównywania ciągów z bajtami:
'' == b''
'' != b''
źródło
JavaScript (Node.js) i PHP ,
7370 bajtówW obu językach jest to funkcja anonimowa. JavaScript daje poprawny wynik, ale PHP daje 0 dla wszystkich n> = 11 .
Wypróbuj JS!
Wypróbuj PHP!
Jak to działa
Oba języki na początku robią to samo: iterują od 1 do n-1, zachowując bieżącą sumę wszystkich liczb i, dla których n% i = 0 .
To, co powoduje różnicę w zachowaniu, to ostatnia część:
W JavaScript
"$n"
jest dosłownie ciągiem znaków. Porównanie>
z10
rzutuje domyślnie na liczbę, ale ponieważ nie wygląda jak liczba, staje się NaN. NaN daje fałsz w porównaniu z liczbą w jakikolwiek sposób. W rezultacie$d
zawsze jest zwracany.Jednak w PHP
"$n"
jest ciągiem zawierającym wartość$n
. Kiedy PHP rzuca to na liczbę, staje się po prostu wartością$n
. Jeśli jest większy niż10
, to0
jest zwracane zamiast$d
.źródło
05AB1E / galaretka ,
98 bajtówKod bajtowy (szesnastkowy):
Użycie strony kodowej Jelly zwraca nieprawidłowe wyniki dla dowolnej nadmiernej liczby (np. Wprowadzenie 12 zwraca
12
zamiast16
):Wypróbuj online!
Użycie strony kodowej 05AB1E zwraca prawidłowe wyniki:
Wypróbuj online!
W jaki sposób?
05AB1E analizuje do włącznie
71
(q
), która nakazuje wyjść, a następnie przestaje analizować:Galaretka analizuje cały program z góry jako trzy łącza ze względu na działanie bajtów bez przypisanego znaczenia
ƭ
iq
działające jako ograniczniki. Punktem wejścia programu jest jego ostatni link:źródło
ÆḌSD
zapisuje bajt.ÆḌSṚ
.Python 3 / Python 2 ,
646058 bajtówDzięki @officialaimm za 2 bajty wyłączone
W Pythonie 3 daje to prawidłowe wyniki. W Pythonie 2 wyjście jest niepoprawne dla wejść przekraczających
10
. Kod wykorzystuje zaokrąglanie bankiera, które jest wykonywane przez Python 3, ale nie przez Python 2.Wypróbuj online! Python 3 (poprawny), Python 2 (niewłaściwy dla
n > 10
).źródło
[ ]
.Python 3 / Python 2 , 47 bajtów
Funkcja nienazwana, fałszywa w Pythonie 2.
Wypróbuj online dla Python 3 lub Python 2
W Pythonie 2
/
jest dzielenie całkowite z argumentami liczb całkowitych, podczas gdy w Pythonie 3 jest to dzielenie.Gdy
n
przekracza 10, w Pythonie 210/n
jest 0 , ale do małej dodatniej liczby w Pythonie 3 (jest to z pewnością prawda do maksymalnej wymaganej liczby co najmniej 10 000 ).Jako takie
10/n>0
ZwracaTrue
Pythona 3 irange(10/n>0,n)
odpowiadarange(1,n)
, podczas gdy w Pythonie 210/n>0
ocenia sięFalse
, gdyn
przekracza 10, w wyniku czegorange(10/n>0,n)
staje się odpowiednikiemrange(0,n)
powodującn%d
próba wykonania arytmetyka modulo zera, unoszącZeroDivisionError
.źródło
Galaretka / 05AB1E , 12 bajtów
Co widzi Jelly:
Wypróbuj online!
Wyjaśnienie:
q
nie jest obsługiwany w Jelly, więc Jelly „widzi” tylko to, co następuje poq
.Co widzi 05AB1E:
Wypróbuj online!
Wyjaśnienie:
Oczywiście wszystko po „wyjściu” tak naprawdę się nie dzieje.
źródło
ÆḌS
był ważny sam ... Niezwykła odpowiedź!мλS
działałoby to w 05AB1E.