Quine z podwójnym rozcięciem

11

Cel:

Koduj dwa programy, w których każdy z programów wyprowadza oba kody źródłowe z przeplotem na znak, jak zamek błyskawiczny, Quine z podwójną szczeliną. Wyjście z Quine z podwójną szczeliną zaczyna się od pierwszego znaku z kodu źródłowego pierwszego programu. Jeśli kod źródłowy jednego z programów jest krótszy niż inny, wówczas resztę danych wyjściowych należy wypełnić resztą dłuższego kodu źródłowego.

Zasady:

  1. Możesz używać dowolnego języka programowania dla obu programów, niekoniecznie tego samego języka programowania dla obu programów.
  2. Twoje programy nie powinny pobierać żadnych danych wejściowych z pliku, nazwy pliku, sieci, innego programu ani niczego innego.

Obowiązkowe kryteria:

  • Jest jakiś haczyk, gdzieś na wyjściu słowo QUINEwielkimi literami musi istnieć nieprzerwanie.
  • Musisz określić, jakich dwóch języków programowania używasz. Jeśli używasz tego samego języka programowania dla obu języków, musisz podać tylko jeden język programowania.
  • Oba programy powinny być w stanie wykonać lub być interpretowane odpowiednio niezależnie od drugiego programu.

Przykład:

Mając ten przykładowy kod źródłowy programu jeden :

"QIE"

Posiadanie tego przykładowego kodu źródłowego programu drugiego :

"UN"

Następnie prawidłowe wyjście Quine z podwójnym nacięciem z obu programów musi być:

""QUINE""

To jest golf golfowy, najmniej bajtów przy sumowaniu długości obu kodów źródłowych, i oczywiście także długość każdego wyjścia programów, wygrywa!

Plarsen
źródło
Każdy program też nie musi być quine, prawda? I czy każdy program musi zawierać co najmniej jeden znak?
mbomb007
@ mbomb007 To prawda. Każdy program powinien wypisywać oba znaki kodu źródłowego jak suwak od początku do końca. Cóż, myślę, że potrzebujesz co najmniej 1 bajtu w języku programowania, aby wyprowadzić QUINE? Dane wyjściowe z obu programów muszą być identyczne.
Plarsen
Nie jestem pewien, czy rozumiem, że reszta danych wyjściowych musi być poprawnie wypełniona resztą dłuższego kodu źródłowego . W jaki sposób Ai XYZbyć przeplatane? AXYZ?
Dennis
@Dennis Podobnie jak .+lub zdziała
Optymalizator
@Dennis Correct. To, co pozostało z dłuższego kodu źródłowego, gdy brakuje krótszych bajtów, musi zostać dołączone do danych wyjściowych obu programów.
Plarsen

Odpowiedzi:

9

CJam, 49 47 bajtów

{`:_"__~~e#QUINE"}_~

i

{`:_"__~~e#QUINE"}_~e#QUINE

oba drukują

{{``""__~~""++::__""ee##QQUUIINNEE""}}__~~e#QUINE

Wypróbuj online: program 1 , program 2 , dowód ważności

Jak oni pracują

{                }   e# Push a code block.
                  _~ e# Execute a copy.
 `                   e# Convert the code block into a string.
  :_                 e# Duplicate each character of the resulting string.
    "__~~e#QUINE"    e# Push this string.

Program 1 kończy się tutaj i ma ciąg reprezentujący cały kod źródłowy (który każdy znak powtarza się dwukrotnie), a także ciąg e # QUINE na stosie.

Program 2 dodatkowo analizuje e#QUINE, co jest komentarzem.

W obu przypadkach CJam automatycznie drukuje dwa ciągi, co skutkuje wyżej wymienionymi danymi wyjściowymi.

Dennis
źródło
4

Poważnie, 46 56 42 bajtów

QUNX;RZtdXεj.ƒ£REIQ

Hex Dump:

51554e583b525a746458ee6a2e7f9f9c524549510a

Drugi program to ten dokładnie odwrócony program. Zawiera niewidoczny znak, ale liczba bajtów jest prawidłowa. Oba programy generują ten ciąg palindromiczny:


QQUINEXR;£RƒZ⌂t.djXεεXjd.t⌂ZƒR£;RXENIUQQ

(Z jakiegoś powodu wyświetla niewidoczny znak, gdy wyświetla go w moim terminalu. Naprawdę nie rozumiem tego bajtu 7F).

Jak to działa:

Q                     Push the source to the stack
 U                    Nop
  NX                  Push and pop lyrics to 99 bottles of beer
    ;R                Make a copy of the source reversed.
      Z               Zip them together.
       t              Completely flatten the list.
        dX            Delete the trailing newline
          εj          Join it into a string.
            .         Print it with a trailing newline.
             ⌂        (This is that 7F byte that won't show up. It halts.)

Reszta programu nie jest wykonywana.

Następnie w innym kierunku:

\n                   Nop
  Q                  Push the source code.
   IE                Nops
     R               Reverse source code to get source of first program
      £              Eval it into a function
       ƒ             Call it.

W tym momencie uruchamiamy teraz pierwszy program powyżej, więc wykonywanie jest kontynuowane, jak tam opisano.

W dużym stopniu wykorzystuję fakt, że kilka poleceń nic nie robi z łańcuchami ani pustymi stosami. Wykorzystuję również nieoczekiwane zachowanie, tgdy na stosie jest tylko jeden przedmiot. Nie oczekuj, że ten program będzie działał w przyszłych wersjach Seriously.

Ponieważ wersja online poważnie interpretera nadal jest zepsuta, musisz pobrać interpreter i uruchomić go na własnym komputerze, aby go przetestować.

kwintopia
źródło
@Dennis przetestowałeś to na swoim komputerze? To może być artefakt mojego środowiska kompilacji.
kwintopia,
@Dennis nvm masz rację. Wszystkie metody wyjściowe Seriously dodają linię. Mogę to naprawić kosztem 8 bajtów. Wygląda na to, że twoja metoda będzie krótsza (co jest smutne, ponieważ ta metoda jest fajniejsza IMO).
kwintopia
1

GolfScript, 46 bajtów

{`{.}%"..~~QUINE"}.~

i

{`{.}%"..~~QUINE"}.~QUINE

oba drukują

{{``{{..}}%%""....~~~~QQUUIINNEE""}}..~~QUINE

Wypróbuj online: program 1 , program 2 , dowód ważności

Jak to działa

{`{.}%"..~~QUINE"}.~

{                }    # Push a code block.
                  .~  # Execute a copy.
 `                    # Convert the code block into a string.
  {.}%                # Duplicate each character of the resulting string.
      "..~~QUINE"     # Push that string.

Kod źródłowy programu 2 dodatkowo analizuje QUINE\n, które są dwoma niezdefiniowanymi tokenami.

Dennis
źródło
1

Perl, 61 + 60 = 121 bajtów

Program 1:

$x=q<print"\$x=q<$x>;eval\$x#"=~s/./$&$&/gr,QUINE>;eval$x#QIE

Program 2:

$x=q<print"\$x=q<$x>;eval\$x#"=~s/./$&$&/gr,QUINE>;eval$x#UN

Myślałem, że spróbuję w języku innym niż golf. Jest to po prostu uniwersalny konstruktor quine w Perlu, zmodyfikowany, aby podwoić każdą postać przed wydrukowaniem i dołączyćQUINE do końca. Następnie musimy tylko przykleić komentarz na końcu kodu, aby zrekompensować dodany tekst.

(Napisałem to, nie patrząc na inne odpowiedzi. Okazuje się, że można zapisać bajt, umieszczając cały komentarz w jednym programie, ale nie jestem pewien, czy powinienem po prostu rażąco kopiować takie algorytmy.)


źródło