Jesteś Desmond Hume. Przez ostatnie 3 lata ty i twój partner, Kelvin, byliście niewolnikami komputera, który wymaga wprowadzenia określonej sekwencji co 108 minut, aby uratować świat.
4 8 15 16 23 42
Twój partner zmarł 40 dni temu (z powodu nieszczęśliwego wypadku z głową Kelvina i dużym kamieniem) i nie masz z kim porozmawiać. Nikt nie poda za ciebie liczb. Nikt nie przełamie monotonii. Na początku nie było tak źle, ale nie możesz już dłużej znieść ciszy. A jeśli będziesz musiał jeszcze raz posłuchać „Make Your Own Kind Of Music”, będziesz krzyczeć.
Ty decydujesz, że musisz się wydostać. Uciec. Ty decydujesz, że zbudujesz tratwę i odpłyniesz z wyspy. Ale wtedy uświadamiasz sobie złe wieści: utknąłeś tutaj. Musisz wciąż ratować świat.
Ale wtedy zdajesz sobie sprawę z dobrych wiadomości: jesteś programistą! Możesz zautomatyzować ratowanie świata! Podekscytowany podbiegasz do komputera i, używając swoich sprawdzonych umiejętności python, wymyślasz szybki skrypt, aby wprowadzić liczby.
import time
while True:
print "4 8 15 16 23 42"
time.sleep(60 * 107)
Szybki, prosty, niezawodny, krótki i łatwy. Wszystko, czym powinien być dobry skrypt Pythona. Ale wtedy, gdy spróbujesz go przetestować, pojawi się błąd.
Bad command or file name.
Dziwne. No cóż, spróbujmy c ++.
#include <iostream>
#include <unistd.h>
int main()
{
while (true)
{
std::cout << "4 8 15 16 23 42" << std::endl;
sleep(60 * 107);
}
}
Nie! C ++ też nie został znaleziony. Wypróbujesz każdy język, o którym możesz pomyśleć. JavaScript, Ruby, Perl, PHP, C #. Nic. Ten komputer powstał przed wszystkimi popularnymi językami dnia.
Wyzwanie
Musisz napisać program, który:
1) Wydrukuj dokładnie to: „4 8 15 16 23 42” (bez cytatów)
2) Poczekaj od 104 do 108 minut. (Według The Lost Wiki )
3) Powtarzaj na zawsze. (Lub dopóki nie uświadomisz sobie, że to wszystko jest skomplikowane oszustwo i że utknąłeś w dziwnej otchłani z powodu leniwego pisania i zadawania pytań, na które nie masz odpowiedzi. Dzięki JJ Abrams!)
Jest jednak pewien haczyk: MUSISZ użyć języka, który komputer w stacji łabędzi byłby w stanie uruchomić. Przy założeniu, że
A) Komputer był aktualny w momencie budowy,
B) Brak aktualizacji oprogramowania komputerowego oraz
C) Nie ma dostępnego połączenia internetowego (co oznacza, że nie można pobrać Golfscript ...),
i starając się zgadnąć datę budowy The Swan Station, (Again, The Lost Wiki. )
Oznacza to, że musisz używać języka, który został po raz pierwszy wydany 31 grudnia 1977 r.
Kilka wyjaśnień zasad:
Dołączanie bibliotek jest OK, ale obowiązuje ta sama zasada (biblioteki muszą być wcześniejsze niż 1977).
Nie musisz się martwić kompatybilnością systemu operacyjnego.
Jeśli używasz
system
języka lub jego odpowiedników w językach, musisz udowodnić, że wszelkie używane polecenia systemowe byłyby dostępne przed 1978 rokiem. Artykuł w Wikipedii jest prawdopodobnie najlepszym sposobem na udowodnienie tego.Nie ma znaczenia, kiedy uruchamiasz program, o ile kończy się to naprzemiennym drukowaniem i snem. (print-sleep-print-sleep ... i sleep-print-sleep-print ... są dopuszczalne.)
To jest Code-Golf, więc wygrywa najkrótsza odpowiedź w bajtach.
źródło
Odpowiedzi:
APL ,
28242524 bajtówDziałało to w APL * PLUS STSC i SharpAPL IPSA w 1977 roku i chociaż współczesne APL mają mnóstwo nowych funkcji, nadal działa to na wszystkich głównych APL-ach:
Pierwszy wiersz wypisuje skumulowaną sumę pokazanych liczb, które są liczbami wymaganymi. Druga linia d e l Ays 6360 sekund (106 minut), a następnie wykonuje się signum z tym, że (1, oczywiście) i trafia do tej linii (tzn poprzedniego, numer drukowania jednego).
Jednak APL \ 360 (APL dla IBM System / 360 ) z 1966 roku faktycznie pokonuje go o jeden bajt (testowany na wolnym emulatorze IBM / 370 ):
Sleep dwuteownik ( „ IBM ” - dostać) wykonuje się w czasie oczekiwania na jiffies od 1 / 300 TH na sekundę, więc czekać 19 x 10 5 jiffies = 105 minut i 33 1 / 3 sekundy.
źródło
+\⎕A⍳'EEHBHT'
(if⎕IO=0
)⎕A
.+\4 4 7 1 7 19
wtedy?MUMPS - 30 znaków, około 1966 r. (Pierwszy standard ANSI w 1977 r.)
Moja pierwsza próba golfa kodowego, zaczynamy!
MUMPS jest nadal popularnym językiem oprogramowania EHR, stworzonym przez Massachusetts General Hospital w Bostonie. Najbardziej znaną implementacją jest Epic Systems w Verona, WI.
źródło
TECO, 53 bajty
TECO (Text [poprzednio Tape] Editor and Corrector) to edytor tekstowy pochodzący z 1962 roku. Można go również używać do uruchamiania samodzielnych programów. To najnowocześniejszy edytor dla PDP, VAXen itp.
Zgodnie z instrukcją TECO
^H
polecenie podaje godzinę. Sprawdź system operacyjny i zasilacz, ponieważ jednostka czasu może się różnić w zależności od urządzenia:Poniższy program działa w systemach, w których pora dnia jest mierzona w sekundach / 2:
Zauważ, że
^H
i$
należy wprowadzić, uderzając odpowiednio CONTROL-H i ESCAPE.Liczby w programie można dostosować dla następujących maszyn:
źródło
Skorupa Bourne'a,
4745 bajtówźródło
sleep
był wtedy faktycznie dostępny - znalazłeś to? en.wikipedia.org/wiki/…sleep
jakowhile
warunek. Oszczędza 2 bajtyC,
5452 bajtówźródło
main(){for(;;sleep(6360))puts("4 8 15 16 23 42");}
FORTRAN 66 (
10898 bajtów)Pewne jest, że komputer, o którym mowa, miał kompilator FORTRAN, ponieważ zdominował on dziedziny nauki i techniki w tamtych czasach. Urodziłem się 18 lat po tytułowym roku, ale podczas mojego programu matematycznego na uniwersytecie nauczyliśmy się FORTRAN. Podczas jednego zabawnego wykładu nauczyliśmy się programować na kartach do wykrawania. Nie jest łatwo sformatować go poprawnie tutaj, powinno być 6 pustych spacji przed każdym poleceniem i mogłem znaleźć tylko odwołanie do funkcji Sleep dla Fortran 77, ale powinien on istnieć już w Fortran IV i 66.
PS: Możemy zeskrobać jeden bajt, używając etykiety 1 zamiast etykiety 42.
PPS: Jeśli komputer, o którym mowa, używa kart wykrawających do wprowadzania programu, nie masz szczęścia, a bajty nie mają już znaczenia: D.
źródło
60*107
go80**2
również.MacLisp,
4746 bajtówWszystkie konstrukcje zaczerpnięte z podręcznika z 1974 r. (PDF) . Nie testowałem jednak, ponieważ nie mam interpretera MacLisp.
źródło
nil
można zapisać()
Altair Basic
Na pewno Desmond i Kelvin mieliby dla zabawy Altair 8800 (lub emulator). Altair Basic (od faceta o nazwisku Bill Gates, z małego, dwuosobowego start-upu o nazwie Micro-Soft) piszczy wraz z wydaniem z 1975 roku.
Desmond musiałby trochę dostroić, aby
FOR
pętla wewnętrzna trwała minutę. Wtedy wszyscy wiedzieli, że zajęte pętle są błędne, ale wszyscy ich używali!Alternatywnie Desmond może zainstalować płytę 88-RTC (zmontowaną z komponentów !: http://www.classiccmp.org/altair32/pdf/88-virtc.pdf ) i uzyskać dostęp przez przerwania do wybiegającego zegara czasu rzeczywistego linia energetyczna lub wewnętrzny kryształ.
Będzie musiał napisać procedurę przerwania, aby obsłużyć wejście zegara, co z kolei może zaktualizować port, powiedzmy, że co 59 sekund przyniesie na ziemię na sekundę, a następnie podniesie wysoko.
Altair Basic miał
WAIT
funkcję, więc kod zostałby uproszczony do czegoś takiego jak poniżej (nie mogłem znaleźć listy portów, więc wybrałem po prostu 125 w nadziei, że będzie nieużywany.):To było naprawdę zabawne małe pytanie, wracając do niektórych naprawdę prymitywnych komputerów. Cierpliwość, którą musieli mieć dawni (łącznie ze mną)!
źródło
Asembler PDP-11 dla systemu Unix 6 -
736874 znakówMówiąc o latach 70., obowiązkowe jest uhonorowanie Uniksa i sprzętu, od którego wszystko się zaczęło!
Możesz go łatwo uruchomić tutaj (ale najpierw musisz odkryć na nowo radość z
ed
wstawiania tekstu - w moim konkretnym przypadku musiałem nawet odkryć, jak właściwie edytować tekst:)
).Po złożeniu staje się 108 bajtów.
źródło
msg
jest marnotrawstwem, mogę iść zm
(golenie innych 4 bajtów).br
zamiastjmp
, prawda? Również zapis wymaga deskryptora pliku w r0 - najwyraźniej zdarza się, że masz w nim 1 (lub 2) dla pierwszej pętli, ale rozbijasz go czasem snu.br
, dzięki tej jednej i kilku innym sztuczkom (głównie wycinanie białych znaków i używanie liczb ósemkowych, gdy to możliwe) do 74 znaków, nawet dodając pierwszymov
.LOGO, 61 bajtów (ewentualnie) lub 48 bajtów (prawdopodobnie nie)
Niestety nie udało mi się znaleźć internetowej wersji systemu LOGO: Podręcznik wstępny (1967) BBN ani żadnych referencji grupy MIT Logo Group (1960 +). Logo Apple autorstwa LCSI jest nieco za nowe (~ 1980). Jednak w oparciu o książki online pewna odmiana następujących prawdopodobnie działała w tym czasie. Pamiętaj, że CZEKAJ 60 czeka 1 sekundę, a nie 60.
Możemy trochę lepiej poradzić sobie z optymalizacją wywołania ogona, chociaż prawdopodobnie nie było to wtedy dostępne.
źródło
CBM BASIC 1.0,
5238 znaków, tokenizowany na4531 bajtówCBM BASIC 1.0 został wprowadzony wraz z Commodore PET w październiku 1977 roku. Polecenia byłyby zwykle wyświetlane dużymi literami i znakami graficznymi CBM, ale dla ułatwienia wymieniłem je tutaj małymi i dużymi literami (zarówno moje, jak i twoje! :-) ). Zauważ też, że ^ byłoby faktycznie wyświetlane jako ↑. Detokenized, po umieszczeniu tego na liście
LIST
spowoduje:PET2502 pracowały z częstotliwością 1 MHz, więc ukończenie powinno zająć około 105 minut.
Edycja : Uświadomiłem sobie, że zagnieżdżone pętle nie były tak naprawdę konieczne i źle przeliczyłem swoje tokeny. Wciąż za mało, aby wygrać (i za późno, aby uruchomić), ale przynajmniej jest lepiej.
źródło
Pascal -
10795 bajtówWersja bez golfa:
źródło
Dalej , 50 bajtów
Chociaż FORTH-79 jest najwcześniejszą znormalizowaną wersją, język był rozwijany od 1968 roku i był dostępny na IBM 1130. Był używany w innych systemach także przed nadejściem 1977 roku. Mogę przeprowadzić trochę więcej badań, aby upewnić się, że wszystkie te słowa są dostępne, ale jestem całkiem pewien, że jest to wystarczająco podstawowe, aby istniało do tego czasu. Na pewno wszystkie były dostępne w FORTH-79.
Pętle na zawsze, czekając 6420000 milisekund między drukowaniem ciągów. Nie jest drukowana nowa linia.
źródło
Smalltalk, 95 (lub 68, jeśli dozwolona jest luka)
Istnieje od 1972 roku
Brak doświadczenia z tym, widziałem go na wikipedii: P
Sprawdziłem online, jak zapętlać i opóźniać, składnia powinna być poprawna, ale nie mogła znaleźć sposobu na uruchomienie.
Możliwa luka
Powinien drukować sekwencję co 108 minut, ale nie oznacza, że musi to być 108 minut.
Może to skrócić kod
Kod wydrukuje sekwencję bez przerwy, więc gwarantuje, że wydrukuje również po 108 minutach.
źródło
Wait some time between 104 and 108 minutes
, więc nie sądzę, że luka jest możliwa.SAS,
827569Nie jest to typowy język golfowy, ale myślę, że kwalifikuje się do tego wyzwania, zakładając, że
file stdout
był ważny w SAS z 1977 roku.Ulepszenia:
data _null_;
->data;
zapisuje 7 znaków (i teraz tworzy pusty zestaw danych, a także drukuje na standardowe wyjście).źródło
Powłoka Thompson, 1971 (1973 dla polecenia uśpienia)
43 bajty
Ponieważ powłoka Bourne'a, choć istniała w 1977 r., Nie była dostępna w wydanej wersji Uniksa aż do wersji 7 w 1979 r. Oryginalna powłoka uniksowa nie miała żadnych fantazyjnych poleceń kontroli pętli. (Jeśli chcesz zakończyć pętlę, możesz użyć
if
polecenia, aby pominąć goto.)źródło
exec $0
to niewielką oszczędnośćgoto
?C, 50 bajtów
Krótszy niż inne rozwiązanie C, a zatem nie jest duplikatem. Właściwie to napisałem, zanim zauważyłem (prawie) identyczny komentarz Digital Trauma na temat innego rozwiązania C.
źródło
COBOL, 240 bajtów
Tak, wiodące białe znaki są znaczące. Skompiluj i uruchom jak
cobc -x save.cob; ./save
. (Ta-x
opcja tworzy plik wykonywalny w przeciwieństwie do współdzielonej biblioteki lib, dlatego też nie sądzę, że trzeba to policzyć.)Jeśli chcemy się nudzić, możemy dodać
--free
opcję kompilacji dla kodu w dowolnym formacie, a następnie 158 + 6 = 164 bajtów, ale prawdopodobnie nie zadziała to w 1977 roku.źródło
ALGOL 60/68 / W,
744750 bajtówUruchom ten pełny program za
a68g save.a68
pomocąalgol68g
.ALGOL nie ma wbudowanego sposobu na sen, ale możemy uruchomić w zasadzie
/bin/sleep
:Stara odpowiedź:
źródło
system
jest dobrze, a nie dobrze? Nic ci nie jest,system("ping ...")
ale wyzwanie mówi, że nie mogę używaćsystem
C do np. Poleceń bash. ALGOL zajmuje się drukowaniem, ale nie mam innego sposobuping(8)
anisleep(1)
spać.system("sleep")
od tego czasu będzie działać na systemie operacyjnym. Zmienię post.