Błąd 404: Nie znaleziono postaci


74

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 , więc wygrywa najkrótsze przesłanie (w bajtach)!


16
Czy oryginalny program (bez żadnych znaków) również musi działać?
Adnan

5
Czy błędy można zignorować, jeśli program nadal drukuje 1 - 404?
jrich

4
Może powinien istnieć znacznik taki jak utrudniający promieniowanie ?
Vi.

5
Głosowanie zamknąć, nie robimy swoją pracę domową dla Ciebie XD
チーズパン

Odpowiedzi:


16

05AB1E , 12 bajtów

Kod:

XX440044ÔÔŸŸ

Normalne objaśnienie kodu:

X             # Pushes the number 1.
 X            # Pushes the number 1 again.
  440044      # Pushes the number 440044.
        Ô     # Connected uniquify.
         Ô    # Connected uniquify.
          Ÿ   # Inclusive range of the top two elements.
           Ÿ  # Inclusive range on the array, which leaves it intact.

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:

440044ÔÔ
40044ÔÔ
44044ÔÔ
44004ÔÔ
440044Ô

Zakres obejmujący działa w następujący sposób na dwóch liczbach:

`1 5Ÿ`             ->    [1, 2, 3, 4, 5]
[1, 5]Ÿ            ->    [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]Ÿ   ->    [1, 2, 3, 4, 5]

Co zawsze sprawia, że ​​sekunda staje Ÿsię niemożliwa .

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!


34

JavaScript, 228 bajtów

etInterval=stInterval=seInterval=setnterval=setIterval=setInerval=setIntrval=setInteval=setInteral=setIntervl=setInterva=top=>4

setInterval
`405>(i=this.i?i:1)?alert(i++):0`///`
setInterval
`405>(i=this.i?i:1)?alert(i++):0`///`

Wyjaśnienie

Ocena kodu w a setIntervalpozwala 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ływania setIntervalcią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 setIntervalsię 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łania setInterval, 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ę” setTimeoutprawidł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, aby top>4to wyrażenie logiczne będzie ważna, ponieważ topjest predefiniowane w przeglądarkach, po prostu plonowanie false. Jeśli 4 zostanie usunięte, ciało funkcyjne po prostu staje się pierwszym setIntervalsegmentem, a drugi działa bez szwanku.

Teraz jedyne, o co należy się martwić, to usunięcie `.

Usunięty od początku, setIntervalpo 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 drugiemu setIntervalfragmentowi 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.


3
Zastanawiałem się, co by się zepsuło, gdyby jedna z cyfr w a 405został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.
ETHproductions

Co się stanie, jeśli część „góry” zaginie?
Scimonster,

@ Scimonster Nadal parsuje jako funkcję, zwracając 4, tylko z nieużywanym parametrem o nazwie „do” lub „op” lub „tp”
jrich

1
@Jrich oczywiście. Skurcz mózgu : P
Scimonster

Co się stanie, jeśli stracisz część this?
dkudriavtsev

25

Pyth - 16 bajtów

Podstawową ideą tego jest to, że jeśli usuniesz cyfrę 404, to tylko zmniejsza liczbę, więc musimy uzyskać maksymalnie dwa 404, aby upewnić się, że mamy odpowiednią liczbę. Oczywiście jest więcej zwolnień.

SSsetSS[404  404

Wyjaśnienie:

SS                       First one does 1-index range, second one sorts, which is no-op 
 s                       If the e is there, this is no-op, if only t is there, it sums a one element list, which is the item
  et                     e picks last element in list, and if e is gone, then t gets you the list without the first element which is good enough when combined with s
   SS                    Sorting twice is no-op
    [                    Start list, this can't be two element because if we get rid of initial 4, the 0 becomes third element which neeeds to be captured
     404                 One of the 404's
     <space><space>404   Need two spaces for redundancy, because 404404 *is* bigger than 404

Wypróbuj online tutaj .


23

Befunge-98 , 37 bajtów

20020xx##;;11++::''ee44**``kk@@::..;;

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ą jest 2 0niezawodne wejście na stos. Będziemy potrzebować 0 2 0reszty programu do poprawnego działania, ale zrobimy to za darmo. Oto jak to robimy:

20020xx

Zauważ, że każda cyfra przesuwa się sama, więc w pełnym programie nastąpi początek, 2 0któ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:

2000xx

Zauważ, że delta jest ustawiona na (0,0). Ale to wcale nie przesuwa wskaźnika instrukcji, więc to samo xjest 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ć:

2002xx

Teraz delta zostaje ustawiona na (0,2). Jednak nadal nie ma ruchu poziomego, więc IP natychmiast zawija się do tyłu xi 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:

...#;1+:'e4*`k@:.;

;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.

1+    Increment the top of the stack.
:     Duplicate it.
'e    Push 101.
4*    Multiply by 4 to get 404.
`     Greater-than check. Pushes 1 once the top
      reaches 405, otherwise 0.
k@    Terminate the program that many times.
:.    Print a copy of the top of the stack (and a space).

16

> <> , 103 60 51 bajtów

               vv
;?=*4o" e"n:ll<<
;?=*4o" e"n:ll<<

Testowane 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, vprzeniesie 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.

               vv;?=*4o" e"n:ll<<
;?=*4o" e"n:ll<<

Przypadek 2:

Obie linie stają się jedną linią z podwójną instrukcją.

               vv
;?=*4o" e"n:ll<<;?=*4o" e"n:ll<<

Wyjaśnienie:

Trzon programu jest następujący. Zauważ, że a 1jest wypychane na stos już przez pierwszą linię.

ll:n        Push length of the stack twice, duplicate, print as number
"e "o       Push 101, 32, output 32 as space
4*          101 * 4 is 404
=?;         Pop twice, if equal, halt
            (Execution wraps around)

Czy umiesz używać o" e"?
Martin Ender

I zamiast +1ciebie 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/HwA
Martin Ender

@MartinEnder To nie działa, jeśli usuniesz jeden ze 1s w pierwszym wierszu.
mbomb007


12

> <> , 42 38 34 bajtów

Wypróbuj online!

Dzięki @Martin Ender i @Teal Pelican za zgolenie 8 bajtów!

<<;?=*4o" e"lnll/
 ;?=*4o" e"lnll<

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:

          lnll   Prints the size of the stack + 1 and pushes the stack size twice
     o" e"       Prints a space and pushes 101
   *4            Multiplies to get 404
;?=              If the number we just printed was 404, end the program

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 \npostać. Jest to również uwzględniane, ponieważ tworzy ten kod:

<<;?=*4o" e"lnll/ ;?)*4o" e"lnll<

Właśnie dodaliśmy kopię oryginalnej pętli ;?=*4o" e"lnlldo siebie. Ponieważ jest to pętla, nie ma znaczenia dla wykonania i działa tak, jakby nic się nie zmieniło.


1
Naprawdę fajny sposób na zmniejszenie go do 2 linii. Jedyny problem, jaki widzę, to to, że nie ma 38 bajtów, ale 42? Zmniejszenie wewnętrznego kodu do; ;? = * 4o „e”: n: + 1l zmniejszyłoby to jednak do 38 bajtów. To po prostu umieszcza 84 * w ciągu „e” zamiast osobno.
Teal pelikan

1
Możesz także zamienić jeden :+1i drugi na :jeden l.
Martin Ender

Tak, dziękuję wam obojgu!
MildlyMilquetoast,

;?=*4o" e"n:llteż działa.
mbomb007

11

Grusza , 34 bajty

Program zawiera znaki sterujące, więc oto xxdzrzut:

00000000: 7072 696e 7420 312e 2e34 3034 2327 108a  print 1..404#'..
00000010: af70 7269 6e74 2031 2e2e 3430 3423 2710  .print 1..404#'.
00000020: 8aaf                                     ..

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 partridgew 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 printinstrukcji Perla (która po prostu uruchamia liczby razem), printinstrukcja 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.


9

Befunge 98 , 34 bajtów

Wypróbuj online!

<<.:@k`*4e':+1[

2.:@k`*4e':+1<^^j

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

<<                 Reverses code direction, sending IP to right
               [   Turns the IP left, into the ^, which reverses it.
                   It then hits this again, turning left to go West. (No-op)
            :+1    Adds 1 to the sum
        *4e'       Pushes 404
     @k`           Ends the program if (sum > 404)
   .:              Prints the sum

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ątkiem 2j^^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!)


co dzieje się z pustymi wierszami w kodzie ?. Może mógłbyś także podwoić podawanie linii, aby również był odporny
masterX244

Masz całkowitą rację, dzięki @ masterX244! Nie myślałem o tym.
MildlyMilquetoast,

lol, nigdy nie użyłem tego języka, ale z jakiegoś powodu szósty zmysł dał mi ten pomysł ...
masterX244

5

Befunge-93, 54 51 bajtów

Dzięki Mistah Figgins za uratowanie mi 3 bajtów.

111111111111111vv
+1_@#-*4"e":.:<<
+1_@#-*4"e":.:<<

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 vstrzał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 vstrzał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ę vpowyż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.


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.
MildlyMilquetoast,

5

JavaScript + HTML + fragmenty stosu, 167 158 154 bajty

Nadużywanie faktu, że JavaScript w Stack Snippets zostaje umieszczony na stronie internetowej wewnątrz <script>elementu.

or(x="",i=405,d=document;--i;)d[i]||(x=d[i]=i+' '+x);d.write(x)</script></script><script>for(x="",i=405,d=document;--i;)d[i]||(x=d[i]=i+' '+x);d.write(x)


@ Flp.Tkc Naprawiono.
user2428118,

4

Właściwie 18 bajtów

:404::404kMkMMRRSS

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):

Numbers are indicated by round brackets () and lists by square brackets []

:         - pushes the longest string of characters in '0123456789+-.ij' as a numeric
k         - pop all the elements on the stack into a list [l] and push [l]
M         - pop [l], push max([l])
            pop (a), push (a)
R         - pop [l], push reverse([l])
            pop (a), push range([1,a])
S         - pop [a], push sorted([a])
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.