Я тебе знаю, але ти мене не знаєш


18

Вам доручено написати дві програми. Програма A не повинна друкувати нічого на всіх входах, за винятком випадків, коли вводиться програма B , і в цьому випадку вона повинна друкуватися 1. Програма B повинна роздруковуватись 1на всіх входах, за винятком випадків, коли вводиться програма A , і в цьому випадку вона нічого не повинна друкувати.

Оцінка:

  • +1 Для кожного персонажа з обох програм.
  • Виграє найнижчий рахунок.

3
Чи достатньо цього quine-ish, щоб позначити його як quine ? Мені, звичайно, так здається.
Джастін

Як свідчать перші два опубліковані відповіді, "бути" іншою програмою не дуже добре визначено в цих описах. І я з @Quincunx кажу, що це дуже схоже на природу квінта.
dmckee

@Quincunx Я додав тег quine.
Тімтех

1
@Quincunx правда, але поки що це ніхто не робить, якщо ви також не зателефонуєте quine будь-якій програмі, яка зчитує його вихідний код з диска та роздруковує його: p
aditsu

2
@aditsu мені дуже не подобаються ці відповіді. Я думаю, що опублікую дуже неоптимальну відповідь, яка цього не робить. Я особисто вважаю, що читання вихідного коду через файли обманює; програми повинні працювати де завгодно!
Джастін

Відповіді:


5

GTB , 25

Виконується з калькулятора TI-84

Програма A

`_@_eq;"$w;&

Програма B

`_@_eq;"$#w;&

Пояснення

`_ Введіть рядок

@_eq;"Перевірте, чи він дорівнює вихідному коду ( #автоматично знімається з малих літер)

$w;&Якщо так, відобразити 1 (інакше нічого) [бо Bце $#w;&- якщо ні, відобразити 1 (інакше нічого)]


12

Баш - 32 символи

Сценарій А - 16 символів

cmp -s b&&echo 1

Сценарій В - 16 символів

cmp -s a||echo 1

Використання

$> echo "foo" | ./a
$> cat b | ./a
1
$> echo "foo" ./b
foo ./b
$> cat a | ./b

5

Рубі, 54

А

$><<1if$<.read==IO.read(?B)

Б

$><<1if$<.read!=IO.read(?A)

приклади:

bash-3.2$ ruby A < A
bash-3.2$ ruby A < B
1bash-3.2$ ruby B < A
bash-3.2$ ruby B < B
1bash-3.2$ 

4

J (62)

Оскільки ви цього не заборонили ...

Зберігайте програми як Aі Bвідповідно.

Програма A (30):

exit echo#~(1!:1<'B')-:1!:1[3

Програма B (32):

exit echo#~-.(1!:1<'A')-:1!:1[3

Як це працює (програма B, A схожа):

  • 1!:1[3: читати stdin
  • 1!:1<'A': читати файл A
  • -:: подивіться, чи рівні вони
  • -.: заперечує результат
  • #~: повторити результат сам (значить, 1призводить до одиниці 1і 0дорівнює нулю0 s, тобто нічого)
  • echo: вихід
  • exit: exit (інтерпретатор J не виходить за замовчуванням, коли доходить до кінця файлу)
$ jconsole A <B
1
$ jconsole A <foo
$ jconsole B <A
$ jconsole B <foo
1
$

Чи можете ви дати коротке пояснення, що це робить?
ike

@ike: зробив так _______
marinus

3

Haskell - БЕЗ джерела завантаження - 478 644 символів

Це передбачає, що getContents ВЖЕ закінчується новим рядком, і тому скидає остаточний символ, не перевіряючи, тому що я не відчуваю, як уникнути цього

А

main=interact$($'1').replicate.(1-).fromEnum.(/=map r(d++shows d[toEnum 10]))where r n|n=='-'='*'|n=='*'='-'|True=n;d="main=interact$($'1').replicate.(1-).fromEnum.(/=map r(d++shows d[toEnum 10]))where r n|n=='-'='*'|n=='*'='-'|True=n;d="

Б

main=interact$($'1').replicate.(1*).fromEnum.(/=map r(d++shows d[toEnum 10]))where r n|n=='*'='-'|n=='-'='*'|True=n;d="main=interact$($'1').replicate.(1*).fromEnum.(/=map r(d++shows d[toEnum 10]))where r n|n=='*'='-'|n=='-'='*'|True=n;d="

Він працює як стандартний quine, але замінюючи - на *, щоб отримати іншу програму (уникаючи цих символів в іншому місці).

Наступні тестові друкується як очікувалося (замінюючи main = взаємодію $ з a = і b =)

main=do
  putStrLn "START"
  putStrLn$a "FOO"
  putStrLn$a "main=interact$($'1').replicate.(1*).fromEnum.(/=map r(d++shows d[toEnum 10]))where r n|n=='*'='-'|n=='-'='*'|True=n;d=\"main=interact$($'1').replicate.(1*).fromEnum.(/=map r(d++shows d[toEnum 10]))where r n|n=='*'='-'|n=='-'='*'|True=n;d=\"\n"
  putStrLn$b "FOO"
  putStrLn$b "main=interact$($'1').replicate.(1-).fromEnum.(/=map r(d++shows d[toEnum 10]))where r n|n=='-'='*'|n=='*'='-'|True=n;d=\"main=interact$($'1').replicate.(1-).fromEnum.(/=map r(d++shows d[toEnum 10]))where r n|n=='-'='*'|n=='*'='-'|True=n;d=\"\n"
  putStrLn "END"

-

START

1
1

END

Крім того, якщо є кращий спосіб форматування монолітних однорядних функцій, який був би зручним, мета.stackexchange.com/questions/22186/… не відображає його
Toeofdoom

2

Пітон 2,7 - 82

Файл A (буквально названий просто a):

if raw_input()==open('b').read():print 1

Файл B (буквально названий просто b):

if raw_input()!=open('a').read():print 1

Тотальне зловживання там без того .py- це навіть працює?
Timtech

Я впевнений, що @LegoStormtroopr працює так само, як і мої приклади Ruby, розміщені тут, декількома хвилинами раніше. ;-)
Даррен Стоун

1
@Timtech Це робить, якщо ви запускаєте їх з командного рядка як python a.

Я мав на увазі, чи можливо навіть генерувати файл без розширення?
Timtech

5
Звичайно, це так? Якщо ви перебуваєте на машині Posix, touch aви створите порожній файл, якщо у вас є дозволи. Для додаткової жорстокої забави ви навіть можете зробити touch \~це, створивши файл, названий одним тильдом ( ~) - потім спостерігати, як хтось нерозумно намагається його видалити;)

2

Рубі, 166 символів, джерела для читання немає

A:

(gets(p)==<<2.tr('&|','|&')*2+'2')&&p(1)
(gets(p)==<<2.tr('&|','|&')*2+'2')&&p(1)
2

B:

(gets(p)==<<2.tr('|&','&|')*2+'2')||p(1)
(gets(p)==<<2.tr('|&','&|')*2+'2')||p(1)
2

Переконайтеся, що ваш текстовий редактор не зберігається за допомогою нового рядка.

Використання (приклад):

 $ ruby know_a.rb know_b.rb 
1
 $ ruby know_a.rb know_a.rb 
 $ ruby know_b.rb know_a.rb 
 $ ruby know_b.rb know_b.rb 
1

Кожна програма конструює джерело іншої програми за допомогою HEREdoc та рядкових перетворень, а потім порівнює результат з вхідним.


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

Що таке p? А де закінчується гередок?
aditsu

pце вбудований метод рубіну, який друкує передані йому аргументи, а потім повертає ці аргументи, роблячи його корисним для виведення в гольф. При виклику без аргументів він повертає нуль. Аргумент до gets- це роздільник, тож передача pрезультатів на нульовий роздільник, що означає, що він читає STDIN, поки не потрапить до EOF. Вираз heredoc є <<2, тому він закінчується на (і не включає), 2 в кінці файлу.
гістократ

Використання 2в якості роздільника гередока є традиційним роздмухуванням. Це може бути практично будь-яка струна.
гістократ

Чи оцінюється зміст гередока якось?
aditsu

1

Хаскелл - 138

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

import System.Environment
import Control.Monad
main=do{i<-getContents;p<-getProgName;f<-readFile "ab.hs";when((f==i)/=(p=="B"))(print 1)}

Складіть це джерело як Aі B.

Тест:

% ghc -o A ab.hs
[1 of 1] Compiling Main             ( ab.hs, ab.o )
Linking A ...
% cp A B
% ./A < ab.hs
1
% ./B < ab.hs
% ./A < ab.hi
% ./B < ab.hi
1

навіщо компілювати двічі A, а потім копіювати Aв B?
mniip

З моєї сторони це було помилкою при копіюванні коду. Дякуємо, що вказали на це. Виправимо.
shiona

1

Node.js - 142 символи

Сценарій |(інакше відомий як сценарій А) - 80 символів

f=require('fs').readFileSync;f('/dev/stdin','hex')==f('&','hex')&&console.log(1)

Сценарій &(інакше відомий як Сценарій В) - 62 символи

eval(require('fs').readFileSync('|','utf8').replace(/&/g,'|'))

Використання

# \| is Script A
# \& is Script B

$> echo "foo" | node \| 
$> cat \& | node \| 
1
$> echo "foo" | node \& 
1
$> cat \| | node \&

Опис

Сценарій B зчитує вміст сценарію A і оцінює його після заміни імен файлів та andоператора на or.

Я назвав файли, &і |тому я можу виконати одну заміну в сценарії B.


1

Python 3 - 102 символів

Друкує 1, якщо вхід збігається з програмою 2, інакше нічого:

if input()==open('a.py').read():print('1')

Друкує 1, якщо введення не таке, як програма 1, інакше нічого:

if input()==open('a.py').read():print('1')

Не можна видалити пробіли? Також ви можете скоротити сценарії від t.py та tt.py до a.py та b.py.
Timtech

@Timtech Звичайно, хороша ідея. Крім того, я не рахував пробілів - це просто можливість для читання. Нові лінії не можна видалити.
Hosch250

Так, я знаю про чутливість нового рядка Python.
Timtech

Тільки один з нових рядків може бути видалений дійсно після двокрапки. Іншим потрібні крапки з комою, тому вилучення цих нових рядків немає переваги.
AJMansfield

@AJMansfield Так, я знаю, але я все одно не рахував нові рядки.
Hosch250

0

bash / grep - 59 символів

51 символ, якщо ми порахуємо лише фактичний рядок програми.

$ a='grep -cx "$b" | grep -x 1'
$ b='grep -vcx "$a" | grep -x 1'
$ echo 'foo' | eval $a
$ echo $b | eval $a
1
$ echo 'foo' | eval $b
1
$ echo $a | eval $b

-1

R (62 знаки)

i=identical
A=function(x)if(i(x,B))1
B=function(x)if(!i(x,A))1

виробляє:

> A(123)
> A(A)
> A(B)
[1] 1
> B(123)
[1] 1
> B(A)
> B(B)
[1] 1

Мета коментар: R ярмарки відносно погані на коді гольфу, оскільки немає ярлика до function...

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