Saya tahu Anda, tetapi Anda tidak mengenal saya

18

Anda ditugaskan menulis dua program. Program A harus mencetak apa pun pada semua input kecuali ketika program B adalah input, dalam hal ini harus dicetak 1. Program B harus mencetak 1pada semua input kecuali ketika program A adalah input, dalam hal ini tidak boleh mencetak apa pun.

Mencetak:

  • +1 Untuk setiap karakter dari kedua program.
  • Skor terendah menang.
ike
sumber
3
Apakah quine-ish ini cukup untuk menandai sebagai quine ? Jelas bagi saya hal itu tampak demikian.
Justin
Seperti yang ditunjukkan oleh dua jawaban pertama yang diposting, "menjadi" program lain tidak terlalu didefinisikan dengan baik dalam deskripsi ini. Dan, saya dengan @ Quincunx bahwa ini memiliki sesuatu yang sangat mirip dengan sifat quine.
dmckee
@ Quincunx Saya telah menambahkan tag quine.
Timtech
1
@ Quincunx benar, tetapi tidak ada yang melakukan sejauh ini, kecuali jika Anda juga memanggil quine setiap program yang membaca kode sumbernya dari disk dan mencetaknya: p
aditsu
2
@ Aditsu Saya sangat tidak menyukai jawaban itu. Saya pikir saya akan memposting jawaban yang sangat tidak optimal yang tidak melakukannya. Saya pribadi merasa bahwa membaca kode sumber melalui file curang; program harus bekerja di mana saja!
Justin

Jawaban:

5

GTB , 25

Dieksekusi dari kalkulator TI-84

Program A

`_@_eq;"$w;&

Program B

`_@_eq;"$#w;&

Penjelasan

`_ Masukkan string

@_eq;"Periksa apakah itu sama dengan kode sumber ( #secara otomatis dihapus bersama dengan huruf kecil)

$w;&Jika demikian, tampilkan 1 (jika tidak ada) [untuk Bitu $#w;&- jika tidak, tampilkan 1 (jika tidak ada)]

Timtech
sumber
12

Bash - 32 karakter

Script A - 16 karakter

cmp -s b&&echo 1

Script B - 16 karakter

cmp -s a||echo 1

Pemakaian

$> echo "foo" | ./a
$> cat b | ./a
1
$> echo "foo" ./b
foo ./b
$> cat a | ./b
JayQuerie.com
sumber
5

Ruby, 54

SEBUAH

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

B

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

contoh:

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$ 
Darren Stone
sumber
4

J (62)

Karena Anda tidak melarang ini ...

Simpan program sebagai AdanB masing masing.

Program A (30):

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

Program B (32):

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

Cara kerjanya (Program B, A serupa):

  • 1!:1[3: baca stdin
  • 1!:1<'A': baca file A
  • -:: lihat apakah mereka sama
  • -.: meniadakan hasilnya
  • #~: mereplikasi hasil dengan sendirinya (jadi, 1hasil dalam satu 1dan 0hasil dalam nol 0s, yaitu tidak ada)
  • echo: output
  • exit: exit (J interpreter tidak keluar secara default saat mencapai akhir file)
$ jconsole A <B
1
$ jconsole A <foo
$ jconsole B <A
$ jconsole B <foo
1
$
marinus
sumber
Bisakah Anda memberikan penjelasan singkat tentang apa ini?
Seperti
@ike: melakukannya _______ Jerman
marinus
3

Haskell - TANPA memuat sumber - 478 644 karakter

Ini mengasumsikan getContents SELALU berakhir dengan baris baru dan menjatuhkan karakter terakhir tanpa memeriksa karena saya tidak merasa ingin melarikan diri

SEBUAH

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

Ini bekerja seperti quine standar, tetapi bertukar - untuk * untuk mendapatkan program lain (menghindari karakter tersebut di tempat lain).

Tes berikut dicetak seperti yang diharapkan (mengganti main = berinteraksi $ dengan a = dan 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
Toeofdoom
sumber
Juga jika ada cara yang lebih disukai untuk memformat fungsi baris tunggal monolitik yang akan berguna, meta.stackexchange.com/questions/22186/… tampaknya tidak menutupinya
Toeofdoom
2

Python 2.7 - 82

File A (secara harfiah bernama adil a):

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

File B (secara harfiah bernama adil b):

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

sumber
Total penyalahgunaan di sana tanpa .py- apakah itu bekerja?
Timtech
Saya yakin @LegoStormtroopr akan berjalan dengan cara yang sama seperti contoh Ruby saya yang diposting di sini, beberapa menit sebelumnya. ;-)
Darren Stone
1
@Timtech Tidak jika Anda menjalankannya dari baris perintah sebagai python a.
Maksud saya, mungkinkah menghasilkan file tanpa ekstensi?
Timtech
5
Tentu saja? Jika Anda menggunakan mesin Posix touch aakan membuat file kosong jika Anda memiliki izin. Untuk kesenangan ekstra kejam, Anda bahkan dapat melakukan touch \~yang membuat file dengan nama single tilde ( ~) - lalu tonton ketika seseorang dengan bodohnya mencoba menghapusnya;)
2

Ruby, 166 karakter, tidak ada sumber bacaan

SEBUAH:

(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

Pastikan editor teks Anda tidak menyimpan dengan baris baru tambahan.

Penggunaan (contoh):

 $ 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

Setiap program mengkonstruksikan sumber program lain menggunakan HEREdoc dan transformasi string, kemudian membandingkan hasilnya dengan input.

histokrat
sumber
Ini cukup mudah untuk ditulis, tetapi sekarang beberapa bagian otak saya yang tidak mengerti rekursi bersikeras untuk dapat dioptimalkan tetapi tidak tahu caranya.
histokrat
Apa itu p? Dan di mana heredoc berakhir?
aditsu
padalah metode ruby ​​bawaan yang mencetak argumen yang diteruskan ke sana, lalu mengembalikan argumen itu, menjadikannya berguna untuk keluaran yang di-golf. Ketika dipanggil tanpa argumen, ia mengembalikan nihil. Argumen untuk getsadalah pembatas, sehingga meneruskan pmenghasilkan pembatas nil yang berarti membaca STDIN sampai mencapai EOF. Ekspresi heredoc adalah <<2, jadi itu berakhir pada (dan tidak termasuk), 2 di akhir file.
histokrat
Penggunaan 2sebagai pembatas heredoc adalah sedikit kebingungan tradisional. Ini bisa berupa string apa saja.
histokrat
Apakah konten heredoc dievaluasi entah bagaimana?
aditsu
1

Haskell - 138

Bukan jawaban yang benar-benar bagus, tetapi ingin membuat kedua program menggunakan sumber yang sama. Bisa menyimpan beberapa karakter dengan mengganti nama file, tetapi itu tidak akan menjadikan ini solusi yang unggul jadi saya tidak berpikir itu sepadan.

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

Kompilasi sumber ini sebagai keduanya Adan B.

Uji:

% 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
shiona
sumber
mengapa kompilasi ke dua kali A, lalu salin Ake B?
mniip
Itu adalah kesalahan saya ketika menyalin kode. Terima kasih telah menunjukkannya. Akan memperbaiki.
shiona
1

Node.js - 142 karakter

Script |(atau dikenal sebagai Script A) - 80 karakter

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

Script &(atau dikenal sebagai Script B) - 62 karakter

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

Pemakaian

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

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

Deskripsi

Script B membaca konten Script A dan mengevaluasinya setelah bertukar nama file dan and operator ke or.

Saya menamai file-file tersebut &dan |saya dapat melakukan penggantian tunggal dalam Script B.

JayQuerie.com
sumber
1

Python 3 - 102 karakter

Mencetak 1 jika inputnya sama dengan program 2, jika tidak apa-apa:

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

Mencetak 1 jika input tidak sama dengan program 1, jika tidak apa-apa:

if input()==open('a.py').read():print('1')
Hosch250
sumber
Tidak bisakah spasi dihapus? Anda juga dapat mempersingkat skrip dari t.py dan tt.py ke a.py dan b.py.
Timtech
@Timtech Tentu, ide bagus. Juga, saya tidak menghitung ruang putih - itu hanya ada untuk dibaca. Baris baru tidak bisa dihapus.
Hosch250
Ya, saya mengetahui sensitivitas baris baru Python.
Timtech
Hanya satu dari baris baru yang benar-benar dapat dihapus, yaitu setelah titik dua. Yang lain akan perlu titik koma ditambahkan, sehingga tidak ada keuntungan untuk menghapus baris baru itu.
AJMansfield
@ AJMansfield Ya, saya tahu, tapi saya tetap tidak menghitung baris baru.
Hosch250
0

bash / grep - 59 karakter

51 karakter jika kita hanya menghitung string program yang sebenarnya.

$ 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
Andrew Cheong
sumber
-1

R (62 karakter)

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

menghasilkan:

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

Meta comment: R menunjukkan relatif buruk pada kode golf karena tidak ada jalan pintas untuk function...

Henrik
sumber