Wzajemnie wykluczające się Quines

27

Twoje wyzwanie jest proste. Napisz dwa programy, które nie mają wspólnych znaków.

Przykład

Dwa programy P i Q wzajemnie się wykluczają, jeżeli:

  1. P wyjścia Q
  2. Wyjścia Q P
  3. Nie ma znaku c, który należy zarówno do P, jak i Q
  4. Każdy program P i Qodpowiednimi quinesami
    1. Liczone są puste znaki i znaki, które czytają własny (lub inny) kod źródłowy jako niepoprawny .

Więcej zasad

  • Wygrywa najkrótsza łączna długość tych programów. Oznacza to, że rozmiar ( P ) + rozmiar ( Q ) to Twój wynik, a najniższy wynik wygrywa.
  • Oba programy są w tym samym języku
  • Każdy program może być pełnym programem lub funkcją i nie musi być taki sam.
    • Na przykład P może być pełnym programem, a Q może być funkcją.

Weryfikacja

Ten Spróbuj online! Snippet tutaj może sprawdzić, czy dwa programy wykluczają się wzajemnie. Dane wejściowe są umieszczane w pierwszych dwóch argumentach.

Conor O'Brien
źródło
2
Związane z.
Martin Ender
1
Powiązane , powiązane .
Wheat Wizard
3
Zakładam, że dwa programy, które czytają sobie nawzajem swoje źródła, są również zakazane.
Giuseppe
2
Bardzo chciałbym zobaczyć odpowiedź na to wyzwanie bez esolangu. (Myślałem trochę o tym, jak to zrobić, ale do tej pory nie widziałem sposobu. Może to być możliwe w Forth, ponieważ nie rozróżnia wielkich i małych liter i nie opiera się na znakach alfabetycznych. )
Nathaniel
1
Jeśli mogę przekazać ten sam argument, nie do samych programów, ale do kompilatora obu programów. Zazwyczaj flagi kompilatora są dozwolone, jeśli za nie zapłacisz, ale w przypadku tego wyzwania możesz argumentować, że jest to sprzeczne z zasadą wykluczającą się wzajemnie.
BlackCap

Odpowiedzi:

37

> <> , Wynik: 41 + 41 = 82

Edycja: oba zawierały 3. Naprawiono

'd3*}>a!o-!<<8:5@lI55>@z:5ll55>>q:>|q::|,

i

"r00gr40g44++bb+0p64++?b6+0.22#eW4s )Z

Wypróbuj online! (zamień linie, aby uzyskać inne wyjście) Tym razem z weryfikacją!

><>jest tutaj szczególnie trudnym językiem, ponieważ istnieje tylko jeden sposób na wyprowadzenie znaków - polecenie o. Na szczęście możemy użyć polecenia p ut, aby umieścić okod źródłowy podczas wykonywania, tak jak w mojej odpowiedzi „ Programowanie w nieskazitelnym świecie” .

Ten wymagał wielu prób i błędów. Zacząłem od dwóch wzajemnie wykluczających się programów:

'd3*}>N!o-!<<data

i

"r00gr40g8+X0pN+?Y0.data

Każdy transformuje siebie i swoje dane przez N, pierwszy odejmuje, a drugi dodaje. Następnie wysyła to w odwrotnej kolejności. Chodzi o to, że dane po każdym programie jest inny program w odwrotnej, przesunięty przez N. ( Xjest to liczba komórek, gdzie potrzeby programu, aby umieścić oi Y jest komórka, gdzie wskaźnik pętle z powrotem. ?Gdzie jest oto put) .

Oba mają tę samą strukturę, reprezentowaną na różne sposoby. Działają one dosłownie na całym łańcuchu, dodając go do stosu. Odtworzyli używane przez siebie dosłowne ciągi znaków i umieścili je na dole stosu. Zapętlają stos, dodając / odejmując N do każdego znaku i drukując je.

Pierwszy program używa 'literału ciągów, a prosty d3*}do utworzenia wartości 39 i wypchnięcia jej na dół stosu. Drugi używa "jako literału ciąg z tą samą funkcją. To reverses stos, gETS znak w komórce 0,0 i odwraca stos ponownie. Następnie gprzyjmuje wartość do komórki 4,0 ( g) i dodaje 8, aby ją pobrać, oi umieszcza ją w X.

Oba programy używają innej metody zapętlania. Pierwszy program używa komendy skip ( !) do uruchomienia tylko połowy instrukcji podczas jazdy w lewo, odwraca kierunek i uruchamia drugą połowę. Drugi używa polecenia skoku ( .), aby przejść wstecz do początku pętli w komórce Y. Oba działają, dopóki na stosie nie będzie więcej elementów i nie wystąpią błędy programu.

Wpadłem na wiele problemów z większością niższych wartości N, ponieważ przesunięcie jednego znaku zmieniłoby go w inny znak niezbędny dla tego programu (i dlatego nie mógłby być użyty jako dane dla innego programu) lub dwóch znaków z dwa programy zmieniłyby się w tę samą postać. Na przykład:

  1. ++1 = ,= --1
  2. .+2 = 0
  3. *= --3
  4. g+4 = k= o-4

itp.

W końcu dotarłem do 10 ( a), gdzie mogłem uniknąć tych problemów. Może istnieć krótsza wersja, w której przesunięcia są odwrócone, a pierwszy program dodaje N, a drugi go odejmuje. Może być jednak gorzej, ponieważ pierwszy program znajduje się ogólnie w dolnej części skali ASCII, więc odejmowanie jest lepsze, aby uniknąć konfliktów.

Jo King
źródło
19

Dalej (64-bitowy little-endian gforth) , 428 + 637 = 1065 bajtów

s"	:	l	bl	-	;	:	m	l	emit	;	:	s	space	;	:	z	m	m	m	m	s	;	:	p	.	't	'i	'm	'e	z	;	'e	'r	'e	'h	z	:	q	>r	char	l	bl	l	do	dup	@	.	'L	m	s	cell+	loop	r>	.	;	:	n	'e	'p	'y	't	z	;	q	;	's	p	'B	l	p	#tab	p	'p	'u	'd	'Q	char+	z	n	'B	l	p	n":	l	bl	-	;	:	m	l	emit	;	:	s	space	;	:	z	m	m	m	m	s	;	:	p	.	't	'i	'm	'e	z	;	'e	'r	'e	'h	z	:	q	>r	char	l	bl	l	do	dup	@	.	'L	m	s	cell+	loop	r>	.	;	:	n	'e	'p	'y	't	z	;	q	;	's	p	'B	l	p	#tab	p	'p	'u	'd	'Q	char+	z	n	'B	l	p	n
HERE 3245244174817823034 , 7784873317282429705 , 665135765556913417 , 7161128521877883194 , 682868438367668581 , 679209482717038957 , 680053688600562035 , 678116140452874542 , 682868623551327527 , 680649414991612219 , 682868636436227367 , 7136360695317203258 , 7809815063433470312 , 8458896374132993033 , 5487364764302575984 , 7810758020979846409 , 680166068077538156 , 4181938639603318386 , 8081438386390920713 , 8793687458429085449 , 2812844354006760201 , 7784826166316108147 , 676210045490917385 , 681493840106293616 , 7521866046790788135 , 679491013524025953 , 7928991804732031527 , 216 115 EMIT 34 EMIT 9 EMIT 2DUP TYPE 34 EMIT TYPE 

Wypróbuj online!

Skrypt weryfikacyjny

Dzięki @Nathanielowi za pomysł użycia Fortha - przypomniał mi w komentarzach, że Forth nie rozróżnia wielkości liter . Potem nastały wahania nastroju - znajdowałem powody, dla których to nie zadziałało, a następnie wielokrotnie rozwiązywałem te problemy. Wszystko to podczas kręcenia moim treningowym rowerem treningowym jak obustronny i zniekształcony fidget spinner (wystarczy chwycić jeden koniec kierownicy i lekko go przechylić).

Przed napisaniem tych programów opracowałem, jakie znaki mogą być używane przez dany program. W szczególności drugi program może używać tylko wielkich liter, cyfr dziesiętnych, tabulatorów i przecinków. Oznaczałoby to, że pierwszy program składa się wyłącznie z małych liter, ale użyłem kilku wielkich liter dla ich wartości ASCII.

Ponieważ tabulatory są nieporęczne, zamiast tego użyję spacji w objaśnieniu.

Pierwszy program ma formę s" code"code- s"zaczyna literał ciąg, który jest następnie przetwarzany przez drugą kopię kodu - standardową strukturę quine. Jednak zamiast wypisywać własny kod źródłowy, utworzy inny program, który wygląda następująco:

  • HERE
  • Dla każdego 8 bajtów w oryginalnym ciągu 64-bit-number-literal ,
  • length-of-the-string
  • 115 EMIT 34 EMIT 9 EMIT 2DUP TYPE 34 EMIT TYPE

To wykorzystuje przestrzeń danych Fortha. HEREzwraca wskaźnik na koniec aktualnie przydzielonego obszaru przestrzeni danych i ,dołącza do niego komórkę wypełnioną liczbą. Dlatego pierwsze trzy punkty wypunktowania można traktować jak dosłowny ciąg utworzony za pomocą s". Aby zakończyć drugi program:

  • EMIT wypisuje znak ze względu na jego wartość ASCII, więc:
    • 115 EMIT drukuje małe litery s
    • 34 EMIT drukuje znak zapytania "
    • 9 EMIT drukuje zakładkę
  • 2DUPduplikuje dwa górne elementy na stosie ( a b -- a b a b ), tutaj jest to wskaźnik do i długość łańcucha
  • TYPE wypisuje ciąg, aby wypisać pierwszą kopię kodu
  • 34 EMITdrukuje cytat końcowy "i na koniec
  • TYPE wypisuje drugą kopię kodu

Zobaczmy, jak działa pierwszy program. W wielu przypadkach należy unikać liczb, co odbywa się za pomocą 'xrozszerzenia składni gforth dla literałów znaków, a czasami odejmując wartość ASCII spacji, którą można uzyskać za pomocą bl:

s" ..."      \ the data
: l bl - ;   \ define a word, `l`, that subtracts 32
: m l emit ; \ define a word, `m`, that outputs a character. Because 32 is
             \ subtracted using `l`, lowercase characters are converted to
             \ uppercase, and uppercase characters are converted to some
             \ symbols, which will become useful later
: z m m m m space ; \ `z` outputs four characters using `m`, followed by a
                    \ space. This is very useful because all words used in the
                    \ second program are four characters long
: p . 't 'i 'm 'e z ; \ define a word, `p`, that, given a number, outputs that
                      \ number, followed by a space, `EMIT`, and another space
'e 'r 'e 'h z \ here is where outputting the second program starts - `HERE `
: q \ define a helper word, `q`, that will be called only once. This is done
    \ because loop constructs like do...loop can't be used outside of a word.
  >r \ q is called with the address and the length of the data string. >r saves
     \ the length on the return stack, because we don't need it right now. While
     \ it might seem like this is too complicated to be the best way of doing
     \ this for codegolf, just discaring the length would be done using four
     \ characters - `drop`, which would give you the same bytecount if you could
     \ get the length again in... 0 characters.
  char l \ get a character from after the call to q, which is `;`, with the
         \ ASCII value of $3B, subtract $20 to get $1B, the number of 64-bit
         \ literals necessary to encode the string in the second program.
  bl l \ a roundabout way to get 0
  do   \ iterate from 0 (inclusive) to $1B (exclusive)
    \ on the start of each iteration, the address of the cell we are currently
    \ processing is on the top of the stack.
    dup @ . \ print the value. The address is still on the stack.
    'L m space \ the ASCII value of L is exactly $20 larger than the one of ,
    cell+ \ go to the next cell
  loop
  r> . \ print the length of the string
;
: n 'e 'p 'y 't z ; \ define a word, `n`, that outputs `TYPE`
q ; \ call q, and provide the semicolon for `char` (used to encode the length
    \ of the string in 64-bit words). Changing this to an uppercase U should
    \ make this work on 32-bit systems, but I don't have one handy to check that
's p \ print the code that outputs the lowercase s
'B l p \ likewise, 'B l <=> $42 - $20 <=> $22 <=> the ASCII value of a comma
#tab p \ print the code that outputs a tab
'p 'u 'd 'Q char+ z \ char+ is the best way to add 1 without using any digits.
                    \ it is used here to change the Q to an R, which can't be
                    \ used because of `HERE` in the second program. R has an
                    \ ASCII value exactly $20 larger than the ASCII value of 2,
                    \ so this line outputs the `2DUP`.
n 'B l p n \ output TYPE 34 EMIT TYPE to finish the second program. Note the
           \ that the final `n` introduces a trailing space. Trying to remove
           \ it adds bytes.

Aby to zakończyć, chciałbym powiedzieć, że próbowałem użyć EVALUATE, ale drugi program staje się większy niż oba przedstawione powyżej. W każdym razie tutaj jest:

: s s" ; s evaluate"s" : l bl - ; : m l emit ; : d here $b $a - allot c! ; : c here swap dup allot move ; : q bl l do #tab emit dup @ bl l u.r cell+ #tab emit 'L m loop ; here bl 'B l 's bl 's bl 'Z l d d d d d d d -rot c bl 'B l 's 'B l d d d d s c 'B l d c 'e 'r 'e 'h m m m m 'A q #tab emit 'e 'p 'y 't m m m m"; s evaluate

Jeśli uda ci się zagrać w golfa na tyle, by prześcignąć moje s" ..."...podejście, śmiało i opublikuj to jako własną odpowiedź.

NieDzejkob
źródło
1
Świetny! Cieszę się, że mój komentarz wywołał to rozwiązanie!
Nathaniel
16

Perl, (311 + 630 = 941 bajtów) 190 + 198 = 388 bajtów

Oba programy drukują na standardowe wyjście.

Pierwszy program perla zawiera głównie drukowalne znaki ASCII i znaki nowej linii i kończy się dokładnie jedną nową linią, ale dwie litery ÿ oznaczają bajt inny niż ASCII \ xFF:

@f='^"ÿ"x92;@f=(@f,chr)for 115,97,121,36,126,191,153,194,216,113;print@f[1..5,5,10,5..9,0,9,0,5]'^"ÿ"x92;@f=(@f,chr)for 115,97,121,36,126,191,153,194,216,113;print@f[1..5,5,10,5..9,0,9,0,5]

Drugi zawiera w większości bajty spoza ASCII, w tym kilka znaków o wysokiej kontroli, które są zastąpione gwiazdkami w tym poście i nie ma w nich żadnych znaków nowej linii:

say$~~q~¿*ÂØ¡Ý*Ý*ÆÍÄ¿*Â׿*Ó***Ö***ßÎÎÊÓÆÈÓÎÍÎÓÌÉÓÎÍÉÓÎÆÎÓÎÊÌÓÎÆËÓÍÎÉÓÎÎÌÄ*****¿*¤ÎÑÑÊÓÊÓÎÏÓÊÑÑÆÓÏÓÆÓÏÓʢءÝ*Ý*ÆÍÄ¿*Â׿*Ó***Ö***ßÎÎÊÓÆÈÓÎÍÎÓÌÉÓÎÍÉÓÎÆÎÓÎÊÌÓÎÆËÓÍÎÉÓÎÎÌÄ*****¿*¤ÎÑÑÊÓÊÓÎÏÓÊÑÑÆÓÏÓÆÓÏÓÊ¢~

Zrzut heksowy pierwszego programu z xxd:

00000000: 4066 3d27 5e22 ff22 7839 323b 4066 3d28  @f='^"."x92;@f=(
00000010: 4066 2c63 6872 2966 6f72 2031 3135 2c39  @f,chr)for 115,9
00000020: 372c 3132 312c 3336 2c31 3236 2c31 3931  7,121,36,126,191
00000030: 2c31 3533 2c31 3934 2c32 3136 2c31 3133  ,153,194,216,113
00000040: 3b70 7269 6e74 4066 5b31 2e2e 352c 352c  ;print@f[1..5,5,
00000050: 3130 2c35 2e2e 392c 302c 392c 302c 355d  10,5..9,0,9,0,5]
00000060: 275e 22ff 2278 3932 3b40 663d 2840 662c  '^"."x92;@f=(@f,
00000070: 6368 7229 666f 7220 3131 352c 3937 2c31  chr)for 115,97,1
00000080: 3231 2c33 362c 3132 362c 3139 312c 3135  21,36,126,191,15
00000090: 332c 3139 342c 3231 362c 3131 333b 7072  3,194,216,113;pr
000000a0: 696e 7440 665b 312e 2e35 2c35 2c31 302c  int@f[1..5,5,10,
000000b0: 352e 2e39 2c30 2c39 2c30 2c35 5d0a       5..9,0,9,0,5].

A zrzut heksadru drugiego programu to:

00000000: 7361 7924 7e7e 717e bf99 c2d8 a1dd 00dd  say$~~q~........
00000010: 87c6 cdc4 bf99 c2d7 bf99 d39c 978d d699  ................
00000020: 908d dfce ceca d3c6 c8d3 cecd ced3 ccc9  ................
00000030: d3ce cdc9 d3ce c6ce d3ce cacc d3ce c6cb  ................
00000040: d3cd cec9 d3ce cecc c48f 8d96 918b bf99  ................
00000050: a4ce d1d1 cad3 cad3 cecf d3ca d1d1 c6d3  ................
00000060: cfd3 c6d3 cfd3 caa2 d8a1 dd00 dd87 c6cd  ................
00000070: c4bf 99c2 d7bf 99d3 9c97 8dd6 9990 8ddf  ................
00000080: cece cad3 c6c8 d3ce cdce d3cc c9d3 cecd  ................
00000090: c9d3 cec6 ced3 ceca ccd3 cec6 cbd3 cdce  ................
000000a0: c9d3 cece ccc4 8f8d 9691 8bbf 99a4 ced1  ................
000000b0: d1ca d3ca d3ce cfd3 cad1 d1c6 d3cf d3c6  ................
000000c0: d3cf d3ca a27e                           .....~

W drugim programie cytowany ciąg znaków (długość 189 bajtów, rozdzielany znakami tyldy) jest całym pierwszym programem z wyjątkiem ostatniego nowego wiersza, zakodowanego jedynie bitowo, uzupełniając każdy bajt. Drugi program po prostu dekoduje ciąg, uzupełniając każdy z bajtów, co ~robi operator w perlu. Program drukuje zdekodowany ciąg, po którym następuje nowa linia ( saymetoda dodaje nową linię).

W tej konstrukcji dekoder drugiego programu wykorzystuje tylko sześć różnych znaków ASCII, więc pierwszy program może być praktycznie dowolny, o ile zawiera tylko znaki ASCII i wyklucza te sześć znaków. Nie jest trudno napisać program perlowy bez użycia tych pięciu znaków. Rzeczywista logika quine znajduje się zatem w pierwszym programie.

W pierwszym programie logika quine używa słownika o długości 11 słów @fi łączy dane wyjściowe z tych słów. Pierwsze słowa powtarzają większość kodu źródłowego pierwszego programu. Reszta słów to określone pojedyncze znaki. Na przykład słowo 5 jest tyldą, która jest ogranicznikiem dwóch literałów łańcuchowych w drugim programie. Lista liczb w nawiasach to przepis na słowa, które należy wydrukować w jakiej kolejności. Jest to dość zwyczajna ogólna metoda konstruowania quinów, jedyną niespodzianką w tym przypadku jest to, że pierwsze słowa słownika są drukowane z bajtami uzupełnianymi bitowo.

b_jonas
źródło
14

Haskell , 306 + 624 = 930 bajtów

Program 1: Anonimowa funkcja przyjmująca fikcyjny argument i zwracająca ciąg znaków.

(\b c()->foldr(\a->map pred)b(show()>>c)`mappend`show(map(map fromEnum)$tail(show c):pure b))"İĴİóđđđÝöÝâÝæÝääē××êääē××İēÀħđĮâħēĕóİóòòĮááħááđéêâéêēááĮÀħ""(\b c()->foldr(\a->map pred)b(show()>>c)`mappend`show(map(map fromEnum)$tail(show c):pure b))"

Wypróbuj online!

Program 2: q[[40,...]]na końcu jest anonimowa funkcja przyjmująca fikcyjny argument i zwracająca ciąg znaków.

z~z=[[['@','0'..]!!4..]!!z]
q[x,q]_=z=<<x++q++[34,34]++x
q[[40,92,98,32,99,40,41,45,62,102,111,108,100,114,40,92,97,45,62,109,97,112,32,112,114,101,100,41,98,40,115,104,111,119,40,41,62,62,99,41,96,109,97,112,112,101,110,100,96,115,104,111,119,40,109,97,112,40,109,97,112,32,102,114,111,109,69,110,117,109,41,36,116,97,105,108,40,115,104,111,119,32,99,41,58,112,117,114,101,32,98,41,41,34],[304,308,304,243,273,273,273,221,246,221,226,221,230,221,228,228,275,215,215,234,228,228,275,215,215,304,275,192,295,273,302,226,295,275,277,243,304,243,242,242,302,225,225,295,225,225,273,233,234,226,233,234,275,225,225,302,192,295]]

Wypróbuj online!

Zestaw znaków 1 (zawiera spację):

 "$()-:>E\`abcdefhilmnoprstuw×ÝáâäæéêñòóöđēĕħĮİĴ

Zestaw znaków 2 (zawiera nowy wiersz):

!'+,.0123456789<=@[]_qxz~

Ponieważ tylko zestaw 1 zawiera znaki spoza ASCII, ich bajty UTF-8 są również rozłączne.

Jak to działa

  • Program 1 jest ogólnie napisany z wyrażeniami lambda, spacjami i nawiasami, swobodnym użyciem wbudowanych funkcji alfanumerycznych oraz danymi quine jako literałami łańcuchowymi na końcu.

    • Własny kod programu 1 zamienia się w dane literału łańcuchowego, po prostu otaczając go znakami cudzysłowu.
      • Aby to poprzeć, po każdym odwrotnym ukośniku następuje alub b, które tworzą prawidłowe sekwencje specjalne, które przechodzą w drugą stronę show.
      • Inną korzyścią jest to, że małe a, bi csą tylko małe litery, których kody ASCII są mniej niż 100, oszczędzając cyfra w kodowaniu liczbowej wykorzystywanego przez program 2.
    • Dosłowne kodowanie ciągów kodu podstawowego programu 2 jest bardziej zaciemnione dzięki użyciu kodu Unicode innego niż ASCII: Każdy znak ma 182 dodanych do punktu kodowego, aby zapewnić, że nie zachodzą na siebie znaki oryginalne.
      • 182 było 128, dopóki nie zdałem sobie sprawy, że mogę nadużyć faktu, że 182 jest dwa razy dłuższy od literału łańcucha dla kodu programu 1, aby skrócić dekodowanie. (Jako bonus, program 2 może korzystać z nowych linii).
  • Program 2 jest na ogół napisany z równaniami funkcji najwyższego poziomu (z wyjątkiem ostatniego anonimowego), literałami znaków i liczbami dziesiętnymi, składnią list / zakresu i operatorami, a także danymi quine jako listą Ints na końcu.

    • Główny kod Programu 1 jest zakodowany jako lista jego punktów kodowych, z końcowym podwójnym cytatem.
    • Główny kod programu 2 jest zakodowany jako lista punktów kodowych literału łańcucha używanego w programie 1, wciąż przesuniętego w górę o 182.

Przewodnik, program 1

  • bi csą wartościami literałów łańcuchowych odpowiednio dla programu 2 i 1, podanymi jako ostateczne argumenty wyrażenia lambda. ()jest fikcyjnym argumentem mającym jedynie na celu spełnienie zasady PPCG, zgodnie z którą program powinien definiować funkcję.
  • foldr(\a->map pred)b(show()>>c)dekoduje ciąg bdo kodu podstawowego programu 2, stosując map preddo niego liczbę razy równą długości show()>>c == c++club 182.
  • tail(show c)konwertuje ciąg cdo kodu podstawowego programu 1, dołączając końcowy podwójny cudzysłów.
  • :pure błączy to na liście z ciągiem znaków b.
  • map(map fromEnum)$ konwertuje ciągi znaków na listy punktów kodowych.
  • `mappend`show(...) serializuje wynikową listę list i ostatecznie dołącza ją do podstawowego kodu programu 2.

Przewodnik, program 2

  • Najwyższy poziom z~z=[[['@','0'..]!!4..]!!z]to funkcja konwertująca punkty kodowe z powrotem na znaki (konieczne do napisania, ponieważ nie wszystkie znaki toEnumsą dostępne).
    • Wywoływany jest również argument punktu kodowego z. Znacznik lenistwa ~nie działa w tej pozycji, ale unika znaku spacji.
    • ['@','0'..] jest zakresem wstecznej listy kroków, zaczynając od kodu ASCII 64, a następnie zeskakując 16 w dół na każdym kroku.
    • Zastosowanie !!4do tego nadaje \NULcharakter.
    • Zawijanie tego w [ ..]zakresie daje listę wszystkich znaków, które !!zindeksuje.
    • Postać jest ostatecznie umieszczona na liście singletonów. Pozwala to na mapowanie funkcji zna listach przy użyciu =<<zamiast niedostępnych mapi <$>.
  • Najwyższy poziom q[x,q]_=z=<<x++q++[34,34]++xto funkcja konstruująca program 1 z listy danych quine.
    • xto dane dla rdzenia programu 1 (w tym końcowy podwójny cudzysłów), a wewnętrzna qto zaciemnione dane dla rdzenia programu 2. _to kolejny fałszywy argument wyłącznie po to, aby końcowa anonimowa funkcja była funkcją zamiast tylko łańcucha.
    • x++q++[34,34]++x łączy elementy, w tym dwa znaki podwójnego cudzysłowu z kodem ASCII 34.
    • z=<<konstruuje program 1 poprzez odwzorowanie zkonkatenacji w celu konwersji punktów kodowych na znaki.
  • Final q[[40,...]]to anonimowa funkcja łącząca się qz danymi quine.
Ørjan Johansen
źródło
5

Galaretka , 128 90 87 86 85 79 16 + 32 = 48 bajtów

“OṾ⁾ọṙŒs”OṾ⁾ọṙŒs

Wypróbuj online!

79,7806,8318,7885,7769,338,115ỌṘ

Wypróbuj online!

Pierwszy program wykonuje następujące czynności:

“OṾ⁾ọṙŒs”OṾ⁾ọṙŒs
“OṾ⁾ọṙŒs”          String literal: 'OṾ⁾ọṙŒs'
         O         ord: [79, 7806, 8318,...]
          Ṿ        Uneval. Returns '79,7806,8318,7885,7769,338,115'
           ⁾ọṙ     Two character string literal: 'ọṙ'
              Œs   Swap case the two char literal: 'ỌṘ'.

Pozostawia to łańcuchy 79,7806,8318,7885,7769,338,115i ỌṘjako dwa argumenty łańcucha, które są domyślnie konkatenowane i drukowane na końcu.

Drugi program oblicza chr( ) z listy liczb, które zwraca OṾ⁾ọṙŒs. wypisuje “OṾ⁾ọṙŒs”(z cudzysłowami) i zwraca dane wejściowe, pozostawiając “OṾ⁾ọṙŒs”OṾ⁾ọṙŒsjako pełne dane wyjściowe.

dylnan
źródło
5

Gol> <> , 23 + 23 = 46 22 + 22 = 44 20 + 20 = 40 bajtów

"lF{3+|3d*HqlJJJQpp2

Wypróbuj online!

'5ssTMMMotK-g6.6~Io

Wypróbuj online!

Sprawdź to online!

Jak oni pracują

"lF{3+|3d*HqlJJJQpp2

"..."        Push everything to the stack
 lF{3+|      Add 3 to everything on the stack
       3d*   Push 39 `'`
          H  Print everything on the stack (from the top) and halt

'5ssTMMMotK-g6.6~Io

'...'        Push everything to the stack
 5ss         Push 37 (34 `"` + 3)
    T    t   Loop indefinitely...
     MMMo      Decrement 3 times, pop and print
               At the end, `o` tries to print charcode -3, which is fishy (thanks Jo King)
               Program terminates

Na podstawie odpowiedzi Jo King> <> . Mając o wiele więcej alternatywnych poleceń dla wyjścia i powtarzania, nie było potrzeby glub p, a dwa główne ciała stały się znacznie krótsze.

Inna główna różnica polega na tym, że generuję ofertę przeciwnika bezpośrednio na górze stosu. W ten sposób nieco łatwiej było utrzymać niezmiennik quote + my code + opponent code(reversed and shifted).

Bubbler
źródło