Napisz Semiquine

10

Załóżmy, że masz 2 języki Ai B. Łańcuch sjest półkwinu Ai Bjeśli spełnia następujące warunki:

  1. sjest quine w języku A.
  2. sjest poliglotą w Ai B.
  3. Wynikiem działania sjako Bprogram jest inny ciąg znaków s', który jest quine in B.

Celem tego wyzwania jest napisanie półkwiny w dwóch różnych językach. To jest , więc wygrywa najkrótszy kod, a najwcześniejsza odpowiedź jest używana jako remis.

Zasady dla Quines

Akceptowane są tylko prawdziwe quinesy. 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.
  • opierając się na funkcjach językowych, które w niektórych przypadkach drukują tylko źródło.
  • używając 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ą).

Ponadto kod źródłowy nie może składać się wyłącznie z literałów (niezależnie od tego, czy są to literały łańcuchowe, literały liczbowe itp.) I / lub NOP. Na przykład `12jest poliglotą w Jelly i Pyth, ale w Jelly jest NOP i literałem liczbowym, więc nie jest poprawny.

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

Zasady dla Polyglots

Dwa używane języki muszą być wyraźnie różne. W szczególności:

  • Nie mogą to być różne wersje tego samego języka (np. Python 2 vs. Python 3).
  • Nie mogą to być różne dialekty tego samego języka (np. Pascal vs. Delphi).
  • Jeden język może nie być podzbiorem drugiego (np. C vs. C ++ 1 ).
  • Jeden język może nie być trywialną pochodną drugiego (np. Matlab vs. Octave 2 , brainfuck vs boolfuck vs TinyBF vs ShadyAsFuck vs. wszystkie inne trywialne pochodne brainfuck).

Różne zasady

  • Nie możesz zaakceptować danych wejściowych z STDIN (lub innego źródła). Jeśli wybrany język musi pobierać dane wejściowe, dane wejściowe muszą być puste (pusty ciąg znaków, potok z /dev/nullitd.) Lub dane wyjściowe programu nie mogą zależeć od danych wejściowych.
  • Aby sprostać temu wyzwaniu, musisz napisać kompletny program. Wymaganie dodatkowego kodu do uruchomienia rozwiązania jest niedozwolone (takie jak przypisywanie i wywoływanie funkcji lambda zdefiniowanej w rozwiązaniu).

1: Tak, wiem, że C nie jest tak naprawdę podzbiorem C ++. Jest jednak wystarczająco blisko, aby uznać go za jeden z celów poliglotów, więc liczę to dla tego wyzwania.

2: Podobnie jak w punkcie 1 powyżej, chociaż Octave nie jest technicznie w 100% kompatybilny z Matlabem, został zaprojektowany tak, aby był kompatybilny i jest wystarczająco blisko, aby zezwolenie na poliglotę Matlab / Octave trywializowało wyzwanie.

Mego
źródło
Czy dozwolone są bloki kopiowania ESMin?
lirtosiast
@ThomasKwa Nie znam ESMin, więc czy mógłbyś mi szybko podsumować?
Mego
Istnieje polecenie uruchomienia bloku kopiowania, który pobiera kod źródłowy wszystkiego, co się po nim znajduje. Myślę, że inne języki gry w golfa JS też mogą mieć.
lirtosiast
@ThomasKwa To nie byłoby dozwolone zgodnie z pierwszą regułą w regułach quine (brak odczytu kodu źródłowego, bezpośrednio lub pośrednio).
Mego
1
@Downgoat Tak długo, jak absolutnie nie łamie innych zasad. Nadużywanie dziwactw jest swego rodzaju celem tej strony :)
Mego

Odpowiedzi:

6

GolfScript + Rozszczepienie , 19 18 bajtów

{".~
'!+OR"
2<}.~

Podążanie za linią jest konieczne.

To jest prawdziwa quine w GolfScript. Wypróbuj online!

W Fission drukuje

'!+OR"

co jest prawdziwym quine w Fission . Wypróbuj online!

Wyjaśnienie

W GolfScript dowolna forma

{...}.~

jest quine, o ile ...pozostawia sznurek ".~"na stosie. .Powiela blok, tak, że jedna kopia, która zostanie wydrukowana na końcu, a ~wykonuje go, dzięki czemu możemy korzystać z jej zawartości, aby wydrukować .~sobie. W takim przypadku blok popycha ciąg

".~
'!+OR"

a następnie obcina go do pierwszych dwóch znaków za pomocą 2<.

Program rozszczepienia naprawdę działa dokładnie tak samo jak sam quine , ponieważ pierwszy i trzeci wiersz są całkowicie ignorowane przez program.

Martin Ender
źródło
6

Ruby + (JavaScript lub Python 3), 76 bajtów

To kolejne wyzwanie, które można rozwiązać za pomocą mojego nowego ulubionego języka, prawie powszechnego podzbioru Ruby, JavaScript i Python 3; a biorąc pod uwagę, że nie znamy jeszcze odpowiedzi w egzotycznych językach, a wiele osób lubi widzieć rozwiązania w języku innym niż golf, pomyślałem, że mógłbym je wnieść. Co więcej, ta sama odpowiedź rozwiązuje to wyzwanie na wiele sposobów jednocześnie.

Oto s:

s="'";d='"';n='print("s="+d+s+d+";d="+s+d+s+";n="+s+n+s+";eval(n)")';eval(n)

To jest quine w Ruby. To nie jest quine w JavaScript ani Python 3; jeśli uruchomisz go w jednym z tych języków, jego wynik s'ma końcowy znak nowej linii, a zatem jest inny:

s = "'"; d =' "'; n =' print (" s = "+ d + s + d +"; d = "+ s + d + s +"; n = "+ s + n + s +" ; eval (n) ") '; eval (n)

Jednak s'to Quine poliglota w JavaScript i Python 3! (Jak zwykle dla mnie, używam implementacji JavaScript w Rhino, zarówno dla wygody (ponieważ działa ona z wiersza poleceń, a nie wymaga przeglądarki), i ponieważ ma dziwną standardową bibliotekę, w której printzapisuje na standardowe wyjście.) Oba języki powstają s'w wyniku uruchomienia dowolnego programu.

Jako bonus, ten program rozwiązuje również problem w odwrotnej kolejności. Jeśli zdecydujesz się na uruchomienie s'w Ruby, wydrukuje oryginalny program sponownie. Jako taka s'jest poprawną (ale nieco dłuższą, 77 bajtową) odpowiedzią na pytanie.

W tym momencie prawie zaczynam myśleć, że „różnice w tym, czy wynik kończy się znakiem nowej linii wystarczającym do zaliczenia dwóch programów jako różnych”, należy uznać za standardową lukę, biorąc pod uwagę, że jest to drugi zestaw języków (poza dobrze znanym GolfScript / CJam), w którym można wykonać lewę.


źródło
2

Vitsy (tryb awaryjny) i Y, 9 bajtów, niekonkurujące.

' Ugrd3*Z

W Vitsy jest to quine. W Y drukuje się Ugrd3*Z'; po uruchomieniu drukuje to Ugrd3*Z', co jest literą w Y. Y jednak postdatuje to pytanie.

Co widzi Vitsy:

 ' Ugrd3*Z
 '         Heyyyy a string! Let's do this!
  ........ Capturing a string! Oh, not done? Hm, let's go back to the start.
 '         There we go.
           (space) ...
   U       (no op)
    g      use count, disabled in safe mode
     r     reverse stack
      d3*  push a '
         Z print it all!

Co widzi Y:

' Ugrd3*Z
'         Push a space.
  U       Wrap around and capture.
   g      Print that. (Nothing else is printed.)
Conor O'Brien
źródło
1
Zauważ, że działa to tylko w trybie awaryjnym, a raczej ma pewne ... niezamierzone skutki uboczne w trybie innym niż bezpieczny.
Addison Crump,
1

CJam + GolfScript, 9 bajtów

"0$p"
0$p

To jest quine w CJam. W GolfScript wypisuje się z końcowym znakiem nowej linii, który jest quine w GolfScript.

Nie jestem pewien, czy CJam należy uznać za trywialną pochodną GolfScript. Ale myślę, że są zupełnie inne i przynajmniej nie są trywialne.

jimmy23013
źródło