Szablon programu do drukowania * dowolnego * ciągu


40

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


Odpowiedni post Sandbox jest tutaj .

Czy możesz wyjaśnić zakres znaków, które musimy obsługiwać dla wstawionego ciągu? ASCII? ASCII + niedrukowalne? Wszystko z Unicode?
DJMcMayhem

3
Wszystkie 256 oktetów. To, czy interpretujesz je jako bajty czy Unicode, zależy od ciebie; nie będzie to miało większego znaczenia, gdy zostanie wydrukowane.

1
Celem tego pytania (i jego obecnego brzmienia) jest to, że nie można uzyskać żadnych dodatkowych wyników. Czy masz na myśli rozwiązanie, którego nie można dostosować, aby tego uniknąć? (Korzystając z dodatkowych bajtów, aby uniknąć zbłąkanego wyjścia, lepiej jest tworzyć zbędne wyjście i niezgodne ze specyfikacją.)

1
Gdyby nie wymagało to zmiany kodu, byłoby to trywialne AWK, po prostu 1by to zrobiło .
Robert Benson

Odpowiedzi:


37

Excel, 1 bajt

'

Wersja bez golfa

'        <-- print the following text,
             and exit the current formula

Nie sądzę, że to może zaakceptować nowe linie.
Conor O'Brien

3
@ ConorO'Brien robi to z shift + enter
Adam

2
@MrPaulch To było całkiem sporo inżynierii retro. Jestem prawie pewien, że to polecenie ukrywa inne nieznane funkcje, takie jak awaria systemu.
Adam,

1
Działa to również na OpenOffice Calc. Jest on używany automatycznie po ustawieniu komórki na format @.
Ismael Miguel

1
Osobiście uważam, że ta odpowiedź jest w porządku. @Dennis usunął mój post Mathematica, który używa tej samej koncepcji. Interfejs programu Excel będzie przechowywał test // "" "/// jako ciąg nie-dosłowny, więc jego logika powinna go usunąć. Oto jak jest on przechowywany <Row> <Cell> <Data ss: Type =" Łańcuch „x: Ticked =" 1 "> test // & quot; & quot; /// </Data> </Cell> </Row>
Kelly Lowder

20

Jolf, 6 bajtów

a Lq6(

Wyjaśnienie

a Lq6(
a       print
  L 6   all but the first 6 characters of
   q    the source code
     (  and exit

15

Perl 5 , 30 21 19 bajtów

wydrukuj <DANE> __END__

Wypró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ą DATAuchwytu pliku. Gdy podajemy uchwyt pliku jako argument print, 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ępnie printpoś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ć.


2
Nie sądzę, że potrzebujesz undef$/. Jako argument print, <DATA>nazywa się w kontekście listy, więc powinien czytać każdą linię.
Dada

Masz rację. Odczytuje wejściowy wiersz za jednym razem, zachowując separatory linii, a następnie domyślnie łączy je wszystkie podczas drukowania, więc nie ma potrzeby, aby w pierwszej kolejności siedzieć. To także oszczędność 8 bajtów; Pójdę naprawić post.

4
Możesz użyć __END__zamiast __DATA__.
ninjalj

Co mówi @ninjalj, a ponadto możesz pominąć nową linię po znaku większym niż (ale potrzebujesz nowej linii na końcu programu).
b_jonas

14

Zsh, 6 bajtów

<<'
'

Kończy się nowa linia. Ciąg jest wstawiany na końcu programu.

Grzmotnąć, 20 17 bajtów

Podziękowania dla Adama za usunięcie 3 bajtów.

exec sed 1d "$0"

* skrypt powłoki nix, 21 14 bajtów

Podziękowania dla Adama za usunięcie 7 bajtów.

#!/bin/sed 1d

1
@Copper Istnieje końcowy znak nowej linii. Następnie łańcuch jest wstawiany.
jimmy23013

O, rozumiem. Dzięki za poprawienie mnie!
Miedź

Rozwiązania 6/9-bajtowe wyglądają, jakby wykorzystywały one błąd interpretera (oczywiście nie jest to niedozwolone). (AFAICT z pewnymi eksperymentami, same szukają nowej linii na linii, ale linie są definiowane przez podział na nowe linie, więc sama linia na linii nigdy nie może się zdarzyć.) zshRozwiązanie wydaje się prawidłowe; jednak 9-bajtowe bashrozwiązanie jest niepoprawne (dodaje końcowy znak nowej linii, jeśli plik go nie ma).

@ ais523 Wydaje mi się, że to też błąd. I nie spodziewałem się, że tłumacze pozwolą im. Usunięto rozwiązanie Bash.
jimmy23013

1
do bash możesz użyć sed 1dzamiasttail -n+2
Adam

13

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 catprogram 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ąc catprogram 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.


1
,[.,]!działa tutaj i ma 6 bajtów (wystarczy zaznaczyć pole oznaczone !). Również się kończy.
FinW

@FinW: Nie mogę wymyślić, jak wprowadzić bajt NUL na tej stronie, ale kod ten na pewno by się skończył wcześnie, gdyby go zobaczył.

działało dobrze bez bajtu NUL, kiedy to robiłem.
FinW

1
Dosłownie masz ,(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ę.

Ale jeśli interpreter nie odczytuje żadnych danych wejściowych (np. Końca łańcucha po !), automatycznie ustawia bieżący element taśmy na 0, co kończy pętlę.
FinW

9

Dyalog APL , 11 bajtów

Poniżej znajduje się treść funkcji f :

2↓⎕CR'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ć



9

JavaScript + HTML5 DOM, 163 bajty

<html><body><script>fetch(location).then((r)=>r.text().then((t)=>console.log(t.slice(145,t.lastIndexOf("</b")))));document.body.remove()</script></body></html>

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.


1
Chrome denerwuje się ostatnio skryptami blokującymi parser i narzeka na nie. Podoba mi się pomysł, aby celowo zablokować parser, aby żaden skrypt w nim nie zniszczył twojej próby drukowania.

7

PHP, 46 bajtów

(w tym końcowe łamanie linii)

<?=join([""]+file(__FILE__));halt_compiler();
STRING HERE

Tak: nawet filefunkcja jest binarnie bezpieczna.

[""]+ zastępuje indeks 0 (pierwszy wiersz pliku) pustym ciągiem


6

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!


5

PHP 94 bajty

<?$f=fopen(__FILE__,'rb');fseek($f,93);while(false!==($c=fgetc($f)))echo$c;__halt_compiler();

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.


1) Liczę 93 bajty, a nie 94. 2) false!==$c=...nie potrzebuje nawiasów. 3) rbnie 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();
Titus

6) i kolejne dwa bajty, jeśli pominiesz drugi parametr fgetsi dodasz końcowy podział wiersza do szablonu.
Tytus


3

PHP, 48 60 bajtów

<?=substr(file_get_contents(__FILE__),60);__halt_compiler();STRING HERE

Właśnie dowiedziałem się, że zamknięcie PHP nie zapobiega zawarciu łańcucha <?.


Masz źle umieszczony wspornik zamykający. Jednak dużo ładniejszy zrzut pliku niż moja próba, pomyślałem, że substr () dusi się na bajtach zerowych - nie sądzę.
ToXik-yogHurt

Spróbuj tego: <?die(substr(file_get_contents(__FILE__),48))?>STRING HERE. Powinno działać. Próbowałem <?die('a')?>i udało się.
Ismael Miguel

@ IsmaelMiguel nie będzie działać. dienie drukuje tego parametru, ale wysyła go jako kod wyjścia. To musiałoby być die(print ...).
Tytus

@ ToXik-yogHurt większość funkcji łańcuchowych jest binarnie bezpieczna. nawet file. W tej chwili nie mogę wymyślić żadnego innego.
Tytus

@Titus Trydie('text');
Ismael Miguel

2

Binary Lambda Calculus , 1 bajt

 [text goes here]

To pojedyncza spacja (0x20) przed tekstem.

Wypróbuj online!

Jak to działa

0x20 = 00100000 2 jest analizowany jako

00    λx.
01        x
0000  (ignored, can be anything)

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


Z braku zainteresowania, dlaczego końcowe bity zerowe między funkcją tożsamości a wstawieniem nie są wyświetlane?

@ ais523 Tłumacz interpretuje bajt na raz i raz λ x . x został przeanalizowany, wypełnienie zostało już zużyte.
Anders Kaseorg,



1

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

'[Your Text Here]

na przykład:

'Hello 
World

Natychmiastowa funkcja okna, 5 + 1 = 6 bajtów

?[A1]

+1 bajt dla 'komórki A1


0

Vim (w trybie ex), 28 bajtów

#!/bin/ex -c ':1d' -c ':wq'
[string]

28 bajtów zawiera ostatnią nową linię.


0

Vim, 738 bajtów

:imap <esc> <c-v><esc>
:imap <c-a> <c-v><c-a>
:imap <c-b> <c-v><c-b>
:imap <c-c> <c-v><c-c>
:imap <c-d> <c-v><c-d>
:imap <c-e> <c-v><c-e>
:imap <c-f> <c-v><c-f>
:imap <c-g> <c-v><c-g>
:imap <c-h> <c-v><c-h>
:imap <c-i> <c-v><c-i>
:imap <c-j> <c-v><c-j>
:imap <c-k> <c-v><c-k>
:imap <c-l> <c-v><c-l>
:imap <c-m> <c-v><c-m>
:imap <c-n> <c-v><c-n>
:imap <c-o> <c-v><c-o>
:imap <c-p> <c-v><c-p>
:imap <c-q> <c-v><c-q>
:imap <c-r> <c-v><c-r>
:imap <c-s> <c-v><c-s>
:imap <c-t> <c-v><c-t>
:imap <c-u> <c-v><c-u>
:imap <c-v> <c-v><c-v>
:imap <c-w> <c-v><c-w>
:imap <c-x> <c-v><c-x>
:imap <c-y> <c-v><c-y>
:imap <c-z> <c-v><c-z>
:imap <c-@> <c-v><c-@>
:imap <c-\> <c-v><c-\>
:imap <c-]> <c-v><c-]>
:imap <c-^> <c-v><c-^>
:imap <c-?> <c-v><c-?>
i

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.

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.