Scenariusz
Jeden z twoich przyjaciół zmaga się z zadaniem domowym. Potrzebuje prostego programu, który wypisze pierwsze 404 liczby naturalne:
1 2 3 4 5 6 7 8 9 10 11 ... 401 402 403 404
Twoje wyzwanie jest proste: napisz dla niego ten program.
Jednak twoje połączenie jest straszne, więc 1 losowa postać jest tracona za każdym razem, gdy wysyłasz program. Aby zapobiec uszkodzeniu programu, musisz to zrobić, aby usunięcie pojedynczego znaku nie miało żadnego skutku: program działa, niezależnie od tego. (Oryginalny program musi również działać.)
Ponieważ połączenie jest zbyt słabe, aby wysłać duże pliki, kod musi być możliwie jak najkrótszy.
TL: DR - stwórz program utwardzany promieniowaniem, aby wypisał liczby od 1 do 404
Zasady / Szczegóły
- Wyjściem może być lista liczb całkowitych w dowolnym rozsądnym formacie (oddzielone spacjami, znakami nowej linii, przecinkami itp.). Jednak dane wyjściowe muszą być spójne i nie ulegać zmianie podczas modyfikacji programu.
- Flagi wiersza poleceń, które zawierają logikę, wykonują rzeczywisty kod, generują listę numerów itd., Są zakazane.
- To jest golf golfowy , więc wygrywa najkrótsze przesłanie (w bajtach)!
Odpowiedzi:
05AB1E , 12 bajtów
Kod:
Normalne objaśnienie kodu:
Prowadzi to do następującego kodu w golfa:
X404Ÿ
co chcemy osiągnąć.Liczba 404 jest generowana przez jeden z następujących wariantów:
Zakres obejmujący działa w następujący sposób na dwóch liczbach:
Co zawsze sprawia, że sekunda staje
Ÿ
się niemożliwa .Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
JavaScript, 228 bajtów
Wyjaśnienie
Ocena kodu w a
setInterval
pozwala programowi kontynuować, nawet jeśli wystąpi błąd. Dbamy o to, aby przekazany kod nie zawierał błędów, jeśli zostanie usunięty pojedynczy znak. Składnia ciągu szablonu może być nadużywana do wywoływaniasetInterval
ciągiem ciągłym bez nawiasów. Na szczęście, nawet jeśli ciąg szablonu znajduje się w następnym wierszu, nadal analizuje jako wywołanie funkcji o takiej składni.Pierwszym problemem, na który
setInterval
się natknęliśmy, jest funkcja, a zatem jeśli znak zostanie usunięty, a program spróbuje go wywołaćsetInteval
, wówczas wystąpi błąd. Oczywiście, ponieważ istnieją dwa wciskane wywołaniasetInterval
, nie musimy się martwić, że faktycznie działa ono poprawnie, o ile unikniemy błędu. Zatem pierwszy wiersz definiuje każdą możliwą „literówkę”setTimeout
prawidłowej funkcji.Pierwszy wiersz polega na przypisaniu do funkcji wszystkich tych „błędów ortograficznych”
top=>4
. Zwróć uwagę na składnię ES6, to po prostu pobiera parametr o nazwie „top” i zwraca 4. Dlaczego „top”? Cóż, pierwsza linia nie może nigdy zgłosić błędu, nawet jeśli znak zostanie usunięty. Jeśli=
jest usuwany, abytop>4
to wyrażenie logiczne będzie ważna, ponieważtop
jest predefiniowane w przeglądarkach, po prostu plonowaniefalse
. Jeśli 4 zostanie usunięte, ciało funkcyjne po prostu staje się pierwszymsetInterval
segmentem, a drugi działa bez szwanku.Teraz jedyne, o co należy się martwić, to usunięcie `.
Usunięty od początku,
setInterval
po prostu nic nie robi, oceniając siebie jako swoje własne wyrażenie. Następnie reszta drugiej linii po prostu uruchamia jedną iterację pętli, pozwalając drugiemusetInterval
fragmentowi zakończyć zadanie. Jeśli zostanie usunięty z końca, pozostały backtick jest pobierany od końca komentarza.Nowe wiersze są umieszczone w taki sposób, że ich usunięcie nie wpłynie na zachowanie programu, ale zapobiegnie błędom w przypadku usuwania niektórych znaków, takich jak wiodący backtick.
źródło
405
została usunięta, ale wtedy zrozumiałem: nic, ponieważ albo wszystkie 404 liczby zostały już wydrukowane, albo druga pętla wydrukuje brakujące cyfry. Spektakularna praca.this
?Pyth - 16 bajtów
Podstawową ideą tego jest to, że jeśli usuniesz cyfrę
404
, to tylko zmniejsza liczbę, więc musimy uzyskać maksymalnie dwa404
, aby upewnić się, że mamy odpowiednią liczbę. Oczywiście jest więcej zwolnień.Wyjaśnienie:
Wypróbuj online tutaj .
źródło
Befunge-98 , 37 bajtów
Wypróbuj online!
Wyjaśnienie
Wykonywanie kodu promieniowania hartowana w befunge-98 nie jest zbyt złe, ponieważ można ustawić „delta” (czyli wielkości kroku wskaźnik instrukcji) ręcznie
x
. Jeśli więc ustawisz deltę na(2,0)
, odtąd każda inna postać jest pomijana i możemy po prostu podwoić wszystkie polecenia. Trudną rzeczą jest2 0
niezawodne wejście na stos. Będziemy potrzebować0 2 0
reszty programu do poprawnego działania, ale zrobimy to za darmo. Oto jak to robimy:Zauważ, że każda cyfra przesuwa się sama, więc w pełnym programie nastąpi początek,
2 0
który po prostu zignorujemy.W związku z tym usunięcie pierwszego lub drugiego znaku z programu nie ma znaczenia, ponieważ i tak nie będziemy używać tych cyfr. Podobnie usunięcie trzeciej postaci jest identyczne z usunięciem drugiej, więc nie musimy się o to martwić.
Zastanówmy się, co dzieje się w pozostałych dwóch przypadkach. Upuszczanie czwartej postaci:
Zauważ, że delta jest ustawiona na
(0,0)
. Ale to wcale nie przesuwa wskaźnika instrukcji, więc to samox
jest wykonywane ponownie natychmiast i tym razem pojawia się(2,0)
i wszystko jest w porządku (na dole stosu są ukryte zera dla naszych późniejszych celów).Zamiast tego upuśćmy piątą postać:
Teraz delta zostaje ustawiona na
(0,2)
. Jednak nadal nie ma ruchu poziomego, więc IP natychmiast zawija się do tyłux
i ponownie, ustawiana jest właściwa delta.Od tego momentu możemy zasadniczo zignorować powielanie znaków, a także tę początkową część, ponieważ zawsze będzie ona pomijana:
;
To rodzaj polecenia komentarz, który pomija wszystko aż do następnego;
napotkano. Jednak przeskakujemy nad pierwszym;
z,#
więc tylko część pomiędzy;
będzie wykonana od tego momentu.źródło
> <> ,
1036051 bajtówTestowane tutaj.
Używa tej samej taktyki jak ten program . Jeśli znak zostanie usunięty w pierwszym wierszu, drugi wiersz będzie nadal uruchamiany. Jeżeli znak w 2. linii zostanie usunięty,
v
przeniesie wykonanie do 3. linii, ponieważ 2. linia jest krótsza. Usunięcie w trzeciej linii nie ma wpływu na sterowanie programem, ponieważ jest to wykonanie dopiero po usunięciu w linii 2.Program będzie działał również w przypadku usunięcia podziału linii:
Przypadek 1:
Uruchomiona zostanie druga linia.
Przypadek 2:
Obie linie stają się jedną linią z podwójną instrukcją.
Wyjaśnienie:
Trzon programu jest następujący. Zauważ, że a
1
jest wypychane na stos już przez pierwszą linię.źródło
o" e"
?+1
ciebie możesz użyćl
. Również interpreter fishlanguage.com jest nieco dziwny (i denerwujący w użyciu, chociaż funkcja debugowania jest oczywiście przydatna). Myślę, że TIO używa nieco bardziej rozsądnego interpretera Pythona: tio.run/nexus/fish#@m9oqIAMysq4AMuxtrfVMslXUkhVssqzsrHBEPj/HwA1
s w pierwszym wierszu.> <> ,
42 3834 bajtówWypróbuj online!
Dzięki @Martin Ender i @Teal Pelican za zgolenie 8 bajtów!
Podobne do odpowiedzi mbomb007 , ale wykorzystuje tylko 2 linie.
Zamiast liczyć od 1 do 404 za pomocą pojedynczej wartości pamięci, ciągle przesuwałem długość stosu. Dzięki temu nie musiałem umieszczać niczego na stosie przed uruchomieniem pętli, co znacznie ułatwiało sprawę.
Oryginalny kod
Do
<
s obrócić wokół IP i/
jest no-op, jak owija wokół IP i nadal to normalne wzdłuż ścieżki. Odpowiedni kod to:I to się powtarza.
Usunięcie
Duży klucz tutaj to lustro
/
. Nie robi nic, jeśli druga linia zostanie zmodyfikowana - tylko zawija się do siebie i zasadniczo nie ma op-op. Ale jeśli znak z pierwszej linii zostanie usunięty, linia przesunie się w dół, tak że lustro uderzy w strzałkę<
, prowadząc do identycznej, niezmodyfikowanej pętli.Jedynym znaczącym usunięciem byłaby
\n
postać. Jest to również uwzględniane, ponieważ tworzy ten kod:Właśnie dodaliśmy kopię oryginalnej pętli
;?=*4o" e"lnll
do siebie. Ponieważ jest to pętla, nie ma znaczenia dla wykonania i działa tak, jakby nic się nie zmieniło.źródło
:+1
i drugi na:
jedenl
.;?=*4o" e"n:ll
też działa.Grusza , 34 bajty
Program zawiera znaki sterujące, więc oto
xxd
zrzut:Grusza jest w zasadzie pochodną Perla z pewnymi „interesującymi” funkcjami. Zrzuciłem to razem jako żart (tak, żebym mógł powiedzieć, że mój poliglot wydrukowano
a partridge
w A Pear Tree; w rzeczywistości robią to prawie wszystkie programy). Jest jednak kompletny w Turinga i naprawdę dobry w tego rodzaju wyzwaniach.Cechą, na której nam najbardziej zależy, jest to, że A Pear Tree uruchomi program tylko, jeśli jakiś podciąg kodu ma CRC-32
00000000
. Kod zostaje obrócony, aby na początku kwestionować podciąg. Tak się składa, że każda z dwóch (identycznych) połówek kodu ma kwestionariusz CRC-32 (z powodu tego podejrzanie wyglądającego komentarza binarnego na końcu), więc jeśli usuniesz znak ze źródła (złamanie CRC), druga połowa zostaje obrócona do początku, a#
znak pod końcem skomentuje uszkodzoną połowę poza binarnym śmieciem.Inna funkcja sprawia, że program jest nieco mniejszy: chociaż A Grusza jest interpretowana głównie jako Perl, ma kilka drobnych zmian, aby działała bardziej jak Python. Istotne jest tutaj to, że w przeciwieństwie do
print
instrukcji Perla (która po prostu uruchamia liczby razem),print
instrukcja A Pear Tree oddziela argumenty spacjami i wypisuje końcowy nowy wiersz. To daje nam ładnie rozdzielone spacjami wyjście, co oznacza, że nie musimy marnować bajtów na formatowanie. (Pamiętaj, że nie będziesz musiał wprowadzać żadnych danych do programu; jeśli język otrzyma dane wejściowe, domyślnie zakłada, że powinien coś z tym zrobić).Oczywiście to nie może konkurować z prawdziwymi językami golfa (i nie spodziewałbym się, że będzie), ale myślałem, że ludzie mogą uznać to za interesujące.
źródło
Befunge 98 , 34 bajtów
Wypróbuj online!
Działa to bardzo podobnie do mojej odpowiedzi > <> , ale zamiast lustra
/
korzystam z operacji skrętu w lewo,[
a następnie odwracam kierunek IP, który w tym przypadku jest funkcjonalnie równoważny zwierciadłem.Oryginalny kod
Usunięcie
Jeśli coś w drugim wierszu zostanie usunięte, przesunie się i nie wpłynie w ogóle na górę.
Jeśli coś w pierwszym wierszu zostanie usunięte,
[
wyśle adres IP do<
, który rozpoczyna identyczną pętlę (z wyjątkiem2j^^
której unika się^
s używanego w parze z[
)Ponieważ są 2 nowe wiersze, nie ma znaczenia dla kodu, jeśli zostanie usunięty (dzięki za @ masterX244 za to!)
źródło
Befunge-93,
5451 bajtówDzięki Mistah Figgins za uratowanie mi 3 bajtów.
Wypróbuj online!
Jest to zasadniczo ta sama sztuczka, która została zastosowana w wyzwaniu Hello World odpornym na awarie . Pierwsza linia zaczyna się od upewnienia się, że na początku stosu znajduje się 1, a następnie jedna ze
v
strzałek na końcu linii przekierowuje ścieżkę kodu na początek głównej procedury w linii 2 , wykonując od prawej do lewej.Usunięcie znaku z pierwszego wiersza spowoduje przesunięcie
v
strzałek o jeden, ale nadal pozwala to na pomyślne przekierowanie kodu do drugiego wiersza. Usunięcie znaku z drugiej linii powoduje, że<
strzałka na końcu linii przesuwa się poza ścieżkęv
powyżej, więc ścieżka kodu zostanie przekierowana do procedury tworzenia kopii zapasowej w linii 3.Usunięcie podziału pierwszej linii nie zaszkodzi, ponieważ powoduje to przesunięcie trzeciej linii na miejsce i zastąpienie drugiej linii. A usunięcie czegokolwiek po zakończeniu drugiej linii nie przyniesie żadnego efektu, ponieważ jest to tylko kod zapasowy.
źródło
The first line starts by making sure there is a 1 on the top of the stack...
Pierwsza linia jest pod tym względem całkiem pewna siebie. Możesz także skrócić <code> _ @ #!</code> to
_ @ # - `i umieść go przed drukowaniem, aby zapisać 3 bajty.JavaScript + HTML + fragmenty stosu,
167158154 bajtyNadużywanie faktu, że JavaScript w Stack Snippets zostaje umieszczony na stronie internetowej wewnątrz
<script>
elementu.źródło
Właściwie 18 bajtów
W rzeczywistości jest to język golfowy oparty na stosach.
Objaśnienie zaangażowanych poleceń (ponieważ działają one w powyższym kontekście):
źródło