私はあなたを知っているが、あなたは私を知らない


18

2つのプログラムを作成する必要があります。プログラムAは、プログラムBが入力された場合を除き、すべての入力で何も出力しない必要があります。プログラムBは、プログラムAが入力された場合を除き、すべての入力で印刷する必要があります。その場合、何も印刷されません。11

得点:

  • +1 両方のプログラムの各キャラクターに対して。
  • 最低スコアが勝ちます。

3
これはクイニーっぽいのでしょうか?確かに私にはそう思われます。
ジャスティン14年

投稿された最初の2つの回答が示すように、この説明では、別のプログラムの「存在」はそれほど明確に定義されていません。そして、私は@Quincunxと一緒に、これがクインの性質に非常に似ていることを知っています。
dmckee 14年

@Quincunxクインタグを追加しました。
ティムテック14年

1
pは:あなたは、ディスクからそのソースコードを読み取り、それをプリントアウトし、任意のプログラムQUINEを呼び出さない限り@Quincunx真、誰もが、そのこれまでやっていない
aditsu

2
@aditsu私はそれらの答えが大嫌いです。私はそれをしない非常に最適な答えを投稿すると思います。個人的には、ファイルからソースコードを読み取ることは不正行為だと感じています。プログラムはどこでも動作するはずです!
ジャスティン14年

回答:


5

GTB、25

TI-84計算機から実行

プログラム A

`_@_eq;"$w;&

プログラム B

`_@_eq;"$#w;&

説明

`_ 文字列を入力してください

@_eq;"ソースコードと等しいかどうかを確認します(#小文字とともに自動的に削除されます)

$w;& その場合、1を表示します(それ以外の場合は何も表示しません)[ B、それの$#w;&-そうでない場合は、ディスプレイ1(それ以外の場合は何もありません)]


12

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

ルビー、54

A

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

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)

あなたはこれを禁止しなかったので...

プログラムをAand として保存します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:標準入力を読む
  • 1!:1<'A':ファイルを読み取る A
  • -::それらが等しいかどうかを確認
  • -.:結果を否定する
  • #~:結果を単独で複製します(したがって、1結果は1に1なり、0結果はゼロになります0(つまり、何もありません))
  • echo:出力
  • exit:exit(Jインタープリターは、ファイルの終わりに達するとデフォルトで終了しません)
$ jconsole A <B
1
$ jconsole A <foo
$ jconsole B <A
$ jconsole B <foo
1
$

これが何をするのか簡単に説明できますか?
IKE 14年

@ike:そうしました_______
マリヌス14年

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

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

これは標準のクインのように機能しますが、他のプログラムを取得するために*を交換します(これらの文字を他の場所で回避します)。

次のテストは期待どおりに印刷されます(main = interact $を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(文字通り名前はjust b):

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

せずにそこに完全な虐待.py-それも動作しますか?
ティムテック14年

@LegoStormtrooprは、数分前にここに投稿されたRubyのサンプルと同じ方法で実行されると確信しています。;-)
ダレンストーン14年

1
@Timtechコマンドラインからとして実行する場合はそうしますpython a

拡張子のないファイルを生成することも可能ですか?
ティムテック14年

5
もちろん?Posixマシンtouch aを使用している場合、権限があれば空のファイルが作成されます。あなたも行うことができます余分な残酷な楽しみのためにtouch \~、単一のチルダ(と名前のファイルが作成されます~) -誰かがfoolhardedlyそれを削除しようとして、その後見;)

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

pとは何ですか?そして、ヒアドキュメントはどこで終わりますか?
aditsu

pは、渡された引数を出力し、それらの引数を返す組み込みのrubyメソッドで、ゴルフでの出力に役立ちます。引数なしで呼び出されると nilを返します。引数getsはデリミタなので、渡すとpデリミタがnilになります。つまり、EOFに達するまでSTDINを読み取ります。ヒアドキュメント式は<<2ですので、ファイルの最後にある2で終わります(含まれません)。
histocrat

2ヒアドキュメントデリミタとしての使用は、伝統的な難読化です。ほとんどどんな文字列でもかまいません。
histocrat

ヒアドキュメントの内容は何らかの形で評価されていますか?
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)}

このソースをとの両方としてコンパイル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

に2回コンパイルしてAからコピーAするのはBなぜですか?
mniip 14年

コードをコピー&ペーストするとき、それは私の側の間違いでした。それを指摘してくれてありがとう。修正します。
塩奈14年

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に短縮できます。
ティムテック14年

@Timtechいいですね。また、私は空白を数えていませんでした-それは読みやすさのためだけにあります。ただし、改行は削除できません。
Hosch250 14年

はい、私はPythonの改行感度を知っています。
ティムテック14年

コロンの後にある改行のうち、実際に削除できるのは1つだけです。他にはセミコロンを追加する必要があるため、これらの改行を削除する利点はありません。
AJMansfield

@AJMansfieldはい、知っていますが、とにかく改行を数えませんでした。
Hosch250 14年

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.