Quine na każdej linii


30

Twoim celem jest stworzenie programu, który drukuje się w nieskończoność, z nowym wierszem po każdym. Tak więc, jeśli twój program jest jednowierszowy, byłby powtarzany w każdym wierszu wyniku.

Przykład

Program:

A

Wydajność:

A
A
A
...

Zasady

  • Musi to być kompletny program, a nie fragment kodu lub funkcja.
  • Program powinien zapętlać się na zawsze bez błędów przepełnienia stosu lub błędów limitu rekurencji.
  • Wyjście jest do standardowej lub najbliższej alternatywy.
  • Wejście programu nie jest akceptowane.
  • Standardowe luki są niedozwolone, takie jak otwieranie pliku programu lub uzyskiwanie dostępu do zewnętrznego zasobu. Puste programy są niedozwolone jako standardowa luka.
  • Jeśli kod programu kończy się końcowym znakiem nowej linii, nie jest to liczone jako niezbędny znak nowej linii między znakami i musisz wydrukować inny.
  • - najkrótszy kod!

Tytuł wygląda na to, że kwalifikują się tylko programy jednowierszowe?
Paŭlo Ebermann

@ PaŭloEbermann Następnie przeczytaj opis problemu. To dowcipny tytuł, ponieważ rymuje się. Oto przykład prawidłowego programu obsługującego wiele linii: codegolf.stackexchange.com/a/57985/34718 . Nie możesz oczekiwać, że dowiesz się wszystkiego o wyzwaniu, czytając tylko tytuł.
mbomb007,

@ PaŭloEbermann To tylko while(1)println(your_code);
Matthew Roh

Odpowiedzi:


19

Rozszczepienie, 7 bajtów

'!+!NR"

Dość prosta modyfikacja najkrótszej quine rozszczepienia, jaką znalazłem do tej pory : po prostu używam nieniszczącej !zamiast zamiast Oi dodałem nową Nlinię.

Podsumowując, oto jak to działa: przepływ kontrolny zaczyna się Rod właściwego atomu. "przełącza tryb napisów, co oznacza wszystko, dopóki nie "zostanie wydrukowane następne : w tym przypadku '!+!NR. Pozostawia to "znak nowej linii do wydrukowania. '!ustawia masę atomu na 33, +zwiększa ją do 34 (kod znakowy ") i !drukuje cytat. Nwypisuje nowy wiersz, a Rteraz nie ma w tym przypadku opcji, więc pętla zaczyna się od nowa.

Działa również następujące 7-bajtowe rozwiązanie:

"NR'!+!

9

> <> , 16 bajtów

'ard3*o50l2)?.~~

Tradycyjna quine> <> używa zbyt wielu os, więc do drukowania używamy pętli. Przed każdym skokiem wciskamy 5 i 0 (współrzędne miejsca skoku), po czym albo skaczemy, .jeśli jest jeszcze coś do wydrukowania, albo wyświetlamy dwie najwyższe wartości ~~.

(Przywrócono wersję 16, ponieważ zapomniałem o regule przepełnienia stosu).


Alternatywą jest "ar00go50l2)?.[, prawda?
mbomb007,

3
@ mbomb007 Chyba, ale wolę, d3*ponieważ gczyta swój własny kod źródłowy
Sp3000,

8

CJam, 13 bajtów

{_o"_g
"o1}_g

Interpreter online nie drukuje niczego przed zakończeniem programu, więc musisz to przetestować w interpreterie Java.

Wyjaśnienie

Wreszcie uogólniona Quine CJam, która się nie kończy _~.

{_o"_g
"o1}

To po prostu przesuwa blok. _gduplikuje blok i wykonuje go wielokrotnie, podczas gdy górna część stosu jest prawdziwa (odrzucając warunek).

Teraz wewnątrz bloku druga kopia bloku wciąż znajduje się na stosie. Duplikujemy i drukujemy za pomocą, _oa następnie drukujemy, _ga następnie nową linię (wymagany dodatkowy znak nowej linii między znakami) za pomocą "_g\n"o. Na koniec 1wciskamy stos na pętlę, aby powtórzyć, ponieważ niestety bloki nie są prawdziwe (lub fałszywe) w CJam.


7

Python 2, 39

Niezbyt interesujące zadanie w Pythonie, ponieważ dodawanie pętli while do normalnego quine jest banalne.

c='while 2:print"c=%r;exec c"%c';exec c

Czy to nie zdmuchuje stosu?
Jesan Fafon,

1
@JesanFafon Nie, jeśli spróbujesz, zobaczysz, że tak nie jest. Nie ma rekurencji.
feersum

6

Perl 5.10+, 40 37 bajtów

$_=q{say"\$_=q{$_};eval"while 1};eval

lub (również 37 bajtów)

$_=q{{say"\$_=q{$_};eval";redo}};eval

Wywołaj z flagą -M5.010lub -Ewierszem poleceń, np

$ perl -E '$_=q{say"\$_=q{$_};eval"while 1};eval'
$_=q{say"\$_=q{$_};eval"while 1};eval
$_=q{say"\$_=q{$_};eval"while 1};eval
$_=q{say"\$_=q{$_};eval"while 1};eval
...

Dziękuję Ilmari Karonen za zgolenie 3 bajtów z mojego oryginalnego rozwiązania, którym było:

eval while$_=q{say"eval while\$_=q{$_}"}

To, podobnie jak powyższe krótsze 37-bajtowe rozwiązania, są prostymi odmianami poniższego quine, który po raz pierwszy zobaczyłem w jednym z innych postów Ilmari :

$_=q{say"\$_=q{$_};eval"};eval

Ponieważ wszystko, co dodałem w moim oryginalnym rozwiązaniu, to whilepętla, on naprawdę zasługuje na większość uznania. :-)


Fajnie i dziękuję za kredyt. :-) Oryginalny quine jest moim własnym projektem, chociaż ktoś inny mógł go wcześniej odkryć samodzielnie. BTW, $_=q{say"\$_=q{$_};eval"while 1};evallub $_=q{{say"\$_=q{$_};eval";redo}};evalbyłby o kilka bajtów krótszy. ( $_=q{say"\$_=q{$_};eval";eval};evalbyłby jeszcze krótszy, ale podejrzewam, że w końcu skończy mu się stos).
Ilmari Karonen

Miałem nadzieję, że się pojawisz! Dziękuję za krótsze rozwiązania, pomyślałem, że wymyślisz coś lepszego; ale tak mnie to poruszyło, kiedy zobaczyłem to w odpowiedzi, do której linkowałem, po prostu musiałem spróbować sam. :) Szczerze mówiąc, wciąż jeszcze nie owijałem głowy wokół quines, ale dodatkowe odpowiedzi dają mi więcej do zobaczenia. Nie byłam pewna, czy to stworzyłeś, ponieważ widziałem, że przypisałeś sobie najkrótszą nie oszukującą wersję Perla (?!) na tej stronie , ale nie ma przypisania dla tej kwoty (użycie printzamiast say).
ThisSuitIsBlackNot

tak przy okazji, ten ostatni rzeczywiście nie działa poprawnie po dłuższym uruchomieniu. Jeszcze raz dziękuję, @Ilmari!
ThisSuitIsBlackNot

Właściwie cofam to nieco - zdecydowanie nie jestem pierwszym, który wynalazł ten quine , a ponieważ na pewno go wcześniej widziałem (opublikowałem ten, o którym twierdzę, że mam uznanie w tym samym wątku), jest całkiem prawdopodobne że podświadomie pamiętałem to z tego wątku lub z innego miejsca.
Ilmari Karonen,

W porządku, pozostawiłem pochodzenie nieokreślone. Niezależnie od tego, dziękuję za 3 bajty i dziękuję za oryginalną inspirację.
ThisSuitIsBlackNot

5

Samodomodyfikujący Brainf *** (SMBF) , 14 bajtów

Końcowy \nznak nowej linii musi być literalnym, uniksowym znakiem nowej linii (kod ASCII 10).

[<[<]>[.>]<.]\n

Wyjaśnienie:

Kod przesuwa wskaźnik w lewą stronę kodu źródłowego, a następnie drukuje wszystko, łącznie z nowym wierszem (dwa razy b / c reguły). Pętla trwa.


Masz na myśli, że to musi być \r?
Ismael Miguel,

@ IsmaelMiguel No. \njest nową linią i ma kod ASCII 10, więc zrzut heksowy kodu źródłowego miałby wartość 0Atego bajtu. code.cside.com/3rdpage/us/newLine.html
mbomb007

1
@IsmaelMiguel Nieprawda. Podczas wpisywania kodu w rzeczywistości naciskasz klawisz Enter dla nowej linii. \nogólnie liczy się jako 2 znaki i 2 bajty w kodzie. Wpisałem to w ten sposób dla czytelności, ponieważ formatowanie nie działa dobrze w przypadku wyświetlania pustej linii na końcu mojego kodu źródłowego. Musiałem więc sprecyzować, że był to JEDEN bajt, a nie dwa.
mbomb007,

2
\njest zawsze pojedynczym znakiem, zwanym wysuwem wiersza . Nowa linia jest jednak zależną od platformy sekwencją bajtów.
Dennis,

2
@Dennis Może tak, ale mnie to nie obchodzi. Nie nazywam /„Solidus” i nie znam nikogo, kto by to zrobił. „Newline” zaczyna się od n, i to jest znak ucieczki, więc tak to nazywam. Jest bliżej „przesunięcia linii” niż „powrotu karetki”.
mbomb007

3

PowerShell, 143 bajtów

$d='$d={0}{1}{0}{2}while(1){3}Write($d -f [char]39,$d,"`n",[char]123,[char]125){4}'
while(1){Write($d -f [char]39,$d,"`n",[char]123,[char]125)}

Bazując na Quine PowerShell firmy Rosetta Code , jestem przekonany, że nie jest to najkrótsza możliwa. Formatowanie zamiany ciągów w PowerShell jest do tego trudne, ponieważ te same ograniczniki, w których umieszczać zamienniki, {}również ograniczają bloki kodu while{}, więc musimy użyć [char]rzutowania, co powoduje pęcznienie kodu.


3

Niedociążenie, 25 bajtów

Po raz pierwszy spróbowałem czegoś takiego i nie jestem pewien, czy przestrzegam wszystkich zasad, ponieważ jest to kilka linijek. Nowa linia była trochę uciążliwa.

(::a~*S:a~*^
)::a~*S:a~*^

1
@ mbomb007 Dane wyjściowe na iterację to dwa wiersze programu. Testowałem to tutaj
MickyT

3

Befunge , 30 20 bajtów

<,+55,*2+98_ #!,#:<"

Odmiana popularnej quine befunge, która drukuje nowy wiersz i wyskakuje -1 na stosie, jeśli kończy linię.
Niestety Befunge robi się gadatliwy podczas robienia rzeczy w jednym wierszu. Próbowałem usunąć wszystkie startery ( #), które mogłem, ale niektóre musiały pozostać, aby pominąć niektóre polecenia (jak ,).

Zmiany:

30-20 -> zmieniłem podstawowy quine na niestandardowy, który zrobiłem, który wykorzystuje ciąg znaków. W ten sposób rozgałęzienie jest znacznie łatwiejsze.

Stary:

:0g,:93*`>0-10 #,+$#: #5 _1+>

Nie sądzę, że jest to optymalne, ale na razie jest dopuszczalne.


Możesz użyć instrukcji get, aby chwycić spację i dodać 2 do jednego bajtu krótszego niż 98+2/: <, + 55, + 2g1_ #!, #: <"
MildlyMilquetoast

Najpierw pchnij cytat i znak nowej linii i odwróć drukarkę,-1g0:+5<>:#,_1"
Jo King,


2

R, 34 bajty

repeat{write(commandArgs()[5],'')}

aby wywołać z wiersza poleceń w następujący sposób:

Rscript -e "repeat{write(commandArgs()[5],'')}"

2

> <>, 31 29 bajtów

Prosta modyfikacja tradycyjnej > <> quine .

"ar00gc0.0+efooooooooooooooo|

Aby uruchomić, wklej go tutaj , kliknij „Prześlij”, a następnie „Rozpocznij” (uruchamianie bez animacji nie działa). Zwiększ szybkość wykonywania.


"ar00gc0.0+feooooooooooooooo|jest dwa bajty krótszy.
cole

@Cole Thanks. Myślałem o lustrze, ale zapomniałem go zmienić po tym, jak dostałem śledzenie przy innym wyzwaniu.
mbomb007


@JoKing Istnieje już krótsze> <> rozwiązanie .
mbomb007


2

GolfScript, 16 bajtów

{.".do
":n\p}.do

W rezultacie wyglądało to bardzo podobnie do wpisu Martina Büttnera w CJam . Ciekawą cechą jest to, że, jak się okazuje, najkrótszym sposobem dołączenia ".do"do bloku podczas jego drukowania jest przypisanie go do terminatora linii n. (Oczywiście musimy również dołączyć rzeczywistą nową linię do łańcucha, aby zastąpić nnormalną, która zawiera.) Ten sam ciąg (tak jak w GolfScript) jest również pozostawiony na stosie, aby dopętla odskoczyła , zapewniając, że pętla działa wiecznie.


1

BASH, 76 bajtów

Po prostu nie mogłem się oprzeć, szczególnie z PowerShell tutaj :)

while true;do
a ()
{
    echo while true\;do
    declare -f a
    echo a\;done
}
a;done

Biała spacja jest ważna dla DOKŁADNEJ kopii.


1

JavaScript (ES6), 64

for(;;(_=>console.log(`for(;;(_=>${arguments.callee})());`))());

Alternatywnie (także 64)

a="for(;;)console.log(`a=${JSON.stringify(a)};eval(a)`)";eval(a)

Czy alternatywa nie spowodowałaby przepełnienia stosu?
Patrick Roberts,

Nie. Nie ma rekurencji, więc nic nie powinno sumować się na stosie.
DankMemes,

Ok, właśnie przetestowałem oba, masz rację co do alternatywnego rozwiązania, ale twoje pierwsze rozwiązanie zawodzi i wymyśliłem dlaczego. Zgodnie z dokumentacją MDN na temat funkcji strzałek „Funkcje strzałek nie narażają obiektu argumentów na ich kod”, więc użytkownik arguments.calleenie istnieje i generuje błąd.
Patrick Roberts,

Ciekawy. Dla mnie w Firefox Developer Edition 42.0a2 (13.09.2015) oba działają. Wydaje mi się, że po pełnym przyjęciu standardu pierwszy przestanie działać.
DankMemes,

Przetestowałem je na najnowszym chrome, ponieważ próbowałem zagrać w golfa w twoje pierwsze rozwiązanie !zamiast dołączać nawiasy i umieszczać wykonywanie funkcji po pętli for, aby uniknąć potrzeby użycia korpusu średnika pętli for, który zaoszczędziłby (tak myślę) 4 bajty
Patrick Roberts,

1

Microscript , 22 bajty

"f1{CqxCanx"f1{CqxCanx

W oparciu o Quine'a z artykułu Esolangs: "fCqxah"fCqxah. Wykorzystuje fakt, że język automatycznie dołącza nawiasy zamykające w razie potrzeby, bez których byłoby to dwa bajty dłużej.


1

Partia, 10 (+ 4 dla długości nazwy pliku)

Nie jestem pewien, czy kwalifikuje się to z dwóch powodów:

  • Technicznie rzecz biorąc, powłoka poleceń systemu Windows może, ale nie musi, wywoływać tekstowych skutków ubocznych, ponieważ zależy to od konfiguracji.
  • Ten program wywołuje się po nazwie i nie jestem pewien, czy jest to zabronione przez reguły (w szczególności regułę „brak otwierania pliku programu”). Nie otwiera się w celu czytania i drukowania tekstu; po prostu sam się ponownie uruchamia. Ponadto struktura systemu plików jest integralną częścią oldskulowych skryptów wsadowych (często nawet wykorzystywanych do przechowywania stanu programu itp.). Jako taki nie jestem pewien, czy to narusza 5. zasadę, czy nie.

Kod (dla programu o nazwie q.bat):

echo on&&q

2
Rozumiem, że na to pozwolę, ponieważ nie jest najkrótszy, a jest kreatywny i niepowtarzalny. I to nie było odczytywanie kodu źródłowego, ale wykonywanie się.
mbomb007

1
Ponieważ nazwa pliku nie jest dowolna, należy przynajmniej dodać nazwę pliku do liczby bajtów.
Martin Ender

1
Wierzę, że możesz użyć, echo on&&%0chociaż boję się spróbować.
DankMemes,

1
Aktualizacja: echo on&&%0nie działa. %0jest wyświetlany jako rozwinięty w wyniku, a Windows (7, 32-bitowy, działający na maszynie wirtualnej) dość szybko kończy to wszystko.
DankMemes,

1
Myślę, że możesz pominąć tę .batczęść
SuperJedi224

1

Cejlon , 210 208 bajtów

Oczywiście to nic nie wygra ...

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

Oryginalny:

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(true){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(true){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

Zmodyfikowałem mój Quine sprzed dwóch dni , dodając while(true){...}pętlę, więc pochodzę z 185 bajtów zwykłego Quine do 210 (nie potrzebuję już znaku nowej linii). Ale potem odkryłem, że while(1<2){...}pętla jest nawet dwa bajty krótsza:

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

(Ceylon nie ma for(;;) pętli jak Java, a nawiasy klamrowe są również potrzebne do tej pętli).


1

PowerShell, 132 107 bajtów

$a='$a={0}{1}{0};for(){2}$a-f[char]39,$a,[char]123,[char]125{3}';for(){$a-f[char]39,$a,[char]123,[char]125}

Oparty na Quine Rosetta (Taki sam jak @AdmBorkBork), chociaż nie używa formatowania do zamiany ciągów ... może przełączenie na pętlę for i użycie formatowania byłoby najlepsze?

Jestem pewien, że gdyby AdmBorkBork wrócił, to by to bardzo pobili: P

EDYTOWAĆ Zrozumiałem pętlę for i zamienniki, wszystko dzięki mojemu poprzednikowi :)

Stara próba:

$a='$a=;for(){$a.substring(0,3)+[char]39+$a+[char]39+$a.substring(3)}';for(){$a.substring(0,3)+[char]39+$a+[char]39+$a.substring(3)}


1

Java 10, 194 bajtów

interface M{static void main(String[]a){for(var s="interface M{static void main(String[]a){for(var s=%c%s%1$c;;)System.out.println(s.format(s,34,s));}}";;)System.out.println(s.format(s,34,s));}}

Wyjaśnienie:

Wypróbuj online (upłynie limit czasu po 60 sekundach).

interface M{                    // Class
  static void main(String[]a){  //  Mandatory main-method
    for(var s="interface M{static void main(String[]a){for(var s=%c%s%1$c;;)System.out.println(s.format(s,34,s));}}";
                                //   Unformatted source code
        ;)                      //   Loop indefinitely
       System.out.println(      //    Print with trailing new-line:
         s.format(s,34,s));}}   //     The formatted source code

-part:

  • Ciąg szawiera niesformatowany kod źródłowy.
  • %ssłuży do wprowadzania tego ciągu do siebie za pomocą s.format(...).
  • %c, %1$ci 34służą do formatowania podwójnych cudzysłowów.
  • s.format(s,34,s) łączy to wszystko

Część wyzwania:

  • for(;;) służy do zapętlania w nieskończoność.
  • System.out.println(...) służy do drukowania ze znakiem nowej linii





1

Brachylog , 16 bajtów

∋"∋~kgjẉ₁⊥"gjẉ₁⊥

Nie możesz tego wypróbować online , ale sprawdziłem, czy działa w mojej instalacji.

Brachylog , 18 bajtów

∋"∋~kgjw₁⊥~n"gjw₁⊥

Wypróbuj online!

Zaadaptowano z alternatywnej wersji tego quinu z hackiem do cofania, który początkowo wymyśliłem dla bogosortu wszystkich rzeczy. Zużywa dwa bajty, ~nponieważ (zwykły sposób drukowania z końcowym znakiem nowej linii) napotyka pewne dziwne problemy z kodowaniem znaków w TIO, a rzeczywista nowa linia wstawiana do literału łańcucha jest drukowana ~kjako \n.

               w      Print
 "∋~kgjw₁⊥~n"         "∋~kgjw₁⊥~n"
∋                     which is an element of
                      the (unused and unconstrained) input
                ₁     formatted
          ~n          (so that the ~n is replaced with a newline)
             gj       with itself
   ~k                 (so that the ~k is replaced with the string in quotes),
                 ⊥    then try again.

Ponieważ w₁pobiera dane wejściowe jako listę [string to be formatted, formatting arguments], zawijanie ciągu znaków na listę, a gnastępnie konkatenacja go z sobą jpozwala na sformatowanie go razem z nim. A ponieważ do programu nie są przekazywane żadne dane wejściowe, zmienna wejściowa, która jest domyślnie obecna na początku programu, może przyjąć dowolną wartość, dzięki czemu można ją ograniczyć do jednej z nieskończenie wielu list, które zawierają "∋~kgjw₁⊥~n"jako element, tworząc pojedynczą punkt wyboru, do którego należy wrócić, gdy po wydrukowaniu źródła program uderza .


1

Python 3.6, 48 43 bajtów.

-5 bajtów dzięki @Jo King

x='while 1:print("x=%r;exec(x)"%x)';exec(x)

Możesz użyć, %raby zaoszczędzić na ucieczce od nich '. 43 bajty
Jo King

co daje 41 dla Pythona 3.8: P
tylko ASCII

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.