Znam cię, ale ty mnie nie znasz

18

Twoim zadaniem jest napisanie dwóch programów. Program A nie może drukować niczego na wszystkich wejściach, z wyjątkiem sytuacji, gdy wprowadzony jest program B , w którym to przypadku powinien wydrukować 1. Program B musi drukować 1na wszystkich wejściach, z wyjątkiem sytuacji, gdy wprowadzony jest program A , w którym to przypadku nie powinien nic drukować.

Punktacja:

  • +1 za każdą postać z obu programów.
  • Najniższy wynik wygrywa.
ike
źródło
3
Czy to quine-ish wystarczy, aby oznaczyć go jako quine ? Z pewnością tak mi się wydaje.
Justin
Jak wskazują dwie pierwsze opublikowane odpowiedzi, „bycie” innym programem nie jest zbyt dobrze zdefiniowane w tych opisach. I jestem z @Quincunx, że ma to coś bardzo podobnego do natury quine.
dmckee
@Quincunx Dodałem tag quine.
Timtech
1
@Quincunx prawda, ale nikt nie robi, że tak daleko, chyba że również nazywać Quine dowolny program, który odczytuje jego kod źródłowy z dysku i drukuje je na zewnątrz: p
aditsu
2
@aditsu Bardzo nie lubię tych odpowiedzi. Myślę, że opublikuję bardzo nieoptymalną odpowiedź, która tego nie robi. Osobiście uważam, że czytanie kodu źródłowego przez pliki jest oszustwem; programy powinny działać wszędzie!
Justin

Odpowiedzi:

5

GTB , 25

Wykonane z kalkulatora TI-84

Program A

`_@_eq;"$w;&

Program B

`_@_eq;"$#w;&

Wyjaśnienie

`_ Wpisz ciąg

@_eq;"Sprawdź, czy jest on równy kodowi źródłowemu ( #jest automatycznie usuwany wraz z małymi literami)

$w;&Jeśli tak, wyświetl 1 (w przeciwnym razie nic) [ Bponieważ $#w;&- jeśli nie, wyświetl 1 (w przeciwnym razie nic)]

Timtech
źródło
12

Bash - 32 znaki

Skrypt A - 16 znaków

cmp -s b&&echo 1

Skrypt B - 16 znaków

cmp -s a||echo 1

Stosowanie

$> echo "foo" | ./a
$> cat b | ./a
1
$> echo "foo" ./b
foo ./b
$> cat a | ./b
JayQuerie.com
źródło
5

Ruby, 54

ZA

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

b

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

przykłady:

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
źródło
4

J (62)

Ponieważ nie zabroniłeś tego ...

Zapisz programy jako AiB odpowiednio odpowiednio.

Program A (30):

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

Program B (32):

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

Jak to działa (program B, A jest podobny):

  • 1!:1[3: przeczytaj standardowe
  • 1!:1<'A': przeczytaj plik A
  • -:: sprawdź, czy są równe
  • -.: zaneguj wynik
  • #~: sam powiel wynik (więc 1daje jeden 1i 0daje zero 0s, tzn. nic)
  • echo: wynik
  • exit: exit (interpreter J nie kończy domyślnie po osiągnięciu końca pliku)
$ jconsole A <B
1
$ jconsole A <foo
$ jconsole B <A
$ jconsole B <foo
1
$
marinus
źródło
Czy możesz krótko wyjaśnić, co to robi?
ike
@ike: zrobił to _______
marinus
3

Haskell - BEZ źródła ładowania - 478 644 znaków

Zakłada się, że getContents ZAWSZE kończy się nową linią, więc upuszcza końcową postać bez sprawdzania, ponieważ nie mam ochoty jej uciekać

ZA

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

Działa jak standardowy quine, ale zamienia - na *, aby uzyskać inny program (unikając znaków gdzie indziej).

Następujące testy są drukowane zgodnie z oczekiwaniami (zamieniając main = interact $ na a = ib =)

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
źródło
Również jeśli istnieje preferowany sposób formatowania monolitycznych funkcji jednowierszowych, który byłby przydatny, meta.stackexchange.com/questions/22186/… nie wydaje się to obejmować
Toeofdoom
2

Python 2.7 - 82

Plik A (dosłownie nazwany po prostu a):

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

Plik B (dosłownie nazwany po prostu b):

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

źródło
Całkowite znęcanie się bez .py- czy to w ogóle działa?
Timtech
Jestem pewien, że @LegoStormtroopr działałby w taki sam sposób, jak moje przykłady Ruby zamieszczone tutaj, kilka minut wcześniej. ;-)
Darren Stone
1
@Timtech Robi się, jeśli uruchomisz je z wiersza poleceń jako python a.
Miałem na myśli, czy można nawet wygenerować plik bez rozszerzenia?
Timtech
5
Oczywiście, że jest? Jeśli korzystasz z komputera Posix touch a, utworzysz pusty plik, jeśli masz uprawnienia. Aby uzyskać dodatkową okrutną zabawę, możesz nawet zrobić, touch \~który tworzy plik o nazwie z jedną tyldą ( ~) - a następnie obserwuj, jak ktoś głupio próbuje go usunąć;)
2

Ruby, 166 znaków, brak źródła czytania

ZA:

(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

Upewnij się, że twój edytor tekstu nie oszczędza z końcowym znakiem nowej linii.

Zastosowanie (przykład):

 $ 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

Każdy program konstruuje źródło drugiego programu za pomocą HEREdoc i przekształca ciąg znaków, a następnie porównuje wynik z danymi wejściowymi.

histocrat
źródło
Łatwo było to napisać, ale teraz jakaś część mojego mózgu, która nie rozumie rekurencji, upiera się, że można ją zoptymalizować, ale nie ma pojęcia, jak to zrobić.
histokrata
Co to jest p? A gdzie kończy się heredok?
aditsu
pjest wbudowaną metodą ruby, która drukuje przekazane do niej argumenty, a następnie zwraca te argumenty, dzięki czemu jest przydatna w przypadku gry w golfa. Po wywołaniu bez argumentów zwraca zero. Argumentem getsjest separator, więc przekazanie ppowoduje separator zerowy, co oznacza, że ​​odczytuje STDIN, dopóki nie dotrze do EOF. Wyrażenie heredoc jest <<2, więc kończy się na (i nie obejmuje) 2 na końcu pliku.
histokrata
Użycie 2jako ogranicznika heredoc jest tradycyjnym kawałkiem zaciemnienia. Może to być prawie każdy ciąg.
histokrata
Czy treść heredoka jest w jakiś sposób oceniana?
aditsu
1

Haskell - 138

Niezbyt dobra odpowiedź, ale chciałem, aby oba programy korzystały z tego samego źródła. Można zapisać niektóre znaki, zmieniając nazwę pliku, ale to nie sprawi, że będzie to zwycięskie rozwiązanie, więc nie sądzę, żeby było warto.

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

Skompiluj to źródło zarówno jako, jak Ai B.

Test:

% 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
źródło
po co dwa razy kompilować A, a następnie kopiować Ado B?
mniip
To był błąd z mojej strony podczas kopiowania kodu. Dzięki za zwrócenie na to uwagi. Naprawię.
shiona
1

Node.js - 142 znaki

Skrypt |(znany również jako Skrypt A) - 80 znaków

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

Skrypt &(znany również jako Skrypt B) - 62 znaki

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

Stosowanie

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

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

Opis

Skrypt B odczytuje zawartość skryptu A i analizuje go po zamianie nazw plików i andoperatora na or.

Nazwałam pliki &i |tak mogę wykonać pojedynczy zastąpić w skrypcie B.

JayQuerie.com
źródło
1

Python 3-102 znaków

Wyświetla 1, jeśli dane wejściowe są takie same jak program 2, w przeciwnym razie nic:

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

Wyświetla 1, jeśli dane wejściowe nie są takie same jak program 1, w przeciwnym razie nic:

if input()==open('a.py').read():print('1')
Hosch250
źródło
Czy nie można usunąć białych znaków? Możesz także skrócić skrypty z t.py i tt.py do a.py i b.py.
Timtech,
@Timtech Pewnie, dobry pomysł. Nie liczyłem też białych znaków - to po prostu dla czytelności. Nie można jednak usunąć nowych wierszy.
Hosch250,
Tak, jestem świadomy nowej linii czułości Pythona.
Timtech,
Tylko jedną z nowych linii można naprawdę usunąć, to znaczy po dwukropku. Inne wymagałyby dodania średników, więc usunięcie nowych znaków nie ma żadnej korzyści.
AJMansfield,
@AJMansfield Tak, wiem, ale i tak nie liczyłem nowych linii.
Hosch250,
0

bash / grep - 59 znaków

51 znaków, jeśli policzymy tylko rzeczywisty ciąg programu.

$ 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
źródło
-1

R (62 znaków)

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

produkuje:

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

Meta komentarz: R targi stosunkowo słabo kodują, ponieważ nie ma skrótu do function...

Henrik
źródło