Zdefiniujmy nieskazitelny program jako program, który sam nie ma żadnych błędów, ale spowoduje błąd, jeśli zmodyfikujesz go, usuwając ciągłe podciągi N znaków, gdzie 1 <= N < program length
.
Na przykład trzyznakowy program w języku Python 2
`8`
jest nieskazitelnym programem ( dzięki, Sp ), ponieważ wszystkie programy wynikające z usunięcia podciągów o długości 1 powodują błędy (w rzeczywistości błędy składniowe, ale zrobi to każdy rodzaj błędu):
8`
``
`8
a także wszystkie programy wynikające z usunięcia podciągów o długości 2 powodują błędy:
`
`
Gdyby na przykład `8
program nie zawierał błędów `8`
, nie byłby nieskazitelny, ponieważ wszystkie wyniki usuwania podciągów muszą zawierać błędy.
Twoim zadaniem w tym wyzwaniu jest napisanie możliwie najkrótszego nieskazitelnego programu, który nie pobiera danych wejściowych, ale wypisuje jedno z następujących pięciu słów:
world
earth
globe
planet
sphere
To, które słowo wybierzesz, zależy wyłącznie od Ciebie. Jedyne słowo plus opcjonalny znak nowej linii powinny być wydrukowane na stdout (lub najbliższą alternatywę dla twojego języka). Najkrótszy program w bajtach wygrywa.
Uwagi:
- Wymagany jest samodzielny program, a nie funkcja.
- W słowach rozróżniana jest wielkość liter; wyjście
World
lubEARTH
jest niedozwolone. - Ostrzeżenia kompilatora nie są liczone jako błędy.
- Błędne podprogramy mogą pobierać dane wejściowe lub dane wyjściowe lub robić cokolwiek innego, o ile zawsze ostatecznie powodują błąd.
Oto fragment kodu stosu, który będzie zawierał listę programów, które należy popsuć, biorąc pod uwagę potencjalnie nieskazitelny program:
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>function go() { var s = $('#i').val(), e = []; for (var i = 1; i < s.length; i++) { for (var j = 0; j <= s.length - i; j++) { e.push(s.substring(0, j) + s.substring(j + i)); } } $('#o').val(e.join('\n---\n')); }</script>Program:<br><textarea id='i' rows='16' cols='80'>`8`</textarea><br><button onclick='go()' type='button'>Go</button><br><br>Programs that should error: (--- separated)<br><textarea id='o' rows='16' cols='80'></textarea><br>
źródło
Odpowiedzi:
Szyna , 24 bajty
Myślę, że to działa. I jest zarówno krótki, jak i czytelny (jeśli chodzi o Rail).
$'main'
, otrzymujemyInternal Error: Crash: No 'main' function found
.#
, nie ma możliwości, aby program zakończył się czysto, więc zawsze będzie się kończyłCrash: No valid move
. Uważam, że nie jest możliwe usunięcie podciągu, tak aby ścieżka tworzyła prawidłową (nieskończoną) pętlę.#
, zostanie odłączony od końca toru, więc pociąg się zawiesi (z tym samym błędem jak powyżej).#
, odłączy również#
koniec ścieżki (a potencjalnie nawet początek ścieżki od punktu wejścia$
). Więc znowu ten sam błąd.Co do rzeczywistego programu: każdy program kolejowy musi mieć
$'main'
(lub dłuższy wariant, ale tutaj gramy w golfa) jako punkt wejścia do funkcji, a pociąg rozpoczyna się w$
kierunku południowo-wschodnim. Wszystko w pierwszym wierszu może być jednak częścią ścieżki, więc usunięcie'main'
ścieżki jest następujące:-
I/
są po prostu kawałki szyny której musimy pozwolić pociąg wziąć te 45 ° zakręty.[world]
popycha ciągworld
io
drukuje go.#
oznacza koniec toru - jedyny sposób na bezpieczne zakończenie programu kolejowego.Co ciekawe, to rozwiązanie jest możliwe tylko dlatego, że Rail pozwala torom przejść przez
main
linię - jeśli nie#
byłoby to możliwe, byłoby to po pierwszej nowej linii, a kod można zawsze skrócić doktóry jest poprawnym programem, który nic nie robi. (Znaki spacji pomiędzy
'
i#
nie miałyby na to wpływu.)Również dość interesujące: gdybym właśnie grał w golfa w zadaniu drukowania,
world
nie byłoby to znacznie krótsze ani prostsze:źródło
/
od#
.$
od początku toru, więc pociąg natychmiast się zawiesza (Rail oczekuje, że tor będzie kontynuował południowy wschód od$
).Funciton (
186136 bajtów w UTF-16)Ten program wypisuje „świat”.
Większość podciągów usuniętych z tego spowoduje, że nie będzie to kompletne pudełko, na które parser będzie narzekał. Jedyne możliwe usunięcia, które pozostawiają pełne pole, to:
Większość z nich usuwa zwisający koniec w prawym górnym rogu skrzynki, która jest złączem wyjściowym. Bez tego luźnego końca pudełko jest tylko komentarzem:
To już nie jest poprawny program, ponieważ analizator oczekuje programu z dokładnie jednym wyjściem:
Jedyną możliwością, która pozostawia złącze wyjściowe, jest ostatnia z powyższych, która pozostawia to:
Jednak liczba ta nie koduje prawidłowego ciągu Unicode w ezoterycznym UTF-21 Funcitona. Spróbuj uruchomić to, otrzymasz:
Dlatego ten program jest nieskazitelny.
źródło
Visual C ++ -
9695 bajtówNieruchomości:
int main()
bez błędu kompilacji.a
na wszelkie sposobymain()
nigdy nie pobiera{
, usuwającb
w ogóle znaczy nasza linia nie kończy się w sposób;
, usuwając<
środkistd::cout<'w'
powoduje błąd i usunięcie<<
przyczynystd::cout'w'
,'w''o'
itpI(a)
,I(b)
które nigdy nie pasują iI
które rozwijają się przedtem(
; z drugiej strony używanieI(,
przyczyn<<<<
i,)
upuszcza średnik (z wyjątkiem wszelkich innych błędów).std::cout
bez natrafienia na wiodące<<
, a zatem nie można usunąć żadnego z#include<iostream>
początku bez błędu kompilacji.''
występuje błąd pustego znaku i'w,
itd. ... spróbuj przekształcić wszystko w jedną postać.)
lub(
po drugiej stronie, np. Nie można robić takich rzeczyI('w',I('r'
.Kompiluje online za pomocą Visual C ++ .
Po raz kolejny nie jest to wyczerpujący dowód. Jeśli uważasz, że możesz to zrobić bez pracy, daj mi znać.
Poprzednie wersje stosowały zupełnie inne podejście i okazało się, że nie są nieskazitelne, więc usunąłem te wyniki.
Weryfikacja:
Poniższy program potwierdził, że ta wersja jest nieskazitelna przy użyciu
cl
kompilatora Visual C ++ 2010. Szkoda, że nie zadałam sobie trudu napisania tego wcześniej:źródło
/c
opcja jest automatycznie dołączana i kompiluje się (jak w przypadku tworzenia biblioteki, a nie programu). Jeśli/c
zaznaczysz pole uruchamiania, którego witryna nie zawiera , nie otrzymasz komunikatu o powodzeniu, a zamiast tego znajdziesz naturalny „LINK: błąd krytyczny LNK1561: należy zdefiniować punkt wejścia”.Python 3,
7933open(1,'w')
otwiera standardowe wyjście, a następnie drukujemy ciąg.write
zwraca liczbę zapisanych znaków. Służy to do utwardzenia przed usunięciem podciągów: Usunięcie części ciągu powoduje zwrócenie czegoś innego niż 5, a 5 minus ta wartość następnie przyjmuje wartość true. Ale to powoduje, żeif
osoba zostaje stracona ia
jest niezdefiniowana.Jest to oparte na sprytnym dziewiczym stylu Andersa Kaseorga tutaj .
Ponieważ tylko jedno stwierdzenie wymaga weryfikacji, jest to znacznie krótsze niż stare rozwiązanie, ale także mniej ogólne.
Stare rozwiązanie:
Aby sprawdzić, czy to naprawdę nieskazitelny program:
Niektóre kluczowe punkty:
q
zostało wykonane, wymaga instrukcji pozaq
. Totry
dobrze rozwiązuje, wymagając co najmniej dwóch instrukcji, z których żadnej nie można całkowicie usunąć.q
wykonania została dokonana poprzez ocenęr
na końcu.q
nie został zmodyfikowany został osiągnięty przezeval(q[17:])
, który musi ocenić naNone
naq
być wykonana.if
Warunek jest nieco skomplikowany, aby dostać prawo. Aby upewnić się, że został oceniony, ma fajny efekt uboczny ustawieniae
, który należy ustawićr
. (To jest powód, dla którego użyłem Pythona 3,expr
ponieważ funkcja robi cuda dla efektów ubocznych na poziomie wyrażenia.)źródło
Haskell, 61
Jakikolwiek błąd jest OK? W tym wypadku:
Haskell, 39
źródło
JavaScript,
747335 bajtówOkazuje się, że odpowiedź była znacznie prostsza niż myślałem ...
Wyjaśnienie
źródło
a="world"
, nie powoduje błęduif(a="world")["bol"+a[4]]
nie popełnia błędu.Java 8, 301 bajtów
Ponieważ każde pytanie wymaga odpowiedzi w języku Java.
Rozszerzony
Wyjaśnienie
public static main(String[]a){}
jest wymagane.Najtrudniejsza część:
final
słowo kluczowe zostanie usunięte, druga linia ocenia1/(8-8)
, powodując/ by zero
wyjątek.źródło
System.out.print()
metody. Jest zaprintln()
, ale nie zaprint()
. Więc jeślid='d'
go usuniesz, to daThe method print(boolean) in the type PrintStream is not applicable for the arguments ()
jako błąd (a jeślid=
go usuniesz , da toThe blank final field d may not have been initialized
jako błąd).Funciton ,
143142136 bajtówWynik jest jak zwykle w UTF-8, ponieważ UTF-16 byłby o dwa bajty większy (z powodu BOM).
Tak więc zastanawiałem się nad odpowiedzią Funcitona przez pewien czas i pomyślałem, że byłoby to niemożliwe, ponieważ zawsze można usunąć pełną linię, a kod nadal tworzy prawidłowy blok. Potem rozmawiałem o tym z Timwi, a on doszedł do wniosku, że możesz po prostu umieścić cały numer w jednym wierszu, tak że usunięcie go zepsułoby program z powodu braku złącza wyjściowego.
Ale literały w jednym wierszu są notorycznie drogie, zarówno ze względu na większą liczbę znaków, jak i większą liczbę znaków spoza ASCII. A jego wzmianka o bloku „pusty komentarz” skłoniła mnie do myślenia…
Więc wymyśliłem to bardziej wydajne rozwiązanie, które wykorzystuje dodatkowy pusty blok komentarza, który pęka, gdy próbujesz usunąć wszystko, co pozostawiłoby dosłowny blok w takcie:
Pozostawia to dwie opcje (podziękowania dla Steve'a za wskazanie tego):
19342823075080880373
zdekodowaniu wynikowej liczby całkowitej odpowiadający ciąg znaków zawiera punkt kodowy,0x18D53B
który nie jest prawidłowym znakiem Unicode,System.Char.ConvertFromUtf32
ulega awarii zArgumentOutOfRangeException
.508088037380718711
zawierałaby dwa nieprawidłowe punkty kodowe0x1B0635
i0x140077
prowadziłaby do tego samego wyjątku.Zauważ, że nawet bez pustego bloku komentarza usunięcie drugiego wiersza doprowadziłoby do nieprawidłowego punktu kodowego. Ale blok komentarz zapobiega że bierzemy linię od środka drugiej linii, aby uzyskać całkowitą, jak
193428037380718711
na przykład, który nie spowoduje błąd.źródło
Ruby, 36
Przypisujemy
s="planet"
, a następnie zapisujemy ten ciąg do STDOUT. Zwraca liczbę napisanych znaków. Xor to z 6, więc jeśli cokolwiek innego niż 6 znaków zostanie napisane, otrzymamy niezerową liczbę całkowitą. Następnie dzielimy się nas
ten indeks. Tylko 0 znaks
„p” jest poprawnym łańcuchem (no-op). Przekazujemy to doeval
, używając(*[argument])
składni równoważnej tylko(argument)
z tym wyjątkiem, że nie jest poprawna poza wywołaniem metody.Priorytet zweryfikowany programowo na Ruby 1.9.3 i 2.2
źródło
*
?C #,
128118101 bajtówMyśl o nadużywaniu ciągłej reguły podciągów.
Kod
Dlaczego to działa
class h
istatic void Main()
są wymagane.'w','o','r','l','d'
powoduje błąd, ponieważ tablica znaków jest inicjowana długością1*5
.Przed golfem i separacją
Zweryfikowano za pomocą
https://ideone.com/wEdB54
EDYTOWAĆ:
#if !x
zamiast#if x #else
.=>
składni func.#if!x
zamiast#if !x
. Kredyty dla @JohnBot.=>
składnię func można usunąć dodatkowy warunek preproc.źródło
static
dniaMain
.Main
e element funkcyjny Expression treściwe i 2 więcej usuwając spacje przed warunkiem preprocesora:class h{static void Main()=>System.Console.Write(new char[1\n#if!l\n*5]{'w','o','r','l','d'\n#if!o\n});\n#endif\n}\n#endif
. Według mojego obliczenia to 115.MATLAB,
373633 bajtówPonieważ nie jestem pewien, czy wolno nam również wypisywać ans = , musiałem znaleźć jakieś obejście, aby wypisać w odpowiedni sposób. Samo używanie fprintf nie działało, ponieważ bez względu na to, co próbowałem, po prostu odmawiałem błędu. Samo użycie disp nie było opcją, ponieważ wymagałoby tylko 1 argumentu, a sam argument oczywiście wykonałby się również bez błędów.
Jeśli dołączenie ans = do wyjścia nie stanowi problemu , MATLAB można wykonać za pomocą 20 bajtów :
źródło
> <> , 17 bajtów
Wypróbuj online!
Drukuje „ziemię”.
Jedynym sposobem, w jaki
><>
program zamyka się bezbłędnie, jest wykonanie;
znaku, co stanowi problem, ponieważ można po prostu usunąć wszystkie znaki wcześniej, aby;
był to pierwszy wykonany znak. Aby obejść ten problem, użyjp
polecenia, aby;
zamiast tego zmodyfikować program tak, aby dołączał się do niego podczas wykonywania. Usunięcie jakiejkolwiek sekcji kodu powoduje, że;
nigdy nie zostanie wygenerowane, powodując błędy poprzez nieprawidłowe instrukcjeB
,h
a takżet
niedopełnienie stosu i nieskończone pętle, które ostatecznie zabrakną pamięci. Musiałem tylko upewnić się, że wszystkie nieskończone pętle zapełniają cały stos.Wszystkie warianty zostały przetestowane przy użyciu tego fragmentu kodu python:
dodane do (nieco zmodyfikowanej wersji) oficjalnego interpretera fish.py przez twórcę> <>. Spośród 152 możliwych podprogramów, 92 zignorowano z powodu niepoprawnych instrukcji, 18 z niedopełnienia stosu, a 42 z braku pamięci.
Śmieszne fakty, pierwsza wersja tego
e"ooooo6-c0pAhtra
miała kilka dziwacznych podprogramów, którym udało się użyć polecenia put, aby umieścić plik,[
który wyczyści stos, zamiast niepoprawnej instrukcjiA
. Również „ziemia” jest jedynym z wyrażeń, które będą działać z tą metodą, ponieważ pierwsza literae
jest prawidłową instrukcją w><>
. W przeciwnym razie"
polecenie musi zostać umieszczone z przodu programu, a prawidłowy podprogram może być"
sam.źródło
Ruby, 34
Ma to kilka elementów:
eval(*[
expr])
jest zapożyczony z odpowiedzi histocrata i jest nieskazitelny, a także weryfikacja wartości zwracanej expr jest prawidłowym programem ruby, który nie zawiera błędów.method(*arr)
to składnia ruby, która wywołujemethod
wartościarr
argumentów jako wartości. Powodem, dla którego jest to potrzebne, jest to, że jest poprawny tylko jako parametry metody, więc jeślieval
zostanie usunięty,(*[expr])
jest to błąd składniowy. Jeśli wyrażenie zostanie usunięte,eval
narzeka na brak wystarczających argumentów$>.write("world")-1
nie może być zniekształcony, z wyjątkiem wewnątrz ciągu i odejmowania.$>.write("world")
zapisuje „świat” do STDOUT i zwraca liczbę zapisanych znaków, a następnie odejmuje 1. Dlatego jeśli program nie jest zniekształcony, wartość będzie wynosić dokładnie 4 . Jeśli jest zniekształcony (albo-1
jest usunięty, albo łańcuch skrócony), zwróci jeden z -1,0, 1, 2, 3 lub 5 . Każde inne zniekształcenie powoduje błąd składniowy.Wywołanie
chr
numeru zwraca znak reprezentowany przez ten numer. Tak więc, wywołany w wyniku powyższego przykładu, popełnia błąd na -1, w przeciwnym razie zwraca łańcuch jednoznakowy.Nie jestem właściwie pewien, dlaczego tak jest, ale wygląda na to, że Ruby interpretuje
\x04
jako znak spacji, co oznacza, że wyrażenie jest poprawne (puste programy ruby nic nie robią). Jednak dowolny z pozostałych znaków (\x00
-\x03
i\x05
) powodujeInvalid char '\x01' in expression
. Znalazłem to, po prostu iterując nad możliwą matematyką, którą mógłbym zrobić z liczbą zwróconą. Wcześniej korzystałemgdzie „planeta” plus znak nowej linii to 7 znaków, razy 16, aby uzyskać 112
p
, jedyna funkcja litera w języku Ruby jest domyślnie zdefiniowana. Jeśli nie otrzyma żadnych argumentów, jest to faktycznie brak możliwościWyróżnienie:
$><<"%c"*5%%w(w o r l d)
jest bardzo blisko, ale nie jest nieskazitelne. Usunięcie"%c"*5%
powoduje brak błędów. Mini wyjaśnienie:$>
jest stdout i<<
jest wywoływaną funkcją."%c"*5
generuje ciąg formatu"%c%c%c%c%c"
, który następnie próbuje być sformatowany (%
) przez tablicę:%w(w o r l d)
która jest krótszą wersją['w','o','r','l','d']
. Jeśli w tablicy jest za mało lub za dużo elementów, które nie pasują do ciągu formatu, generowany jest błąd. Pięta achillesowa jest taka"%c"*5
i%w(w o r l d)
może istnieć niezależnie, i$><<
potrzebuje tylko argumentu obu. Istnieje więc kilka różnych sposobów przekształcania tego programu w kuzynów bez błędów.Zweryfikowano za pomocą:
źródło
Python 3 , 43 bajty
Wypróbuj online!
Jak to działa
Aby chronić przed usunięciem podciągów, używamy
open(1,"w").write
zamiastprint
. W Pythonie 3write
zwraca liczbę napisanych znaków, które sprawdzimy,5
aby upewnić się, że żadna część łańcucha nie została usunięta. Robimy to, sprawdzając wartość zwracaną w słowniku{5:[]}
i zapętlając wynikfor[]in…:a
, co zakończy się niepowodzeniem, jeśli nie otrzymamy pustej iterowalnejfor
instrukcji lub jeśli instrukcja zostanie usunięta.źródło
JavaScript (Node.js),
9395 bajtówSprawdź dwukrotnie swój rozmiar, aby w razie braku znaków generowany był błąd. Długość wynosi 156, ponieważ Node.js poprzedza
function (exports, require, module, __filename, __dirname) {
kod w czasie wykonywania.Dzięki Martin Büttner za wskazanie błędu. Naprawiono teraz.
źródło
Perl 5.10+,
7163 bajtówDrukuje
world
z końcowym znakiem nowej linii. Uruchom tak:Zależy to od liczby bajtów kodu źródłowego, więc
file
musi zawierać powyższy kod i nic więcej (bez shebang, bez końcowego znaku nowej linii). Wymagany jest Perl 5.10+say
i operator zdefiniowany//
.Stworzenie nieskazitelnego programu w Perlu jest niezwykle trudne, ponieważ:
Dowolny identyfikator gołe słowo (na przykład
foo
,a
,_
) jest ważne stwierdzenie zno strict 'subs';
(domyślnie). Oznacza to, że program nie może rozpoczynać się ani kończyć literą, cyfrą ani podkreśleniem.Jak wyjaśnia tchrist , „Identyfikatory określone poprzez dereferencję symboliczną absolutnie nie mają żadnych ograniczeń w ich nazwach”. Oznacza to, że program nie może się rozpocząć z jednego z sigilami
$
,@
,%
, lub*
, ponieważ usuwając wszystkie oprócz pierwszego i ostatniego znaku zawsze pozostawić poprawną nazwę zmiennej.Wiele wbudowanych funkcji (w tym większość funkcji generujących dane wyjściowe) działa
$_
domyślnie, więc wywołania często działają, nawet jeśli usuniesz argument (np.say"world"
Vs.say
).Jak to działa
To rozwiązanie zostało zainspirowane odpowiedzią Node.js firmy Naouak , która sprawdza swoją długość, aby upewnić się, że znaki nie zostały usunięte.
Program ma dwie sekcje, jedną w nawiasach, a drugą w bloku:
Pierwsza sekcja odczytuje plik źródłowy i umiera, jeśli ma mniej niż 63 znaki. Druga sekcja sprawdza, czy
read
wykonanie zakończyło się pomyślnie. Jeśli jedna sekcja zostanie usunięta (z nawiasami otaczającymi lub nawiasami klamrowymi lub bez), druga sekcja zgłosi wyjątek.Usunięcie środkowej, lewej lub prawej strony programu spowoduje wyważenie nawiasów i / lub nawiasów klamrowych, powodując błąd składniowy.
Jeśli pierwszy
die
zostanie zmieniony (dod
,e
,di
,de
, lubie
, które są ważne identyfikatory), kontrola długości staje się:który ocenia:
Pobiera odwołanie do łańcucha i próbuje wyrejestrować go jako tablicę, powodując błąd:
Jeśli jakakolwiek inna instrukcja zostanie zmieniona, sprawdzanie długości zakończy się niepowodzeniem i program umrze.
Zweryfikowano nieskazitelność za pomocą następującego programu:
źródło
Ruby + coreutils,
332726 bajtówWypróbuj online!
Rubiki w ruby wykonują wewnątrz nich polecenie i zwracają wszystko, co program wstawiony do STDOUT jako ciąg znaków.
#{expr}
Składnia umożliwia umieszczanie wyrażeń w ciągach znaków i backticks. Ten program można przepisać (nieskazitelnie) jako:IO#write
zwraca liczbę zapisanych bajtów, więc jeśli łańcuch zostanie skrócony, nie będzie to właściwa liczba.#{}
Osadzenie automatycznie przekształca liczbę w ciąg znaków. Jeśli jakiś element zostanie usunięty i nie spowoduje to błędu składniowego, uruchomione zostanie niepoprawne polecenie. Jeśli część"world"
zostanie usunięta niż jednegobase04
throughbase54
spróbuje uruchomić.Wymagana jest nowa linia, zarówno w ciągu, jak i poza nim. W przeciwnym razie pierwsze 5 znaków (
`base
) można usunąć, dzięki czemu cały wiersz będzie komentarzem. Musi także znajdować się jeden lub więcej znaków między pierwszym kliknięciem wstecznym#
, w przeciwnym razie{
można je usunąć, aby cały komentarz stał się komentarzem powłoki .exec
Zastępuje bieżący proces ruby podanym poleceniem. Zobacz moją drugą odpowiedź, aby uzyskać wyjaśnieniemeth(*[])
składni i jej konieczności.(s="ec%co earth")
przypisuje ciąg „ec% co earth” do zmiennejs
. Przydziały zwracają to, co zostało przypisane, więc łańcuch również jest zwracany."format string %d" % 5
jest cukrem syntaktycznymsprintf("format string %d",5)
, jednak odstępy wokół%
nie są konieczne.s[10]
pobiera znak w ciągu o indeksie 10. Gdy nie jest zniekształcony, znak ten to „h”, ostatnia litera w ciągu. Jednak usunięcie dowolnych znaków w ciągu oznacza, że jest on krótszy, więc nie ma znaku w indeksie 10, więcs[10]
powracanil
i"%c" % nil
powoduje błąd.jeśli
%s[10]
zostanie usunięty, wówczas Ruby próbuje uruchomić polecenie,ec%co earth
które nie działa.Zmiana
10
na1
lub0
powoduje również nieznane polecenie (alboeceo
lubecco
). Całkowite usunięcie go technicznie nie jest błędem składniowym, ponieważ wywołuje metodę#[]
w ciągu, ale narzeka na niewystarczającą liczbę argumentów.Uwaga na temat ogólnego rozwiązania tego problemu: Musisz mieć jakieś opakowanie, które weryfikuje kod wewnątrz w sposób abstrakcyjny, będąc jednocześnie nieskazitelnym. Na przykład program z podziałem na końcu (
blablabla/somevar
) nigdy nie zadziała, ponieważ podział można zawsze usunąć (blablabla
). Oto kilka takich opakowań, z których korzystałem do tej pory:eval(*[
kod])
używany przez histocrat i w mojej pierwszej odpowiedzi. Sprawdza, czy dane wyjściowe są poprawnym programem rubyexec(*[
kod])
użyty powyżej potwierdza, że odpowiedź jest poprawną komendą`#{
kod}`
Składnia wsteczna uruchamia również polecenie (i dlatego potwierdza, że jest poprawna), jednak STDOUT jest przechwytywany jako ciąg zamiast wyprowadzania jako proces nadrzędny STDOUT (Ruby's).
Z tego powodu nie mogłem użyć go do tej odpowiedzi,EDYCJA: Sprawiłem, że zadziałało. Ograniczenia przedstawione powyżej.Edycja: Podziękowania dla @histocrat za wskazanie pewnych wad
źródło
write
początkiem ciągu, ale nie sądzę, żeby miało to wpływ na nieskazitelność. Ponadto na moim komputerzebase64
zawiesi się oczekiwanie na dane wejściowe, co może być niezgodne z regułami.$>.write"world"
działa, dzięki! Jeśli chodzi o czekanie na base64, wydaje się, że różni się w zależności od systemu. TIO działa dobrze. To sprawia, że jest jeszcze bardziej niewyraźne, czy przestrzega zasad.PowerShell, (97 bajtów + 5 dla nazwy programu) = 102 bajtów
Sprawdza się, zanim się zniszczy ... dwa razy.
Oczekuje, że zostanie zapisany jako
c.ps1
i wykonane z lokalnego katalogu jako takiego:PS C:\Tools\Scripts\Golfing\> .\c.ps1
.Alias
gc
jest skrótem odGet-Content
i jest podobny docat
odczytu pliku (w tym przypadku naszej ścieżki wykonania.\c.ps1
). Pobieramy.Length
plik, ustawiamy go$a
i sprawdzamy, czy nie jest równy 97 z-eq97
. Jeśli jest równy (tzn. Program nie został zmodyfikowany), drukujemy za pomocą"world"
i wykonujemy nieprawidłowe poleceniea
. Zmusza tocatch
do działania, co pozwala nam sprawdzić się ponownie. Tym razem, jeśli nasz kod nie jest równy 97, rzucamy niepoprawne polecenie, więc nasz program błędnie wydrukował tekst błędu na wyjściu. Mamy wtedyclear()
błąd iexit
normalnie.Oczywiste jest, że jeśli którekolwiek
if
z nich zostanie zmienione, w drugim wystąpi błąd. Jeśli jakakolwiek część"world";
zostanie zmieniona, pierwszaif
spowoduje błąd. Ponieważ musi być ciągły, nie możemy usunąć obuif
instrukcji. Łańcuchy na środku spowodują niedopasowane nawiasy lub spowodują wykonanie drugiego{a}
. Symboltry
/catch
ma wychwycić błąd z pierwszejif
instrukcji, abyśmy mogli go poprawnie usunąć. Zewnętrzne"$( )"
zapobiegają cięciu strun z obu końców. Ostatnim;a
jest zapobieganie wycinaniu części środkowej, które skutkowałyby prawidłowymi programami (np."it}a)";a
, Które wydrukują,it}a)
a następnie wystąpią błędy).Istnieje kilka szczególnych okoliczności:
gc
,gc<space>
lubgc .\
są usuwane, program będzie ostatecznie błędu się z jakimś smakiem out błędu pamięci (z powodu wielokrotnych wezwań self-egzekucyjnym) i prawdopodobnej katastrofie skorupy (a może i komputera). Nie testowany.<space>.\c.ps1
lub.\c.ps1
zostaną usunięte, program zatrzyma się i poprosi użytkownika o wprowadzenie danych. Bez względu na to, co wprowadzi użytkownik, program nadal będzie występować błąd, ponieważ liczenie rozmiaru będzie nieprawidłowe.$
i kończący się przed ostatnim"
jest wycinany, program wyświetli wszystko, co pozostanie, a następnie wystąpi błąd, ponieważa
nie jest prawidłowy.Zweryfikowano za pomocą:
(Podziękowania dla Martina za jego rozległą pomoc!)
źródło
C (gcc) (Linux,
-Werror=undef
), 66 bajtówWypróbuj online!
Świetne wyzwanie! To było zwodniczo trudne, ale jestem prawie pewien, że mam teraz prawidłowy program!
Używa polecenia preprocesora, aby nie można było usunąć nowych linii, ponieważ nawias zamykający do
main
jest uwzględniany tylko wtedy, gdy__LINE__==6
. Uniemożliwia równieżmain
całkowite wyczyszczenie , ponieważ pozostawia to swobodę ruchu#endif
(ważne jest, aby#endif
było pozamain
).Użyłem,
#else
ponieważ byłem dość przekonany, że żadna wersja__LINE__==6
tego nie może usunąć podciągu i nadal jest prawdziwa, ponieważ zarówno one, jak6
i__LINE__
same są prawdziwe. Używa również-Werror=undef
, aby coś takiego#ifdef(LINE__)
nie było fałszywe, ale było błędem.W przypadku gcc (przynajmniej w Linuksie)
puts
zwraca liczbę wydrukowanych znaków (w tym znak nowej linii), więc usunięcie dowolnej części ciągu powodujeputs("...")/6
powrót0
, co1/0
powoduje wyjątek zmiennoprzecinkowy. Zauważ, że ten wyjątek nie jest spowodowany, chyba że1/0
jest przypisany do czegoś, więca=
jest wymagany.Żadna inna część linii nie może zostać usunięta bez utworzenia błędu, zwykle błędu składniowego lub błędu łączenia.
Jako bonus, daje to dość trywialne 86-bajtowe rozwiązanie dla C ++, wystarczy dodać
#include <cstdio>
i zadeklarowaća
jakoint
. Wypróbuj online! (C ++)źródło
1/
podczas opuszczania nowej linii i nadal będzie działać .1
przypuszczalnie w poprzedniej linii.=1
. Myślę, że musisz ustawić 1 na linii samodzielnie.PHP, 73 bajty
Wyjaśnienie
Zakładam domyślną konfigurację php.ini. Więc short_tags jest wyłączone. Oznacza to, że nie można usunąć
=
tagu otwierającego.To jest w zasadzie
<?=unserialize('s:5:"world"');
.Jeśli usuniesz dowolną część serializowanego ciągu, pojawi się błąd.
Możesz po prostu usunąć,
unserialize
a skrypt po prostu wyświetli szeregowany ciąg. Aby temu zaradzić, używamcall_user_func
. Usunięcie jednego z parametrów spowoduje błąd.Można jednak usunąć
un
, aby wywołaćserialize
funkcję. Więc wyjmujemy „ns”. Usunięcie jakichkolwiek znaków nie spowoduje niepoprawnej nazwy funkcji.Użyjemy inline, jeśli będziemy używać przypisania zmiennej ze znacznikiem wyjściowym. Zamiast używać
&&
używamy „|” aby zapobiec usunięciu pojedynczego&
lub usunięciu$f
zadaniaMożesz usunąć
='ns')&&($f="u{$p}erialize"
i skończyć z($p)?$f:''
. Dlatego dodaję dodatkowy nawias wokół$f="u{$p}erialize"
.Uwaga
Technicznie możesz usunąć otwierające tagi bez powodowania błędu. Nie jest to jednak już skrypt PHP, ale zwykły plik tekstowy.
źródło
Matlab (77)
Spróbuj
Uwaga:
Zgodnie z radą @ Optimiser dotyczącą zaprojektowania resuscytacji krążeniowo-oddechowej lub czegoś takiego, stanąłem wobec nieprzewidzianych podciągów, które nie prowadziły do żadnego błędu kompilacji po usunięciu, przykład: usunięcie
arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),
z poprzedniej edycjifeval(@(a)arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),'world')
nie generuje żadnego błędu! również w przypadku tej samej edycji byłybsxfun(@(a,b)arrayfun(@(x)(x),prod(b,ismember(4,b))),'world',1:5)
ibsxfun(@(a,b)a,'world',1:5)
, jeśli zapytałeś o to, jak się znajdowałem, gdy znalazłem je w konsoli wyjściowej, płakałem jak dziecko, więc oto program:Przykład nieoczyszczącego programu
edytować:
źródło
SmileBASIC, 63 bajty
źródło
Grusza , 17 bajtów
Ten program zawiera bajty z ustawionym wysokim bitem (które nie są poprawne UTF-8 i dlatego nie mogą być wysyłane do TIO), więc oto
xxd
odwracalny zrzut heksowy:Wyjaśnienie
Jest to tylko
print'world'
z dołączoną sumą kontrolną. Za pomocą brutalnej siły zweryfikowałem, że żadne z możliwych usunięć nie daje programowi z prawidłową sumą kontrolną, więc po każdym możliwym usunięciu pojawia się błąd.Dość nudne, ale wiąże obecnego lidera, więc czułem, że warto było pisać.
źródło