Ze wszystkich lat, w których podejmowałem to wyzwanie, rok 2017 jest pierwszym rokiem, który był liczbą pierwszą. Pytanie dotyczy więc liczb pierwszych i ich właściwości.
Twoim zadaniem jest stworzenie programu lub funkcji, która weźmie dowolną dużą liczbę całkowitą dodatnią jako dane wejściowe i wyprowadzi lub zwróci, niezależnie od tego, czy liczba ma wartość 2,017 - to znaczy, czy największy czynnik pierwszy w tej liczbie wynosi 2,017 lub mniej.
Niektóre przykładowe dane wejściowe i ich wyniki:
1 (has no prime factors)
true
2 (= 2)
true
80 (= 2 x 2 x 2 x 2 x 5)
true
2017 (= 2017)
true
2019 (= 3 x 673)
true
2027 (= 2027)
false
11111 (= 41 x 271)
true
45183 (= 3 x 15061)
false
102349 (= 13 x 7873)
false
999999 (= 3 x 3 x 3 x 7 x 11 x 13 x 37)
true
1234567 (= 127 x 9721)
false
4068289 (= 2017 x 2017)
true
Twój program nie musi dosłownie wyprowadzać true
i false
- żadnych wartości zgodnych z prawdą lub fałszem, aw rzeczywistości dowolne dwa różne wyniki, które są spójne we wszystkich przypadkach prawdziwych i fałszywych, są w porządku.
Nie możesz jednak używać liczb pierwszych w kodzie źródłowym. Liczby pierwsze występują w dwóch rodzajach:
Znaki lub sekwencje znaków reprezentujące literały liczb pierwszych.
Znaki
2
,3
,5
, i7
są nielegalne w językach, w których numery są ważne tokeny.Numer
141
jest nielegalny, ponieważ zawiera41
, mimo że1
i4
jest w inny sposób ważny.Znaki
B
iD
(lubb
id
) są nielegalne w językach, w których są zwykle używane jako 11 i 13, takich jak CJam lub Befunge.
Znaki, które mają wartości Unicode o największej wartości lub zawierają w swoich kodowaniach bajty o największej wartości.
Znaki
%)+/5;=CGIOSYaegkmq
są nielegalne w ASCII, podobnie jak znak powrotu karetki.Znak
ó
jest nielegalny w UTF-8, ponieważ ma0xb3
w nim kodowanie . Jednak w ISO-8859-1 jego kodowanie jest proste0xf3
, które jest złożone i dlatego jest w porządku.
Wygrywa najkrótszy kod do wykonania powyższego w dowolnym języku.
=
wykluczonych języków standardowych ...Odpowiedzi:
Galaretka , 8 bajtów
Wypróbuj online! Pamiętaj, że przypadki testowe 11111 i nowsze są dla TIO trochę za dużo.
Weryfikacja
Walizka testowa 999999 działa od 13 godzin. Jestem pesymistą jeśli chodzi o obliczenia 2025! 4068289 ...
Jak to działa
źródło
(2^n)!
. To także boli dla sześcioformatowych danych wejściowych, ale przynajmniej dane wejściowe są w postaci dziesiętnej, a nie binarnej.Galaretka , 8 znaków, 14 bajtów UTF-8
Wypróbuj online!
Jelly zwykle używa własnej strony kodowej dla programów. Jednak większość jego wbudowanych funkcji związanych z liczbami głównymi zaczyna się od
Æ
, czyli codepoint 13; niezbyt pomocny. Na szczęście interpreter obsługuje również UTF-8, który ma bardziej przyjazne kodowanie.Weryfikacja
Ten program, w UTF-8, zrzuty heksadecymalne:
Weryfikacja, czy wszystkie bajty są złożone:
Weryfikacja, czy wszystkie punkty kodowe Unicode są złożone:
Jedyny token analizowany jako liczba to
90
. Żadne z9
,0
i nie90
są najważniejsze.Wyjaśnienie
Główny wgląd matematyczny tutaj polega na tym, że 45² to 2025 r., Który zgrabnie przypada między 2017 r. (Bieżącym rokiem) a 2027 r. (Następną liczbą pierwszą). Możemy zatem wziąć pierwiastek kwadratowy z każdego pierwiastka liczbowego liczby i sprawdzić, czy którykolwiek przekroczy 45. Niestety, nie możemy pisać z
45
powodu literału5
, więc musimy go podwoić i porównać z 90.źródło
u
jest złożona, więc będzie to tylko kwestia zmiany wyniku, a nie coś, co go unieważni.)Mathematica,
625855 bajtówOstatnie trzy zapisane bajty pochodzą całkowicie od Martina Endera!
Nienazwana funkcja przyjmująca dodatni argument liczby całkowitej i zwracająca
True
lubFalse
.Algorytm rekurencyjny, który
#4<4
jest prawdziwym przypadkiem podstawowym (potrzebujemy go tylko, aby powrócićTrue
na imput 1, ale dodatkowe przypadki podstawowe są w porządku). W przeciwnym razie obliczamy drugi najmniejszy dzielnik (który jest koniecznie liczbą pierwszą) wejścia za pomocąDivisors[#][[6-4]]
; jeśli jest większa niż 2024 (44*46
), to wychodzimy zFalse
, w przeciwnym razie wywołujemy funkcję rekurencyjnie (używając#6
set to#0
) na danych wejściowych podzielonych przez ten mały czynnik pierwszy#
(który musimy wyrazić jako#^-1
iloczyn wejściowy#4
, ponieważ/
jest niedozwolony).Strukturalnie, pierwsza połowa
#4<4||#<44*46&[#^-1#4]&
jest anonimowa funkcja sześciu argumentów, nazywany z argumentamiDivisors[#][[6-4]]
,Null
,Null
,#
,Null
, i#0
; jest to, aby ominąć zakaz na znaki2
,3
i5
.Poprzednia wersja, która oszczędzała cztery bajty, zastępując
8018-6000
je44*46
, inspirowana odpowiedzią Jelly ais523 (Martin Ender również wydawał się zainspirowany komentarzem ais523):To było dość paskudne: wciąż nie wiem, jak ustawić zmienną w Mathematica pod tymi ograniczeniami! Zarówno
=
oraze
wSet
są niedozwolone. Unikanie+
i)
stanowiło również problem, ale nie było zbyt trudne do obejścia kosztem większej liczby bajtów.źródło
#2
również zostanie niedozwolone, więc musisz uważać na to, jak zagnieżdżają się twoje lambdy, a brak nawiasów może to utrudnić.)#4<4||#<44*46&[#^-1#4]&[Divisors[#][[6-4]],,,#,,#0]&
generuje kilka ostrzeżeń, ponieważ próbuje terazDivisors[#][[2]]
upewnić się, że dane wejściowe są większe niż 1 (lub 3), ale wynik jest nadal poprawny.Haskell,
4847 bajtówZasadniczo tłumaczenie odpowiedzi galaretki Dennisa . xnor zapisał bajt.
Zastosowania
[…]!!0
jako nawiasach ponieważ)
jest zakazane, asnd
+divMod
, ponieważm
wmod
irem
jest zakazane.źródło
!!0<1
z<[1]
. Ale wygląda na to, że jest skrócony do użyciadiv
jako[\p n->p^n`div`n*n>p^n-1]!!0$product[1..44*46]
.\n->[0|p<-[product[1..44*46]^n],0<-[p,p-n..0]]
zastosowania, w których wyniki muszą być spójne.Pyke,
10879 bajtówWypróbuj tutaj!
Zaoszczędzono 1 bajt, wykorzystując metodę Dennisa do generowania 2025
źródło
Brachylog ,
910 bajtówWypróbuj online!
Zasadniczo używając tego samego algorytmu, co moja inna odpowiedź.
$ph
znajduje pierwszy (h
) czynnik pierwszy ($p
); jest to największy czynnik główny, ponieważ listy czynników pierwszych Brachylog zmieniają się z największych na najmniejsze. Następnie biorę pierwiastek kwadratowy ($r
), double (*
) i sprawdzam, czy jest mniejszy niż 90 (<90
).Najpierw musiałem podwoić dane wejściowe, ponieważ 1 nie ma czynników pierwszych (a zatem nie ma pierwszego czynnika pierwszego). Dodaje to dodatkowy współczynnik liczby podstawowej 2, który nie ma wpływu na to, czy liczba jest krucha w 2017 r., Ale zapobiega awarii podczas obsługi 1.
źródło
Właściwie 9 bajtów
Dzięki Dennis za wiele bajtów!
Wypróbuj online!
Wyjaśnienie:
źródło
Mathematica,
6674 bajtówDzięki Dennisowi za wskazanie, że
U+F4A1
jest to zabronione.Wyjaśnienie:
Divisors@#
: Lista dzielników całkowitych pierwszego argumentu#
.0<1
: Golf dlaTrue
(unika także użycia literye
).Divisors@d^0
: Lista formularza{1, 1, ..., 1}
o długości równej liczbie dzielnikówd
.Tr
: W przypadku płaskiej listyTr
zwraca sumę tej listy. W ten sposóbTr[Divisors@d^0]
zwraca liczbę dzielnikówd
.Function[{x,d},And[x,Tr[Divisors@d^0]>6-4||d<44*46]]
: Funkcja anonimowa z dwoma argumentamix
id
. Chodzi o to, żed
jest dzielnikiem#
i testujemy, czy jest on złożony, czy mniejszy, czy równy2017
(włącznie).2017
- kruchość jest równoważna wszystkim dzielnikom spełniającym ten warunek. Jak odkryto ais523 , bycie liczbą pierwszą mniejszą lub równą2017
jest równoważne byciu liczbą pierwszą mniejszą niż2025
. Jak zauważył Greg Martin , wystarczy sprawdzić, czy jest mniejszy niż2024=44*46
. Argumentx
działa jak akumulator wskazujący, czy wszystkie dotychczasowe dzielniki spełniają tę właściwość. Następnie opuściliśmyFold
tę funkcję przez wszystkie dzielniki o#
wartości początkowejTrue
, ponieważ nie mamy dostępu ani doMap
ani/@
.źródło
05AB1E , 10 bajtów
Zwraca 1 jeśli prawda, 0 w przeciwnym razie.
Wypróbuj online!
Wyjaśnienie
źródło
MATL , 15 bajtów
Dane wyjściowe
0
dla produktów sypkich1
2017 lub dla produktów sypkich 2017.Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Ten program sprawdza, czy wszystkie bajty są złożone.
Wyjaśnienie
źródło
Bash, 144 bajty
Kodowanie ASCII:
Jak zwykle w przypadku powłoki, kod wyjścia wskazuje powodzenie (0) lub niepowodzenie (inne niż 0).
Jest to w rzeczywistości inna pisownia
Dostajemy największy czynnik z
factor $1|grep -o '[0-9]*$'
;tr -d :
jest szczególnym przypadku dla-wejściowy1
.Wyrażenie
$[6*6*69-466]
przyjmuje wartość do 2018 r.Używanie
tr
nazw poleceń i używanie ich zastępowania było trudne - nie mogłem użyć formy zagnieżdżenia$( )
, więc skończyłem z potokiem do innego Basha, aby ocenić wynik.Wyniki testów:
Potwierdzenie kodów znaków:
źródło
Pyth, 11 bajtów
Wypróbuj online. Zestaw testowy.
Korzysta ze sztuczki Dennisa, aby uzyskać 2025, a następnie sprawdza, czy nie ma większych czynników wejściowych.
źródło
Julia 0,4 ,
843837 bajtówOczekuje argumentu BigInt .
Wypróbuj online! lub sprawdź, czy żaden bajt nie jest liczbą pierwszą .
źródło
Japt , 14 bajtów
Zwraca 1 jeśli prawda, 0 jeśli fałsz.
Wypróbuj tutaj .
źródło
k
ma wartość pierwsząBraingolf , 11 bajtów [bardzo niekonkurencyjny]
Wypróbuj online!
Nieczytelne z powodu tego,
ߢ
które śruby z cyframi, jednak nadal działa w tłumaczu.Nawet nie zauważyłem ograniczeń postaci, kiedy to napisałem, ale wszystko, co musiałem zrobić, to zmienić dziwną postać Unicode z 2017 na 2018.
Biorąc pod uwagę, że 2018 nie jest liczbą pierwszą, każda liczba pierwsza
<= 2018
jest również<= 2017
Wyjaśnienie
źródło