2つのプログラムを作成する必要があります。プログラムAは、プログラムBが入力された場合を除き、すべての入力で何も出力しない必要があります。プログラムBは、プログラムAが入力された場合を除き、すべての入力で印刷する必要があります。その場合、何も印刷されません。1
1
得点:
- +1 両方のプログラムの各キャラクターに対して。
- 最低スコアが勝ちます。
2つのプログラムを作成する必要があります。プログラムAは、プログラムBが入力された場合を除き、すべての入力で何も出力しない必要があります。プログラムBは、プログラムAが入力された場合を除き、すべての入力で印刷する必要があります。その場合、何も印刷されません。1
1
得点:
回答:
スクリプト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
あなたはこれを禁止しなかったので...
プログラムをA
and として保存します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 $
これは、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
ファイルA(名前はちょうどa
):
if raw_input()==open('b').read():print 1
ファイルB(文字通り名前はjust b
):
if raw_input()!=open('a').read():print 1
.py
-それも動作しますか?
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
は、渡された引数を出力し、それらの引数を返す組み込みのrubyメソッドで、ゴルフでの出力に役立ちます。引数なしで呼び出されると、 nilを返します。引数gets
はデリミタなので、渡すとp
デリミタがnilになります。つまり、EOFに達するまでSTDINを読み取ります。ヒアドキュメント式は<<2
ですので、ファイルの最後にある2で終わります(含まれません)。
2
ヒアドキュメントデリミタとしての使用は、伝統的な難読化です。ほとんどどんな文字列でもかまいません。
本当に良い答えではありませんが、両方のプログラムが同じソースを使用するようにしたかったです。ファイルの名前を変更することでいくつかの文字を保存できますが、これが勝利のソリューションになるわけではないので、価値があるとは思いません。
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
なぜですか?
スクリプト|
(スクリプト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に置き換え、単一の実行可能
入力がプログラム2と同じ場合は1を出力し、そうでない場合は何も出力しません。
if input()==open('a.py').read():print('1')
入力がプログラム1と同じでない場合は1を出力し、そうでない場合は何も出力しません。
if input()==open('a.py').read():print('1')
実際のプログラム文字列のみをカウントする場合は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