Tło:
Obecne wyzwanie Perfect Numbers jest raczej wadliwe i skomplikowane, ponieważ wymaga od ciebie wyjścia w złożonym formacie z uwzględnieniem czynników liczby. Jest to repost wyłącznie problemu decyzyjnego .
Wyzwanie
Biorąc pod uwagę dodatnią liczbę całkowitą za pośrednictwem dowolnego standardowego formatu wejściowego , rozróżnij, czy jest ona idealna, czy nie.
Liczba doskonała to liczba równa sumie wszystkich jej właściwych dzielników (jej dodatnich dzielników mniej niż siebie). Na przykład jest liczbą idealną, ponieważ jej dzielniki wynoszą , co daje sumę do , a nie jest liczbą idealną, ponieważ jej dzielniki ( ) sumują się do , nie .
Przypadki testowe:
Imperfect:
1,12,13,18,20,1000,33550335
Perfect:
6,28,496,8128,33550336,8589869056
Zasady
- Twój program nie musi wypełniać większych przypadków testowych, jeśli istnieją ograniczenia pamięciowe lub czasowe, ale powinien teoretycznie być w stanie, gdyby otrzymał więcej pamięci / czasu.
- Dane wyjściowe mogą mieć dwie różne i spójne wartości w dowolnym dozwolonym formacie wyjściowym . Jeśli nie jest od razu oczywiste, co reprezentuje Doskonały / Niedoskonały, prosimy o podanie w swojej odpowiedzi.
1
byłaby idealna, ponieważ każda liczba jest podzielna1
sama z siebie. Suma właściwych dzielników1
wynosi0
Odpowiedzi:
Brachylog , 4 bajty
Wypróbuj online!
Predykatowi udaje się uzyskać idealne dane wejściowe, a nieudanym - niedokładne dane wejściowe, drukowanie
true.
lubfalse.
uruchomienie jako kompletny program (z wyjątkiem ostatniego przypadku testowego, który zajmuje więcej niż minutę na TIO).źródło
fk
: xNeim , 3 bajty
Wypróbuj online!
(Właściwie nie wiem, jak uruchomić wszystkie przypadki testowe jednocześnie, ponieważ zacząłem uczyć się Neima około piętnaście minut temu, ale sprawdziłem je indywidualnie).
Drukuje 0 za niedoskonałe, 1 za idealne.
źródło
𝔼
1 bajt? Czy Neim używa tylko 128 takich niestandardowych znaków?R ,
3329 bajtówWypróbuj online!
Zwraca
TRUE
liczby idealne iFALSE
niedoskonałe.źródło
0
(idealny)FALSE
i niezerowy,TRUE
ale usunąłem jeden z nich, aby odwrócić odwzorowanie. Jest to przydatne do golfa sztuczka z obsadąnumeric
dological
, często w połączeniu zwhich
lub[
.Galaretka , 3 bajty
Wypróbuj online!
źródło
Japt
-!
, 4 bajtyZ jakiegoś powodu
¦
nie działa na Tio, więc muszę użyć-!
flagi i¥
zamiast tegoWypróbuj online!
źródło
U
nie jest wcześniej automatycznie wstawiany!
.Python 3 , 46 bajtów
Wypróbuj online!
Brutalna siła, sumuje czynniki i sprawdza równość.
źródło
lambda x:sum(i for i in range(1,x)if x%i<1)^x
powinno również działać.Python , 45 bajtów
True
dla idealnego;False
dla innych (przełącz to za pomocą==
->!=
)Wypróbuj online!
44 4241 bajtów (-2 dzięki ovs), jeśli możemy wyprowadzać dane używając „truey vs falsey”:(falsey (
0
)) dla ideału; prawda (liczba całkowita niezerowa) w przeciwnym razieźródło
Oktawa , 25 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript, 38 bajtów
Wypróbuj online!
(Limit czasu ostatniej próby w TIO.)
źródło
f=
po konwersji z funkcji rekurencyjnej.C # (interaktywny kompilator Visual C #) , 46 bajtów
Zwraca 0, jeśli jest idealne, w przeciwnym razie zwraca liczbę dodatnią. Nie wiem, czy wypuszczanie różnych typów liczb całkowitych jest dozwolone zamiast dwóch odrębnych wartości prawdy i fałszu, i nie mogłem znaleźć dyskusji na temat meta na ten temat. Jeśli jest to nieważne, usunę go.
Wypróbuj online!
C # (interaktywny kompilator Visual C #) ,
4947 bajtówWypróbuj online!
źródło
Ruby , 33 bajty
Wypróbuj online!
źródło
TI-BASIC (TI-84),
3023 bajtówStrasznie nieefektywne, ale działa.Zmniejszenie liczby bajtów znacznie przyspieszyło program.
Wejście jest w
Ans
.Wyjście jest w
Ans
i są automatycznie drukowane po zakończeniu programu.Objaśnienie:
(TI-BASIC nie ma komentarzy, więc załóżmy, że
;
robi komentarz)Przykład:
Uwaga: Liczba bajtów programu jest obliczana przy użyciu wartości w [MEM] > [2] > [7] (36 bajtów), a następnie odejmując długość nazwy programu
CDGF2
, (5 bajtów) i dodatkowe 8 bajtów używanych dla przechowywanie programu:36 - 5 - 8 = 23 bajty
źródło
Java (JDK) , 54 bajty
Wypróbuj online!
Chociaż dla ścisłego dopasowania liczby do liczby następujące, zwrócą te same wartości, ale tylko 40 bajtów.
Wypróbuj online!
źródło
Your program doesn't have to complete the larger test cases, if there's memory or time constraints, but it should be theoretically able to if it were given more memory/time.
int
, a raczejBigInteger
? Ponieważ Java maBigIntegers
, ale nigdy nie będzie miałaint
więcej niż 31 bitów zgodnie z podpisem, które nie mogą mieć żadnej innej wartości niż te tutaj reprezentowane ...int
typ był nieograniczonyMontaż x86,
4543 bajtów.Wyjaśnienie (składnia Intel):
Dane wejściowe należy podać w
EAX
.Zestawy funkcji
EAX
do1
idealnego i do0
za niedoskonałe.Edycja : zredukowany Liczba bajtów w dwóch zastępując
MOV EAX, $1
zXOR EAX, EAX
aINC EAX
źródło
Labirynt , 80 bajtów
Znaki łacińskie
perfect puts zero else neg I
są w rzeczywistości tylko komentarzami *.tzn. jeśli dane wejściowe są idealne,
0
drukowane jest, w przeciwnym razie-1
jestWypróbuj online!
* więc to lub to też działa ...
W jaki sposób?
Przyjmuje jako dane wejściowe dodatnią liczbę całkowitą
n
i umieszcza zmienną akumulatora-n
na stosie pomocniczym, a następnie wykonuje test podzielności dla każdej liczby całkowitej od wn-1
dół do włącznie1
, dodając dowolne, które dzieląn
do akumulatora. Po zakończeniu tej czynności, jeżeli zmienna akumulatora jest niezerowa,-1
wyprowadzane jest a , w przeciwnym razie a0
jest.?::`}:(
Jest wykonywany tylko raz, na początku realizacji:Następna instrukcja,
"
to brak operacji, ale mamy trzy sąsiednie instrukcje, więc rozgałęziamy się zgodnie z wartością na górze Main, zero prowadzi nas do przodu, a niezerowe prowadzi nas w prawo.Jeśli dane wejściowe
1
byłyby kontynuowane, ponieważ górna część Main ma zero:Ale jeśli dane wejściowe były większe niż
1
skręcamy w prawo, ponieważ góra Main jest różna od zera:W tym momencie mamy oddział trzech sąsiadów, ale wiemy, że
n-1
jest niezerowy, więc skręcamy w prawo ...Jesteśmy teraz w innym oddziale trzech sąsiadów w
%
.Jeśli wynik
%
był niezerowy, idziemy w lewo, aby zmniejszyć nasz potencjalny dzielnikp=p-1
, i opuścić akumulatora
, ponieważ jest:... ale jeśli wynik
%
był zerowy (dla pierwszego przejścia tylko wtedyn=2
)a=a+p
, przejdźmy DO ZARÓWNO dodajmy dzielnik do naszego akumulatora , ORAZ zmniejszamy nasz potencjalny dzielnikp=p-1
:W tym momencie, jeśli
p-1
nadal nie jest zero, skręcamy w lewo:... ale jeśli
p-1
osiągniemy zero, przejdziemy prosto do:
drugiej linii labiryntu (widziałeś już wszystkie instrukcje wcześniej, więc pomijam ich opisy i po prostu daję efekt):Teraz
{
ma trzy sąsiednie instrukcje, więc ...... jeśli
a
wynosi zero, co będzie idealnen
, to idziemy prosto:... jeśli
a
jest niezerowe, co będzie niedokładnen
, wówczas skręcamy w lewo:źródło
CJam , 17 bajtów
Wypróbuj online!
źródło
JavaScript, 62
Wyjaśnienie (chociaż jest to dość proste)
Dzięki Jo King za ulepszenie!
źródło
05AB1E , 4 bajty
Wypróbuj online!
Wyjaśnienie
źródło
PowerShell,
46 bajtów43 bajtyWypróbuj online!
Edycja: -3 bajty dzięki @AdmBorkBork
źródło
2*$i
aby wyeliminować pareny odejmujące jeden.C (gcc) , 41 bajtów
Wypróbuj online!
Daj mi znać, jeśli to niepowodzenie w ostatniej sprawie jest problemem.
źródło
n=!s;
zamiastreturn!s;
zapisać 5 bajtów.s=s
który bardziej niż prawdopodobnie został zoptymalizowany.Smalltalk, 34 bajty
źródło
Dalej (gforth) , 45 bajtów
Wypróbuj online!
Wyjaśnienie
Zapętla każdą liczbę od 1 do n-1, sumując wszystkie wartości, które dzielą n idealnie. Zwraca true, jeśli suma jest równa n
Wyjaśnienie kodu
źródło
Pyth , 9
13bajtówWypróbuj online!
Dziękuję komentatorom za pomoc w golfie
Znajduje wszystkie czynniki wejściowe, sumuje je i porównuje z oryginalnymi danymi wejściowymi.
źródło
q0
można je zastąpić!
iSQ
daje zasięg[1-Q]
, dzięki czemu zasięg[1-Q)
można wygenerować za pomocąStQ
. PonieważQ
s są już na końcu programu, oba można pominąć. Wersja Fettled, 9 bajtów -qsf!%QTSt
Partia, 81 bajtów
Pobiera
n
jako parametr wiersza polecenia i wypisuje,1
jeśli jest to liczba idealna. Metoda brute force rozpoczyna sumę od,-n
aby mogła się włączyćn
do pętli.źródło
Węgiel drzewny , 13 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjścia
-
dla idealnych liczb. Używa brutalnej siły. Wyjaśnienie:źródło
Wolfram Language (Mathematica) , 14 bajtów
Wypróbuj online!
źródło
Pyth, 8 bajtów
Wypróbuj online tutaj .
źródło
Retina 0.8.2 , 44 bajty
Wypróbuj online! Używa brutalnej siły, więc link zawiera tylko szybsze przypadki testowe. Wyjaśnienie:
Konwertuj na unary.
Dopasuj wszystkie czynniki wejściowe. Wykorzystuje to tryb nakładania się, który w Retina 0.8.2 wymaga, aby wszystkie mecze zaczynały się na różnych pozycjach, więc mecze są zwracane w kolejności malejącej, zaczynając od oryginalnych danych wejściowych.
Odejmij odpowiednie dane wejściowe.
Sprawdź, czy wynik wynosi zero.
źródło
Java 8, 66 bajtów
Ktoś musi kiedyś użyć interfejsu API strumienia, nawet jeśli jest to krótszy sposób
Wypróbuj online!
źródło
cQuents , 8 bajtów
Wypróbuj online!
Wyjaśnienie
źródło