Ich kenne dich, aber du kennst mich nicht

18

Sie müssen zwei Programme schreiben. Programm A muss auf allen Eingaben nichts ausgeben, außer wenn Programm B eingegeben wird. In diesem Fall sollte es gedruckt werden 1. Programm B muss 1auf allen Eingaben gedruckt werden, außer wenn Programm A eingegeben wird. In diesem Fall sollte es nichts drucken.

Wertung:

  • +1 Für jedes Zeichen aus beiden Programmen.
  • Die niedrigste Punktzahl gewinnt.
ike
quelle
3
Ist das quine-ish genug, um es als quine zu kennzeichnen ? Das kommt mir sicher so vor.
Justin
Wie die ersten beiden Antworten zeigen, ist "Sein" eines anderen Programms in dieser Beschreibung nicht besonders gut definiert. Und ich bin mit @Quincunx, dass dies etwas sehr ähnliches wie die Quine-Natur hat.
dmckee
@ Quincunx Ich habe das Quine-Tag hinzugefügt.
Timtech
1
@Quincunx wahr, aber niemand tut das so weit, es sei denn , Sie auch ein quine jedes Programm aufrufen , die den Quellcode von der Festplatte liest und druckt sie aus: p
aditsu
2
@Aditsu Ich mag diese Antworten nicht. Ich denke, ich werde eine sehr suboptimale Antwort posten, die das nicht tut. Ich persönlich habe das Gefühl, dass das Lesen von Quellcode durch Dateien ein Betrug ist. Programme sollten überall funktionieren!
Justin

Antworten:

5

GTB , 25

Wird von einem TI-84-Rechner ausgeführt

Programm A

`_@_eq;"$w;&

Programm B

`_@_eq;"$#w;&

Erläuterung

`_ Geben Sie eine Zeichenfolge ein

@_eq;"Überprüfen Sie, ob es dem Quellcode entspricht ( #wird automatisch zusammen mit Kleinbuchstaben entfernt)

$w;&Wenn ja, angezeigt werden 1 (sonst nichts) [für Bsie ist $#w;&- wenn nicht, Anzeige 1 (sonst nichts)]

Timtech
quelle
12

Bash - 32 Zeichen

Skript A - 16 Zeichen

cmp -s b&&echo 1

Skript B - 16 Zeichen

cmp -s a||echo 1

Verwendung

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

Rubin, 54

EIN

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

B

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

Beispiele:

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
quelle
4

J (62)

Da du das nicht verboten hast ...

Speichern Sie die Programme als AundB jeweils.

Programm A (30):

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

Programm B (32):

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

Wie es funktioniert (Programm B, A ist ähnlich):

  • 1!:1[3: lese stdin
  • 1!:1<'A': Datei lesen A
  • -:: sehen, ob sie gleich sind
  • -.: negiere das Ergebnis
  • #~: repliziere das Ergebnis von selbst (also 1ergibt es eins 1und 0ergibt null 0s, dh nichts)
  • echo: Ausgabe
  • exit: exit (der J-Interpreter wird nicht standardmäßig beendet, wenn das Dateiende erreicht ist)
$ jKonsole A <B
1
$ jconsole A <foo
$ jconsole B <A
$ jconsole B <foo
1
$
Marinus
quelle
Können Sie kurz erläutern, was dies bewirkt?
ike
@ike: tat so _______
marinus
3

Haskell - OHNE Ladequelle - 478 644 Zeichen

Dies setzt voraus, dass getContents IMMER mit einem Zeilenumbruch endet und daher das letzte Zeichen ohne Überprüfung entfernt, da ich keine Lust habe, ihm zu entkommen

EIN

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

Es funktioniert wie ein Standard-Quine, tauscht jedoch - gegen *, um das andere Programm zu erhalten (wobei diese Zeichen an anderer Stelle vermieden werden).

Der folgende Test wird wie erwartet gedruckt (Ersetzen von main = interact $ durch a = und 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
quelle
Auch wenn es eine bevorzugte Möglichkeit gibt, monolithische einzeilige Funktionen zu formatieren, die praktisch wäre, scheint meta.stackexchange.com/questions/22186/… dies nicht zu behandeln
Toeofdoom
2

Python 2.7 - 82

Datei A (wörtlich nur genannt a):

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

Datei B (wörtlich nur genannt b):

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

quelle
Totaler Missbrauch dort ohne die .py- geht das überhaupt?
Timtech
Ich bin mir sicher, dass @LegoStormtroopr auf die gleiche Weise ausgeführt wird wie meine Ruby-Beispiele, die ich ein paar Minuten zuvor hier gepostet habe. ;-)
Darren Stone
1
@ Timtech Es funktioniert, wenn Sie sie über die Befehlszeile als ausführen python a.
Ich meinte, ist es möglich, sogar eine Datei ohne eine Erweiterung zu generieren?
Timtech
5
Natürlich ist es das? Wenn Sie sich auf einem Posix-Computer befinden, touch awird eine leere Datei erstellt, wenn Sie über Berechtigungen verfügen. Für zusätzlichen grausamen Spaß können Sie sogar touch \~eine Datei mit dem Namen einer einzelnen Tilde erstellen ( ~) - und dann zusehen, wie jemand tollkühn versucht, sie zu entfernen;)
2

Ruby, 166 Zeichen, keine Lesequelle

EIN:

(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

Stellen Sie sicher, dass Ihr Texteditor nicht mit einer nachgestellten Newline speichert.

Verwendung (Beispiel):

 $ 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

Jedes Programm erstellt mithilfe von HEREdoc und String-Transformationen die Quelle des anderen Programms und vergleicht dann das Ergebnis mit der Eingabe.

Histokrat
quelle
Das war leicht zu schreiben, aber jetzt besteht ein Teil meines Gehirns, das Rekursion nicht versteht, darauf, dass es optimiert werden kann, aber keine Ahnung hat, wie.
Histokrat
Was ist p? Und wo endet der Heredoc?
Aditsu
pist eine integrierte Ruby-Methode, die die übergebenen Argumente ausgibt und diese Argumente dann zurückgibt, was sie für die Golf-Ausgabe nützlich macht. Wenn es ohne Argumente aufgerufen wird , gibt es nil zurück. Das Argument zu getsist ein Begrenzer, so dass das Übergeben pzu einem Null-Begrenzer führt, was bedeutet, dass es STDIN liest, bis es zu EOF gelangt. Der Heredoc-Ausdruck <<2endet (und schließt nicht ein) mit der 2 am Ende der Datei.
Histokrat
Die Verwendung 2als Heredoc-Trennzeichen ist eine traditionelle Art der Verschleierung. Es kann fast jede Zeichenfolge sein.
Histokrat
Wird der Inhalt des Heredocs irgendwie bewertet?
Aditsu
1

Haskell - 138

Keine wirklich gute Antwort, wollte aber dafür sorgen, dass beide Programme dieselbe Quelle verwenden. Durch Umbenennen der Datei könnten einige Zeichen gespart werden, aber dies wird keine gewinnbringende Lösung sein, daher denke ich, dass es sich nicht lohnt.

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

Kompilieren Sie diese Quelle als Aund B.

Prüfung:

% 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
quelle
warum Kompilierung zweimal in A, und kopieren Sie dann Aauf B?
Mittwoch,
Das war ein Fehler von mir, als ich den Code kopiert habe. Vielen Dank für den Hinweis. Wird reparieren.
Shiona
1

Node.js - 142 Zeichen

Skript |(auch als Skript A bekannt) - 80 Zeichen

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

Skript &(auch als Skript B bezeichnet) - 62 Zeichen

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

Verwendung

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

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

Beschreibung

Skript B liest den Inhalt von Skript A und wertet ihn aus, nachdem die Dateinamen und der andOperator zu einem ausgetauscht wurden or.

Ich nannte die Dateien &und |so kann ich eine einzige ersetzen in Script B. ausführen

JayQuerie.com
quelle
1

Python 3 - 102 Zeichen

Gibt 1 aus, wenn die Eingabe mit Programm 2 identisch ist, andernfalls nichts:

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

Gibt 1 aus, wenn die Eingabe nicht mit Programm 1 übereinstimmt, andernfalls nichts:

if input()==open('a.py').read():print('1')
Hosch250
quelle
Kann das Leerzeichen nicht entfernt werden? Sie können die Skripte auch von t.py und tt.py auf a.py und b.py kürzen.
Timtech
@ Timtech Sicher, gute Idee. Außerdem habe ich keine Leerzeichen gezählt - das dient nur der Lesbarkeit. Die neuen Zeilen können jedoch nicht entfernt werden.
Hosch250
Ja, ich bin mir der Newline-Empfindlichkeit von Python bewusst.
Timtech
Nur eine der Zeilenumbrüche kann wirklich entfernt werden, nämlich nach dem Doppelpunkt. Bei den anderen müssen Semikolons hinzugefügt werden, sodass das Entfernen dieser Zeilenumbrüche keinen Vorteil bietet.
AJMansfield
@AJMansfield Ja, ich weiß, aber ich habe trotzdem keine Zeilenumbrüche gezählt.
Hosch250
0

bash / grep - 59 Zeichen

51 Zeichen, wenn wir nur die tatsächliche Programmzeichenfolge zählen.

$ 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
quelle
-1

R (62 Zeichen)

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

produziert:

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

Meta-Kommentar: R-Messen sind auf Code-Golf relativ schlecht, da es keine Abkürzung zu function...

Henrik
quelle