Ti conosco, ma tu non mi conosci


18

Hai il compito di scrivere due programmi. Il programma A non deve stampare nulla su tutti gli ingressi tranne quando è inserito il programma B , nel qual caso dovrebbe stampare 1. Il programma B deve essere stampato 1su tutti gli ingressi tranne quando è inserito il programma A , nel qual caso non dovrebbe stampare nulla.

punteggio:

  • +1 per ogni personaggio di entrambi i programmi.
  • Il punteggio più basso vince.

3
Questo quine-ish è abbastanza per etichettarlo come quine ? Mi sembra certamente così.
Justin,

Come indicano le prime due risposte pubblicate, "essere" un altro programma non è terribilmente ben definito in queste descrizioni. E sono con @Quincunx che ha qualcosa di molto simile alla quine-natura.
Dmckee,

@Quincunx Ho aggiunto il tag quine.
Timtech,

1
@Quincunx è vero, ma nessuno lo sta facendo finora, a meno che tu non chiami un quine qualsiasi programma che legga il suo codice sorgente dal disco e lo stampi: p
aditsu

2
@aditsu Non mi piacciono molto quelle risposte. Penso che posterò una risposta molto subottimale che non lo fa. Personalmente ritengo che leggere il codice sorgente attraverso i file sia un imbroglio; i programmi dovrebbero funzionare ovunque!
Justin,

Risposte:


5

GTB , 25

Eseguito da una calcolatrice TI-84

Programma A

`_@_eq;"$w;&

Programma B

`_@_eq;"$#w;&

Spiegazione

`_ Inserisci una stringa

@_eq;"Controlla se è uguale al codice sorgente ( #viene automaticamente rimosso insieme alle lettere minuscole)

$w;&In tal caso, visualizzare 1 (altrimenti niente) [perché Bè $#w;&- in caso contrario, visualizzare 1 (altrimenti niente)]


12

Bash - 32 caratteri

Script A - 16 caratteri

cmp -s b&&echo 1

Script B - 16 caratteri

cmp -s a||echo 1

uso

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

5

Ruby, 54

UN

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

B

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

esempi:

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)

Dal momento che non l'hai proibito ...

Memorizza i programmi come Ae Brispettivamente.

Programma A (30):

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

Programma B (32):

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

Come funziona (il programma B, A è simile):

  • 1!:1[3: leggi stdin
  • 1!:1<'A': leggi il file A
  • -:: vedi se sono uguali
  • -.: annulla il risultato
  • #~: replicare il risultato da solo (quindi, 1risulta in uno 1e 0risulta in zero 0s, cioè niente)
  • echo: produzione
  • exit: exit (l'interprete J non esce di default quando raggiunge la fine del file)
$ jconsole A <B
1
$ jconsole A <pippo
$ jconsole B <A
$ jconsole B <pippo
1
$

Puoi dare una breve spiegazione di ciò che fa?
Ike,

@ike: fatto _______
Marin

3

Haskell - SENZA fonte di caricamento - 478 644 caratteri

Questo presuppone che getContents finisca SEMPRE con una nuova riga e quindi abbandoni il personaggio finale senza controllarlo perché non ho voglia di sfuggirlo

UN

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

Funziona come un normale quine, ma scambiando - per * per ottenere l'altro programma (evitando quei caratteri altrove).

Il seguente test viene stampato come previsto (sostituendo main = interact $ con a = e 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

Inoltre, se esiste un modo preferito per formattare le funzioni monolitiche a riga singola che sarebbe utile, meta.stackexchange.com/questions/22186/… non sembra coprirlo
Toeofdoom

2

Python 2.7 - 82

File A (letteralmente chiamato solo a):

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

File B (letteralmente chiamato solo b):

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

Totale abuso lì senza il .py- funziona anche?
Timtech,

Sono sicuro che @LegoStormtroopr funzionerebbe allo stesso modo dei miei esempi di Ruby pubblicati qui, pochi minuti prima. ;-)
Darren Stone,

1
@Timtech Lo fa se li esegui dalla riga di comando come python a.

Volevo dire è possibile anche generare un file senza estensione?
Timtech,

5
Ovviamente è? Se sei su una macchina Posix touch acreerà un file vuoto se hai le autorizzazioni. Per un divertimento ancora più crudele puoi anche fare ciò touch \~che crea un file chiamato con una sola tilde ( ~) - quindi guarda come qualcuno cerca

2

Rubino, 166 caratteri, nessuna fonte di lettura

UN:

(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

Assicurati che il tuo editor di testo non salvi con una nuova riga finale.

Utilizzo (esempio):

 $ 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

Ogni programma costruisce l'origine dell'altro programma usando un HEREdoc e trasforma le stringhe, quindi confronta il risultato con l'input.


È stato abbastanza facile da scrivere, ma ora una parte del mio cervello che non capisce la ricorsione insiste sul fatto che può essere ottimizzata ma non ha idea di come.
istocratico

Che cos'è p? E dove finisce l'eredità?
aditsu,

pè un metodo ruby ​​incorporato che stampa gli argomenti passati ad esso, quindi restituisce tali argomenti, rendendolo utile per l'output golf. Quando viene chiamato senza argomenti restituisce zero. L'argomento getsè un delimitatore, quindi il passaggio prisulta in un delimitatore zero, il che significa che legge STDIN fino a quando non arriva a EOF. L'espressione ereditaria è <<2, quindi termina in (e non include), il 2 alla fine del file.
istocratico

L'uso di 2come delimitatore ereditario è un po 'offuscato tradizionale. Può essere quasi qualsiasi stringa.
istocratico

Il contenuto dell'ereditarietà è valutato in qualche modo?
aditsu,

1

Haskell - 138

Non è proprio una buona risposta, ma voleva che entrambi i programmi utilizzassero la stessa fonte. Potrebbe salvare alcuni caratteri rinominando il file, ma non renderà questa soluzione vincente, quindi non credo ne valga la pena.

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

Compila questa fonte come entrambi Ae 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

perché compilare due volte in A, quindi copiarlo Ain B?
mniip,

È stato un errore da parte mia quando ho copiato il codice. Grazie per la segnalazione. Risolverà.
shiona,

1

Node.js - 142 caratteri

Script |(altrimenti noto come Script A) - 80 caratteri

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

Script &(altrimenti noto come Script B) - 62 caratteri

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

uso

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

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

Descrizione

Lo script B legge il contenuto dello script A e lo elimina dopo aver scambiato i nomi dei file e l' andoperatore in un or.

Ho chiamato i file &e |quindi posso eseguire una singola sostituzione nello script B.


1

Python 3 - 102 caratteri

Stampa 1 se l'ingresso è uguale al programma 2, altrimenti nulla:

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

Stampa 1 se l'ingresso non è uguale al programma 1, altrimenti nulla:

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

Lo spazio bianco non può essere rimosso? Inoltre è possibile abbreviare gli script da t.py e tt.py a a.py e b.py.
Timtech,

@Timtech Certo, buona idea. Inoltre, non stavo contando lo spazio bianco, che è lì solo per la leggibilità. Tuttavia, le nuove righe non possono essere rimosse.
Hosch250,

Sì, sono consapevole della sensibilità newline di Python.
Timtech,

Solo una delle newline può davvero essere rimossa, quella dopo i due punti. Gli altri avrebbero bisogno di punti e virgola aggiunti, quindi non c'è alcun vantaggio nel rimuovere quelle nuove righe.
AJMansfield,

@AJMansfield Sì, lo so, ma non ho comunque contato i newline.
Hosch250,

0

bash / grep - 59 caratteri

51 caratteri se contiamo solo la stringa di programma effettiva.

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

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

produce:

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

Meta commento: R fa fiere relativamente cattive sul code golf in quanto non esiste un collegamento a function...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.