Взаємно ексклюзивні лайки


27

Ваше завдання просте. Напишіть дві програми, які не мають жодних символів, які виводять один одного.

Приклад

Дві програми P і Q є взаємовиключними лайками, якщо:

  1. P виводить Q
  2. Q виходи P
  3. Немає жодного символу c, який належить і до P, і до Q
  4. Кожна програма P і Q є належними лайками
    1. Це зараховує порожні лайки та лайки, які читають власний (або інший) вихідний код як недійсні .

Більше правил

  • Виграє найкоротша комбінована тривалість цих програм. Тобто розмір ( P ) + розмір ( Q ) - це ваша оцінка, і найнижча оцінка виграє.
  • Обидві програми є однаковою мовою
  • Кожна програма може бути повноцінною програмою або функцією, і вони не повинні бути однаковими.
    • Наприклад, P може бути повноцінною програмою, а Q може бути функцією.

Перевірка

Це Спробувати онлайн! Тут ви можете переконатись, що дві програми взаємно виключають чи ні. Вхідні дані містяться в перших двох аргументах.




3
Я б припустив, що дві програми, які читають джерело одне одного, також заборонені.
Джузеппе

2
Мені б хотілося побачити невід’ємну відповідь на цей виклик. (Я трохи задумувався над тим, як це зробити, але поки що я не бачив способу. Це може бути можливим у Forth, оскільки це не є чутливим до регістру і не дуже покладається на не алфавітні символи. )
Натаніел

1
Якщо я можу передавати один і той же аргумент, не самим програмам, а компілятору обох програм. Як правило, прапори компілятора дозволяються, якщо ви платите за них, але для цього виклику ви можете стверджувати, що це суперечить взаємовиключному правилу.
BlackCap

Відповіді:


37

> <> , Оцінка: 41 + 41 = 82

Редагувати: обидва містили 3. Виправлено

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

і

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

Спробуйте в Інтернеті! (поміняйте місцями рядки, щоб отримати інший висновок) На цей раз з підтвердженням!

><>тут є особливо важкою мовою, оскільки існує лише один спосіб виведення символів, команда o. На щастя, ми можемо використовувати команду p ut для розміщення oвихідного коду під час виконання, як у моєму програмуванні у відповіді у світі .

Цей взяв багато спроб та помилок. Я почав з двох взаємовиключних програм:

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

і

"r00gr40g8+X0pN+?Y0.data

Кожен перетворює себе та свої дані N, перший віднімає, а другий додає. Потім він виводить це в зворотному порядку. Справа в тому , що дані після кожної програми є іншою програмою в зворотному напрямку, зрушено на N. ( Xце числом клітин , де потреба програми ставити oі Y є осередком , де покажчик повертається до початку циклу. ?Те , де oставиться) .

Обидва слідують одній структурі, представленій по-різному. Вони виконують рядковий літерал по всьому коду, додаючи його до стеку. Вони відтворюють команду рядкових літер, яку вони використовували, і ставлять її внизу стеку. Вони петлюють над стеком, додаючи / віднімаючи N до кожного символу і друкуючи їх.

Перша програма використовує 'як рядковий літерал, так і просту d3*}для створення значення 39 і натискання на дно стека. Другий використовує "як літеральний рядок з тією ж функцією. Він rніколи не втрачає стек, задає gсимвол у комірці 0,0 та повертає стек знову. Потім він отримує gзначення в комірці 4,0 ( g) і додає до нього 8, щоб отримати oі поставити це в X.

Обидві програми використовують різний метод циклічного циклу. Перша програма використовує команду skip ( !) для запуску лише половини інструкцій, рухаючись ліворуч, повертає напрямок та виконує другу половину. Другий використовує команду jump ( .), щоб пропустити назад до початку циклу в комірці Y. Обидва ці запустіть, поки в стеку не буде більше елементів і програмних помилок.

Я зіткнувся з низкою проблем з більшістю нижчих значень N, оскільки зміщення одного символу перетворило б його на інший, важливий для цієї програми (і тому не міг би бути використаний як дані для іншої програми) або два символи з дві програми зміняться на одного персонажа. Наприклад:

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

тощо.

Врешті-решт я потрапив до 10 ( a), де мені вдалося уникнути цих проблем. Можливо, існує коротша версія, коли зміни зрушуються, і перша програма додає N, а друга віднімає її. Це може бути гірше, оскільки перша програма, як правило, знаходиться в нижній частині шкали ASCII, тому віднімання краще уникати конфліктів.


19

Четверте (64-бітне мало-ендіанське гфорт) , 428 + 637 = 1065 байт

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 

Спробуйте в Інтернеті!

Сценарій підтвердження

Дякую @Nathaniel за ідею використання Forth - він нагадав мені у коментарях, що Forth не враховує регістри . Потім прийшли перепади настрою - я знаходив причини, чому це не вийде, після чого знову і знову вирішуються ці проблеми. Весь час крутячись мій тренувальний велосипед на закритому повітрі, як забійний та неправильний фіджер (просто потрібно схопити один кінець ручки та трохи нахилити його).

Перш ніж писати ці програми, я склав, які символи може використовуватися якою програмою. Зокрема, друга програма може використовувати лише великі літери, десяткові цифри, вкладки та коми. Це означатиме, що перша програма - це всі маленькі літери, але я використав кілька великих літер для їх значень ASCII.

Оскільки вкладки непрості, я замість цього використовую пробіли у поясненні.

Перша програма має форму s" code"code- s"починається рядковий літерал, який потім обробляється другою копією коду - стандартною рамкою quine. Однак замість виведення власного вихідного коду він створить іншу програму, яка виглядає приблизно так:

  • HERE
  • Кожні 8 байт у початковому рядку, 64-bit-number-literal ,
  • length-of-the-string
  • 115 EMIT 34 EMIT 9 EMIT 2DUP TYPE 34 EMIT TYPE

Для цього використовується простір даних Forth. HEREповертає вказівник на кінець виділеної в даний час області простору даних і ,додає до нього комірку, заповнену цифрою. Тому перші три точки кулі можна розглядати як буквений рядок, створений за допомогою s". Щоб закінчити другу програму:

  • EMIT виводить символ з урахуванням його значення ASCII, так що:
    • 115 EMIT друкує малі літери s
    • 34 EMIT друкує персонаж цитати "
    • 9 EMIT друкує вкладку
  • 2DUPдублює два верхні елементи на стеці ( a b -- a b a b ), ось це вказівник на та довжина рядка
  • TYPE друкує рядок для виведення першої копії коду
  • 34 EMITдрукує завершальну цитату ", і нарешті
  • TYPE виводить другу копію коду

Подивимося, як працює перша програма. У багатьох випадках слід уникати чисел, що робиться за допомогою 'xрозширення синтаксису gforth для символьних літералів, а іноді і віднімання значення простору ASCII, яке можна отримати за допомогою 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.

Закінчивши це, я хотів би сказати, що я спробував використовувати EVALUATE, але друга програма стає більшою, ніж обидві, представлені вище. У всякому разі, ось це:

: 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

Якщо вам вдасться достатньо переграти цей гольф, щоб перевершити мій s" ..."...підхід, продовжуйте і розміщуйте це як свою відповідь.


1
Чудово! Я радий, що мій коментар спричинив це рішення!
Натаніел

16

Perl, (311 + 630 = 941 байт) 190 + 198 = 388 байт

Обидві програми друкують на стандартний вихід.

Перша програма Perl містить переважно друковані символи ASCII та нові рядки, і вона закінчується рівно в одному новому рядку, але дві літери ÿ являють собою байт, не 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]

Другий містить байти, що не містять ASCII, включаючи кілька символів високого керування, які замінені зірками в цій публікації, і зовсім немає нових рядків:

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

Шестнадцятковий випуск першої програми з 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].

А шістнадцятковий варіант другої програми:

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                           .....~

У другій програмі цитується рядок (довжина 189 байтів, обмежена тильдами) - це перша перша програма, за винятком остаточного нового рядка, кодується лише побітовим доповненням кожного байта. Друга програма просто розшифровує рядок, доповнюючи кожен байт, який ~оператор виконує в perl. Програма друкує розшифровану рядок, а потім новий рядок ( sayметод додає новий рядок).

У цій конструкції декодер другої програми використовує лише шість різних символів ASCII, тому перша програма може бути практично довільною, якщо вона містить лише символи ASCII і виключає ці шість символів. Не важко написати будь-яку програму perl без використання цих п'яти символів. Таким чином, фактична логіка quine знаходиться в першій програмі.

У першій програмі логіка quine використовує словник @f, що триває 11 слів , і збирає вихід з цих слів. Перші слова повторюють більшу частину вихідного коду першої програми. Решта слів - це конкретні поодинокі символи. Наприклад, слово 5 - це тильда, яка є роздільником для двох рядкових літералів у другій програмі. Список цифр між дужками - це рецепт, за якими словами надрукувати в якому порядку. Це досить звичайний загальний метод побудови для quines, єдиний поворот у цьому випадку полягає в тому, що перші слова словника друкуються з його байтами, розрядними доповненнями.


14

Haskell , 306 + 624 = 930 байт

Програма 1: Анонімна функція, яка приймає фіктивний аргумент і повертає рядок.

(\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))"

Спробуйте в Інтернеті!

Програма 2: q[[40,...]]наприкінці - анонімна функція, яка бере фіктивний аргумент і повертає рядок.

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]]

Спробуйте в Інтернеті!

Набір символів 1 (включає пробіл):

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

Набір символів 2 (включає новий рядок):

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

Оскільки лише набір 1 містить символи, що не належать до ASCII, їх байти UTF-8 також роз'єднані.

Як це працює

  • Програма 1, як правило, записується з лямбда-виразами, пробілами та дужками, вільним використанням вбудованих буквено-цифрових функцій та з даними quine як рядкові букви в кінці.

    • Власний основний код програми 1 перетворюється на рядкові буквальні дані, просто оточуючи його лапки.
      • Щоб підтримати це, після кожного зворотного косого кута слідує aабо b, що утворює дійсні послідовності втечі, що проходять по колу show.
      • Ще одна крихітної перевага полягає в тому a, bі cє тільки малими літерами , чия ASCII коду менше , ніж 100, заощадивши цифри в числовому кодуванні , використовуваної програмою 2.
    • Рядкове буквене кодування основного коду програми 2 є більш прихованим, використовуючи Unicode, який не є ASCII: Кожен символ додає 182 до своєї кодової точки, щоб переконатися, що немає перекриття з вихідними символами.
      • Раніше 182 було 128, поки я не зрозумів, що можу зловживати тим фактом, що 182 вдвічі перевищує лінійний рядок для коду програми 1 для скорочення декодування. (В якості бонусу програма 2 може використовувати нові рядки.)
  • Програма 2, як правило, пишеться з рівняннями функцій верхнього рівня (крім остаточного анонімного), символьними буквами та десятковими числами, синтаксисом списку / діапазону та операторами, а також дані quine як список списків Ints в кінці.

    • Основний код програми 1 кодується у вигляді списку кодових точок із остаточною подвійною цитатою.
    • Основний код програми 2 кодується як перелік точок коду рядкового літералу, що використовується в програмі 1, все ще зміщений вгору на 182.

Покрокова інструкція, програма 1

  • bі cє значеннями літеральних рядків для програм 2 і 1 відповідно, наведені як кінцеві аргументи до лямбда-виразу. ()є фіктивним аргументом виключно для задоволення правила PPCG про те, що програма повинна визначати функцію.
  • foldr(\a->map pred)b(show()>>c)декодує рядок bдо основного коду програми 2, застосовуючи map predдо нього кілька разів рівну довжині show()>>c == c++c, або 182.
  • tail(show c)перетворює рядок cдо основного коду програми 1, додаючи остаточну подвійну лапочку.
  • :pure bпоєднує це у списку з рядком b.
  • map(map fromEnum)$ перетворює рядки в списки кодових точок.
  • `mappend`show(...) серіалізує отриманий список списків і, нарешті, додає його до основного коду програми 2.

Покрокова інструкція, програма 2

  • Топлерівень z~z=[[['@','0'..]!!4..]!!z]- це функція, що перетворює кодові точки назад у символи (необхідні для запису, оскільки не всі символи toEnumдоступні.)
    • Аргумент його кодової точки також називається z. Маркер ліні ~в цьому положенні не впливає, але уникає космічного характеру.
    • ['@','0'..] являє собою діапазон списку кроків, що починається назад, починаючи з коду ASCII 64, потім стрибаючи 16 вниз на кожному кроці.
    • Звернення !!4до цього надає \NULхарактеру.
    • Розгортання цього [ ..]діапазону дає список усіх символів, які !!zіндексує.
    • Персонаж нарешті загорнутий у одиночний список. Це дозволяє відображати функцію zза списками, використовуючи =<<замість недоступних mapта <$>.
  • Топлевель q[x,q]_=z=<<x++q++[34,34]++x- це функція, що конструює програму 1 зі списку даних quine.
    • x- це дані для ядра програми 1 (включаючи остаточну подвійну цитату), а внутрішня q- це затуманені дані для ядра програми 2. _- ще один фіктивний аргумент виключно для того, щоб зробити остаточну анонімну функцію функцією замість просто рядка.
    • x++q++[34,34]++x поєднує фрагменти, включаючи дві подвійні лапки з кодом ASCII 34.
    • z=<<будує програму 1 шляхом відображення zконкатенації для перетворення з кодових точок в символи.
  • Фінал q[[40,...]]- це анонімна функція, що поєднується qз даними quine.

5

Желе , 128 90 87 86 85 79 16 + 32 = 48 байт

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

Спробуйте в Інтернеті!

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

Спробуйте в Інтернеті!

Перша програма робить наступне:

“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: 'ỌṘ'.

Це залишає рядки 79,7806,8318,7885,7769,338,115і ỌṘяк два аргументи ланцюга, і вони неявно об'єднуються і друкуються в кінці.

Друга програма обчислює chr( ) списку чисел, який повертається OṾ⁾ọṙŒs. друкує “OṾ⁾ọṙŒs”(з лапками) і повертає вхід, залишаючи “OṾ⁾ọṙŒs”OṾ⁾ọṙŒsяк повний вихід.


5

Gol> <> , 23 + 23 = 46 22 + 22 = 44 20 + 20 = 40 байт

"lF{3+|3d*HqlJJJQpp2

Спробуйте в Інтернеті!

'5ssTMMMotK-g6.6~Io

Спробуйте в Інтернеті!

Перевірте це в Інтернеті!

Як вони працюють

"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

Адаптовано з відповіді Джо Кінга . Маючи ще багато альтернативних команд для виведення та повторення, не було потреби в gабо p, і два основні елементи стали набагато коротшими.

Ще одна основна відмінність полягає в тому, що я генерую цитату суперника прямо у верхній частині стеку. Таким чином, було утримати інваріант трохи легше quote + my code + opponent code(reversed and shifted).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.