Napisz Metaquine


19

Metaquine to program, który nie jest quine, ale którego wyjście, gdy działa jako program w tym samym języku, jest quine.

Celem tego wyzwania jest napisanie metaquine. To jest , więc wygrywa najkrótszy kod, a najwcześniejsza odpowiedź jest używana jako remis. Należy pamiętać, że ze względu na definicję quine dopuszczalne są tylko pełne programy.

Zasady dotyczące Quines

Akceptowane są tylko prawdziwe quines. Oznacza to, że musisz wydrukować cały kod źródłowy dosłownie do STDOUT, bez :

  • czytanie kodu źródłowego, bezpośrednio lub pośrednio.
  • polegając na środowisku REPL, które po prostu ocenia i drukuje każde podane wyrażenie.
  • polegając na funkcjach językowych, które w niektórych przypadkach drukują tylko źródło.
  • za pomocą komunikatów o błędach lub STDERR, aby napisać całość lub część quine. (Możesz pisać różne rzeczy do STDERR lub generować ostrzeżenia / niekrytyczne błędy, o ile STDOUT jest poprawnym quine, a komunikaty o błędach nie są jego częścią.)
  • kod źródłowy składający się wyłącznie z literałów (niezależnie od tego, czy są to literały łańcuchowe, literały liczbowe itp.) i / lub NOP.

Wszelkie dane wyjściowe, których nie można ukryć (takie jak powiadomienia o prawach autorskich, komunikaty o uruchamianiu / zamykaniu lub końcowe podawanie wiersza) mogą być ignorowane w danych wyjściowych ze względu na ważność quine.

Przykład

Ignorując regułę zabraniającą programom dosłownym i wbudowane quining, byłby to metaquine w Seriously:

"Q"

Program składa się z pojedynczego literału łańcuchowego "Q", który jest domyślnie drukowany na wyjściu. Po uruchomieniu output ( Q) jest to quine ( Qjest to wbudowana funkcja quine).


2
Czy reguła literałów / komentarzy / NOP dotyczy również wyjścia (tj. Prawdziwego quine) metakwotu? W przeciwnym razie np. Tjest łatwą 1-bajtową odpowiedzią na Pyth.
Klamka

@Doorknob Tak, wyjaśnię.
Mego,

8
Naprawdę nie rozumiem, gdzie jest trudny punkt tego wyzwania. Czy strategia „drukowania łańcucha zawierającego najkrótszą znaną liczbę” nie jest w zasadzie gwarantowana dla każdego języka?
Fatalize

1
@Fatalize Cóż, wydaje mi się, że interesujące jest pytanie, czy można to zrobić w tej samej ilości lub w mniejszej liczbie bajtów niż sama quine.
Martin Ender

3
@Fatalize Czy nie jest również możliwe, że można napisać krótką metaquine, która wypisuje długi, ale ważny quine?
Rhyzomatic

Odpowiedzi:


15

CJam, 6 bajtów

"_p"_p

Wydruki

"_p"
_p

który jest najkrótszym właściwym quine w CJam.

Sprawdź to tutaj.

Wyjaśnienie

Oba programy działają dokładnie tak samo, ponieważ podawanie wiersza w odpowiednim quine nie działa i jest uwzględniane tylko dlatego, że usunięcie go z wyjścia jest droższe. Jak działają programy:

"_p"  e# Push this string.
_     e# Duplicate it.
p     e# Print a string representation of the top of the stack (i.e. the string with
      e# quotes) followed by a linefeed.
      e# The other copy is then printed automatically at the end of the program, without
      e# stringifying it.

Dygresja

To samo działa w GolfScript jak

".p".p

który drukuje

".p"
.p

z tylnym podawaniem linii, co z kolei jest jednym z najkrótszych znanych quines.


10

Pyth, 12 11 10 9 bajtów

Znalazłem jeszcze jeden bajt dzięki @ Pietu1998.

jN B".[9N

To drukuje

.[9N".[9N

który jest quine w Pyth. Możesz to wypróbować tutaj .


Czy wynik jest nowym rekordem dla najkrótszego quina Pyth? Nie wierzę, że kiedykolwiek to widziałem.
ETHprodukcje

Nigdzie indziej nie mogłem go znaleźć. Wymyśliłem to, próbując uzyskać metakinę.
Rhyzomatic

1
Być może powinieneś opublikować to jako odpowiedź na oryginalne wyzwanie quine :)
ETHproductions

2
Możesz zmniejszyć to do 9 za pomocą jN B".[9Nlub .[9N"jN B. ( jN B"jN Bto kolejna prawdziwa quine o 9: funkcja tożsamości bifurcate i dołącz ".)
PurkkaKoodari

@ Pietu1998 Thanks! Wiedziałem, że musi istnieć sposób, aby dostać się do 9. Czy są jakieś quiny w Pyth, które są krótsze niż 9 bajtów?
Rhyzomatic



4

Python 2, 29 bajtów

_="_=%r;print _%%_";print _%_

Okazuje się, że dobrze znany krótki quin pythonowy łatwo przekształca się w metaquine :)

A ponieważ nie musimy się martwić o dopasowanie nowej linii, metakina jest w rzeczywistości krótsza!


pobiłem mnie do tego jeszcze raz :( Myślałem o opakowaniu, ale twoje jest lepsze
Erik Outgolfer

3

Japt, 15 13 bajtów

Q+"+Q ³s7J" ²

Przetestuj online!

Ten program generuje dane

"+Q ³s7J"+Q ³s7J

która jest najkrótszą znaną quine w Japt.

Jak to działa

Q+"..." // Take a quotation mark plus this string.  "+Q ³s7J
²       // Repeat it twice.                         "+Q ³s7J"+Q ³s7J
        // Implicit output

Wersja niekonkurencyjna, 11 bajtów

Q+"+Q ²é" ²

Ja po prostu dodał é , polecenie „Rotate”. Więc

"+Q ²é"+Q ²é

jest teraz prawidłowym quine.


1

Ruby, 25 23 lat

puts"puts <<2*2,2
"*2,2

Generuje klasyczną wersję Ruby HEREdoc

puts <<2*2,2
puts <<2*2,2
2

Stare rozwiązanie

_='_=%p;$><<_%%_';$><<_%_

Generuje się z wyjątkiem pojedynczych cudzysłowów zastąpionych podwójnymi cudzysłowami.



1

Ryba (> <>), 17 bajtów

Działa to przy użyciu klasycznej quine ryb, "r00g!;oooooooo|ale dodaje, {która przesuwa cały stos w lewo, dzięki czemu oryginalny program nie jest quine, ale jest wyświetlany po uruchomieniu.

"{r00g!;oooooooo|

Wyjścia:

"r00g!;oooooooo|

który jest rybnym quine!


1

Galaretka , 3 bajty (niekonkurujące)

Niestety wymagane atomy są około 2 tygodnie młodsze od wyzwania.

Metakina

”Ṙv

Wypróbuj online!

Jak to działa

”Ṙv  Main link. No arguments.

”Ṙ   Set the left argument and the return value to the character 'Ṙ'.
  v  Dyadic eval; evaluate the return value with the left argument as argument.
     Executing the atom Ṙ on the argument 'Ṙ' prints a string representation of
     the character, i.e., the string "”Ṙ".
     Finally, v returns its unaltered argument, which is printed implicitly.

Quine

”ṘṘ

Wypróbuj online!

Jak to działa

”ṘṘ  Main link. No arguments.

”Ṙ   Set the left argument and the return value to the character 'Ṙ'.
  Ṙ  Print a string representation of the character, i.e., the string "”Ṙ".
     (implicit) Print the unaltered return value.

Ponieważ drugi drukuje pierwsze dwa znaki ( ”Ṙ), jest to właściwy quine z naszej definicji.


1

Octopen-Baru, 22 bajty

** Niekonkurencyjna odpowiedź

愛[35211].pack歩U')

Wyjście Ruby

puts [35211].pack(' U')

Które wyjścia . Który jest quine w Octopen-Baru!


1

7 , 2 bajty, wyzwanie dla postdate języka

Program ma dwa bajty i można go interpretować na kilka sposobów; jako zrzut heksowy:

00000000: 4ff4                                     O.

jako strona kodowa 437:

O⌠

lub, najłatwiej, w formie ósemkowej (z której 7 używa natywnie):

237723

Wypróbuj online!

Działanie tego jest bardzo proste: jest to standardowa 7-cio osobowa z elementem stosu no-op umieszczonym między dwiema połówkami, aby się wyróżnić (w tym kontekście 7oddziela elementy stosu). (Mógłbym również wstawić go na początku 723723. Nie mogłem go zinterpretować na końcu, ponieważ końcowe 7s są jak końcowe białe znaki i są ignorowane w spakowanym kodowaniu, więc nie różni się niczym od programu wyjściowego. )

Nawiasem mówiąc, ten program jest w systemie szesnastkowym, ale to w większości zbieg okoliczności.


1

Niedociążenie, 11 bajtów

(:aSS)::aSS

Dość proste. Drukuje (:aSS):aSS, co jest standardowym quine niedociążenia.


1

Brachylog , 12 bajtów

"~k;?w₁"gjw₃

Wypróbuj online!

Jedna ze 132 odmian metakiny o tej samej długości na szynie, którą przetłumaczyłem z Brachylog v1 (nie oszukującej) Fatali. Napisałem (nie golfowy i ogólnie głupiutki) program do wydrukowania wszystkich:

{[[";?","gj","jḍ"],"₁₃₅₇"]j∋ᵐ{ḍ≠&};"\"~~k~ww~w\"~ww~w~n"}ᶠ{lw" metaquines generated:
"ẉ&}w₁ᵐ

Wypróbuj online!

Istnieją dwie części oryginalnego quine, które można zastąpić niekonsekwentnie: ;? można zmienić gjlub jḍ, i mogą być zmieniane do , lub . Jeśli zachowamy lub zmienimy je poza literałem ciągu w jeden sposób, a wewnątrz literału ciągu w inny sposób, wynik nie będzie pasował do źródła, ponieważ którekolwiek warianty występujące w literale ciągu zostaną wydrukowane zarówno wewnątrz, jak i na zewnątrz , czego wynikiem jest quine, która nie była początkowym uruchomieniem programu.

;?, gji jḍsą wymienne, ponieważ wszystkie trzy łączą literał ciąg z samym sobą: ze względu na układ programu zmienna wejściowa ?jest zunifikowana z ciągiem, więc ;?paruje ciąg ze sobą; bez względu na układ gjzawija ciąg w listę, która jest następnie konkatenowana do siebie; podobnie jḍłączy ciąg do siebie, a następnie dzieli go na pół.

Indeksy wdolne o nieparzystych numerach są wymienne, ponieważ chociaż pierwotnie wmogło zająć tylko 0 lub 1, przy czym 0 wypisuje dane wejściowe do, wa 1 drukuje pierwszy element sformatowany za pomocą drugiego, inwentarz indeksu dolnego wrozwinął się w coś, co zewnętrznie funkcjonuje jako pole bitowe: niski bit indeksu dolnego koduje, czy jest on bezpośredni, czy sformatowany, środkowy bit koduje, czy zmienna wyjściowa zwjest nieskrępowany lub ustawiony na wejście, a wysoki bit koduje, czy drukowanie jest wykonywane natychmiast, czy opóźnia się do końca programu, aby można go było cofnąć. (Te indeksy dolne były moim pierwszym i jak dotąd największym wkładem w Brachylog.) Ponieważ quine i metaquine nie używają zmiennej wyjściowej i nie cofają się, wszystkie cztery nieparzyste indeksy są równoważne.


0

Befunge-93, 22 bajty

"+1_@#`+39:,g0:">:#,_@

Właśnie wziąłem standardowy quine, umieściłem go w cudzysłowach, odwróciłem (aby poprawnie załadować go na stos), a następnie dodałem wydruk stosu na końcu.

Jest 8 znaków dodanych do normalnego quine, więc jest bardzo możliwe, że istnieje lepsze rozwiązanie.


Czy nie możesz po prostu wziąć standardowego quine i dodać nowy wiersz? Nowa linia zniknie na etapie analizy, pozostawiając ci tylko standardowy quine (który wydrukuje się).

0

Turtlèd , 52 bajty (niekonkurencyjne)

1 mniej niż oryginalny quine

@##'@r,r,r-{ +.r_}r{ +.r_}"#'@r,r,r-{ +.r_}r{ +.r_}"

Działa w ten sam sposób, z tym wyjątkiem, że nie ma znaku na końcu, gdy zostanie uruchomiony, będzie miał znak na końcu, co nie wpłynie na wynik, ponieważ zapisuje # na #. Zauważ, że wynik jest nieco inny niż quine, które stworzyłem dla quine Challenge, ale działa tak samo: „zapisuje #, który jest jego ostatnim znakiem, podobnie jak napisane przeze mnie quine. Sprawdź tam wyjaśnienie .


0

Lua, 45 bajtów

Kod Quine nie mój.

s="s=%qprint(s:format(s))"print(s:format(s));

spowoduje

s="s=%qprint(s:format(s))"print(s:format(s))

który jest quine. Cieszę się, że ;jest to opcjonalne w Lua.


0

Pushy , 7 bajtów

Niekonkurencyjny, ponieważ język jest późniejszy niż wyzwanie.

Jest to standardowy quine, ale z usuniętymi znakami nowej linii. Nowe linie nic nie znaczą w Pushy, ale są standardowym separatorem operatora drukowania, a zatem są potrzebne do prawdziwego quine.

95 34_"

Wypróbuj online! To daje:

95 34
_ ”

Która jest najkrótsza Pushy Quine - wyjaśnienie tego, jak to działa, można znaleźć tutaj .

Alternatywnie, H5-34_"działa dla tej samej liczby bajtów.


0

Piana , 14 bajtów

[. .'|: ~|]: ~

To drukuje drugą piankę Quine, którą można znaleźć tutaj . Jest to w rzeczywistości krótsze, ponieważ .zawsze umieszcza spację między każdym elementem, ale pasek w trzecim żetonie pozwala mi pominąć spację przed nim.


Usunąłem niekonkurencyjny bit, ponieważ nowsze języki nie są automatycznie niekonkurencyjne zgodnie z zasadami witryny.
Mego

0

Łuska , 6 bajtów

D"S+s¨

Wypróbuj online!

Drukuje standardowy kadłub Łuski S+s"S+s".

 "S+s¨    The string S+s"
D         concatenated with itself.

Quine wyjaśnił:

   "S+s"    The string S+s
 +          concatenated with
S           itself passed through
  s         the function which returns its string representation.
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.