나는 당신을 알고 있지만 당신은 나를 몰라


18

두 가지 프로그램을 작성해야합니다. 프로그램 A 는 프로그램 B 가 입력 된 경우를 제외하고 는 모든 입력에 아무것도 인쇄하지 않아야하며 ,이 경우 인쇄해야합니다 . 프로그램 B 는 다음을 제외한 모든 입력에 인쇄해야합니다11 프로그램 A는 이 아무것도 인쇄하지해야하는 경우에 입력.

채점 :

  • +1에서 각 문자마다 프로그램의
  • 최저 점수가 이깁니다.

3
로 태그이 quine 틱 충분 quine은 ? 그것은 확실히 나에게 보인다.
저스틴

게시 된 처음 두 개의 답변에서 알 수 있듯이 다른 프로그램이 "존재"한다는 것은이 설명에서 잘 정의되어 있지 않습니다. 그리고 @Quincunx와 함께 이것은 quine-nature와 매우 흡사합니다.
dmckee

@Quincunx quine 태그를 추가했습니다.
Timtech

1
@Quincunx true이지만 디스크에서 소스 코드를 읽고 인쇄하는 프로그램을 quine으로 호출하지 않는 한 아무도 그렇게하지 않습니다. p
aditsu

2
@aditsu 나는 그 대답을 많이 싫어합니다. 나는 그것을하지 않는 매우 차선책을 게시 할 것이라고 생각합니다. 필자는 개인적으로 파일을 통해 소스 코드를 읽는 것이 부정 행위라고 생각합니다. 프로그램은 어디에서나 작동해야합니다!
Justin

답변:


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

루비, 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: 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
$

이것이 무엇을하는지 간단한 설명을 해 줄 수 있습니까?
ike

@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처럼 작동하지만 다른 프로그램을 얻기 위해 *를 바꿉니다 (다른 문자를 피하십시오).

다음 테스트는 예상대로 인쇄됩니다 (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

파이썬 2.7-82

파일 A (문자 그대로 just 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 자, 읽기 소스 없음

ㅏ:

(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 및 문자열 변환을 사용하여 다른 프로그램의 소스를 구성한 다음 결과를 입력과 비교합니다.


이것은 작성하기 쉽지만, 이제 재귀를 이해하지 못하는 두뇌의 일부는 최적화 할 수는 있지만 어떻게 해야할지 모릅니다.
histocrat

p 란 무엇입니까? 그리고 heredoc은 어디에서 끝나나요?
aditsu

p내장 루비 메소드는 전달 된 인수를 인쇄 한 다음 해당 인수를 리턴하여 골프 출력에 유용합니다. 인수 없이 호출되면 nil을 반환합니다. 에 대한 인수 gets는 분리 문자이므로 pnil 분리 문자를 전달 하면 EOF에 도달 할 때까지 STDIN을 읽습니다. heredoc 표현식은 <<2이므로 파일 끝에서 2로 끝나고 포함되지 않습니다.
histocrat

의 사용 2히어 닥 구분 기호로는 난독의 전통적인 비트입니다. 거의 모든 문자열이 될 수 있습니다.
histocrat

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?
mniip

코드를 복사하여 붙여 넣을 때 제 실수는 실수였습니다. 지적 해 주셔서 감사합니다. 해결됩니다.
shiona

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

파이썬 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 물론, 좋은 생각입니다. 또한 공백을 세지 않았습니다-가독성을 위해 거기에 있습니다. 줄 바꿈은 제거 할 수 없습니다.
Hosch250

예, 파이썬의 줄 바꿈 감도를 알고 있습니다.
Timtech

콜론 이후의 줄 바꿈 중 하나만 실제로 제거 할 수 있습니다. 다른 것들은 세미콜론을 추가해야하므로, 그 줄 바꿈을 제거하는 이점이 없습니다.
AJMansfield

@AJMansfield 예, 알고 있지만 어쨌든 개행을 세지 않았습니다.
Hosch250 2019 년

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.