2 кішки в лайці


30

Виклик

Складіть дві програми, A і B, які обидві програми для кішок однією і тією ж мовою. При з’єднанні АВ (також тією ж мовою) має бути лайкою.

Наприклад, припустимо, helloі worldобидві програми для котів є мовою XYZ. Якщо helloworldу цій мові є квітка, то ваше рішення справедливе.

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

Оцінка та правила

  • Загальна кількість байтів об'єднаної програми AB - це ваша оцінка. Оскільки це кодовий гольф, виграє найнижчий бал.
  • Стандартні лазівки заборонені
  • Введення має бути взято з stdin, а вихід повинен перейти до stdout.
  • Програм для котів не потрібно брати аргументи; їм потрібно лише скопіювати stdin в stdout.
  • Quine має працювати, коли програмі не вводять даних, але вона не повинна працювати правильно (але може) для інших входів.
  • Квіну не потрібно припиняти, за умови, що вона надрукує саме свій вихідний код один раз, і не більше.
  • Квінт повинен бути принаймні одним байтом.
  • A і B можуть бути однією і тією ж програмою.
  • БА не потрібно бути лайкою або навіть дійсною програмою.

Я не думаю, що у вас повинні бути правила A і B - це те саме програмне правило
Мухаммад Салман

2
@MuhammadSalman Моя оригінальна ідея полягала в тому, щоб програма для котів була подвоєна, щоб перетворитися на лайки. Я просто хотів відкрити двері для більш легких рішень, тому що я не був повністю впевнений, що це можливо. Схоже, я помилявся в обох пунктах, але я в цьому добре.
Beefster

3
Вам, мабуть, слід додати, що вони ABповинні бути не порожніми, оскільки багато мов мають 0-байтну кішку, що забезпечує 0-байтову квітку.
DJMcMayhem

9
@DJMcMayhem 0-байтова квітка не буде дійсною квіною.
Нісса

4
Що таке програма для котів?
Педро

Відповіді:


32

V , 2 + 2 == 4 байти

2i2i

Спробуйте quine!

Спробуйте кота!

А є2i

Б також2i

Як це працює?

Спочатку кілька пояснень того, як працює V. Одне помітне, що робить цю відповідь можливою, це те, що у V порожня програма - це програма для котів. Це не окремий випадок, він притаманний тому, як працює V. При запуску весь вхід завантажується в "буфер", кожна команда певним чином змінює буфер, а потім, коли програма виконана, буфер неявно друкується. Це означає, що будь-яка рядок NOP - це також програма для котів.

У iкоманді означає ввести режим вставки , що означає кожен символ слідуючи iбуде додано до буфер. З номером, що передує цьому, цей текст буде дублюватися n разів.

Це означає, що для програми для котів нічого не буде додано в буфер, і він буде надрукований так, як він був прочитаний. Іншими словами:

        " (Implicitly) Load all input
2       " 2 times,
 i      " Insert the following text into the buffer...
        " (nothing)
        " (Implicitly) Print the buffer

Але для quine є текст після i :

2       " 2 times,
 i      " Insert the following text into the buffer...
  2i    "   "2i"
        " (Implicitly) Print the buffer

Хитрий невідповідь

V , 0 байт

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

А - це порожня програма.

Б - також порожня програма.

: P


21
Кожна інша мова: Ой, ми потрапили в глухий кут! . V: * посади стандартної квітки * .
Ерік Аутгольфер

13

Рубін, 71 байт

2;puts (<<2*2+?2)[/.+2/m]||$<.read
2;puts (<<2*2+?2)[/.+2/m]||$<.read
2

Можна поділити на котів наступним чином:

2;puts (<<2*2+?2)[/.+2/m]||$<.read
2

і

;puts (<<2*2+?2)[/.+2/m]||$<.read
2

Дві коти однакові, за винятком провідних 2, що є неоперативним у всіх трьох програмах. Це <<2є єрестре, тобто все, що починається з наступного рядка до закінчення 2 на його власному рядку - це рядок, який ми приєднуємо до себе ( *2) і додаємо трейлінг 2. У котів єрестинг добре сформований, але порожній, тож регулярний вираз не буде відповідати йому, і ми перейдемо до $<.readвиразу та виводимо STDOUT. Однак, коли ми будемо стикувати котів, рядок не закінчиться до третього рядка, тож регулярний вираз збігається, і ми коротко замикаємо і виводимо лайку.


11

Pyth, 29 байт (5 + 24) 27 байт (5 + 22)

pz=T0?TzjN*2]"pz=T0?TzjN*2]     # Quine
pz=T0                           # Cat A
     ?TzjN*2]"pz=T0?TzjN*2]     # Cat B

Це було весело.
Спробуйте царину тут
Спробуйте першого кота тут
Спробуйте другу кішку тут

Пояснення

Cat A
pz=T0
pz       Print the input.
  =T0    (Irrelevant for cat)

Cat B
?TzjN*2]"pz=T0?TzjN*2]
?Tz                      If T (10) is truthy, output the input.
   jN*2]"pz=T0?TzjN*2]   (Irrelevant for cat)

Quine
pz=T0?TzjN*2]"pz=T0?TzjN*2]
pz                            Print the (empty) input (without a newline).
  =T0                         Set T to 0.
     ?Tz                      If T (0) is truthy, output the input.
             "pz=T0?TzjN*2]   Otherwise, get this string...
          *2]                 ... take two copies...
        jN                    ... and join them with a quote.

11

C # (компілятор Visual C #) , 551 байт

A: 95 байт

class A{public static int i=2;static void Main(string[]args){System.Console.Write(args[0]);}}//

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

B: 438 + 18 байт

class A{public static int i=0;}
class B{static void Main(string[]args){if(A.i<1){System.Console.Write(args[0]);return;}var a=@"class A{{public static int i=2;static void Main(string[]args){{System.Console.Write(args[0]);}}}}//class A{{public static int i=0;}}
class B{{static void Main(string[]args){{if(A.i<1){{System.Console.Write(args[0]);return;}}var a=@{0}{1}{0};System.Console.Write(a,'{0}',a);}}}}";System.Console.Write(a,'"',a);}}

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

A + B: 533 + 18 байт

class A{public static int i=2;static void Main(string[]args){System.Console.Write(args[0]);}}//class A{public static int i=0;}
class B{static void Main(string[]args){if(A.i<1){System.Console.Write(args[0]);return;}var a=@"class A{{public static int i=2;static void Main(string[]args){{System.Console.Write(args[0]);}}}}//class A{{public static int i=0;}}
class B{{static void Main(string[]args){{if(A.i<1){{System.Console.Write(args[0]);return;}}var a=@{0}{1}{0};System.Console.Write(a,'{0}',a);}}}}";System.Console.Write(a,'"',a);}}

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

A і B приймають дані як аргумент командного рядка. A + B ігнорує будь-які дані. 18 байт на B і A + B додано для /p:StartupObject=Bопції, що надсилається до MSBuild. Це лише суворо необхідно на A + B, але здавалося, що це обман, щоб його також не було у B. Таким чином, прапорці компілятора для A + B є прапорами компілятора для A (none) плюс прапорами компілятора для B.

Пояснення

Програма А є простою. Клас A містить (невикористану) статичну змінну, iініціалізовану до 2та друкує перший аргумент під час запуску. The//В кінці має важливе значення для коду A + B, але не робить нічого в собі.

Програма B дивна в ізоляції, але по суті однакова. Він створює клас A, що містить статичну змінну, iініціалізовану до 0, а потім запускає основний метод класу B, який робить те саме, що і програма A, оскількиA.i менше 1, і повертається перед будь-яким із дивних речей. Нові рядки тут не потрібні, але вони важливі для A + B.

У поєднанні //програма "Програма А" коментує декларацію класу А з програми "Б", але через новий рядок клас "В" є нормальним, що дозволяє A.iпосилатися на 2значення з програми А натомість. Прапор компілятора змушує програму запускати B.Main (), оскільки також існує A.Main (). Результат полягає в тому, що програма A + B не виводить своїх аргументів, а замість цього переходить до наступного сегмента B.Main (), який в основному є лише стандартним C # quine .


1
"програми для котів ... потрібно скопіювати stdin в stdout"
Якоб

9

Хаскелл , 116 + 20 = 187 175 174 136 байт

Купа байтів, збережених відтоді, як мені показав Ørjan Johansen interact

Кіт 1

g=";main|idmain<-(++\"g=\"++show g++g)=interact idmain|1>0=interact id";main|idmain<-(++"g="++show g++g)=interact id

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

Кіт 2

main|1>0=interact id

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

Квіне

g=";main|idmain<-(++\"g=\"++show g++g)=interact idmain|1>0=interact id";main|idmain<-(++"g="++show g++g)=interact idmain|1>0=interact id

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


Основний принцип в роботі тут є те , що , коли ми додаємо другу кішку до першого ми змінимо ім'я функції ми взаємодіє з від aдо idmain. Так interact idяк це кішка, ми хочемо, idmainщоб я функцію, яка повертала лайку. Очевидним рішенням буде використання const, однак, оскільки ми можемо вважати, що вхід також порожній (++). Звідси ми знаходимо вихідний код за допомогою досить стандартних засобів, у нас є змінна, gщо кодує джерело, і ми використовуємо спеціальну обгортку, щоб надрукувати його у формі рядка та коду. Є невеликий виняток, що нам потрібно поставити наш кодер спереду, тому що нам вже потрібно закінчити interact id. Це означає додатковоg=не кодується і має оброблятися вручну. Наступний наш кіт є досить стандартним, за винятком того, що нам потрібно зробити його дійсним кодом, коли його позначають на кінці іншого кота, тому нам потрібні обидві коти, щоб бути примірниками охоронців візерунка.

Альтернативна стратегія, 43 + 105 = 186 148

Кіт 1

g="";main|idmain<-(++g++show g)=interact id

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

Кіт 2

main|1>0=interact id where g="g=\"\";main|idmain<-(++g++show g)=interact idmain|1>0=interact id where g="

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

Квіне

g="";main|idmain<-(++g++show g)=interact idmain|1>0=interact id where g="g=\"\";main|idmain<-(++g++show g)=interact idmain|1>0=interact id where g="

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


1
Ви можете скоротити це трохи, замінивши getContents+ putStrна interact id. Спробуйте в Інтернеті! (Квінка більше не працює з не порожнім входом, що дозволяє використовувати (++ ...)розділ для idmain.)
Ørjan Johansen

@ ØrjanJohansen Дякую! Я не знав про це interact, я думаю, це тому, що я рідко роблю IO речі з Haskell. Я відредагував публікацію.
Пшеничний майстер

8

Python 3, 286 байт

Мій перший гольф Python і моя перша квин! Не дуже елегантно, але це працює.

Програма A (238 байт)

from atexit import*;s="from atexit import*;s=%r;register(lambda:print(end='b'in globals()and s%%s or open(0).read()));b=0\nif's'not in vars():print(end=open(0).read())";register(lambda:print(end='b'in globals()and s%s or open(0).read()));

(немає останнього рядка)

Програма B (48 байт)

b=0
if's'not in vars():print(end=open(0).read())

(немає останнього рядка)

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

Подяка

  • -24 байти завдяки Джо Кінгу
  • -82 байти завдяки Джо Кінгу

Ви можете робити end=open...та використовувати %rзамість того, %sщоб не робити нового рядка та котирувань
Джо Кінг,

Класно, я перейшов на %r. Не впевнений, що ви маєте на увазі про новий рядок.
Якоб

1
Замість того, %sщоб форматувати новий рядок у, ви можете просто зробити буквальне \n. Ви також можете використовувати ;для розділення висловлювань замість \n(за винятком ifпотреб бути у власному рядку). %можна уникнути в рядку, виконавши %%. Єдиний аргумент, необхідний для форматування рядка, - це сам рядок, все інше можна позбавити
Jo King

1
Програма B (і текст для неї) може використовувати locals()для збереження 2 байти.
Джонатан Аллан

6

C ++ (стук) , 313 + 102 = 415 байт

Програма A (закінчується новим рядком):

#include<cstdio>
#define Q(x,y)#x,B=#y;x
int c;auto I="#include<cstdio>",A=Q(int main(){if(c)printf("%s\n#define Q(x,y)#x\",\"#y;x\nint c;auto I=\"%s\",A=Q(%s,)\n#ifdef Q\nint n=++c;\n#else\n%s\n%s\n#endif",I,I,A,I,B);else while((c=getchar())>=0)putchar(c);},int c;int main(){while((c=getchar())>=0)putchar(c);})

Програма B (не закінчується новим рядком):

#ifdef Q
int n=++c;
#else
#include<cstdio>
int c;int main(){while((c=getchar())>=0)putchar(c);}
#endif

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

Спробуйте в Інтернеті: A , B , AB

(Єдине, що мені відомо про переносимість, це те, що програма передбачає розміщення <cstdio>імен як у глобальному просторі імен, так і в std.)


5

Befunge-98 (FBBI) , 8 + 15 = 23 байти

A + B: (працює лише без введення даних)

+9*5~,#@#@~,9j>:#,_:@#"

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

A:

+9*5~,#@

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

B:

#@~,9j>:#,_:@#"

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


Мені було цікаво, чи хтось керуватиме неправдивою відповіддю. Дуже погано, що це не 2D: - /
Beefster

@Beefster так. Проблема в тому, що зробити 2d Quine досить важко. Можливо, я над чимсь
попрацюю

5

Python 3 , 100 + 37 = 137 байт

Програма A:

s='s=%r;print(end=open(0).read())#print(end=open(0).read())\nprint(s%%s)';print(end=open(0).read())#

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

Програма B:

print(end=open(0).read())
print(s%s)

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

Зробіть Quine AB

s='s=%r;print(end=open(0).read())#print(end=open(0).read())\nprint(s%%s)';print(end=open(0).read())#print(end=open(0).read())
print(s%s)

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

Працює лише тоді, коли вхід порожній, інакше він попереджає вхід до виводу.


Подвійні лапки повинні бути одиничними.
Джонатан Аллан

Збій дозволений?
Якоб

@Jakob У запитанні не сказано, що збій не дозволений, і зазвичай вихід на STDERR ігнорується
Jo King

Гаразд, досить справедливо. Розумні ярлики!
Якоб

4

Приєднати , 15 + 126 = 141 байт

A:

AllInput[]|Echo

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

B:

@{If[_,s.="AllInput[]|Echo@{If[_,s.=%s;;Printf[s,Repr!s],AllInput[]|Echo]es}|Call";;Printf[s,Repr!s],AllInput[]|Echo]es}|Call

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

A + B:

AllInput[]|Echo@{If[_,s.="AllInput[]|Echo@{If[_,s.=%s;;Printf[s,Repr!s],AllInput[]|Echo]es}|Call";;Printf[s,Repr!s],AllInput[]|Echo]es}|Call

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

Пояснення

Кожна програма котів кодується AllInput[]|Echo, що є простою програмою для котів. B - основна фаза хіни; поодинці, це векторизована функція (через унійну @), яка викликається без входів (називається як |Call). Таким чином, If[_,A,B]виконуються перші умовні виконання B, що просто AllInput[]|Echo.

Коли A + B виконується, унар @стає бінарним @через Echoзлиття з лямбда:

AllInput[]|Echo@{If[_, ...

Тепер це означає, що лямбда виконується раніше, ніж Echoє. Повертаючись до умовного, тепер ця функція є всім STDIN як аргумент. Отже, If[_,A,B]виконує A, що є стандартною рамкою quine.


3

Стакс , 16 + 12 = 28 байт

Кіт 1:

"yi|d|ca34b4lr"y

Запустіть і налагоджуйте його

"yi|d|ca34b4lr"y Full program, implicit input
"yi|d|ca34b4lr"  Push the string
               y Push raw input
                 Implicit output of top item

Кішка 2:

i|d|ca34b4lr

Запустіть і налагоджуйте його

i|d|ca34b4lr Full program, implicit input
i            Don't parse input (prefix directive)
 |d          Push main stack depth, always zero
   |c        Cancel because top item is falsy, and implicitly print
     a34b4lr Never executed

Quine:

"yi|d|ca34b4lr"yi|d|ca34b4lr

Запустіть і налагоджуйте його

"yi|d|ca34b4lr"yi|d|ca34b4lr Full program
"yi|d|ca34b4lr"              Push the string
               y             Push input
                i            No-op
                 |d          Push main stack depth, i.e. 2
                   |c        Do nothing because top is truthy
                     a       Get the string to the top
                      34     Push 34 (charcode of ")
                        b    Copy both
                         4l  Listify top 4
                           r Reverse
                             Implicit output

3

Кіт 1:

Луа , 41 байт

a=io.read;while a(0)do io.write(a(1))end;

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


Кішка 2:

Луа , 70 байт

if a then io.input(arg[0])end;a=io.read;while a(0)do io.write(a(1))end

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


Quine:

Луа , 111 байт

a=io.read;while a(0)do io.write(a(1))end
if a then io.input(arg[0])end;a=io.read;while a(0)do io.write(a(1))end

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

io.input(arg[0]) у Cat 2 встановлює поточний файл як стандартний вхід, і в результаті кішка друкує вихідний код


1
Ласкаво просимо в PPCG
Мухаммад Салман

Ви можете зберегти один байт у коті 1, видаливши останню крапку з двокрапкою?
Мухаммад Салман

1
На жаль, читання поточного файлу - це стандартна лазівка. Але приємно спробувати все одно.
Beefster


0

JavaScript (Node.js) , 199 байт


a=()=>console.log(require('fs').readFileSync(0)+'');a();var a=a||0;b=()=>console.log(require('fs').readFileSync(0)+'');!a?b():c=()=>console.log(`a=${a};a();var a=a||0;b=${b};!a?b():c=${c},c()`),c()

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

Кіт А, 57 байт


a=()=>console.log(require('fs').readFileSync(0)+'');a();

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

Кіт В, 142 байти

var a=a||0;b=()=>console.log(require('fs').readFileSync(0)+'');!a?b():c=()=>console.log(`a=${a};a();var a=a||0;b=${b};!a?b():c=${c},c()`),c()

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

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