Otrzymujesz funkcje: h1 (f, * args) i h2 (f, * args)
Obie są metodami, które są już dla Ciebie zdefiniowane (tutaj gwiazdka wskazuje zmienną liczbę argumentów)
f jest funkcją, * args to lista parametrów, które należy przekazać tej funkcji
h1 zwraca wartość logiczną: Prawda, jeśli funkcja f kiedykolwiek się zatrzymuje po wywołaniu * args, a False, jeśli nie (zakładając, że uruchomiona maszyna ma nieskończony czas i pamięć oraz że interpreter / kompilator języka, w którym piszesz umie obsługiwać nieskończony czas i pamięć).
Jeśli f (* args) kiedykolwiek wykona wywołanie do h1 lub h2, h1 zgłasza wyjątek
h2 zachowuje się dokładnie tak, jak h1, z wyjątkiem tego, że jeśli f wywoła h1, wówczas h2 nie zgłosi wyjątku
W jak najmniejszej liczbie znaków napisz program, który nie pobiera danych wejściowych i powinien wypisać:
The Collatz Conjecture is {True/False}
Goldbach's Conjecture is {True/False}
The Twin Primes Conjecture is {True/False}
na podstawie ważności każdej z tych przypuszczeń.
Oto linki do Wikipedii wyjaśniające każdą z przypuszczeń:
http://en.wikipedia.org/wiki/Collatz_conjecture
http://en.wikipedia.org/wiki/Goldbach%27s_conjecture
http://en.wikipedia.org/wiki/Twin_prime
Możesz założyć, że dowolna duża biblioteka liczb całkowitych w dowolnym języku, który wybierzesz, z powodzeniem reprezentuje dowolne duże liczby całkowite. Innymi słowy, założymy, że każdy język / biblioteka, która jest zdolna do wyrażania, 3**(3**10)
jest również zdolna do wyrażania 3**(3**(3**10))
na wystarczająco mocnej maszynie.
Oczywiście, ponieważ nie można uruchomić programu, proszę wyjaśnić, jak działa on wraz z kodem
Odpowiedzi:
J, 207
Zdecydowałem się użyć
f
ig
zamiasth1
ih2
, zgodnie z nagrodą; wystarczą dwie dodatkowe linie z 10 znakami wcześniej:f=:h1
,g=:h2
.I rzeczywista logika:
Collatz
((-:`>:@*&3)^:(~:&1))^:_
jest jego mięsem; jest to w zasadzie pętlawhile (x != 1) x = collatz(x)
. Jeśli nazwiemy to zdaniereduce
:reduce&f
ma być czasownikiem monadycznym (patrz koniec), gdziereduce&f n
jest prawdziwe, gdyreduce(n)
zatrzymuje się. Pozostałe bity pętli y>:^:()^:_
są w zasadzie nieskończoną pętlą (>:
jest to przyrost,^:
może być używany jako warunek i iterator), który pęka po napotkaniu redukcji Collatza, która się nie zatrzymuje. W końcug
wywoływane jest, aby sprawdzić, czy nieskończona pętla kiedykolwiek się zakończy.Goldbach
Ta sama logika w przeważającej części, oczywistą różnicą jest teraz obliczenie rdzenia
+./@1&p:@(-p:@_1&p:)
.-p:@_1&p:
oblicza różnicę między liczbą a wszystkimi liczbami pierwszymi mniejszymi od tej liczby,1&p:
jestisPrime
funkcją i+./
jest logicznym OR. Zatem jeśli różnica między liczbą a dowolną liczbą pierwszą mniejszą od tej liczby jest również liczbą pierwszą, wówczas hipoteza Goldbacha jest spełniona, a pętla nieskończona trwa dalej. Znówf
jest stosowany w końcowym teście, czy wspomniana nieskończona pętla jest naprawdę nieskończona.Twin Primes
Taki sam jak powyżej, z wyjątkiem tego, że
(4&p:)^:(2&~:@(-~4&p:))
.4&p:
zwraca następną największą liczbę pierwszą po podanej liczbie.-~4&p:
zwraca różnicę między liczbą a następną największą liczbą pierwszą po niej.2&~:
jest!= 2
. Zatem najbardziej wewnętrzna pętla jest analogiczna dowhile (nextPrimeAfter(p) - p != 2) p = nextPrimeAfter(p)
.Notatki
Nie mogą być błędy składniowe, bo nie testowałem z manekina
f
ig
jeszcze. Przyjąłem tof
ig
przybierze formę, którą można skomponować z czasownikiem po lewej stronie i rzeczownikiem po prawej stronie, co nie jestem całkowicie pewien, że w jakikolwiek sposób przestrzega gramatyki J. Są one z natury funkcjami wyższego rzędu, a ja jestem zbyt zmęczony, by szukać odpowiedniej konstrukcji jako przysłówków / spójników / what-have-you w tej chwili, jeśli istnieje nawet taka odpowiednia konstrukcja.Tak naprawdę nie użyłem właściwej konkatenacji ciągów, a zamiast tego zdecydowałem się pozostawić pojedyncze ciągi w pudełku. Dane wyjściowe (zakładając, że wszystko inne jest poprawne) byłyby zatem tabelą z trzema kolumnami, przy czym lewa kolumna to „The Collatz” itp., Środkowa kolumna to „Conjecture is”, a prawa kolumna „True” / „False” .
Jestem też całkiem pewien, że J domyślnie nie konwertuje liczb całkowitych na dowolną dokładność, a kluczowa funkcja użyteczności liczb pierwszych
p:
nie ma arbitralnie dużej domeny. Z drugiej strony, biorąc pod uwagę, że J obsługuje standardowy typ liczb o dowolnej dokładności, nie jestem pewien, ile wysiłku wymagałoby doprowadzenie tego kodu do wartości nominalnej.źródło
Haskell, 242
ponieważ w Haskell zmienne mogą zawierać nie tylko wartości, ale także obliczenia (to się nazywa lenistwo), pozwalam sobie
h1, h2
wziąć jeden argument i powrócić, czy nie, jego ocena się zatrzyma.nieco nieznany kod:
trochę wyjaśnienia:
gdy
all
jest stosowana do listy nieskończonym, to powstrzymanie IFF jeden z elementów listy jestFalse
powodu lenistwa (zwarcie, dla wszystkich osób spoza Haskell). używamy tego do obliczenia hipotezy collatz i hipotezy bliźniaczych liczb pierwszych.!
pakuje to oszustwo wraz z drukowaniem. wynikiem jest,True
gdyf
kończy się na wszystkich liczbach4..
. (nie ma to znaczenia dla hipotezy collatz lub hipotezy podwójnych liczb pierwszych, ponieważ wiemy już, że są prawdziwe dla tak małych liczb).kod dla przypuszczenia collatz to
"The Collatz"!c
. wypisuje „The Collatz Conjecture is”, a wynik, którym jest pogoda,c
kończy się na wszystkich liczbach4..
.kod hipotezy Goldbacha to
"Goldbach's"! \n->or[p$n-r|r<-[2..n-2],p r]
.\n->or[p$n-r|r<-[2..],p r,r<n+1]
jest funkcją, któran
, jeśli jest sumą dwóch liczb pierwszych, zwracaTrue
, ale poza tym zapętla się w nieskończoność. więc jeśli zatrzyma się na każdym4..
hipotezy Goldbacha, jest to prawdą.kodem domniemania podwójnych liczb pierwszych jest
"The Twin Primes"! \n->or[p$r+2|r<-[n..],p r]
.\n->or[p$r+2|r<-[n..],p r]
jest funkcją, która biorąc pod uwagęn
, że jeśli są dwie liczby pierwsze większe niżn
, zwraca True, ale poza tym pętle są nieograniczone. zatem jeśli zatrzyma się dla każdej4..
podwójnej pierwotnej hipotezy, to prawda.źródło
Python (965 znaków)
Ponieważ moje pytanie nie ma miłości. Zamieszczam moje (niekodowane w golfa) rozwiązanie w Pythonie:
To dość proste.
numCollatzSteps (n) mówi, ile kroków wykonuje sekwencja Collatz dla określonego n. Działa nieskończenie, jeśli wspomniana sekwencja Collatz się nie kończy.
findNonHaltingN () liczy w górę, sprawdzając, czy numCollatzSteps kończy się dla każdego n. findNonHaltingN kończy się wtedy i tylko wtedy, gdy istnieje n, dla którego numCollatzSteps się nie kończy.
Możemy więc sprawdzić, czy hipoteza Collatza jest prawdziwa, sprawdzając, czy findNonHaltingN () nie zatrzymuje się
isPrime (n) sprawdza, czy liczba jest liczbą pierwszą, widząc, że żadna dodatnia liczba całkowita od 1 do n-1 nie dzieli
isSumOf2Primes (n) iteruje po wszystkich liczbach całkowitych dodatnich od 2 do n-2 i sprawdza, czy co najmniej jedna jest liczbą pierwszą wraz z dopełniaczem
findNonSum () liczy liczby parzyste w górę od 4, aż osiągnie pierwszą liczbę, która nie jest sumą 2 liczb pierwszych, a następnie ją zwróci. Jeśli taka liczba nie istnieje, będzie ona kontynuowana w nieskończoność.
Możemy sprawdzić, czy hipoteza Goldbacha jest prawdziwa, widząc, że findNonSum się nie zatrzymuje.
isSmallTwinPrime (n) zwraca wartość true tylko wtedy, gdy n i n + 2 są liczbami pierwszymi
nextSmallTwinPrime (n) zwraca następny numer> = n, dla którego parametr isSmallTwinPrime ma wartość true
największyTwinPrimes () liczy w górę od 2, sprawdzając, czy nextSmallTwinPrime zatrzymuje się dla wszystkich n. Jeśli kiedykolwiek nextSmallTwinPrime nie zatrzyma się na jakieś n, oznacza to, że największymi liczbami podwójnymi są n-1 i n + 1, i na tym się zatrzymujemy
Następnie możemy sprawdzić poprawność hipotezy o dwóch liczbach pierwszych, sprawdzając, czy największaTwinPrimes nigdy się nie zatrzymuje.
źródło
APL (234)
Jest to oczywiście niesprawdzone, ale logika wydaje się rozsądna. Uwzględniono wszystkie polecenia drukowania, dane wyjściowe to
104
znaki, a rzeczywista logika to130
.Nie golfowany:
źródło
3**(3**10)
(3*3*10
w APL), co daje BŁĄD DOMENY w tryapl.org.