Я знаю тебя, но ты меня не знаешь


18

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

Подсчет очков:

  • +1 за каждого персонажа из обеих программ.
  • Самый низкий балл побеждает.

3
Достаточно ли этого quine-ish, чтобы пометить его как quine ? Это, конечно, мне так кажется.
Джастин

Как показывают первые два опубликованных ответа, «быть» другой программой не очень хорошо определено в этом описании. И я с @Quincunx, что в этом есть что-то очень похожее на сущность квин.
dmckee

@Quincunx Я добавил тег quine.
Timtech

1
@Quincunx верно, но пока никто этим не занимается, если только вы не вызываете quine какой-либо программой, которая считывает свой исходный код с диска и печатает его: p
aditsu

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

Ответы:


5

БРГ , 25

Выполнено из калькулятора ТИ-84

программа A

`_@_eq;"$w;&

программа B

`_@_eq;"$#w;&

объяснение

`_ Введите строку

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

$w;&Если это так, отобразите 1 (иначе ничего) [для Bэтого $#w;&- если нет, отобразите 1 (иначе ничего)]


12

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

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

cmp -s b&&echo 1

Скрипт B - 16 символов

cmp -s a||echo 1

использование

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

5

Руби, 54

A

$><<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соответственно.

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

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

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

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

Как это работает (программа B, A похожа):

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

Можете ли вы дать краткое объяснение того, что это делает?
икэ

@ike: так и было _______
marinus

3

Haskell - БЕЗ загрузки источника - 478 644 символов

Это предполагает, что getContents ВСЕГДА оканчивается символом новой строки и поэтому удаляет последний символ без проверки, потому что я не чувствую необходимости экранировать его

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="

В

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

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

2

Python 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 и строковые преобразования, затем сравнивает результат с входными данными.


Это было достаточно легко написать, но теперь какая-то часть моего мозга, которая не понимает рекурсию, настаивает на том, что ее можно оптимизировать, но понятия не имеет, как.
гистократ

Что такое р? И где кончается наследственность?
aditsu

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

Использование в 2качестве разделителя heredoc является традиционной частью запутывания. Это может быть практически любая строка.
гистократ

Содержание heredoc оценивается как-то?
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?
Мниип

Это было моей ошибкой при копировании кода. Спасибо что подметил это. Починю.
Шион

1

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

Скрипт |(иначе известный как Скрипт A) - 80 символов

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

Скрипт &(иначе известный как Скрипт B) - 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

Yes, I am aware of Python's newline sensitivity.
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.