Spróbuj napisać kod w swoim języku i spraw, aby nie spełniał już naszych kryteriów bycia językiem programowania .
Język spełnia nasze kryteria (uproszczona wersja tego wyzwania) bycia językiem programowania, jeżeli:
- Może w jakiś sposób odczytać dane wejściowe użytkownika reprezentujące krotki dodatnich liczb całkowitych.
- Może generować co najmniej dwa różne możliwe wyniki w zależności od danych wejściowych.
- Może to zająć dwie dodatnie liczby całkowite i dodać je (a wynik może wpłynąć na wynik).
- Może przyjmować dodatnią liczbę całkowitą i decydować, czy jest liczbą pierwszą (a wynik może wpływać na wynik).
- Na potrzeby tego wyzwania, każdy rodzaj wyniku, który nie jest dozwoloną metodą wyjścia dla normalnego wyzwania, jest ignorowany. Nie ma zatem znaczenia, czy program może również odtwarzać utwór muzyczny, czy publikować przez HTTP itp.
- Aktualizacja: Możesz także wybrać jedną lub kilka dozwolonych metod wyjściowych i zignorować wszystkie pozostałe. Musisz jednak wszędzie używać tej samej definicji w następujących kryteriach. A jeśli twój program może wyłączyć więcej niż jedną metodę wyjściową - jest to warte więcej głosów pozytywnych.
Przykłady takie jak uniemożliwianie wyjścia lub wyłączanie wszystkich konstrukcji pętli, aby nie mógł wykonać testu pierwotności i upewnienie się, że użytkownik nie będzie mógł ich ponownie włączyć.
Powinieneś zostawić miejsce na wstawienie nowego kodu. Domyślnie jest na końcu kodu. Jeśli rozważymy umieszczenie kodu źródłowego w tym miejscu w odpowiedzi i uruchomienie pełnego kodu jako kompletnego programu interpretera nowego języka, język ten nie powinien spełniać kryteriów.
Ale wstawiony kod musi zostać wykonany w taki sposób, aby spełniał kryteria:
- Wstawiony kod musi być gramatycznie taki sam jak coś (powiedzmy, że jest to blok kodu w poniższych kryteriach), który ogólnie spełnia kryteria, z perspektywy tego, kto chce napisać wyróżnienie składni. Więc nie może być w ciągu, komentarzu itp.
- Wstawiony kod musi zostać faktycznie wykonany, tak aby spełniał kryteria. Dlatego nie może być w nieużywanej funkcji ani
sizeof
w C, nie można po prostu wykonać tylko niefunkcjonalnej części kodu i nie można umieścić go po nieskończonej pętli itp. - Nie można ograniczyć liczby możliwych poprawnych gramatycznie programów wygenerowanych w ten sposób. Jeśli istnieje już ograniczenie długości w używanym języku, nie powinno ono spełniać kryteriów, nawet jeśli limit ten zostanie usunięty.
- Nie możesz modyfikować ani „wykorzystywać” treści wejścia / wyjścia, ale możesz uniemożliwić dostęp do nich.
- Te kryteria zwykle dotyczą tylko języków bez wyraźnego We / Wy:
- Twój kod powinien przekierować dane wejściowe użytkownika (zawierające informacje o dowolnej długości) na wstawiony kod, jeśli blok kodu zwykle nie jest w stanie uzyskać danych wejściowych użytkownika bezpośrednio / jawnie w języku, którego używasz.
- Twój kod powinien wydrukować zwróconą wartość wstawionego kodu, jeśli blok kodu zwykle nie jest w stanie wyprowadzić rzeczy bezpośrednio / jawnie w języku, którego używasz.
- W przypadku wydrukowania zwróconej wartości, która jest wpisana w używanym języku, zwracany typ powinien mieć 2 różne praktycznie możliwe wartości. Na przykład nie można użyć tego typu
struct {}
lubstruct {private:int x;}
w C ++.
To konkurs popularności. Wygrana jest najwyższa poprawna odpowiedź (więc nikt nie zauważył błędu lub wszystkie błędy zostały naprawione).
Wyjaśnienia
- Nie należy modyfikować kodu w formie tekstowej, ale można zmienić składnię przed interpretacją lub kompilacją kodu.
- Podczas działania kodu możesz wykonywać inne czynności. Ale powodem, dla którego nie spełnia kryteriów, powinien być sam wstawiony kod. Może powodować błędy z powodu interferencji innego wątku, ale nie tylko zostać zabity przez inny wątek.
- Wszystkie specyfikacje w zasadzie oznaczają, że gramatycznie powinno spełniać kryteria, jeśli wszystkie wbudowane elementy nie zostały zmienione, ale w rzeczywistości tak nie są. Nie ma problemu, jeśli znajdziesz jakieś nie gramatyczne obejścia, takie jak prawidłowe przekazywanie parametrów do bloku kodu, ale uniemożliwiają ich użycie w jakiś sposób.
- Ponownie wstawiony kod musi zostać faktycznie wykonany. Kod po nieskończonej pętli lub awarii jest uważany za „faktycznie nie wykonany”, dlatego nie jest prawidłowy . Te odpowiedzi mogą być interesujące, ale na tej stronie jest już kilka nieskończonych pętli lub zawieszających się pytań i możesz znaleźć bardziej odpowiednią odpowiedź. Jeśli nie, rozważ zadanie nowego pytania. Przykładami tych pytań są:
Tabela liderów
var QUESTION_ID=61115/*,OVERRIDE_USER=8478*/;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,/*getComments()*/(more_answers?getAnswers():process())}})}/*function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}*/function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),score:s.score,language:a[1],lang:jQuery('<div>').html(a[1]).text(),link:s.share_link})}),e.sort(function(e,s){var r=e.score,a=s.score;return a-r});var s={},r=1,a=null,n=1;e.forEach(function(e){e.score!=a&&(n=r),a=e.score,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",e.n=n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.score).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text())/*,s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}*/});var t=e/*[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o])*/;t.sort(function(e,s){return (e.lang.toUpperCase()>s.lang.toUpperCase())-(e.lang.toUpperCase()<s.lang.toUpperCase())||(e.lang>s.lang)-(e.lang<s.lang)});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{PLACE}}",o.n).replace("{{LANGUAGE}}",o.language).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.score).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<(?:h\d|(?!.*<h\d>)p)>\s*((?:[^,;(\s]| +[^-,;(\s])+)(?=(?: *(?:[,;(]| -).*?)?\s*<\/(h\d|p)>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;float:left}table{width:250px}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/all.css?v=7509797c03ea"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Score</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Sorted by Language</h2> <table class="language-list"> <thead> <tr><td></td><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{PLACE}}</td><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
źródło
Odpowiedzi:
JavaScript Shell
To sprawi, że język będzie całkowicie bezużyteczny.
Czy to nie fajne, że JavaScript ma tak fajną funkcję do samozniszczenia?
Jest to dość proste,
clear
funkcja całkowicie opróżnia obiekt.this
odnosi się do obiektu globalnego usuwającego wszystko, łącznie z konstruktorami i funkcjami.Ponieważ wszystko to wyczyści , zrobienie czegokolwiek , nawet zdefiniowanie literału spowoduje wygenerowanie błędu, przez co język będzie całkowicie bezużyteczny: * Nie wymaga środowiska REPL . Wykorzystuje silnik SpiderMonkey (powłoka, a nie przeglądarka), oryginalny silnik JS.
źródło
clear
funkcja wydaje się być dodatkiem specyficznym dla powłoki SpiderMonkey, a nie ogólną cechą JavaScript. Z pewnością nie pojawia się w specyfikacji ES5 § Właściwości funkcji obiektu globalnego . Próbowałem tego znode
i otrzymałem „ReferenceError: clear nie jest zdefiniowany”. W konsoli Chrome i Firefoxclear
funkcja po prostu czyści konsolę, bez względu na przekazywane argumenty. A może narzędzie, którego użyłeś, było zgodne z wersją ECMAScript starszą niż 5.1?Emmental
Wiem, że to nie jest golf golfowy, ale odpowiednie narzędzie do pracy, wiesz ...
Kod użytkownika można wstawić po
!
.Emmental jest interesującym esolangiem opartym na przepisywaniu tłumacza. Każdy pojedynczy symbol (w tym wbudowane) może zostać ponownie zdefiniowany jako dowolny program Emmental. Język opiera się na tej funkcji tak bardzo, że nie zapewnia żadnych konstrukcji zapętlonych. Zamiast tego definiujesz polecenia rekurencyjne, które pojawiają się we własnych definicjach.
Ta redefinicja zachodzi przez
!
, który odczytuje znak ze stosu, a następnie odczytuje ciąg ze stosu, dopóki nie napotka znaku;
. Znak jest następnie redefiniowany, aby oznaczać program reprezentowany przez ten ciąg.Oznacza to, że możemy wyłączyć funkcje zapętlenia Emmentala, ponownie definiując
!
się jako pusty program. Podczas gdy cały inny kod Emmental nadal działa doskonale, a wiele kryteriów języka programowania jest nadal spełnionych, nie można ponownie zdefiniować żadnych symboli. Bez tej funkcji (a zatem bez możliwości zapętlenia) Emmental nie może już sprawdzać, czy liczba jest liczbą pierwszą.źródło
PHP
Można całkowicie zabić PHP, ustawiając limit pamięci na 1.
To całkowicie umrze.
Spróbuj tego:
Nie powinno to nawet powodować żadnych błędów, ponieważ nie ma na to wystarczającej ilości pamięci.
Możesz przeczytać więcej o
memory_limit
dyrektywieJeśli poprzedni jest nieprawidłowy, można użyć buforów wyjściowych:
To całkowicie usuwa wszelkie dane wyjściowe. Ponieważ bufor wyjściowy jest nadal otwarty, niektóre inne rzeczy przypadkowo pozostawione po kodzie również nie zostaną wyświetlone.
Wykorzystując pomysł @fschmengler :
Pozwoli to uniknąć problemu usuwania automatycznie uruchamianego bufora wyjściowego, używanego do przechwytywania danych wyjściowych do skompresowania.
Zapobiega to również usuwaniu lub opróżnianiu bufora wyjściowego (wysyłanie do przeglądarki). Aby to poprawić, dodawany jest moduł obsługi wyjścia, który zawsze zwraca pusty ciąg.
Uruchomienie
ob_end_flush(); echo "Hello, world!";
nic nie da, ale wysłałoby wynik za pomocą zwykłegoob_start();
.Dziękujemy @LucasTrzesniewski za ujawnienie tego problemu!
źródło
while(ob_get_level()) ob_end_flush();
jest używany w ramach do opróżniania wszystkich buforów wyjściowych, które mogły zostać przypadkowo otwarte.ob_end_flush(); echo "Hello, world!";
This shouldn't even throw any error, since there isn't enough memory for that.
LOL'ed at :)kod maszynowy x86 w trybie rzeczywistym (=> prawie dowolny program DOS)
to znaczy
Mam nadzieję, że nie byłeś zbyt przywiązany do stołu przerwań.
źródło
cli
, a następnie naprawię tabelę przerwań i przejdę do obliczania liczb pierwszych itp.?cli
(inp
ioutp
tylko dla pewności), ale nie wiem, czy to byłoby dozwolone według zasadclear(this);
, limit pamięci w PHP, rekursja limit w Pythonie, środowisko sandboxowe w Pythonie i wiele innych), nie widziałbym tego jako problemu.Jawa
Edycja: Środki zaradcze sprawiają, że ten gigant :(
Przekierowuje stdin i stdout na strumienie zerowe i zastępuje argumenty pustą tablicą. Używa również ogromnej ilości hacków refleksyjnych, aby upewnić się, że standardowe IO jest naprawdę ukryte. Na koniec ustawia menedżera bezpieczeństwa, aby upewnić się, że standardowe IO nie może zostać odtworzone, a to sprawia, że programy nie mogą ustawić kodu wyjścia.
źródło
Lua
W Lua
_ENV
jest środowiskiem, w którym przechowywane są wszystkie zmienne globalne, funkcje, tabele itp. Zdefiniowanie go jako pustego ciągu oznacza, że nie możesz zdefiniować niczego nowego, a wszystkie funkcje i zmienne są usuwane. Oznacza to, że nie możesz nic wysyłać, przyjmować danych wejściowych ani właściwie nic robić.źródło
_ENV=5
działa Jeśli tak, jest o jedną postać krótszy.Język programowania Szekspira
W języku SPL wbudowany analizator składni, który jest pobierany z programem, podlega bardzo szczegółowym regułom dotyczącym tego, co może się zdarzyć w skrypcie. Jedną z takich zasad jest to, że tylko dwie postacie mogą być jednocześnie na scenie. Ponadto sprawienie, by postać opuściła scenę, która nigdy nie była na scenie, dezorientuje ją. To samo dotyczy dodawania postaci do sceny, która już jest na scenie. Gdy parser otrzyma błąd, odmówi wykonania Cokolwiek innego; dosłownie musisz całkowicie zamknąć program i analizator składni, a następnie ponownie uruchomić wszystko.
PS Jeśli nie masz pojęcia, jak działa ten język, Google go. To jest zajebiste.
źródło
Pogawędka
Nie jestem pewien, czy to się kwalifikuje:
Spowoduje to usunięcie całego środowiska wykonawczego, zawieszając silnik obiektów. Jedynym sposobem, aby to naprawić, jest przymusowe zakończenie procesu i ponowne uruchomienie z kopii zapasowej.
Dla tych, którzy nie wiedzą, sposób działania [Visual Works] Smalltalk jest nieco dziwny. To jest jak mini-OS. Po uruchomieniu Smalltalk ładujesz „obraz pamięci” do pamięci RAM i kontynuuje on wykonywanie od miejsca, w którym został przerwany. Cały interfejs Smalltalk IDE jest napisany w języku Smalltalk i można go dynamicznie modyfikować.
W szczególności
Smalltalk
jest słownikiem zawierającym wszystkie zmienne globalne. W szczególności za każdym razem, gdy deklarujesz nową klasę, tworzona jest zmienna globalna o tej nazwie, wskazującaClass
obiekt dla twojej nowej klasy. Więc ustawienieSmalltalk
naNil
(w zasadzie zero) usuwa wszystkie klasy w całym systemie. Nawet moduły obsługi zdarzeń GUI idą na całość.Nie mam pojęcia, dlaczego ta zmienna jest nawet zapisywalna. Prawdopodobnie dlatego, że jest to zmienna globalna i dlatego istnieje jako wpis w sobie. (Czy boli cię głowa? Czy wspominałem już, że każdy obiekt ma klasę, a klasy są obiektami, więc każda klasa ma klasę? Klasa klasy nazywa się metaklasą, ale metaklasa jest również przedmiotem, który w związku z tym ma Klasa...)
Podobny efekt można prawdopodobnie osiągnąć, usuwając słownik zamiast zastępując go wartością null. Rzeczywiście, istnieje wiele rzeczy, które można zakodować, aby usunąć wszystkie klasy w systemie, co nie pozwala nic zrobić. Ale ponieważ rzeczywisty kompilator Smalltalk jest także klasą ... wszystko, co łamie język, również trochę psuje całe IDE, więc ...
źródło
nil
zamiastNil
w Pharo.true become: false
, ale myślę, że to nie działa w nowszych wersjach języka. W ten sposób możesz zabić SmallTalk / V 286.Haskell
Jest tu kilka możliwości.
Nudny pomysł nr 1: Zdefiniuj,
main
aby nic nie robić. Teraz, bez względu na inny kod, który napiszesz, nigdy nie będzie mógł zostać wykonany. (Chyba że ręcznie uruchomisz go z REPL.)Nudny pomysł nr 2: Zdefiniuj moduł bez publicznego eksportu. Teraz, bez względu na inny kod, który piszesz, nigdy nie może zostać wykonany.
Ciekawy pomysł: wyłącz cały import.
Teraz możesz zdefiniować funkcje, które są widoczne i można je uruchomić ... ale nie mogą nic zrobić. Wszystkie standardowe typy i funkcje Haskell są teraz ukryte. (Z wyjątkiem kilku rzeczy naprawdę głęboko osadzonych w języku).
W szczególności nie można wykonać żadnych operacji we / wy. Nie można także wykonywać arytmetyki precyzyjnej dla maszyny. (Ponieważ
Int
,Double
itp obecnie nieokreślone).Ty może jeszcze napisać funkcje lambda kamienia nazębnego, który ma wykonać pewne obliczenia choć prawdziwe. Po prostu nie możesz dostać żadnych danych do ani z tego. Ale możesz oczywiście napisać inny, osobny moduł, który wywołuje
Fubar
powyższy moduł i wykonuje operacje we / wy w jego imieniu (udowadniając w ten sposób, że kod wykonuje i robi rzeczy).Niektóre subtelności:
Ślepa
foo = foo
deklaracja jest potrzebna, aby nikt nie dodawał dodatkowego importu. (Importy nie mogą pojawić się po deklaracjach.)Istnieją różne niestandardowe rozszerzenia języka Haskell, które pozwolą ci wyjść z tej sytuacji. Ale rozszerzenia językowe muszą być włączone za pomocą pragmy kompilatora na początku pliku. (Lub z przełączeniem kompilatora z wiersza poleceń. Naprawdę nie mogę temu zapobiec!)
źródło
foobar
, pisownia, której użyłeś, ma ... niezamierzone skojarzenia.Postscriptum
Tak, PostScript to język programowania. Co więcej, jest to język programowania, w którym wszystkie konstrukcje językowe są funkcjami zdefiniowanymi przez system, które można przedefiniować ...
Po angielsku:
Magic
.systemdict
dodaj ten sam kluczMagic
z pustą definicją („{}
”).Magic
na górę stosu słownika.Od tego momentu każde polecenie języka PostScript jest zdefiniowane, aby nic nie robić. AFAIK, nie można uciec od tego stanu.
(Technicznie rzecz biorąc, nie „niszczysz” starych definicji, po prostu je cieniasz. Gdybyś mógł nadal wykonać
end
, to wyskoczyłobyMagic
ze stosu słownika, odtajniając wszystkie polecenia i przywracając ci życie. Ale ponieważend
sama w sobie też jest zacieniona ... teraz nic nie zrobi.)Zauważ, że wszystkie polecenia będą nadal wykonywane ... po prostu są teraz zdefiniowane, aby nic nie robić. Nie dostaniesz żadnego błędu, po prostu nic się nie wydarzy. (Cóż, przypuszczam, że w końcu nastąpi przepełnienie stosu ...)
źródło
Dowolny program uruchamiany w systemie Linux / x86 (-64)
Ten program jest napisany w C, ale może zakłócać działanie dowolnego programu działającego pod Linux / x86 (-32 lub -64). Poprzedzasz go do wywołania z linii poleceń programu, który chcesz zakłócić.
Używa interfejsu API debuggera, aby uniemożliwić programowi docelowemu generowanie jakichkolwiek danych wyjściowych. W szczególności wszystkie wywołania systemowe, które mogą komunikować coś ze światem poza procesem (oczywiście
write
, oczywiście, ale takżeopen
podczas tworzenia pliku, większość interfejsu API gniazda,kill
po zastosowaniu do innego procesu, ...) zawiedzie tak jakby były niewdrożone._exit
jest dozwolone, ale kod wyjścia jest zastępowany przez zero.W przeciwieństwie do poprzedniej edycji tej odpowiedzi wiele programów może działać prawie do końca w tych warunkach; po prostu cała ich praca jest marnowana. Na przykład, jeśli to zrobisz
./no-syscalls /bin/ls
(zakładając, że GNU coreutilsls
) czyta cały katalog i formatuje go, a następnie wszystkiewrite
wywołania generujące dane wyjściowe kończą się niepowodzeniem. (Jednak wszystko, co musi otworzyć dwukierunkowy kanał komunikacji, takie jak wszyscy klienci X11, zawiedzie w tym momencie. Myślałem o zezwoleniu,socket
ale niesend
, ale wydawało się, że zbyt prawdopodobne jest otwarcie luk).Istnieje kilka opcji wiersza polecenia, aby poprawić zachowanie;
Dynamicznie połączone programy nawet nie wyjdą z dynamicznego linkera w
-e
trybie.-S
oczywiście otwiera ogromną dziurę w polityce, ale może być zabawne, gdy programy narzekają, że nic nie działa, npMusisz odczytać dane wyjściowe dziennika przy
/usr/include/asm*/unistd.h
otwartym w innym oknie, ponieważ jest to już dość długie.Niestety, używane przez to interfejsy debuggera są słabo spójne we wszystkich implementacjach Uniksa i są z natury specyficzne dla procesora. Przeniesienie go na inne architektury procesora byłoby stosunkowo proste (wystarczy dodać odpowiednie definicje
SYSCALL_*_REG
) i prawdopodobnie możliwe jest przeniesienie go na dowolny system Unixptrace
, ale może być konieczne obszerne zebranie się na białej liście syscall, a także radzenie sobie z rozbieżnościami wptrace
.źródło
-DNO_EXIT
tryb jest dla ludzi, którzy czują się tak jak ty. W tym trybie nie jest możliwe uzyskanie znaczącego wyniku.strace
?TeX
Nie jestem pewien, czy to faktycznie zadziała, ale teoretycznie powinno się to załamać,
\
ponieważ postać ucieczki nie pozostawia ci sposobu na naprawienie tego. Zwykle TeX potrafi czytać i zapisywać pliki, teraz nie może pisać niczego, co zależy od logiki. Tak więc język jest teraz łamany zgodnie z definicją OP.EDYCJA: Inne polecenia zabicia pobrane z komentarzy (chociaż oba mogą naruszać regułę kodu należy wykonać):
\def\fi{}\iffalse
przez smpl tworzy nieodłączną gałąź if\catcode13=9%
autor: iwillnotexist idonotexist tworzy niekończący się komentarzźródło
\def\fi{}\iffalse
. Nie mogę publikować odpowiedzi na ten temat, ponieważ wymaga to co najmniej 10 powtórzeń uzyskanych z tej witryny, ale to również nie pozwoli na wydruk.\fi
swoje pierwotne znaczenie, prawda? Zatem język nie jest łamany bez żadnej naprawy.\fi
to prymityw TeX. I nie, nie można na nowo zdefiniować niczego w tej chwili,\iffalse
został nazwany.\catcode13=9%
że całkowicie zepsuję język (wszystko, co%
jest dalej, i znaki nowej linii (ASCII char 13) są ignorowane, więc komentarz rozciąga się na nieskończoność), chciałem opublikować go tutaj. Ale masz już nieco dłuższe polecenie.Zadraśnięcie
when [timer v] > (0)
Będzie działać tak szybko, jak kod zostanie zainicjowany, które jeśli jesteś w edytorze jest jeszcze przed uruchomieniem kodu.when I receive (join[][])
Spowoduje błąd zostać wyrzucony za każdym razem coś jest nadawany, wstrzymując wykonanie kodu, jeśli masz wersję Developer Flash. Tabreak
funkcja utworzy klony i wyzwoli błąd transmisji. Każdy klon będzie trwał dwie sekundy, a następnie sam się usunie, obciążając stos. I każdy klon zareaguje nawhen [timer v] > (0)
uruchomieniebreak
podprogramu i zresetowanie timera, co spowoduje ponowne uruchomienie kodu timera. Ponadto, każdy klon zareaguje również na każdy błąd transmisji, co oznacza, że liczba błędów na ocenębreak
to liczba kwadratów podniesiona do kwadratu. Czy zapomniałem wspomnieć, żebreak
funkcja marun without screen refresh
zaznaczone, powodując zawieszanie się, wstrząsanie i opóźnianie edytora, a także pobieranie i przydzielanie pamięci. I maksymalnie wykorzystując procesor.Każdy kod dodany w dowolnym miejscu z tym działaniem nie będzie w stanie utworzyć klonów (przekroczony limit 300 klonów), a także rozgrzać i zawiesić komputer z uruchomionym programem. I chwytanie pamięci, dopóki nie będzie już więcej do pobrania, pozostawiając zmienne źle funkcjonujące.
A po zbyt długim opóźnieniu, aby uruchomić
when [timer v] > (0)
blok, nadal będzie działaćbreak
.Dzięki @towerofnix za przypomnienie mi o usterce,
when I receive
którą znalazłem jakiś czas temu i danie mi pomysłurun without screen refresh
. Jeśli ci się podobało, oto oryginał: https://codegolf.stackexchange.com/a/61357/43394źródło
stop this script
: Pwhen I receive
usterka”?when I receive
Blok kapelusza jest przeznaczony wyłącznie do pobierania danych z listy rozwijanej.join[][]
Blok zwraca typ danych, żewhen I recieve
blok nie jest przeznaczony do zaakceptowania. Za każdym razem, gdy coś jest nadawane, wszystkie bloki kapelusza sprawdzają i oceniają zwracaną wartość bloku, zgłaszającincorrect type
błąd.join
bloku.n
”(n-1)
działa na pozytywnen
<3, ale ponieważ jest to algorytm, dobry algorytm powinien być w stanie zrobićn
wystarczająco duży, aby móc odrzucić ten argument. Nie jestem pewien, czy szybsza czy wolniejsza maszyna uczyniłaby ją bardziej użyteczną. Zgadzam się jednak, że to rozwiązanie można obejść. To nie jest gliniarz i rabuś , ale i tak dobrze zrobione.Język Mathematica / Wolfram
Mathematica to interpretowany język, w którym nazwy poleceń są symbolami, którymi może manipulować programista. Nie można usunąć wbudowanych operatorów, ale można je przeciążać lub w inny sposób modyfikować ich funkcje. Poniżej szyfruje polecenie „With”, które jest potrzebne do przypisania zmiennych nawet wewnętrznie. Ta zmiana zapobiega trzymaniu przez jądro argumentów nieocenionych aż do zakończenia przypisania i zabija język zupełnie martwy.
Jeśli to polecenie zostanie uruchomione w sesji interaktywnej lub w bloku kodu, Mathematica nawet nie będzie w stanie dodać
1+1
(wynikowy komunikat o błędzie ma długość strony, więc nie dołączę go tutaj).źródło
PHP
Dziwi mnie, że tak naprawdę działa, ale zamyka
STDOUT
iSTDERR
tłumi wszystkie dane wyjściowe. Aby mieć pewność, że nie zostaną ponownie otwarte, otwieramy/dev/null
trzy razy, aby ponownie przypisać deskryptory plików 0, 1 i 2:Więcej na ten temat: https://stackoverflow.com/questions/937627/how-to-redirect-stdout-to-a-file-in-php
źródło
Partia DOS (przed Windows 95, jak sądzę)
Wydane bez argumentów powoduje to odłączenie wiersza poleceń od terminala. Dalsze próby odczytu danych wejściowych lub wygenerowania danych wyjściowych nic nie robią.
Jeśli chcesz wiedzieć, jak prawidłowo korzystać z CTTY:
Nieco mocniejszy plik wsadowy może nawet odpowiedzieć na modem i połączyć wszystko, co nawiązało połączenie z CTTY.
źródło
Common Lisp
Mam nadzieję, że nie potrzebujesz tych otwierających nawiasów.
Jest to makro czytnika, które informuje Lisp Reader, aby zastąpił każde wystąpienie
(
wywołaniem(lambda (x y) ())
funkcji, która przyjmuje dwa argumenty i nic nie zwraca. Na przykład odczytałby(foo)
jakofoo)
, zinterpretowałfoo
jako zmienną, a następnie wrzucił niedopasowany błąd w nawiasie0
.źródło
)
jako coś łamliwego! W ten sposób będzie mniej błędów.Zadraśnięcie
Oto dość prosty przykład, który spowoduje awarię przeglądarki (i teoretycznie komputera):
Zostawiłem to uruchomione na około dwadzieścia sekund, a potem straciłem 2,65 GB pamięci do Scratcha. Zaledwie chwilę później zniknęło 5 GB.
Zdecydowanie sugeruję, abyś mógł wymusić zamknięcie Adobe Flash lub przeglądarki internetowej przed uruchomieniem tego!
Ja naprawdę chciałem zrobić chłodną odpowiedź lubią
clear(this)
JS jeden ale niestety Scratch nie ma żadnych sposobów, aby to zrobić. Zaktualizuj ten post (lub stwórz własny), jeśli znajdziesz inny sposób, aby Scratch był bezużyteczny!źródło
Czw
Z nową linią na końcu
Ten język opiera się na definiowaniu zestawów reguł, a symbol
::=
oznacza koniec zestawu reguł. Niemożliwe jest zrobienie WSZYSTKIEGO w TYM, bez zdefiniowania reguł, które to robią, więc bez względu na to, co postawisz po::=
, nic się nie stanie.Alternatywna odpowiedź
(i tak dalej dla każdego znaku w całym Unicode, w tym także przed
A
znakiem i znaków niedrukowalnych). Wymaga to opcji wiersza polecenia-r
.źródło
MATLAB
Poniższy fragment kodu sprawia, że środowisko jest całkowicie bezużyteczne 1 :
Zastępuje to
builtin
funkcję iclear
funkcję z nowymi uchwytami funkcji anonimowych, które po prostu powracają zafalse
każdym razem, gdy próbujesz wywołać te funkcje.builtin
Funkcja zapewnia, że jeśli istnieją jakieś niestandardowe funkcje piszesz MATLAB, które są takie same nazwy jak te, które są wbudowane do MATLAB (rzeczy jaksum
,max
,min
, itd.), Są w stanie wywołać te jednoznacznie zamiast przeciążonych funkcji . Podobnieclear
daje możliwość wyczyszczenia wszystkich zadeklarowanych zmiennych, dzięki czemu możesz zacząć od nowa. Usunięcie tych możliwości uniemożliwi korzystanie z MATLAB bez ponownego uruchomienia programu.W MATLAB R2015a otrzymuję również następujący komunikat:
Obszar roboczy to zmienne, które są obecnie zadeklarowane w środowisku, dzięki czemu można ich później użyć. Spowoduje to trwałe wyłączenie obszaru roboczego, więc wszelkie zmienne, które spróbujesz utworzyć, nie zostaną zapisane, a zatem nie będzie można zrobić postępu podczas wykonywania wierszy kodu w MATLAB.
1: Kredyt trafia do użytkownika Dev-iL, który pierwotnie odkrył ten pomysł.
źródło
feval('clear')
naprawić. Lub:s=str2func('clear'); s()
.///
Jedyna operacja /// powtarza podstawienie ciągu, w następujący sposób:
/pattern/replacement/
.Ten kod usuwa wszystkie
/
w ten sposób, że nie można użyć powtarzania podstawiania ciągów, więc w zasadzie wszystko, co napiszesz, zostanie wydrukowane (z wyjątkiem/
s).Nadal możesz używać
\
s, ale to ci niewiele pomoże.źródło
Befunge-96
Kod użytkownika może podążać w dowolnym miejscu po tej sekwencji, o ile są to pierwsze trzy znaki w źródle.
'
Poleceń (string tryb jeden-shot) popycha wartości ASCII~
na stosie (czyli 126), ah
komenda ustawia co jest znane jako Holistic Delta z tej wartości. Dla tych, którzy nie znają Befunge-96, Holistyczna Delta jest przesunięciem dodawanym do wartości każdego bajtu polecenia, z którym zetknie się interpreter.Gdy delta jest ustawiona na 126, jedynym prawidłowym poleceniem, które można wygenerować, jest
~
(wprowadzanie znaków) za pomocą bajtu zerowego w źródle. Wszystko inne niż bajt zerowy przełożyłoby się na wartość większą niż 126 i żadna z tych wartości nie byłaby prawidłowymi poleceniami Befunge.Myślę, że można śmiało powiedzieć, że uniemożliwiłoby to zakwalifikowanie się jako język programowania.
źródło
Gwizd
A potem, gdzie indziej w projekcie,
Proste makro o nieszkodliwie brzmiącej nazwie, ale niezwykle frustrującym efekcie. Kompilator Boo wykorzystuje wielostopniowy potok, który zaczyna się od analizowania źródła do AST, a kończy na generowaniu kodu. (Ogólnie. Można go ponownie skonfigurować dla różnych aplikacji.) Każdy krok pomiędzy wykonuje różne operacje na AST.
W części znajduje się etap ekspansji makr, w którym makra są wykonywane w kontekście kompilatora. Pamiętasz bit z ostatniego akapitu o rekonfiguracji potoku? Jeśli podczas ekspansji makra zostanie wywołane makro, które czyści potok, użytkownik nie wyświetli żadnego błędu, ale wszystkie kroki po rozwinięciu makra (w tym generowanie kodu) już tam nie są. W efekcie powstaje coś, co wygląda na udaną kompilację - nie wyświetla się żaden komunikat o błędzie - ale z jakiegoś powodu nie ma pliku binarnego! Gwarantowane jest doprowadzenie nawet najlepszych narzędzi do rozwiązywania problemów do ściany, jeśli dobrze ukryjesz makro i wywołanie.
źródło
NGN / APL
NGN / APL pozwala na redefiniowanie prymitywów, więc redefinicja (
←
) wszystkich funkcji prymitywnych⊢
(„pass through”: oba⊢3
i2⊢3
daje3
) sprawia, że język jest całkowicie bezużyteczny:Wypróbuj tutaj.
źródło
Ruby (29 znaków)
Ponieważ „send” jest używane wewnętrznie za każdym razem, gdy wywoływana jest metoda w Ruby, i ponieważ wszystkie obiekty dziedziczą z klasy Object. Powinno to zatrzymać dowolną metodę.
Ciekawostka: w teorii brzmi to doskonale. Ale z jakiegoś powodu wydaje się, że nie sprząta języka Ruby. Nie mam pojęcia, dlaczego można uruchomić ten kod, a następnie nadal korzystać z otwartego środowiska Ruby.
źródło
Tcl
Spowoduje to usunięcie wszystkich słów kluczowych z języka oprócz
if
irename
.Powyższy kod spowoduje błąd w nowym kodzie. Jest więc dyskusyjne, czy nowy wstawiony kod rzeczywiście zostanie „wykonany”. Poniżej znajduje się wersja, która wykonuje nowy kod, ale nic nie robi, ponieważ zmienia wszystkie słowa kluczowe (oprócz
if
iproc
) na brak operacji:Zamiast usuwania słów kluczowych ten kod zastępuje je funkcją, która nic nie robi.
(Uwaga: używam tutaj „słów kluczowych” bardzo luźno, ponieważ Tcl nie ma słów kluczowych, tylko funkcje)
źródło
if
irename
po pętli. W drugiej wersji powinieneś zrobićproc
wyjątek.proc
pojawia się na liście wcześniejputs
. Technicznie kod powinien również działać bez,rename
ale wbudowane polecenia wydają się w przeciwnym razie chronione. Nie jestem pewien, co się dzieje, ale kod jest testowany i działa zgodnie z reklamą.rename
. To był mój mózg - zapomniałem wykluczyćproc
.if
ponieważ możliwośćif
samodzielnego działania jest prawie bezużyteczna, jeśli chcesz generować dane wyjściowe.Hoon
Hoon jest dziwny. Jest to prawie zupełnie inne niż inne języki programowania, nie tylko w składni, ale w semantyce. Jednak w przeciwieństwie do języków takich jak Hexagony, nie został stworzony specjalnie celowo ezoterycznie.
Hoon kompiluje się do Nock , minimalnej maszyny wirtualnej opartej na kombinatorze. Nock jest głupi: specyfikację można spakować do 340 bajtów. Jedyną operacją matematyczną jest zwiększanie. Wszystko jest rzeczownikiem: atom (bignum) lub komórka (para rzeczowników), z całym modelem pamięci ułożonym w niezmiennym acyklicznym drzewie binarnym. Jedynym wyjściem jest rzeczownik, do którego ogranicza się twoje wyrażenie.
Z powodu dziwnego celu kompilacji, Hoon jest również dziwny: jest całkowicie czysty. Hoon kompiluje się do wyrażenia Nocka, które jest oceniane w „kontekście”. Całe jądro i stdlib wraz ze wszystkimi zmiennymi są pośrednio przekazywane do programu przez kontekst.
Aby uczynić Hoon bezużytecznym, używamy po prostu
=<
„oceny a w kontekście b”. Zawsze oceniamy~
, co wynosi zero. Bez względu na tob
, co robi, nie może zmienić wartości, do której redukuje, a ponieważ nie może mieć skutków ubocznych, nie może wprowadzać ani wyprowadzać danych.Uwaga dodatkowa: Ponieważ tak naprawdę nie możesz poprosić o dane wejściowe od Hoon (czystość!), Zgodnie z regułami nie jest to tak naprawdę język programowania. Wejście odbywa się za pomocą argumentów funkcji, wyjście poprzez wartości zwracane (lub
~&
, co jest bardziej funkcją debugowania printf i jest przezroczyste dla programu).Aby program mógł uzyskać dane wejściowe w Urbit, tak naprawdę piszesz program, który zwraca funkcję, która akceptuje dane wejściowe, a powłoka pyta w twoim imieniu i przekazuje oddzwonienie.
źródło
Taxi, 2354 bajty.
Ten mały program po prostu jeździ taksówką w wielkiej jeździe przez Townsburg, zabrakło mu gazu. Każdy kod, który uruchomisz po tym, szybko spowoduje błąd
error: out of gas
. I nawet gdybyś mógł dotrzeć do stacji benzynowej, co nie wydaje mi się możliwe, nie możesz dostać żadnego gazu, ponieważ nie zebrano żadnych pieniędzy, ponieważ nie ma pasażerów.źródło
JavaScript w przeglądarce
Cóż, przynajmniej w IE11.
Wyłącza pisanie do dokumentu, pisanie do zmiennej globalnej i powrót z funkcji.
Skomentuj, jeśli przegapiłem metodę wyjściową!
źródło
window.addEventListener('error',function(){});
document
powinny być nadal dostępne z zakresu zewnętrznej w wstawionego kodu i nie powinno się wymienić dopiero po wstawiony kod zakończeniu wykonywania.Python 2, niesamowicie duży
Ta niesamowicie duża ilość kodu jest odrodzeniem starożytnego
rexec
modułu (porzuconego w Pythonie 2.3) z kilkoma nowymi modułami dodanymi do listy „ok” i naprawionymi wadami (w tymobject.__subclasses__()
metodą, która stworzyła co najmniej dwa inne pytony nieprawidłowe odpowiedzi).Spora część tego kodu (
__init__
metodaRExec
klasy i całejModuleImporter
klasy) jest kopiowana ze standardowej biblioteki Pythona z niewielkimi modyfikacjami.źródło
8064 bytes
przy okazji