Seni biliyorum ama sen beni tanımıyorsun


18

İki program yazmakla görevlisiniz. Program A , program B girilmesi dışında tüm girişlere hiçbir şey yazdırmamalıdır , bu durumda yazdırmalıdır . Program B çıktısını gerekir bütün girdilere hariç programı A hiçbir şey yazdırmalısınız bu durumda olduğunu girdi.11

puanlama:

  • +1 Her iki programdaki her karakter için .
  • En düşük puan kazanır.

3
Bu quine-ish onu quine olarak etiketlemek için yeterli mi? Bana öyle geliyor ki.
Justin

Gönderilen ilk iki cevabın belirttiği gibi, başka bir program "olmak" bu açıklamalarda çok iyi tanımlanmamıştır. Ve @Quincunx ile birlikteyim ki bunun kine-doğaya çok benziyor.
dmckee

@Quincunx Quine etiketini ekledim.
Timtech

1
@Quincunx true, ancak kaynak kodunu diskten okuyan ve çıktısını alan herhangi bir programı kine çağırmadıkça, şu ana kadar kimse bunu yapmıyor: p
aditsu

2
@aditsu Bu cevaplardan çok hoşlanmıyorum. Bence bunu yapmayan çok düşük bir cevap göndereceğim. Ben şahsen dosyaları aracılığıyla kaynak kodu okumak hile hissediyorum; programlar her yerde çalışmalıdır!
Justin

Yanıtlar:


5

GTB , 25

Bir TI-84 hesap makinesinden yürütülür

program A

`_@_eq;"$w;&

program B

`_@_eq;"$#w;&

açıklama

`_ Bir dize girin

@_eq;"Kaynak koduna eşit olup olmadığını kontrol edin ( #küçük harflerle otomatik olarak soyulur)

$w;&[İçin Öyleyse, 1 (Aksi şey) görüntüler Bbu kadar $#w;&- değilse, görüntü 1 (Aksi şey)]


12

Bash - 32 karakter

Komut dosyası A - 16 karakter

cmp -s b&&echo 1

Senaryo B - 16 karakter

cmp -s a||echo 1

kullanım

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

5

Yakut, 54

bir

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

B

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

örnekler:

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)

Bunu yasaklamadığınız için ...

Programları AveB sırasıyla saklayın.

Program A (30):

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

Program B (32):

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

Nasıl çalışır (Program B, A benzerdir):

  • 1!:1[3: okuma stdin
  • 1!:1<'A': dosyayı oku A
  • -:: eşit olup olmadıklarına bakın
  • -.: sonucu olumsuzlamak
  • #~: sonucu tek başına çoğaltır (yani, bir 1sonuç verir ve sıfır s 1ile 0sonuçlanır 0, yani hiçbir şey)
  • echo: çıktı
  • exit: exit (J yorumlayıcısı dosyanın sonuna geldiğinde varsayılan olarak çıkmaz)
$ jconsole A <B
1
$ jconsole A <foo
$ jconsole B <A
$ jconsole B <foo
1
$

Bunun ne yaptığına dair kısa bir açıklama yapabilir misiniz?
ike

@ike: öyle yaptı _______
marinus

3

Haskell - Yükleme kaynağı OLMADAN - 478 644 karakter

Bu getContents HER ZAMAN bir satırsonu ile sona erdiğini varsayar ve bu yüzden son karakteri kontrol etmeden bırakır çünkü kaçmak istemiyorum

bir

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

Standart bir quine gibi çalışır, ancak diğer programı almak için * değiştirmek (başka yerlerde bu karakterlerden kaçınmak için).

Aşağıdaki test beklendiği gibi yazdırılır (main = interaktif $ ile a = ve b = yerine)

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

Ayrıca, monolitik tek satır işlevlerini kullanışlı olacak şekilde biçimlendirmek için tercih edilen bir yol varsa, meta.stackexchange.com/questions/22186/… bunu kapsamıyor gibi görünmüyor
Toeofdoom

2

Python 2.7-82

A Dosyası (kelimenin tam anlamıyla adlandırılmış a):

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

Dosya B (tam anlamıyla sadece adlandırılmış b):

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

Orada olmadan tam istismar .py- bu bile işe yarıyor mu?
Timtech

Eminim @LegoStormtroopr, birkaç dakika önce Ruby örnekleriimle aynı şekilde çalışır. ;-)
Darren Stone

1
@Timtech Bunları komut satırından olarak çalıştırırsanız yapar python a.

Yani uzantısı olmayan bir dosya bile oluşturmak mümkün mü?
Timtech

5
Tabiki öyle? Posix makinesindeyseniz touch a, izinleriniz varsa boş bir dosya oluşturur. Ekstra zalim eğlence için bile yapabilirsiniz touch \~tek bir tilde ( ~) adlı bir dosya oluşturur - sonra birisi aptalca kaldırmaya çalışırken izleyin;)

2

Ruby, 166 karakter, okuma kaynağı yok

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

Metin düzenleyicinizin sondaki yeni satırla kaydetmediğinden emin olun.

Kullanım (örnek):

 $ 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

Her program, bir HEREdoc ve string dönüşümleri kullanarak diğer programın kaynağını oluşturur, ardından sonucu girdiyle karşılaştırır.


Bu yazmak için yeterince kolaydı, ama şimdi beynimin özyinelemeyi anlamayan bir kısmı optimize edilebileceği konusunda ısrar ediyor, ancak nasıl yapılacağı hakkında hiçbir fikri yok.
histokrat

P nedir? Yorumlu metin nerede bitiyor?
aditsu

pkendisine iletilen bağımsız değişkenleri yazdıran, ardından bu bağımsız değişkenleri döndürerek golf çıktısı için kullanışlı hale getiren yerleşik bir yakut yöntemidir. Hiçbir argüman olmadan çağrıldığında nil döndürür. Argümanı getsbir sınırlayıcıdır, bu yüzden geçmek psıfır sınırlayıcı ile sonuçlanır, bu da EOF'a ulaşana kadar STDIN'i okuduğu anlamına gelir. Yorumlu metin ifadesi, <<2dosyanın sonunda 2 ile biter (ve içermez).
histokrat

2Yorumlu metin sınırlayıcı olarak kullanımı geleneksel bir gizleme parçasıdır. Neredeyse herhangi bir dize olabilir.
histokrat

Yorumlu metin içeriği bir şekilde değerlendiriliyor mu?
aditsu

1

Haskell - 138

Gerçekten iyi bir cevap değil, ama her iki programın da aynı kaynağı kullanmasını istedim. Dosyayı yeniden adlandırarak bazı karakterleri kaydedebiliriz, ancak bunu kazanan bir çözüm yapmayacaktır, bu yüzden buna değer olduğunu düşünmüyorum.

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

Bu kaynağı hem Ave olarak derleyin B.

Ölçek:

% 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

neden derleme iki kez içine Ave sonra kopyalama Aiçin B?
Ocak'ta mniip

Kodu kopyalarken bu benim tarafımdan bir hataydı. Bunu işaret ettiğiniz için teşekkürler. Düzeltecek.
shiona

1

Node.js - 142 karakter

Script |(A Script olarak da bilinir) - 80 karakter

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

Komut Dosyası &(Komut Dosyası B olarak da bilinir) - 62 karakter

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

kullanım

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

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

Açıklama

Komut dosyası B, Komut dosyası A'nın içeriğini okur ve dosya adlarını ve andişleci bir or.

Dosyaları adlandırdım &ve |böylece Script B'de tek bir değişiklik yapabilirim.


1

Python 3-102 karakter

Giriş program 2 ile aynıysa 1 yazdırır, aksi takdirde hiçbir şey yazmaz:

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

Giriş program 1 ile aynı değilse 1 yazdırır, aksi takdirde hiçbir şey yazmaz:

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

Boşluk kaldırılamaz mı? Ayrıca komut dosyalarını t.py ve tt.py'den a.py ve b.py'ye kısaltabilirsiniz.
Timtech

@Timtech Elbette, iyi fikir. Ayrıca, beyaz boşluk saymıyordum - bu sadece okunabilirlik için var. Yeni satırlar kaldırılamaz.
Hosch250

Evet, Python'un yeni satır duyarlılığının farkındayım.
Timtech

Yeni satırlardan yalnızca biri, iki nokta üst üste işaretinden sonra gerçekten kaldırılabilir. Diğerlerinin noktalı virgül eklenmesi gerekir, bu nedenle bu satırları kaldırmanın bir avantajı yoktur.
AJMansfield

@AJMansfield Evet, biliyorum, ama yine de yeni satır saymadım.
Hosch250

0

bash / grep - 59 karakter

51 karakter yalnızca gerçek program dizesini sayarsak.

$ 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 karakter)

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

üretir:

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

Meta yorum: R kısayol yok gibi kod golf nispeten kötü fuarlar function...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.