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.

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)]


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

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$ 

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
$

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

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

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.


Ł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

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.


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')

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.