Napisz program o następujących właściwościach:
Po uruchomieniu w takiej postaci program nie generuje danych wyjściowych (tj. 0 bajtów danych wyjściowych).
W programie znajduje się lokalizacja (do wyboru: może być na początku, na końcu lub gdzieś pośrodku) z następującą właściwością: modyfikacja programu poprzez umieszczenie dowolnego łańcucha spowoduje, że wynikowy program wydrukuje ten łańcuch, gdy wykonany.
Musi to działać niezależnie od tego, czy ciąg zawiera cudzysłowy, ukośniki odwrotne, znaki komentarza, ograniczniki, bajty NUL itp .; bez względu na to, co tam umieścisz, ciąg jest nadal interpretowany jako ciąg i drukowany całkowicie dosłownie. Możesz jednak nie obsłużyć bardzo bardzo długich łańcuchów, jeśli spowodowałoby to wyczerpanie się pamięci w kompilatorze itp. (Mówiąc dokładniej, powinieneś być w stanie obsłużyć łańcuchy o długości do 1000 bajtów lub trzykrotnie większej niż długość twojego programu, w zależności od tego, który jest dłuższy).
Przykładem może być nieprawidłowe rozwiązanie
print("");
# ^ text goes here
w Python, Perl, Ruby itp .; chociaż działa na wiele ciągów, nie będzie działać na ciąg zawierający podwójny cudzysłów lub ciąg zawierający podłańcuch \n
(który byłby interpretowany jako nowy wiersz).
Zauważ, że ten problem jest prawdopodobnie niemożliwy w większości języków; wyzwanie polega przynajmniej na znalezieniu języka, w którym działa. Wybrany język musi być językiem programowania zgodnie z definicją tej witryny , np. Brak przesyłania rozwiązania w tekście .
Ponieważ jest to gra w golfa , wygrywa najkrótszy szablon programu. Nie zniechęcaj się jednak do zgłaszania rozwiązań, nawet jeśli nie są w stanie pokonać aktualnego zwycięzcy! Nadal możesz rywalizować o drugie, trzecie itd. Miejsce lub po prostu znaleźć tyle odpowiedzi, na ile to możliwe. Należy jednak upewnić się, że program spełnia całą specyfikację przed przesłaniem; przybliżone rozwiązania nie trafiłyby w sedno problemu.
AWK
, po prostu1
by to zrobiło .Odpowiedzi:
Excel, 1 bajt
Wersja bez golfa
źródło
@
.Jolf, 6 bajtów
Wyjaśnienie
źródło
Perl 5 ,
302119 bajtówWypróbuj online!
Końcowy znak nowej linii. Wykorzystuje to funkcję Perla, która umożliwia dołączenie dowolnych danych do pliku źródłowego, które można następnie odczytać za pomocą
DATA
uchwytu pliku. Gdy podajemy uchwyt pliku jako argumentprint
, podany jest kontekst listy, co powoduje, że uchwyt pliku zwraca listę wszystkich linii w pliku, łącznie z nowymi liniami (podobnie, nowa linia w ostatnim wierszu zostanie pominięta). Następnieprint
pośrednio łączy je wszystkie, cofając podział na linie i dając nam dokładnie oryginalny ciąg bez względu na to, gdzie były nowe znaki.Dzięki @Dada, który zdał sobie sprawę, że nie ma potrzeby ręcznego obsługiwania nowych linii, oraz @ninjalj i @b_jonas, którzy dostrzegli postać, którą można oderwać.
źródło
undef$/
. Jako argumentprint
,<DATA>
nazywa się w kontekście listy, więc powinien czytać każdą linię.__END__
zamiast__DATA__
.Zsh, 6 bajtów
Kończy się nowa linia. Ciąg jest wstawiany na końcu programu.
Grzmotnąć,
2017 bajtówPodziękowania dla Adama za usunięcie 3 bajtów.
* skrypt powłoki nix,
2114 bajtówPodziękowania dla Adama za usunięcie 7 bajtów.
źródło
zsh
Rozwiązanie wydaje się prawidłowe; jednak 9-bajtowebash
rozwiązanie jest niepoprawne (dodaje końcowy znak nowej linii, jeśli plik go nie ma).sed 1d
zamiasttail -n+2
brainfuck ( Unreadable Brainfuck ), 9 bajtów
Dołącz dane wejściowe na końcu. Tym razem nie ma końca nowej linii.
Szukając języków, które akceptują dane wejściowe dołączane na końcu programu, pieprzenie mózgu wydawało się wyraźną możliwością; wielu tłumaczy pieprzonych mózgów napisanych w esolangach pobiera zarówno program, jak i dane wejściowe programu ze standardowego wejścia, a zatem potrzebuje jakiegoś sposobu, aby między nimi odróżnić. W tym przypadku stosowana jest konwencja, w której
!
znak rozróżnia program od danych wejściowych, co jest często używane do pisania krótkich programów typu „pierdolony mózg”,[.,]!Hello, world!
; w zasadzie tworzy to inny dialekt pieprzenia mózgu, w którym!
ma inne znaczenie niż normalne.Teoretycznie więc moglibyśmy po prostu znaleźć jednego z tych tłumaczy i dać mu
cat
program w celu spełnienia specyfikacji. Jest jednak duża subtelność; brainfuck zwykle używa 256 wartości dla każdej komórki, jest 256 oktetów i należy użyć jednego dla EOF. Więc jeśli chcemy móc dosłownie wysłać echo wszystkich 256 oktetów, nie możemy w ogóle wykryć EOF i będziemy musieli zakończyć program w inny sposób. Innymi słowy, musimy znaleźć implementację, która podaje 256 oktetów i EOF 257 różnych wartości lub ulega awarii na EOF.Wpisz Nieczytelne . W Nieczytelnym jest tłumacza pieprzenia mózgu, który poprzedza to wyzwanie i który przyjmuje dane wejściowe po
!
; dodatkowo, w przeciwieństwie do większości interpreterów, używa komórek bignum i -1 dla EOF, co pozwala odróżnić EOF od innych 256 możliwych oktetów. Tak więc, używając Nieczytelnego Brainfuck jako specyficznego interpretera dla programu, możemy rozwiązać wyzwanie w zaledwie 9 bajtach, pisząccat
program pieprzenia mózgu , który zatrzymuje się na EOF = -1.Czy można to zrobić lepiej? Cóż, moglibyśmy wypróbować następujący 7-bajtowy program, który próbuje wyprowadzić EOF na końcu łańcucha, zanim wyłamie się z pętli:
Zachowanie tego programu zależy od zachowania się nieczytelny tłumacza na warunkach błędach (w ten sposób, to zależy nie tylko od realizacji brainfuck, ale na realizację wykorzystane do uruchomienia realizacji brainfuck). Niestety, nieczytelny interpreter używam błędów wyjściowych na standardowym wyjściu , co oznacza, że to zapisywanie nie działa. Jeśli ktoś wie o nieczytelnym interpretatorze, który wychodzi przy próbie wysłania EOF lub dyskretnie pomija próbę, daj mi znać; to byłoby siedmiobajtowe rozwiązanie.
źródło
,[.,]!
działa tutaj i ma 6 bajtów (wystarczy zaznaczyć pole oznaczone!
). Również się kończy.,
(odczytaj standardowe wejście do bieżącego elementu taśmy), a następnie]
(pętlę wyjścia, jeśli bieżący element taśmy ma wartość 0). Zatem odczyt bajtu wejściowego o wartości 0 (tj. NUL) przerwałby pętlę.!
), automatycznie ustawia bieżący element taśmy na 0, co kończy pętlę.Dyalog APL , 11 bajtów
Poniżej znajduje się treść funkcji f :
Kończy się nowa linia, po której można wstawić wszystko.
2↓
upuść pierwsze dwie linie (nagłówek i tę linię) z⎕CR'f'
C haracter R ePresentation z F⋄
następnie→
porzucićźródło
Ruby, 20 bajtów
Wejście idzie na końcu (po końcowym znaku nowej linii). Ten
DATA
idiom jest jednym z wielu, które Ruby ukradła Perlowi .Wypróbuj na eval.in: https://eval.in/684370
źródło
JavaScript + HTML5 DOM, 163 bajty
Możesz wstawić wszystko, co chcesz, bezpośrednio przed zamykającym tagiem treści. Działa to poprzez pobranie źródła strony i usunięcie kodu otwierającego i tagów zamykających.
Prawdziwy kopacz zastanawiał się, jak uciec od nieskończonej pętli. Wstawienie
while(true){}
strony blokuje na zawsze wszystkie wywołania zwrotne, zamrażając wykonanie, a JavaScript nie ma możliwości wstrzymania głównego wątku. Jednak kod, który już nie istnieje, nigdy nie jest uruchamiany, więc treść dokumentu zatwierdza seppuku w ostatnim poleceniu, usuwając się podczas oczekiwania na załadowanie swojego klonu.Tak, jest długi i rondo, ale sam fakt, że jest to możliwe w JS, jest niesamowity.
źródło
PHP, 46 bajtów
(w tym końcowe łamanie linii)
Tak: nawet
file
funkcja jest binarnie bezpieczna.[""]+
zastępuje indeks 0 (pierwszy wiersz pliku) pustym ciągiemźródło
gs2 , 4 bajty
Wykorzystuje kodowanie CP437. Sznurek przechodzi na końcu.
╥
pobiera kod źródłowy,¶
wypycha 4,=
upuszcza tyle wiodących znaków i☼
wychodzi.Wypróbuj online!
źródło
PHP 94 bajty
Umieść swój ciąg po końcowym średniku.
Chyba dla niejasnych funkcji? __halt_compiler () robi dokładnie to, czego można oczekiwać od nazwy. Poprzedni kod po prostu otwiera plik i zapisuje wszystkie bajty po ostatnim średniku na standardowe wyjście. NUL, BEL itp. Wychodzą dobrze. Literały w Unicode (♪) są zepsute w systemie Windows, ale myślę, że to po prostu błąd cmd Windowsa w Unicode.
źródło
false!==$c=...
nie potrzebuje nawiasów. 3)rb
nie wymaga cytatów. 4) Możesz zapisać jeden bajt za pomocąfor($f=fopen(...),fseek($f,88);false!==(...);)echo$c;
5) kolejnych dwóch bajtów krótszych:<?for($f=fopen(__FILE__,rb);false!==$s=fgets($f,86);)echo$i++?$s:"";__halt_compiler();
fgets
i dodasz końcowy podział wiersza do szablonu.Perl 6 , 23 bajtów
Łańcuch jest umieszczany od nowej linii po
=finish
.źródło
PHP,
4860 bajtówWłaśnie dowiedziałem się, że zamknięcie PHP nie zapobiega zawarciu łańcucha
<?
.źródło
<?die(substr(file_get_contents(__FILE__),48))?>STRING HERE
. Powinno działać. Próbowałem<?die('a')?>
i udało się.die
nie drukuje tego parametru, ale wysyła go jako kod wyjścia. To musiałoby byćdie(print ...)
.file
. W tej chwili nie mogę wymyślić żadnego innego.die('text');
Binary Lambda Calculus , 1 bajt
To pojedyncza spacja (0x20) przed tekstem.
Wypróbuj online!
Jak to działa
0x20 = 00100000 2 jest analizowany jako
(W rzeczywistości każda z postaci
!"#$%&\'()*+,-./
będzie działać równie dobrze.)Ponieważ jest to pełne wyrażenie, pozostała część programu jest interpretowana jako dane wejściowe i zgodnie z konwencjami I / O binarnego rachunku lambda funkcja tożsamości λ x. x kopiuje dane wejściowe bezpośrednio na dane wyjściowe.
źródło
Bash, 17 bajtów
Opracowany niezależnie od odpowiedzi jimmy23013 .
źródło
$0
? Poza tym myślę, że to działa (potwierdziłem, że po tym nic nie analizujeexit
).RProgN , 19 bajtów
Zwróć uwagę na spację końcową.
Wstaw dowolny tekst po tym fragmencie, a zostanie on wydrukowany.
Na podstawie odpowiedzi gs2 Lynn .
Wypróbuj online!
źródło
Excel VBA, 6 bajtów
Ma to przede wszystkim odpowiedzieć na pytanie, jak wydrukować tekst przechowywany w odpowiedzi Adama na okno natychmiastowe w środowisku VBA
Podstawowe ustawienia:
W komórce A1 w arkuszu aktywnym użyj poniższego wzoru, aby zatrzymać ciąg do wydrukowania. W celu zliczenia bajtów należy dodać 1 bajt
na przykład:
Natychmiastowa funkcja okna, 5 + 1 = 6 bajtów
+1 bajt dla
'
komórki A1źródło
Vim (w trybie ex), 28 bajtów
28 bajtów zawiera ostatnią nową linię.
źródło
Vim, 738 bajtów
Ponownie przypisuje wszystkie znaki kontrolne w trybie wstawiania do
<c-v>
, a następnie ten znak kontrolny, który wprowadzi je dosłownie. ^ _ (separator jednostek) nie wymaga ponownego wiązania, ponieważ jest domyślnie wyświetlany dosłownie.Oczywiście tekst zmiennej znajduje się na końcu.
źródło