我认识你,但你不认识我


18

您的任务是编写两个程序。程序A不得在所有输入上打印任何内容,除非输入了程序B,否则应打印1。程序B必须1在所有输入上打印出来,但输入程序A除外,在这种情况下,它不应打印任何内容。

得分:

  • +1对于两个程序中的每个字符。
  • 最低分获胜。

3
这是奎因色足以将其标记为奎因吗?在我看来,确实如此。
贾斯汀

正如发布的前两个答案所表明的那样,在此描述中“正在存在”另一个程序的定义并不十分好。而且,我与@Quincunx在一起,这非常类似于quine-nature。
dmckee 2014年

@Quincunx我添加了quine标签。
Timtech

1
@Quincunx真实的,但没有人在做,到目前为止,除非你也叫蒯从磁盘和打印读取它的源代码,任何方案出来:P
aditsu

2
@aditsu我非常不喜欢那些答案。我想我会发布一个不那么理想的答案。我个人认为通过文件读取源代码是作弊的;程序应该可以在任何地方工作!
贾斯汀2014年

Answers:


5

GTB,25

从TI-84计算器执行

程序 A

`_@_eq;"$w;&

程序 B

`_@_eq;"$#w;&

说明

`_ 输入一个字符串

@_eq;"检查它是否等于源代码(#会自动与小写字母一起剥离)

$w;&如果是这样,显示1(否则没有)为B它的$#w;&-如果不是,显示1(否则无)]


12

重击-32个字符

脚本A-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

Ruby,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)

既然你没有禁止...

将程序分别存储为AB

计划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:读标准输入
  • 1!:1<'A':读取文件 A
  • -::看看它们是否相等
  • -.:否定结果
  • #~:自己复制结果(因此,1结果为1 10结果为0 0s,即为空)
  • echo:输出
  • exit:退出(J解释器到达文件末尾时默认不退出)
$ jconsole A <B
1个
$ jconsole A <foo
$ jconsole B <A
$ jconsole B <foo
1个
$

您能对此做一个简短的解释吗?
ike 2014年

@ike:是_______
marinus,

3

Haskell-无需加载源-478644个字符

假设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,但将-换成*以获取其他程序(避免在其他地方使用这些字符)。

以下测试按预期方式打印(用a =和b =替换main = interact $)

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 2014年

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-甚至行得通吗?
2014年

我确定@LegoStormtroopr将以几分钟前与此处发布的Ruby示例相同的方式运行。;-)
Darren Stone

1
@Timtech如果您从命令行以方式运行它们,则可以python a

我的意思是甚至可以生成没有扩展名的文件吗?
Timtech

5
当然是的?如果您在Posix机器上,touch a如果您有权限,将创建一个空文件。为了获得额外的乐趣,您甚至touch \~可以创建一个用单个波浪号(~)命名的文件-然后看着有人

2

Ruby,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和字符串转换构造另一个程序的源,然后将结果与输入进行比较。


编写起来很容易,但是现在我大脑的某些不理解递归的部分坚持认为可以对其进行优化,但是不知道如何实现。
histocrat 2014年

什么是p?Heredoc在哪里结束?
aditsu

p是一个内置的ruby方法,它打印传递给它的参数,然后返回这些参数,使其对于高尔夫球输出有用。如果任何参数调用,则返回nil。参数to gets是一个定界符,因此传递将p导致一个nil分隔符,这意味着它将读取STDIN直到到达EOF。heredoc表达式为<<2,因此它以文件末尾的2结尾(但不包括)。
histocrat 2014年

采用2作为定界符分隔符是混淆的传统位。它几乎可以是任何字符串。
histocrat 2014年

是否对Heredoc的内容进行了评估?
aditsu 2014年

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)}

将此源编译为AB

测试:

% 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,然后复制AB
mniip 2014年

就我而言,复制粘贴代码时这是一个错误。感谢您指出了这一点。将修复。
shiona 2014年

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个字符

如果输入的内容与程序2相同,则显示1,否则显示:

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当然,好主意。另外,我没有在计算空格-只是为了提高可读性。但是不能删除新行。
2014年

是的,我知道Python的换行敏感性。
Timtech

实际上,只有冒号之后的换行符之一才能删除。其他的则需要添加分号,因此删除这些换行符没有任何好处。
AJMansfield 2014年

@AJMansfield是的,我知道,但是我还是不算换行符。
2014年

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.