Interquine - dwa programy, które wysyłają się nawzajem w pętli

29

Program A generuje kod programu B po uruchomieniu, a B generuje źródło A.

Wymagania:

  • Tylko jeden język w obu programach
  • Programy są różne. Jeden program, który sam się wyświetla, nie kwalifikuje się.
  • Oba programy są niepuste lub mają co najmniej 1 bajt długości. Końcowe znaki nowego wiersza zarówno źródłowego, jak i wyjściowego są ignorowane
  • standardowe jest zamknięte. Nie czytaj niczego (więc nie możesz odczytać źródła i manipulować nim). Wyjście przechodzi na standardowe wyjście.
    Edycja: stdin jest podłączony /dev/null. Możesz zamówić zamknięcie, jeśli zostanie to wyjaśnione.
  • Nie używaj randomfunkcji.

Dodatkowy:

  • Podaj wyjaśnienia, jeśli to możliwe

Wynik to całkowita długość . Końcowy znak nowej linii nie jest liczony, jeśli nie wpływa na program.

iBug
źródło
8
Związane z.
Martin Ender
5
„Nie używaj funkcji losowych.”? Co masz na myśli? Funkcje generujące liczbę losową?
Pan Xcoder,
Jestem pewien, że tak naprawdę nie masz na myśli, że stdin jest zamknięty. Powoduje to wybuch niektórych środowisk, ponieważ stdin staje się duplikatem pierwszego otwartego pliku. W każdym razie, jeśli tego nie naprawisz, nadużyję tego.
Joshua

Odpowiedzi:

18

CJam , 13 + 13 = 26 bajtów

{sYZe\"_~"}_~

Wypróbuj online!

Wyjścia

{sZYe\"_~"}_~

Wyjaśnienie

{       e# Standard quine framework, leaves a copy of the block on the stack
        e# for the block itself to process.
  s     e# Stringify the block.
  YZe\  e# Swap the characters at indices 2 and 3, which are Y and Z themselves.
  "_~"  e# Push the "_~" to complete the quine.
}_~

Ponieważ e\jest przemienne w drugim i trzecim argumencie, drugi program robi dokładnie to samo, zamiana Zi Yz powrotem do ich oryginalnej kolejności.

Martin Ender
źródło
17

CJam ,11 + 13 = 24 11 + 12 = 23 bajty

"N^_p"
N^_p

Wypróbuj online!

Wyjścia:

"N^_p
"
N^_p

Dane wyjściowe mają 13 bajtów, ale:

Końcowy znak nowej linii nie jest liczony, jeśli nie wpływa na program.

Więc zmieniłem przestrzeń na nową linię, aby z tego skorzystać.

Opiera się na najkrótszym odpowiednim quinie CJam:

"_p"
_p

I N^jest xor ciągu z nową linią, która dodaje nową linię, jeśli nie ma nowej linii, i usuwa ją, jeśli istnieje, dla łańcucha, że ​​każdy znak jest unikalny.

Myślę, że widziałem ten quine w pytaniu quine, ale nie mogłem go znaleźć.

jimmy23013
źródło
+1 za posiadanie dwóch programów o różnych rozmiarach, w przeciwieństwie do wszystkich innych dotychczasowych odpowiedzi. Edytuj: jak tylko będę mógł ponownie głosować .. osiągnął limit ostatni głos>.>
Kevin Cruijssen
Dobry, ponieważ ma różną długość.
iBug
„Myślę, że widziałem ten quine w pytaniu quine, ale nie mogłem go znaleźć”. Zostało to wspomniane tylko w odpowiedzi GolfScript.
Martin Ender
12

RProgN 2 , 3 + 3 = 6 bajtów

Pierwszy program:

0
1

Wypróbuj online!

Drugi program:

1
0

Wypróbuj online!

-2 dzięki Martinowi Enderowi .

Erik the Outgolfer
źródło
7
Możesz zapisać dwa bajty, zmieniając języki: tio.run/##Kyooyk/P0zX6/9@Ay/D/fwA
Martin Ender
@MartinEnder Ooh racja, zapomniałem RProgN 2 wykazuje takie zachowanie ... przy okazji nie wiem, czy to nadal jest taki bugg.
Erik the Outgolfer
11
Nic nie wiem o RProgN poza tym, że takie zachowanie istnieje.
Martin Ender
@MartinEnder Autor RProgN tutaj, po prostu zapytaj, czy potrzebujesz czegoś wyjaśnionego!
ATaco,
@ATaco Cóż, poprosiłbym cię o wyjaśnienie opinii, ale nie sądzę, żebyś mógł ...
Erik Outgolfer
6

C, 95 + 95 = 190 bajtów

Dzięki @immibis za oszczędność 16 * 2 bajtów!

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=1^1;printf(s,34,s,34,i);}

Wypróbuj online!

Wyjścia:

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=0^1;printf(s,34,s,34,i);}

Wypróbuj online!

Które wyjścia:

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=1^1;printf(s,34,s,34,i);}
Steadybox
źródło
1
Dlaczego nie nazwać go zawsze C i polegać na zmianie, aby program był inny? C jest krótszy niż% c
253751
@immibis Tak, masz rację, to wystarczy.
Steadybox,
5

JavaScript, 67 + 67 = 134 bajtów

1. program:

alert(eval(c="`alert(eval(c=${JSON.stringify(c)},n=${+!n}))`",n=0))

2. program:

alert(eval(c="`alert(eval(c=${JSON.stringify(c)},n=${+!n}))`",n=1))

Jest to oparte na odpowiedzi Hermana Lauensteina na Tri-interquine

JavaScript (nieprawidłowy odczyt kodu źródłowego), 75 + 75 = 150 61 + 61 = 122 58 + 58 = 116 50 + 50 = 100 bajtów

zapisano 20 bajtów dzięki Tushar, 6 bajtów dzięki Craig Ayre i zapisano 16 bajtów dzięki kamoroso94

1. program:

f=_=>alert(("f="+f).replace(0,a=>+!+a)+";f()");f()

2. program:

f=_=>alert(("f="+f).replace(1,a=>+!+a)+";f()");f()

Zamienia cyfry 1 na 0 i odwrotnie. Obaj robią to samo, po prostu wytwarzając różne dane wyjściowe ze względu na kod źródłowy.

SuperStormer
źródło
1
Oszczędzajmy kilka bajtów. f.toString()=> (''+f), (0|1)=> 0|1, (a,b)=> apowodującf=()=>("f="+(''+f).replace(/0|1/g,a=>a==0?1:0)+";f()");f()
Tushar
Możesz użyć nieużywanego parametru, aby zapisać kilka bajtów f=_=>i usunąć pareny z oddzwaniania zastępującego, jak sugerował @Tushar:a=>+!+a
Craig Ayre
Wymienić "f="+(f+"")z ("f="+f)do -3 bajtów.
kamoroso94,
Zastąpienie /0|1/gi /1|0/gz 0i 1odpowiednio -5 bajtów.
kamoroso94,
Uruchomiłeś to? Działa to w ten sposób f=_=>alert(("f="+f).replace(0,a=>+!+a)+";f()");f().
kamoroso94,
4

Python 2, 63 + 63 = 126 bajtów

Wypróbuj online

Pierwszy program:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[23:29]

wyjścia:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[29:35]

Drugi program:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[29:35]

Wyjścia:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[23:29]
Dead Possum
źródło
4

JavaScript ( JsShell ), 35 + 34 = 69 bajtów

1:

(f=x=>print(`(f=${f})(${-x})`))(-1)

2:

(f=x=>print(`(f=${f})(${-x})`))(1)
tsh
źródło
3

Mathematica, 43 + 44 = 87 bajtów

(Print[#1[#0[#1, -#2]]] & )[HoldForm, -1 1]

i

(Print[#1[#0[#1, -#2]]] & )[HoldForm, -(-1)]
alephalpha
źródło
Przetestowałem to na moim komputerze, a wyjście drugiego ma tylko -1na końcu, a nie -1 1.
numbermaniac
@numbermaniac Napisałem te kody w interfejsie tekstowym. Wygląda na to, że nie działają w notebookach.
alephalpha
3

asmutils sh, 16 + 16 bajtów, nadużywanie reguły „stdin is closed”.

#!/bin/sh
tr x y

Ponieważ stdin jest zamknięte i sh otworzy swój skrypt do pierwszego dostępnego uchwytu (zamiast przenosić go do uchwytu o wysokim numerze, jak to robią współczesne powłoki), tr kończy czytanie kopii skryptu bez jego otwierania.

Ta interquine jest zdolna do obciążenia, ale wstawienie ładunku jest trudne.

Ponadto, ta oryginalna wersja narusza jakiś szalony błąd w starożytnym jądrze, którego używałem w tamtych czasach. (Nie wiem, co jest grane z tym jądrem - później dowiedziałem się, że ma także inne numery główne i drugorzędne dla urządzeń.) Jeśli naprawisz zmiany ABI, które złamały asmutils, to interquine nadal nie będzie działać. Zapominam, czy asmutils sh ma exec, czy nie, ale jeśli tak, to jest to nowoczesna wersja:

exec dd skip=0 | tr x y

To nadużywa celowego błędu w asmutils dd; ma optymalizację wydajności, która wywołuje llseek dla pominięcia, jeśli to możliwe, ale aby zapisać bajt, przekazuje SEEK_SET zamiast SEEK_CUR. Powoduje to śmieci na stderr, ale interquine na stdout. Asmutils dd nie ma opcji tłumienia spamu stderr.

Joshua
źródło
Czy to zadziała, jeśli /dev/nullzamiast tego zostanie podłączone standardowe wejście ? W każdym razie dobra robota!
iBug
@iBug: Nie. Zależy całkowicie od stdin zamknięty i faktu, że asmutils sh nie jest powiązany z libc, a więc nie dziedziczy kodu automatycznej naprawy w libc.
Joshua,
Potrzebujesz #!/bin/sh?
CalculatorFeline
@CalculatorFeline: zależy to od dokładności twojej definicji czegoś innego.
Joshua
Zasadniczo shebangi nie są liczone, więc będzie to 6 bajtów.
CalculatorFeline,
1

Common Lisp, 58 znaków

#1=(let((*print-circle* t))(print'(write '#1# :circle t)))

... lub 24 znaki, jeśli nie masz nic przeciwko zakładaniu *print-circle* globalnie jest ustawione na T:

#1=(print '(write '#1#))

Wydrukowana reprezentacja kodu jest odczytywana jako struktura cykliczna, gdzie #1# wskazuje na następną komórkę przeciw #1=. Przytaczamy programy, aby nie były wykonywane. Ponieważ *print-circle*jest to T, REPL stara się emitować takie zmienne czytnika podczas drukowania; oto, co drukuje powyższy kod i zwraca:

#1=(write '(print '#1#)) 

Kiedy oceniamy powyższy kod, drukuje:

#1=(print '(write '#1#))

Jeśli chcesz pozostać przy wartości domyślnej dla *print-circle* NIL w implementacji zgodnej, musisz tymczasowo ponownie powiązać zmienną:

#1=(let((*print-circle* t))(print'(write '#1# :circle t)))

W treści LET drukujemy różne rzeczy *print-circle* jako T. Więc otrzymujemy:

#1=(write
    '(let ((*print-circle* t))
       (print '#1#))
    :circle t) 

Jak widać, nowy program nie łączy się ponownie *print-circle*, ale ponieważ używamy write, czyli wywoływanej funkcji niskiego poziomu print, możemy przekazać dodatkowe argumenty, takie jak:circle . Kod działa wtedy zgodnie z oczekiwaniami:

#1=(let ((*print-circle* t))
     (print '(write '#1# :circle t)))

Jednak trzeba wykonać powyższe programy jako skrypt, a nie wewnątrz REPL, ponieważ nawet jeśli wydrukować rzeczy dbając kolistych struktur, zarówno writea printtakże zwraca wartość drukowanego; i w domyślnej REPL wartość jest również drukowana, ale poza kontekstem dynamicznym, gdzie *print-circle*jest T.

rdzeń rdzeniowy
źródło
1

> <> , 16 + 16 = 32 bajty

":1-}80.r   !#o#

i

#o#!   r.08}-1:"

Wypróbuj online!

Działa to poprzez użycie skoku w programie, pierwszy skok programu pominie odwrócenie stosu (jeśli odwróci stos, będzie to quine). Drugi program nie przeskakuje do tyłu, ale był już odwrócony przez przepływ programu, wówczas utworzy oryginał.

Ten kod zakończy się błędem.

Pelikan turkusowy
źródło
1

RProgN 2 , 7 + 7 = 14 bajtów

Chciałem spróbować pokazać lepsze wykorzystanie RProgN, a nie tylko nadużywanie zamówień drukowania ...

1
«\1\-

i...

0
«\1\-

Wyjaśnił

1   # Push the constant, 1. (Or 0, depending on the program)

«\1\-
«       # Define a function from this to the matching », in this case there isn't any, so define it from this to the end of the program, then continue processing.
 \      # Flip the defined function under the constant.
  1\-   # Get 1 - Constant.

Ponieważ powoduje to wydrukowanie stosu do góry nogami, najpierw drukowana jest nowa stała, a następnie drukowana jest strunkowa wersja funkcji.

Wypróbuj online!

ATaco
źródło
1

LOGO , 65 + 66 = 131 bajtów

apply [(pr ? ` [[,? ,-?2]] )] [[apply [(pr ? ` [[,? ,-?2]] )]] 1]

i

apply [(pr ? ` [[,? ,-?2]] )] [[apply [(pr ? ` [[,? ,-?2]] )]] -1]
użytkownik202729
źródło
1

Python 3, 74 + 74 = 148 bajtów

a='a=%r;b=%r;print(b%%(b,a))';b='b=%r;a=%r;print(a%%(a,b))';print(b%(b,a))

i

b='b=%r;a=%r;print(a%%(a,b))';a='a=%r;b=%r;print(b%%(b,a))';print(a%(a,b))

też tego nie rozumiem

aaay aaay
źródło
1

> <> , 12 + 12 = 24 bajty

'3d*!|o|!-c:

i

':c-!|o|!*d3

Wypróbuj online!

Oba programy używają literału zawijania, aby dodać kod do stosu, a następnie wygenerować 'polecenie za pomocą różnych metod. Podczas drukowania stosu wypycha kod do tyłu, jednak 'pozostaje z przodu. Istnieje kilka odmian, które powodują '; 3d*, d3*, 00g, :c-Gdy w połączeniu z 3d*, a :9-gdy w połączeniu z00g .

Zbyt podobne rozwiązanie do opublikowania, w Befunge-98 dla 13 * 2 bajtów

"2+ck, @,kc+2
Jo King
źródło
0

JavaScript (ES6), 36 + 36 = 72 bajty

Program 1:

f=n=>('f='+f).replace(/4|5/g,n=>n^1)

Program 2:

f=n=>('f='+f).replace(/5|4/g,n=>n^1)

Programy te działają poprzez sklonowanie się i wymienić 5z 4oraz 4z5

console.log((
    f=n=>('f='+f).replace(/4|5/g,n=>n^1)
)())
console.log((
    f=n=>('f='+f).replace(/5|4/g,n=>n^1)
)())

Herman L.
źródło
2
Ponieważ jest to oznaczone jako „ quine” , jest to zwykle „oszukańcze”, ponieważ czyta swoje własne źródło. Nie jestem pewien, jaka jest decyzja OP w tej sprawie, ale zwykle nie są dozwolone.
Stephen
0

Klein , 26 24 bajtów

<:3+@+3<:"

Wypróbuj online!

Wyjaśnienie

Działa to tak samo, jak moja Klein Quine , gdzie wypisuje źródło wstecz, a następnie a ", ostatni uniknął tego, ponieważ jest palindromiczny, więc wszystko, co musimy zrobić, to uczynić go niepalindromicznym bez szkody dla jego funkcjonalności. Przełączając <i :byliśmy w stanie to zrobić bez ingerencji z funkcjonalnością.

Kreator pszenicy
źródło