Te conozco pero no me conoces

18

Tienes la tarea de escribir dos programas. El programa A no debe imprimir nada en todas las entradas, excepto cuando se ingresa el programa B , en cuyo caso debe imprimir 1. El programa B debe imprimir 1en todas las entradas, excepto cuando se ingresa el programa A , en cuyo caso no debe imprimir nada.

Puntuación:

  • +1 para cada personaje de ambos programas.
  • La puntuación más baja gana.
ike
fuente
3
¿Es esto quine-ish suficiente para etiquetarlo como quine ? Ciertamente me parece así.
Justin
Como indican las dos primeras respuestas publicadas, "ser" otro programa no está terriblemente bien definido en estas descripciones. Y estoy con @Quincunx porque esto tiene algo muy parecido a la naturaleza quine.
dmckee
@Quincunx He agregado la etiqueta quine.
Timtech
1
@Quincunx es cierto, pero nadie lo ha hecho hasta ahora, a menos que también llame a un programa que lea su código fuente del disco y lo imprima: p
aditsu
2
@aditsu No me gustan esas respuestas. Creo que publicaré una respuesta muy subóptima que no hace eso. Personalmente, creo que leer el código fuente a través de archivos es hacer trampa; ¡Los programas deberían funcionar en cualquier lugar!
Justin

Respuestas:

5

GTB , 25

Ejecutado desde una calculadora TI-84

Programa A

`_@_eq;"$w;&

Programa B

`_@_eq;"$#w;&

Explicación

`_ Ingrese una cadena

@_eq;"Compruebe si es igual al código fuente ( #se elimina automáticamente junto con letras minúsculas)

$w;&Si es así, muestre 1 (de lo contrario, nada) [porque Bes, $#w;&si no, muestre 1 (de lo contrario, nada)]

Timtech
fuente
12

Bash - 32 caracteres

Guión A - 16 caracteres

cmp -s b&&echo 1

Guión B - 16 caracteres

cmp -s a||echo 1

Uso

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

Rubí, 54

UN

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

si

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

ejemplos:

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$ 
Piedra de Darren
fuente
4

J (62)

Como no prohibiste esto ...

Almacene los programas como Ay Brespectivamente.

Programa A (30):

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

Programa B (32):

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

Cómo funciona (el programa B, A es similar):

  • 1!:1[3: leer stdin
  • 1!:1<'A': leer archivo A
  • -:: ver si son iguales
  • -.: negar el resultado
  • #~: replica el resultado por sí mismo (por lo tanto, 1da como resultado uno 1y 0da como resultado cero 0s, es decir, nada)
  • echo: salida
  • exit: salir (el intérprete J no sale por defecto cuando llega al final del archivo)
$ jconsola A <B
1
$ jconsole A <foo
$ jconsola B <A
$ jconsole B <foo
1
PS
marinus
fuente
¿Puedes dar una breve explicación de lo que esto hace?
ike
@ike: lo hizo _______
marinus
3

Haskell - SIN fuente de carga - 478 644 caracteres

Esto supone que getContents SIEMPRE termina con una nueva línea y, por lo tanto, suelta el carácter final sin verificarlo porque no tengo ganas de escapar.

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

si

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

Funciona como un quine estándar, pero intercambiando * por * para obtener el otro programa (evitando esos caracteres en otra parte).

La siguiente prueba se imprime como se esperaba (reemplazando main = interact $ con a = y 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
fuente
Además, si hay una forma preferida de formatear funciones monolíticas de una sola línea que sería útil, meta.stackexchange.com/questions/22186/… no parece cubrirlo
Toeofdoom
2

Python 2.7 - 82

Archivo A (literalmente llamado solo a):

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

Archivo B (literalmente llamado solo b):

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

fuente
Abuso total allí sin el .py... ¿eso funciona?
Timtech
Estoy seguro de que @LegoStormtroopr se ejecutará de la misma manera que mis ejemplos de Ruby publicados aquí, unos minutos antes. ;-)
Darren Stone
1
@Timtech Lo hace si los ejecuta desde la línea de comandos como python a.
Quise decir, ¿es posible incluso generar un archivo sin una extensión?
Timtech
55
¿Por supuesto que es? Si está en una máquina Posix touch a, creará un archivo vacío si tiene permisos. Para una diversión extra cruel, incluso puede hacer lo touch \~que crea un archivo llamado con una sola tilde ( ~) - luego ver cómo alguien intenta
2

Ruby, 166 caracteres, sin fuente de lectura

UN:

(gets(p)==<<2.tr('&|','|&')*2+'2')&&p(1)
(gets(p)==<<2.tr('&|','|&')*2+'2')&&p(1)
2

SI:

(gets(p)==<<2.tr('|&','&|')*2+'2')||p(1)
(gets(p)==<<2.tr('|&','&|')*2+'2')||p(1)
2

Asegúrese de que su editor de texto no se guarde con una nueva línea final.

Uso (ejemplo):

 $ 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

Cada programa construye la fuente del otro programa usando un HEREdoc y transforma cadenas, luego compara el resultado con la entrada.

histocrat
fuente
Esto fue bastante fácil de escribir, pero ahora una parte de mi cerebro que no comprende la recursión insiste en que se puede optimizar, pero no tiene idea de cómo.
histocrat
¿Qué es p? ¿Y dónde termina el heredoc?
aditsu
pes un método de rubí incorporado que imprime los argumentos que se le pasan, luego los devuelve, lo que lo hace útil para la salida de golf. Cuando se llama sin argumentos, devuelve nil. El argumento para getses un delimitador, por lo que pasar presulta en un delimitador nulo, lo que significa que lee STDIN hasta que llega a EOF. La expresión heredoc es <<2, por lo que termina en (y no incluye), el 2 al final del archivo.
histocrat
El uso del 2delimitador heredoc es un poco tradicional de ofuscación. Puede ser casi cualquier cadena.
histocrat
¿El contenido del heredoc se evalúa de alguna manera?
aditsu
1

Haskell - 138

Realmente no es una buena respuesta, pero quería que ambos programas usaran la misma fuente. Podría guardar algunos caracteres cambiando el nombre del archivo, pero no va a hacer de esta una solución ganadora, así que no creo que 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)}

Compile esta fuente como ambos Ay B.

Prueba:

% 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
fuente
¿Por qué compilar dos veces Ay luego copiar Aa B?
mniip
Eso fue un error por mi parte al copiar el código. Gracias por señalar eso. Arreglará.
Shiona
1

Node.js - 142 caracteres

Script |(también conocido como Script A) - 80 caracteres

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

Script &(también conocido como Script B) - 62 caracteres

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 \&

Descripción

El guión B lee el contenido del guión A y lo evalúa después de intercambiar los nombres de archivo y el andoperador a un or.

Puse un nombre a los archivos &y |así puedo realizar un solo reemplazo en el Script B.

JayQuerie.com
fuente
1

Python 3 - 102 caracteres

Imprime 1 si la entrada es la misma que la del programa 2; de lo contrario, nada:

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

Imprime 1 si la entrada no es la misma que la del programa 1; de lo contrario, nada:

if input()==open('a.py').read():print('1')
Hosch250
fuente
¿No se puede eliminar el espacio en blanco? También puede acortar los scripts de t.py y tt.py a a.py y b.py.
Timtech
@Timtech Claro, buena idea. Además, no estaba contando los espacios en blanco, eso es solo para la legibilidad. Sin embargo, las nuevas líneas no se pueden eliminar.
Hosch250
Sí, soy consciente de la sensibilidad de nueva línea de Python.
Timtech
Solo una de las nuevas líneas puede eliminarse realmente, después del colon. Los otros necesitarían puntos y comas agregados, por lo que no hay ninguna ventaja en eliminar esas nuevas líneas.
AJMansfield
@AJMansfield Sí, lo sé, pero no conté nuevas líneas de todos modos.
Hosch250
0

bash / grep - 59 caracteres

51 caracteres si solo contamos la cadena real del programa.

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

R (62 caracteres)

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 comentario: R es relativamente malo en el golf de código ya que no hay un atajo para function...

Henrik
fuente