두 가지 프로그램을 작성해야합니다. 프로그램 A 는 프로그램 B 가 입력 된 경우를 제외하고 는 모든 입력에 아무것도 인쇄하지 않아야하며 ,이 경우 인쇄해야합니다 . 프로그램 B 는 다음을 제외한 모든 입력에 인쇄해야합니다1
1
프로그램 A는 이 아무것도 인쇄하지해야하는 경우에 입력.
채점 :
- +1에서 각 문자마다 두 프로그램의
- 최저 점수가 이깁니다.
두 가지 프로그램을 작성해야합니다. 프로그램 A 는 프로그램 B 가 입력 된 경우를 제외하고 는 모든 입력에 아무것도 인쇄하지 않아야하며 ,이 경우 인쇄해야합니다 . 프로그램 B 는 다음을 제외한 모든 입력에 인쇄해야합니다1
1
프로그램 A는 이 아무것도 인쇄하지해야하는 경우에 입력.
채점 :
답변:
스크립트 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
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 1
이고 0
결과는 0 임)0
).echo
: 출력exit
: exit (J 인터프리터가 파일 끝에 도달해도 기본적으로 종료되지 않습니다)$ jconsole A <B 1 $ jconsole A <foo $ jconsole B <A $ jconsole B <foo 1 $
이것은 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 = 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
ㅏ:
(gets(p)==<<2.tr('&|','|&')*2+'2')&&p(1)
(gets(p)==<<2.tr('&|','|&')*2+'2')&&p(1)
2
비:
(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
내장 루비 메소드는 전달 된 인수를 인쇄 한 다음 해당 인수를 리턴하여 골프 출력에 유용합니다. 인수 없이 호출되면 nil을 반환합니다. 에 대한 인수 gets
는 분리 문자이므로 p
nil 분리 문자를 전달 하면 EOF에 도달 할 때까지 STDIN을 읽습니다. heredoc 표현식은 <<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')