Tôi biết bạn, nhưng bạn không biết tôi


18

Bạn được giao nhiệm vụ viết hai chương trình. Chương trình A phải in ra không có gì trên tất cả các đầu vào trừ khi chương trình B là đầu vào, trong trường hợp đó nên in 1. Chương trình B phải in ra 1trên tất cả các đầu vào trừ khi chương trình A là đầu vào, trong trường hợp đó, nó sẽ không in gì.

Ghi điểm:

  • +1 Đối với mỗi nhân vật từ cả hai chương trình.
  • Điểm số thấp nhất chiến thắng.

3
Là quine-ish này đủ để gắn thẻ nó là quine ? Nó chắc chắn có vẻ như vậy với tôi.
Justin

Như hai câu trả lời đầu tiên được đăng chỉ ra, "trở thành" một chương trình khác không được xác định rõ ràng trong phần mô tả này. Và, tôi với @Quincunx rằng điều này có một cái gì đó rất giống với bản chất quine.
dmckee

@Quincunx Tôi đã thêm thẻ quine.
Timtech

1
@Quincunx đúng, nhưng cho đến nay vẫn chưa có ai làm điều đó, trừ khi bạn cũng gọi một câu hỏi bất kỳ chương trình nào đọc mã nguồn của nó từ đĩa và in ra: p
aditsu

2
@aditsu Tôi không thích những câu trả lời đó. Tôi nghĩ rằng tôi sẽ đăng một câu trả lời rất tối ưu mà không làm điều đó. Cá nhân tôi cảm thấy rằng đọc mã nguồn thông qua các tập tin là gian lận; chương trình nên hoạt động ở bất cứ đâu!
Justin

Câu trả lời:


5

GTB , 25

Được thực hiện từ máy tính TI-84

Chương trình A

`_@_eq;"$w;&

Chương trình B

`_@_eq;"$#w;&

Giải trình

`_ Nhập một chuỗi

@_eq;"Kiểm tra xem nó có bằng mã nguồn không ( #được tự động tước cùng với các chữ cái thường)

$w;&Nếu vậy, hiển thị 1 (nếu không có gì) [đối với B$#w;&- nếu không, hiển thị 1 (nếu không có gì)]


12

Bash - 32 ký tự

Tập lệnh A - 16 ký tự

cmp -s b&&echo 1

Kịch bản B - 16 ký tự

cmp -s a||echo 1

Sử dụng

$> echo "foo" | ./a
$> cat b | ./a
1
$> echo "foo" ./b
foo ./b
$> cat a | ./b

5

Ruby, 54

Một

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

B

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

ví dụ:

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)

Vì bạn đã không cấm điều này ...

Lưu trữ các chương trình như ABtương ứng.

Chương trình A (30):

exit echo#~(1!:1<'B')-:1!:1[3

Chương trình B (32):

exit echo#~-.(1!:1<'A')-:1!:1[3

Cách thức hoạt động (Chương trình B, A tương tự):

  • 1!:1[3: đọc stdin
  • 1!:1<'A': Đọc tài liệu A
  • -:: xem họ có bằng nhau không
  • -.: phủ nhận kết quả
  • #~: tự sao chép kết quả (vì vậy, 1kết quả là một 10kết quả bằng 0 0, tức là không có gì)
  • echo: đầu ra
  • exit: exit (trình thông dịch J không thoát theo mặc định khi đến cuối tệp)
$ jconsole A <B
1
$ jconsole A <foo
$ jconsole B <A
$ jconsole B <foo
1
$

Bạn có thể đưa ra một lời giải thích ngắn về những gì này không?
ike

@ike: đã làm như vậy ___
bến

3

Haskell - KHÔNG tải nguồn - 478 644 ký tự

Giả định này getContents LUÔN LUÔN kết thúc bằng một dòng mới và vì vậy bỏ ký tự cuối cùng mà không kiểm tra vì tôi không cảm thấy muốn thoát khỏi nó

Một

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

Nó hoạt động giống như một quine tiêu chuẩn, nhưng hoán đổi - cho * để có được chương trình khác (tránh các ký tự đó ở nơi khác).

Các thử nghiệm sau đây in như mong đợi (thay thế main = tương tác $ bằng a = và 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

Ngoài ra, nếu có một cách ưa thích để định dạng các hàm đơn dòng nguyên khối sẽ tiện dụng, meta.stackexchange.com/questions/22186/ không xuất hiện để che nó
Toeofdoom

2

Con trăn 2.7 - 82

Tệp A (được đặt tên theo nghĩa đen a ):

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

Tệp B (được đặt tên theo nghĩa đen b):

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

Lạm dụng hoàn toàn ở đó mà không có .py- thậm chí còn hoạt động?
TimTech

Tôi chắc chắn @LegoStormtroopr sẽ chạy theo cách tương tự như các ví dụ về Ruby của tôi được đăng ở đây, một vài phút trước đó. ;-)
Darren Stone

1
@Timtech Nó sẽ làm nếu bạn chạy chúng từ dòng lệnh như python a.

Tôi có nghĩa là có thể thậm chí tạo ra một tập tin mà không cần một phần mở rộng?
TimTech

5
Tất nhiên là thế rồi? Nếu bạn đang sử dụng máy Posix touch asẽ tạo một tệp trống nếu bạn có quyền. Để có thêm niềm vui độc ác, bạn thậm chí có thể thực hiện việc touch \~tạo một tệp có tên một dấu ngã ( ~) - sau đó xem khi ai đó cố tình xóa nó;)

2

Ruby, 166 ký tự, không có nguồn đọc

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

Hãy chắc chắn rằng trình soạn thảo văn bản của bạn không lưu với một dòng mới.

Cách sử dụng (ví dụ):

 $ 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

Mỗi chương trình xây dựng nguồn của chương trình khác bằng cách sử dụng biến đổi TẠI ĐÂY và chuỗi, sau đó so sánh kết quả với đầu vào.


Điều này đủ dễ để viết, nhưng bây giờ một phần trong bộ não của tôi không hiểu đệ quy đang khẳng định nó có thể được tối ưu hóa nhưng không biết làm thế nào.
lịch sử

P là gì Và di truyền kết thúc ở đâu?
aditsu

plà một phương thức ruby ​​tích hợp để in các đối số được truyền cho nó, sau đó trả về các đối số đó, làm cho nó hữu ích cho đầu ra được đánh gôn. Khi được gọi mà không có đối số, nó trả về nil. Đối số getslà một dấu phân cách, do đó, việc chuyển các pkết quả trong một dấu phân cách không có nghĩa là nó đọc STDIN cho đến khi đến EOF. Biểu thức heredoc là <<2, vì vậy nó kết thúc tại (và không bao gồm), 2 ở cuối tệp.
lịch sử

Việc sử dụng 2như là dấu phân cách di truyền là một chút truyền thống. Nó có thể là hầu hết các chuỗi.
lịch sử

Là nội dung của các di sản được đánh giá bằng cách nào đó?
aditsu

1

Haskell - 138

Không thực sự là một câu trả lời tốt, nhưng muốn làm cho cả hai chương trình sử dụng cùng một nguồn. Có thể lưu một số ký tự bằng cách đổi tên tệp, nhưng nó sẽ không biến đây thành một giải pháp chiến thắng nên tôi không nghĩ nó đáng giá.

import System.Environment
import Control.Monad
main=do{i<-getContents;p<-getProgName;f<-readFile "ab.hs";when((f==i)/=(p=="B"))(print 1)}

Biên dịch nguồn này là cả hai AB.

Kiểm tra:

% 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

Tại sao biên dịch hai lần vào A, sau đó sao chép Avào B?
mniip

Đó là một sai lầm của tôi khi sao chép mã. Cảm ơn đã chỉ ra rằng. Sẽ sửa chữa.
shiona

1

Node.js - 142 ký tự

Tập lệnh |(còn được gọi là Tập lệnh A) - 80 ký tự

f=require('fs').readFileSync;f('/dev/stdin','hex')==f('&','hex')&&console.log(1)

Tập lệnh &(còn được gọi là Tập lệnh B) - 62 ký tự

eval(require('fs').readFileSync('|','utf8').replace(/&/g,'|'))

Sử dụng

# \| is Script A
# \& is Script B

$> echo "foo" | node \| 
$> cat \& | node \| 
1
$> echo "foo" | node \& 
1
$> cat \| | node \&

Sự miêu tả

Tập lệnh B đọc nội dung của Tập lệnh A và xóa nó sau khi hoán đổi tên tập tin và andtoán tử thành mộtor .

Tôi đã đặt tên cho các tệp &|vì vậy tôi có thể thực hiện một thay thế duy nhất trong Tập lệnh B.


1

Python 3 - 102 ký tự

In 1 nếu đầu vào giống như chương trình 2, nếu không thì không có gì:

if input()==open('a.py').read():print('1')

In 1 nếu đầu vào không giống như chương trình 1, nếu không thì không có gì:

if input()==open('a.py').read():print('1')

Không thể xóa khoảng trắng? Ngoài ra, bạn có thể rút ngắn các tập lệnh từ t.py và tt.py thành a.py và b.py.
TimTech

@Timtech Chắc chắn, ý kiến ​​hay. Ngoài ra, tôi đã không đếm khoảng trắng - chỉ ở đó để dễ đọc. Các dòng mới không thể được gỡ bỏ mặc dù.
Hosch250

Vâng, tôi biết về độ nhạy dòng mới của Python.
TimTech

Chỉ một trong những dòng mới thực sự có thể được gỡ bỏ, đó là sau dấu hai chấm. Những cái khác sẽ cần thêm dấu chấm phẩy, vì vậy không có lợi thế nào để loại bỏ những dòng mới đó.
AJMansfield

@AJMansfield Vâng, tôi biết, nhưng dù sao tôi cũng không tính dòng mới.
Hosch250

0

bash / grep - 59 ký tự

51 ký tự nếu chúng ta chỉ đếm chuỗi chương trình thực tế.

$ 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 ký tự)

i=identical
A=function(x)if(i(x,B))1
B=function(x)if(!i(x,A))1

sản xuất:

> A(123)
> A(A)
> A(B)
[1] 1
> B(123)
[1] 1
> B(A)
> B(B)
[1] 1

Nhận xét meta: R hội chợ tương đối tệ trên golf mã vì không có lối tắt đến function...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.