ฉันรู้จักคุณ แต่คุณไม่รู้จักฉัน


18

คุณได้รับมอบหมายให้เขียนโปรแกรมสองโปรแกรม โปรแกรมต้องพิมพ์อะไรในปัจจัยการผลิตทั้งหมดยกเว้นเมื่อโปรแกรมBคือการป้อนข้อมูลในกรณีที่มันควรพิมพ์ โปรแกรมBต้องพิมพ์บนอินพุตทั้งหมดยกเว้นเมื่อโปรแกรมAเป็นอินพุตซึ่งในกรณีนี้ไม่ควรพิมพ์อะไรเลย11

เกณฑ์การให้คะแนน:

  • +1 สำหรับแต่ละตัวละครจากทั้งสองโปรแกรม
  • คะแนนต่ำสุดชนะ

3
นี่คือควิน - ish เพียงพอที่จะแท็กเป็นควิน ? มันดูเหมือนกับฉันอย่างแน่นอน
Justin

เมื่อสองคำตอบแรกที่โพสต์บ่งชี้ว่า "การเป็น" โปรแกรมอื่นนั้นไม่ได้นิยามไว้อย่างดีนักในคำอธิบายนี้ และฉันกับ @Quincunx ว่านี่มีบางอย่างที่เหมือนกับธรรมชาติของควินิน
dmckee

@Quincunx ฉันได้เพิ่มแท็ก quine
Timtech

1
@Quincunx จริง แต่ไม่มีใครทำอย่างนั้นจนกว่าคุณจะเรียก quine โปรแกรมใด ๆ ที่อ่านซอร์สโค้ดของมันจากดิสก์และพิมพ์ออกมา: p
aditsu

2
@aditsu ฉันไม่ชอบคำตอบเหล่านั้น ฉันคิดว่าฉันจะโพสต์คำตอบที่ไม่ดีมากที่ไม่ได้ทำ โดยส่วนตัวฉันรู้สึกว่าการอ่านซอร์สโค้ดผ่านไฟล์เป็นการโกง โปรแกรมควรทำงานได้ทุกที่!
Justin

คำตอบ:


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


4

J (62)

เนื่องจากคุณไม่ได้ห้ามสิ่งนี้ ...

จัดเก็บโปรแกรมตามลำดับ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และ0ผลลัพธ์เป็นศูนย์0s คือไม่มีอะไร)
  • echo: เอาท์พุท
  • exit: exit (ล่าม J ไม่ได้ออกตามค่าเริ่มต้นเมื่อถึงจุดสิ้นสุดของไฟล์)
$ jconsole A <B
1
$ jconsole A <foo
$ jconsole B <A
$ jconsole B <foo
1
$

คุณช่วยอธิบายสั้น ๆ เกี่ยวกับสิ่งนี้ได้ไหม?
ike

@ike: ทำเช่นนั้น _______
marinus

3

Haskell - ไม่มีแหล่งโหลด - 478 644ตัวอักษร

สิ่งนี้อนุมานว่าเนื้อหาจะจบลงด้วยการขึ้นบรรทัดใหม่และลดตัวละครสุดท้ายโดยไม่ตรวจสอบเพราะฉันไม่รู้สึกอยากหนี

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

มันทำงานได้เหมือน quine มาตรฐาน แต่การสลับ - สำหรับ * เพื่อรับโปรแกรมอื่น (หลีกเลี่ยงอักขระเหล่านั้นที่อื่น)

การทดสอบต่อไปนี้พิมพ์ตามที่คาดไว้ (แทนที่ main = interact $ ด้วย a = and 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 (ตั้งชื่อตามตัวอักษรb):

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

การทารุณกรรมทั้งหมดที่นั่นโดยที่.py- ทำงานได้จริง
Timtech

ฉันแน่ใจว่า @LegoStormtroopr จะทำงานในลักษณะเดียวกับตัวอย่าง Ruby ของฉันที่โพสต์ไว้ที่นี่ไม่กี่นาทีก่อนหน้านี้ ;-)
Darren Stone

1
@Timtech python aมันไม่ถ้าคุณเรียกพวกเขาจากบรรทัดคำสั่งเป็น

ฉันหมายถึงมันเป็นไปได้หรือไม่ที่จะสร้างไฟล์โดยไม่มีนามสกุล?
Timtech

5
แน่นอนมันคืออะไร? หากคุณอยู่ในเครื่อง Posix touch aจะสร้างไฟล์ว่างเปล่าหากคุณมีสิทธิ์ เพื่อความสนุกสนานที่โหดร้ายเป็นพิเศษคุณสามารถทำได้touch \~โดยสร้างไฟล์ที่มีชื่อตัวหนอนตัวเดียว ( ~) - จากนั้นดูว่ามีใครบางคนพยายามลบมันอย่างไม่เป็น

2

Ruby, 166 chars, ไม่มีแหล่งอ่าน

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 คืออะไร และ heredoc จะสิ้นสุดที่ใด
aditsu

pเป็นวิธี ruby ​​ในตัวที่พิมพ์อาร์กิวเมนต์ที่ส่งผ่านไปแล้วส่งคืนอาร์กิวเมนต์เหล่านั้นทำให้มีประโยชน์สำหรับเอาต์พุตกอล์ฟ เมื่อถูกเรียกโดยไม่มีอาร์กิวเมนต์มันจะส่งกลับค่าศูนย์ อาร์กิวเมนต์ to getsเป็นตัวคั่นดังนั้นส่งผ่านpผลลัพธ์ในตัวคั่น nil ซึ่งหมายความว่ามันอ่าน STDIN จนกว่าจะถึง EOF นิพจน์ heredoc คือ<<2ดังนั้นจึงสิ้นสุดที่ (และไม่รวม), 2 ที่ท้ายไฟล์
ฮิสโทแกต

การใช้2เป็นตัวคั่น heredoc เป็นบิตของความสับสน มันสามารถเป็นสตริงได้เกือบทุกชนิด
ชำนาญวิชาประวัติศาสตร์

มีการประเมินเนื้อหาของ heredoc หรือไม่?
aditsu

1

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

ทำไมรวบรวมสองครั้ง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 อ่านเนื้อหาของสคริปต์และ evals มันหลังจากการสลับชื่อไฟล์และผู้ประกอบการไปยังandor

ฉันตั้งชื่อไฟล์&และ|เพื่อให้สามารถทำการแทนที่เดียวใน Script B


1

Python 3 - 102 ตัวอักษร

พิมพ์ 1 หากอินพุตเหมือนกับโปรแกรม 2 ไม่เช่นนั้นจะไม่มีอะไร:

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

@JMansfield ใช่ฉันรู้ แต่ฉันไม่ได้นับบรรทัดใหม่
Hosch250

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

ความคิดเห็น Meta: งานแสดงสินค้า R ค่อนข้างไม่ดีนักในรหัสกอล์ฟเนื่องจากไม่มีทางลัดไปfunction...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.