Czas zmierzyć się z prawdą: nie będziemy tu na zawsze, ale przynajmniej możemy napisać program, który przeżyje ludzkość, nawet jeśli będzie walczyć do końca czasów.
Twoim zadaniem jest napisanie programu, którego oczekiwany czas działania jest większy niż pozostały czas do końca wszechświata.
Możesz założyć, że:
- Wszechświat umrze od entropii za 10 1000 lat.
- Twój komputer:
- Przeżyje wszechświat, ponieważ jest on zbudowany z Unobtainium .
- Ma nieograniczoną pamięć / stos / limit rekurencji.
- Jego procesor ma ograniczoną prędkość.
Musisz pokazać, że Twój program się kończy (przepraszam, nie ma nieskończonych pętli) i obliczyć oczekiwany czas działania.
Obowiązują standardowe luki .
Jest to wyzwanie dla golfistów, więc wygrywa najkrótszy kod spełniający kryteria.
EDYCJA :
Niestety (30 minut później) stwierdzono, że nieprawdopodobne pole Unobtainium zakłóca wewnętrzny zegar komputera, czyniąc go bezużytecznym. Programy oparte na czasie natychmiast się zatrzymują. (Kto zrezygnowałby z programu, który po prostu czeka na jego żywe dziedzictwo?).
Procesor komputera jest podobny do procesora Intel i7-4578U, więc jednym ze sposobów pomiaru czasu działania jest uruchomienie programu na podobnym komputerze z mniejszym wejściem (mam nadzieję) i ekstrapolowanie jego czasu działania.
Podium
#CharsLanguageUpvotes Author
1 5 CJam 20 Dennis
2 5 J 5 algorithmshark
3 7 GolfScript 30 Peter Taylor
4 9 Python 39 xnor
5 10 Matlab 5 SchighSchagh
* Głosowanie na 31/08
źródło
Odpowiedzi:
CJam, 5 bajtów
Jak to działa
Ten program zostanie zatrzymany, gdy sterty nie będą już mogły przechowywać Big Integer, co nie nastąpi w najbliższym czasie na nowoczesnym komputerze stacjonarnym.
Domyślny rozmiar sterty to 4 179 623 936 bajtów na moim komputerze (Java 8 w Fedorze). Można go zwiększyć do dowolnej wartości za pomocą
-Xmx
, więc jedynym prawdziwym ograniczeniem jest dostępna pamięć główna.Czas zgonu
Zakładając, że interpreter potrzebuje x bitów pamięci do przechowywania nieujemnej liczby całkowitej mniejszej niż 2 x , musimy policzyć do 2 8 × 4 179 623 936 = 2 33 436 991 488 . Z jednym przyrostem na cykl zegara i moim Core i7-3770 (3,9 GHz z turbo), zajmie to 23,436,991,488 ÷ 3 400 000 000> 10 10 065 537 373 sekund, czyli ponad 10 10 065 533 3785 lat.
źródło
!=
nieskończone typy danych. Jeśli mam terabajt pamięci RAM, 8-bitowa liczba całkowita bez znaku wciąż rośnie do 255.JavaScript, 39
Wyjaśnienie
Ponieważ JavaScript nie reprezentuje dokładnie dużych liczb całkowitych, pętla
for(;x!=++x;)
kończy się pox
trafieniu9007199254740992
.Ciało pętli for będzie wykonywane
Fib(9007199254740992) - 1
razy, gdzieFib(n)
jest n-ta liczba Fibonacciego.Z testów wiem, że mój komputer wykona mniej niż 150 000 iteracji na sekundę. W rzeczywistości działałby znacznie wolniej, ponieważ stos byłby bardzo duży.
Dlatego uruchomienie programu zajmie co najmniej
(Fib(9007199254740992) - 1) / 150000
sekundy. Nie byłem w stanie obliczyć,Fib(9007199254740992)
ponieważ jest tak duży, ale wiem, że jest znacznie większy niż 10 1000 * 150 000.EDYCJA: Jak zauważono w komentarzach,
Fib(9007199254740992)
jest to około 4,4092 * 10 1882393317509686 , co jest rzeczywiście wystarczająco duże.źródło
fib(n)
można to przybliżyćphi^n
, możemy użyćlog((sqrt(5) + 1)/2)*9007199254740992
do obliczenia, o ile cyfr sięfib(9007199254740992)
okaże1.8823933*10^15
.Fib(9007199254740992)
(przy użyciu ciągłej postaci zphi
) jest w przybliżeniu4.4092... * 10^1882393317509686
. Obliczeniafor(x=0;x!=++x;)
i iteruje tylko 9007199254740992 razy.Python (9)
Ma ponad 10 ** 10000000 bitów, więc obliczenia powinny zabrać nas daleko w przeszłość po śmierci z powodu upałów.
Sprawdziłem, że dla coraz większych, ale wciąż rozsądnych wartości zajmuje to coraz więcej czasu, więc nie jest to tylko optymalizacja przez tłumacza.
Edycja: Gra w golfa dwa znaki, usuwając parens dzięki @ user2357112. TIL, że Python traktuje kolejne wykładniki jako wieżę mocy.
źródło
...82528057365719799011536835265979955007740933949599830498796942400000000009
(pominięto 2,6 * 10 ^ 954242509 cyfr, aby uniknąć upadku czarnej dziury ). Naprawdę powinieneś uaktualnić do Unobtanium.9**9**9e9
jest tak samo krótki i wymaga nieco więcej długości wszechświata, a także wygląda trochę ładniej.GolfScript (
127 znaków)To oblicza i drukuje 8 ^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ~ = 10 ^ 10 ^ 10 ^ 10 ^ 183230. Aby go wydrukować (nie wspominając o obliczeniach) za 10 ^ 1000 lat ~ = 10 ^ 1007,5 sekund, trzeba wydrukować około 10 ^ (10 ^ 10 ^ 10 ^ 183230 - 10 ^ 3) cyfr na sekundę.
źródło
Cudowne
6866 bajtówMarbelous to 8-bitowy język z wartościami reprezentowanymi tylko przez kulki w maszynie podobnej do Rube Goldberg, więc nie było to bardzo łatwe. To podejście jest w przybliżeniu równoważne z następującym pseudokodem:
ponieważ maksymalna wartość to 256 (reprezentowana przez 0 w programie Marbleous, który jest obsługiwany w różnych miejscach w różny sposób) funkcja rekurencyjna (1) zostanie nazwana w sumie
256!*512^256
równą około10^1200
, wystarczająco łatwo, aby przeżyć wszechświat.Marbelous nie ma bardzo szybkiego interpretera, wygląda na to, że może obsługiwać
10^11
wywołania tej funkcji rocznie, co oznacza, że patrzymy na środowisko wykonawcze10^1189
lat.Dalsze objaśnienie tablicy Marbelous
00
jest dosłownym językiem (lub marmurem), reprezentowanym w systemie szesnastkowym (więc 0). Ten marmur spada na--
, który zmniejsza każdy marmur o 1 (00 owija się i zamienia w FF lub 255 w systemie dziesiętnym). Marmur o wartości FF spada teraz na ten,\\
który przesuwa go o jedną kolumnę w prawo, na niższy@0
. To jest portal i teleportuje marmur do drugiego@0
urządzenia. Tam marmur ląduje na/\
urządzeniu, które jest powielaczem, umieszcza jedną kopię marmuru po--
lewej stronie (ten marmur będzie się ciągle pętli między portalami i ulegał zmniejszeniu w każdej pętli), a drugi po=0
prawej stronie.=0
porównuje marmur do wartości zero i pozwala, aby marmur spadł, jeśli jest równy, i popchnie go w prawo, jeśli nie. Jeśli marmur ma wartość 0, wyląduje na&0
synchonizerze, który wyjaśnię później.Podsumowując, zaczyna się to od marmuru o wartości 0 w pętli i zmniejsza go, aż osiągnie ponownie 0, następnie umieszcza ten marmur o wartości 0 w synchronizatorze i kontynuuje zapętlanie w tym samym czasie.
}0
jest urządzeniem wejściowym, początkowo n-te (podstawa 0) wejście wiersza poleceń podczas wywoływania programu jest umieszczane w każdym}n
urządzeniu. Więc jeśli wywołasz ten program z wejściem wiersza poleceń 2, marmur o wartości 02 zastąpi to}0
. Ten marmur następnie wpada do&0
urządzenia, inny synchronizator,&n
synchronizatory trzymają kulki, aż wszystkie inne odpowiednie również&n
zostaną złożone. Marmur jest następnie zmniejszany, teleportowany i duplikowany podobnie jak w poprzednio wyjaśnionej pętli. Odpowiednia kopia jest następnie sprawdzana pod kątem nierówności z wartością zero (>0
), jeśli nie jest równa 0, to przechodzi. Jeśli wynosi 0, zostaje popchnięty w prawo i ląduje!!
, co kończy planszę.Okay, do tej pory mamy pętlę, która odlicza w sposób ciągły od 255 do 0 i pozwala kolejnej, podobnej pętli (zasilanej przez dane z wiersza poleceń) uruchomić raz za każdym razem, gdy osiągnie 0. Kiedy ta druga pętla uruchomi się n razy (maksymalnie 256 ) program kończy się. To jest maksymalnie 65536 przebiegów pętli. Niewystarczająco, by przeżyć wszechświat.
Powinno to zacząć wyglądać znajomo, dane wejściowe są zmniejszane raz, a następnie ta wartość zapętla się i jest kopiowana (zauważ, że marmur zmniejsza się tylko raz, a nie przy każdym uruchomieniu pętli). Następnie jest sprawdzany pod kątem równości do 0 i jeśli nie jest to zero, ląduje dalej
MB
. Jest to funkcja w Marbelous, każdy plik może zawierać kilka tablic, a każda tablica jest funkcją, każda funkcja musi zostać nazwana przez poprzedzenie siatki:[name]
. Każda funkcja z wyjątkiem pierwszej funkcji w pliku, która ma standardową nazwę: MB. Więc ta pętla ciągle wywołuje ponownie płytę główną z wartością,n - 1
gdzie n jest wartością, z którą wywołano to wystąpienie funkcji.Więc dlaczego
n*512
?Cóż, pierwsza pętla działa z 4 tyknięciami (i 256 razy), a druga pętla biegnie n razy przed zakończeniem płytki. Oznacza to, że tablica działa na około
n*4*256
tyknięcia. Ostatnia pętla (która wywołuje funkcję rekurencyjną) jest złożona i działa z 2 tikami, co oznacza, że udaje się wywołaćn*4*256/2 = n*512
czasy funkcji .O jakich symbolach nie wspomniałeś?
\/
to kosz na śmieci, który usuwa kulki z planszy, dzięki czemu rozrzucone kulki nie kolidują z innymi kulkami, które zapętlają rundę i uniemożliwiają zakończenie programu.Premia
Ponieważ kulki, które spadają z dolnej części cudownej płyty, są wysyłane do STDOUT, ten program wypisuje mnóstwo znaków ASCII podczas działania.
źródło
Perl,
6658 znakówPowyżej jest implementacją funkcji Ackermann – Péter . Nie mam pojęcia, jak duże jest A (9,9), ale jestem całkiem pewien, że ocena zajmie zadziwiająco dużo czasu.
źródło
$n?A($m-1,A($m,$n-1)):A($m-1,1)
pozwala na łatwą oszczędność 8 znaków poprzez wciśnięcie operatora trójskładnikowego.MATLAB,
5852 znakówPotrzebujemy co najmniej jednego rozwiązania arytmetycznego o skończonej precyzji, stąd:
x = jedynki (1,999); y = x; podczas gdy dowolne (y), y = mod (y + x, liczby pierwsze (7910)); koniec( dzięki dzięki @DennisJaheruddin za strącenie 6 znaków )
Liczba cykli potrzebnych do ukończenia wynika z iloczynu pierwszych 999 liczb pierwszych. Ponieważ ogromna większość z nich ma znacznie ponad 10 lat, czas potrzebny do osiągnięcia konwergencji byłby o setki lub tysiące rzędów wielkości większy niż minimalny termin.
źródło
p=1:9e9;y=p;while+y*y',y=mod(y+1,p),end
Mathematica,
2519 bajtówTo rozwiązanie zostało opublikowane, zanim funkcje czasowe zostały zdyskwalifikowane.
TimeUsed[]
zwraca sekundy od rozpoczęcia sesji, a Mathematica używa typów o dowolnej dokładności. W ciągu roku jest około 10 7 sekund, więc odczekanie 10 10000 sekund powinno wystarczyć.Krótsza / prostsza (/ ważna) alternatywa:
Zamiast tego policzmy. Będziemy musieli liczyć nieco dalej, ponieważ możemy wykonać sporo przyrostów w ciągu sekundy, ale wyższy limit nie kosztuje postaci.
Technicznie w obu rozwiązaniach mogłem zastosować znacznie niższy limit, ponieważ problem nie określa minimalnej szybkości procesora.
źródło
9^9^9
trwa dłużej niż10^1000
lata? Szacuję, że obliczenia9^9^9
na moim 1.3GHz U7300 przy użyciubc
zajmie mniej niż 6 miesięcy. (Na podstawie ekstrapolacji czasu obliczania9^200000
i9^400000
.)Python 3 - 49
Robi to coś pożytecznego: oblicza Pi z niespotykaną dokładnością za pomocą nieskończonej serii Gregory-Leibniz.
Na wypadek, gdybyś się zastanawiał, ten program zapętla
10**10**10**2.004302604952323
czasy.Arbitralna precyzja: 78
Źródło obrazu
Oddech terminalny
Ze względu na ogromne obliczenia,
1e99**1e99
iteracje trwają niecałe1e99**1e99
lata. Teraz(1e99**1e99)-1e1000
nie robi prawie żadnej różnicy. Oznacza to, że ten program będzie działał znacznie dłużej niż śmierć naszego wszechświata.Odrodzenie
Teraz naukowcy proponują, że we
10**10**56 years
wszechświecie odrodzi się z powodu fluktuacji kwantowych lub tunelowania. Więc jeśli każdy wszechświat jest dokładnie taki sam, przez ile wszechświatów będzie żył mój program?Zakładając, że wszechświat zawsze będzie żył
1e10+1e1000
latami, a następnie10**10**56
latami „restartem”, mój program będzie żył przez1e9701
wszechświaty. Zakłada się oczywiście, że unobtainium może przetrwać Wielki Wybuch.źródło
1000**1000
jest1e3000
, nie1e2000
.100**100=1E200
.Python 59 (działa przez większość czasu)
Nie mogłem się oprzeć
Chociaż prawdą jest, że teoretycznie może to zakończyć się w ciągu milisekundy, średni czas działania jest znacznie dłuższy niż
10^400
określony czas życia wszechświata. Dzięki @BetaDecay, @undergroundmonorail i @DaboRoss za sprowadzenie około 17 znaków.źródło
continue
zpass
J - 5 znaków, tak myślę
Zauważ, że wszystkie poniższe elementy są arytmetyką o dowolnej precyzji, ponieważ liczba 9 zawsze ma trochę
x
obok siebie.W siedmiu znaków, mamy
!^:!!9x
, która jest trochę jak bieganiez arytmetyką dowolnej precyzji. To zdecydowanie przekracza limit, ponieważ tak powiedział Synthetica , więc mamy górną granicę.
W sześciu znakach możemy również napisać
^/i.9x
, który oblicza każdy wynik pośredni0 ^ 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 ^ 7 ^ 8
. Wolfram | Alpha mówi, że2^3^4^5^6^7^8
jest w przybliżeniu10 ^ 10 ^ 10 ^ 10 ^ 10 ^ 10 ^ 6.65185
, co prawdopodobnie również czyści inspekcję.Mamy również pięć znaków
!!!9x
, czyli po prostu ((9!)!) !. W | A mówi, że to10 ^ 10 ^ 10 ^ 6.2695
powinno być wystarczająco duże ... To jak1.6097e1859933
-cyfry, które są zdecydowanie większe niż3.154e1016
liczba nanosekund we wszechświecie, ale przyznam, że nie mam pojęcia, jak można to rozgryźć prawdziwe środowiska wykonawcze tych rzeczy.Jednak samo drukowanie powinno trwać wystarczająco długo, aby trwało dłużej niż wszechświat, więc powinno być w porządku.
źródło
C,
6356 znakówUdowodnienie, że się kończy, odbywa się przez indukcję.
Udostępnianie indukcji krok po indukcji:
źródło
Matlab (
108 znaków)IMHO, większość wpisów próbuje za bardzo, obliczając duże, skomplikowane rzeczy. Ten kod po prostu zainicjuje tablicę 9x10 1016
double
s, licząc w górę od 1, co zajmuje 7,2x10 ^ 1017 bajtów. Na nowoczesnym procesorze o maksymalnej przepustowości pamięci 21 GB / s lub 6,63x10 ^ 17 bajtów / rok zajmie to co najmniej 1,09x10 1000 lat, aby nawet zainicjować tablicę, nie mówiąc już o próbie wydrukowania jej, ponieważ nie zawracałem sobie głowy pomijanie danych wyjściowych za pomocą średnika końcowego. (;stare rozwiązanie
Alternatywnie
Ten kod po prostu utworzy kwadratową macierz
NaN
s / nieskończoności o rozmiarze3e508
x3e508 = 9e1016
8 bajtów podwójnych lub7.2e1017
bajtów.źródło
Perl, 16 znaków
To buduje ciąg powtarzający się „. *” Miliard razy, a następnie używa go jako igły i stogu siana w dopasowaniu wyrażenia regularnego. To z kolei powoduje, że silnik regex próbuje wykonać każdą możliwą partycję ciągu o długości dwóch miliardów znaków. Zgodnie z tą formułą z Wikipedii istnieje około 10 35218 takich partycji.
Powyższe rozwiązanie ma długość 16 znaków, ale wymaga jedynie około 2 GB pamięci, co oznacza, że można je uruchomić na prawdziwym komputerze. Jeśli założymy, że pamięć jest nieskończona i rozmiar rejestru skończonego (co prawdopodobnie nie ma sensu), można go skrócić do 15 znaków, jednocześnie znacznie zwiększając czas działania:
(Nie testowałem tego, ale myślę, że może działać z 32-bitowym Perlem zbudowanym na 64-bitowym komputerze z co najmniej 6 GB pamięci RAM).
Uwagi:
x
jest operatorem powtarzania łańcucha.for
nie jest rzeczywiste pętli; służy tylko do uratowania jednej postaci (w porównaniu do$_=".*"x1e9;/$_^/
).^
fraza końcowa wyrażenia regularnego zapewnia dopasowanie tylko pustego łańcucha; ponieważ kwantyfikatory regularne są domyślnie zachłanne, jest to ostatnia rzecz, którą silnik spróbuje.źródło
J (12)
Do czego to sprowadza się w Pythonie (zakładając, że
!
działa):EDYTOWAĆ:
Cóż, program może zająć najwyżej
2 × 10^-1858926
kilka sekund na cykl, aby ukończyć go w wymaganym czasie. Wskazówka: to nie zadziała nawet w pierwszym cyklu, nie mówiąc już o ostatnim;).Ponadto: ten program może wymagać więcej pamięci niż entropia we wszechświecie ...
źródło
xrange()
;)!
nie działa w Pythonie. Potrzebujeszimport math
imath.factorial()
.C # 217
Nie jestem wielkim golfistą, ale nie mogłem się oprzeć funkcji Ackermana . Nie bardzo wiem też, jak obliczyć czas działania, ale na pewno się zatrzyma i na pewno będzie działał dłużej niż ta wersja .
źródło
ack
funkcji na nazwę jednoznakową, npa
.Pierwsza próba kodowania golfa, ale proszę bardzo.
VBA -
5745Zatem X wzrośnie o jeden, jeśli wystąpi zdarzenie 1 na 2 ^ 128 i zresetuje, jeśli nie wystąpi. Kod kończy się, gdy to zdarzenie nastąpi 2 ^ 64 + 1 razy z rzędu. Nie wiem, jak zacząć obliczać czas, ale sądzę, że jest ogromny.
EDYCJA: Wyliczyłem matematykę, a prawdopodobieństwo tego w każdej pętli wynosi 1 na 2 ^ 128 ^ (1 + 2 ^ 64) i ma długość około 20000 cyfr. Zakładając, że 1000000 pętli / sek. (Ballpark z cienkiego numeru powietrza) i 30000000 s / rok to 3 * 10 ^ 13 cykli rocznie, pozostało 10 ^ 1000 lat to 3 * 10 ^ 1013 cykli, więc prawdopodobnie trwałoby to około 20 razy więcej niż pozostały czas we wszechświecie. Cieszę się, że moja matematyka wspiera moją intuicję.
źródło
While x=1
, prawda? (w przeciwnym razie jest to nieskończona pętla). Ponadto, można zgolić 12 znaków, jeśli zastąpiDim x As Double
sięx=0
(VBA nie wymaga deklarowania zmiennych, chyba że podaszOption Explicit
)C, 30 znaków
Zakładając przepełnienie komplementu dwóch i 32-bitowe inty, będzie to działać dla około 2 2 32 wywołań funkcji, co powinno zająć dużo czasu dla końca wszechświata.
źródło
GolfScript, 13 znaków
Ten program po prostu liczy się od 0 do 10 9 9 -1 = 10 387420488 . Zakładając optymistyczne, że komputer działa na 100 GHz może wykonać iteracji programu w jednym cyklu programu na 10 9 9 -12 sekund lub około 3 x 10 9 9 -20 = 3 x 10 387420469 lat
Aby przetestować program, możesz zamienić na
9
a2
, co spowoduje, że zatrzyma się na 10 2 2 −1 = 10 3 = 1000. (Użycie a3
zamiast a2
spowoduje, że zatrzyma się na 10 3 3 −1 = 10 26 , co , nawet przy powyższych optymistycznych założeniach nie osiągnie co najmniej kilku milionów lat).źródło
Autohotkey 37
źródło
Haskell, 23
Program kończy się po odczytaniu 1073741824 znaków z
stdin
. Jeśli jest uruchamiany bez przesyłania żadnych danychstdin
, będziesz musiał wpisać tę liczbę znaków na klawiaturze. Zakładając, że klawiatura ma 105 klawiszy, z których każdy ma 100 000 cykli mechanicznych i jest zaprogramowany do generowania nieumarłych naciśnięć klawiszy, automatyczne powtarzanie jest wyłączone, a gniazdo klawiatury pozwala na 100 cykli połączeń, co daje maksymalną liczbę naciśnięć klawiszy na komputer wynoszącą 1050000000, co jest wartością nie wystarczy, aby program się zakończył.Dlatego program zostanie zakończony tylko wtedy, gdy lepszy sprzęt będzie dostępny pod względem liczby cykli, czego w rzeczywistości nigdy nie ma w tym działającym wszechświecie. Może następnym razem, gdy jakość będzie miała wyższy priorytet niż ilość. Do tego czasu program ten kończy się w zasadzie, ale nie w praktyce.
źródło
~ ATH, 56
W fikcyjnym języku ~ ATH :
Przepraszam za pogwałcenie granic; Pomyślałem, że to zbyt istotne, żeby to pominąć.
Jeśli ktoś był tym rozbawiony, więcej szczegółów: (1) , (2) , (3) , (4)
źródło
Rubin (34)
Linia
([0]*9).permutation.each{print}
trwa około 2,47 sekundy na 9! drukuje na mojej maszynie, podczas gdy linia([0]*10).permutation.each{print}
zajmuje około 24,7 sekundy na 10! drukuje, więc myślę, że mogę tutaj ekstrapolować i obliczyć,(24.7/10!)*470! seconds in years
która wynosi 6,87 * 10 ^ 1040, co powinno być czasem wykonania:źródło
JavaScript
6862 znakówKorzysta z funkcji Ackermanna, którą można zapisać jako
Jego czas działania wydłuża się wykładniczo, dlatego jego obliczenie zajmuje bardzo dużo czasu. Nawet jeśli to nie jest język angielski tutaj można uzyskać przegląd jego wartości zwracanych. Zgodnie z tabelą
ackermann(5,1)
równa2↑↑(65533)-3
się, wiesz, bardzo duża.źródło
n==0?X:Y
zawsze możesz to zrobićn?Y:X
Befunge '93 - 40 bajtów
(Program 20x2)
Ten program opiera się na losowych liczbach, aby zapewnić mu opóźnienie. Ponieważ tłumacze Befunge są dość powolne, ten program powinien pasować. A jeśli nie, zawsze możemy go rozwinąć w poziomie. Nie jestem do końca pewien, jak zacząć obliczać oczekiwany czas działania tego programu, ale wiem, że każdy? ma szansę 50/50 na rozpoczęcie od nowa lub zmianę pozycji poziomej o 1. Jest 18? Myślę, że powinno to być coś w stylu (18 ^ 2) !, który według kalkulatora Google mówi „Infinity”
EDYCJA: Ups, nie zauważyłem drugiej odpowiedzi Befunge, to mój pierwszy post tutaj. Przepraszam.
źródło
APL, 10
Nie sądzę, żeby to była poprawna odpowiedź (ponieważ jest niedeterministyczna), ale w każdym razie ......
Ten program oblicza losową permutację liczb 1e9 (
?⍨1e9
) i powtarza, aż dwa kolejne wyjścia będą równe (⍣≡
)Za każdym razem, gdy obliczana jest permutacja, ma ona wartość 1 na 1000000000! szansa na zakończenie. I 1000000000! wynosi co najmniej 10 10 8 .
Czas potrzebny do obliczenia permutacji staje się nieistotny z uwagi na masywność 1000000000! Ale niektóre testy pokazują, że tak jest,
O(n)
a ekstrapolacja daje około 30 sekund.Jednak mój interpreter odmawia przyjęcia danych wejściowych do funkcji losowej większej niż 2 31 -1 (więc użyłem 1e9), a generowanie permutacji liczb 1000000000 dało pełny błąd obszaru roboczego. Jednak koncepcyjnie można tego dokonać za pomocą idealnego interpretera APL z nieskończoną pamięcią.
To prowadzi nas do możliwości użycia 2 63 -1 zamiast 1e9 w celu zwiększenia czasu działania do co najmniej 10 10 20 , przy założeniu architektury 64-bitowej.
Ale poczekaj, czy architektura jest odpowiednia w idealnym tłumaczu? Do diabła nie, więc tak naprawdę nie ma górnej granicy czasu pracy !!
źródło
R, 45 bajtów
To stary wątek, ale nie widzę odpowiedzi R i nie możemy tego mieć!
Dla mnie czas działania wynosił około 1 sekundy, gdy x wynosił 20, co sugeruje czas działania 2 ^ 9979 sekund.
Jeśli zamienisz zero na jeden, wówczas wynik wyniósłby 2 ^ x, ale w takim stanie wynik jest zerowy bez względu na x (pozwala uniknąć problemów z przepełnieniem).
źródło
JavaScript, 120 bajtów
Można to zrobić przy minimalnej pamięci (prawdopodobnie mniej niż pół megabajta), ale zatrzymanie zajmuje (prawdopodobnie) około 10 8750 lat.
Wielokrotnie zwiększa małą-endianową bazę-9 BigInteger, aż osiągnie 9 10 4 -1 .
źródło
Python 3, 191 bajtów
Po pierwsze, f jest rekurencyjną funkcją czynnikową i ultra wolną. Następnie jest zasilany 9 * 10⁹⁹⁹, który generuje błąd przepełnienia, ale nie dzieje się tak na tym komputerze Unobtanium. For-Loop iteruje 9E999! ^ (9E999 ^ 9E999)! razy i przechodzi tylko do następnej iteracji, jeśli 9E999! +1 losowe ints od 0 do 9E99 * ^ i! wszystkie są równe 0 i w każdej iteracji pętli while ustawiane jest na (9E999 ^ s)! Uh, zapomniałem, że drukowanie s zajmuje muuuuccchhhh czas ...
Wiem, że to nie jest najkrótsze rozwiązanie, ale myślę, że to naprawdę skuteczne. Czy ktoś może mi pomóc w obliczeniu czasu pracy?
źródło
Maszyna Turinga, ale gorzej , 167 bajtów
Wypróbuj online!
Powinien uruchomić 6-stanowy 2-symbolowy Busy Beaver ze strony Wikipedii .
źródło