Eu te conheço, mas você não me conhece

18

Você está encarregado de escrever dois programas. O programa A não deve imprimir nada em todas as entradas, exceto quando o programa B é inserido, caso em que deve ser impresso 1. O programa B deve imprimir 1em todas as entradas, exceto quando o programa A for inserido, caso em que não deverá imprimir nada.

Pontuação:

  • +1 para cada personagem dos dois programas.
  • Menor pontuação ganha.
ike
fonte
3
Esse quine-ish é suficiente para marcá-lo como quine ? Certamente me parece.
Justin
Como indicam as duas primeiras respostas postadas, "ser" outro programa não está muito bem definido nessas descrições. E estou com a @Quincunx que isso tem algo parecido com a natureza quine.
dmckee
@Quincunx Adicionei a tag quine.
Timtech
1
@Quincunx verdade, mas ninguém está fazendo isso até agora, a menos que você também chamar um Quine qualquer programa que lê o seu código-fonte do disco e imprime-out: p
aditsu
2
@ Aditsu Eu não gosto muito dessas respostas. Acho que vou postar uma resposta muito abaixo do ideal que não faça isso. Pessoalmente, acho que ler o código-fonte através de arquivos é trapaça; programas devem funcionar em qualquer lugar!
Justin

Respostas:

5

GTB , 25

Executado a partir de uma calculadora TI-84

Programa A

`_@_eq;"$w;&

Programa B

`_@_eq;"$#w;&

Explicação

`_ Insira uma string

@_eq;"Verifique se é igual ao código-fonte ( #é automaticamente removido com letras minúsculas)

$w;&Nesse caso, exiba 1 (caso contrário, nada) [ Bpois é $#w;&- se não, exiba 1 (caso contrário, nada)]

Timtech
fonte
12

Bash - 32 caracteres

Script A - 16 caracteres

cmp -s b&&echo 1

Script 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
fonte
5

Ruby, 54

UMA

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

B

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

exemplos:

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

J (62)

Desde que você não proibiu isso ...

Armazene os programas como Ae Brespectivamente.

Programa A (30):

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

Programa B (32):

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

Como funciona (o Programa B, A é semelhante):

  • 1!:1[3: leia stdin
  • 1!:1<'A': ler arquivo A
  • -:: veja se são iguais
  • -.: negar o resultado
  • #~: replica o resultado por si só (portanto, 1resulta em um 1e 0resulta em zero 0s, ou seja, nada)
  • echo: resultado
  • exit: exit (o intérprete J não sai por padrão quando chega ao final do arquivo)
$ jconsole A <B
1
$ jconsole A <foo
$ jconsole B <A
$ jconsole B <foo
1
$
marinus
fonte
Você pode dar uma breve explicação sobre o que isso faz?
ike
@ike: fez isso _______
marinus
3

Haskell - SEM fonte de carregamento - 478 644 caracteres

Isso pressupõe que getContents SEMPRE termina com uma nova linha e, portanto, elimina o caractere final sem verificar, porque não tenho vontade de escapar dele

UMA

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

Funciona como uma solução padrão, mas trocando - por * para obter o outro programa (evitando esses caracteres em outro lugar).

O teste a seguir é impresso conforme o esperado (substituindo main = interact $ por a = eb =)

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
fonte
Além disso, se há uma maneira preferida para formatar funções de linha única monolíticas que seria útil, meta.stackexchange.com/questions/22186/... não aparecer para cobri-lo
Toeofdoom
2

Python 2.7 - 82

Arquivo A (literalmente nomeado apenas a):

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

Arquivo B (literalmente nomeado apenas b):

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

fonte
Abuso total sem o .py- isso funciona?
Timtech
Tenho certeza de que o @LegoStormtroopr funcionaria da mesma maneira que meus exemplos do Ruby publicados aqui, alguns minutos antes. ;-)
Darren Stone
1
@ Timtech Faz isso se você executá-los na linha de comando como python a.
Eu quis dizer é possível até gerar um arquivo sem uma extensão?
Timtech
5
Claro que é? Se você estiver em uma máquina Posix touch a, criará um arquivo vazio se você tiver permissões. Para o divertimento extra cruel que você mesmo pode fazer touch \~o que cria um arquivo chamado com um único til ( ~) - depois ver como alguém foolhardedly tenta removê-lo;)
2

Ruby, 166 caracteres, sem fonte de leitura

UMA:

(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

Verifique se o editor de texto não salva com uma nova linha à direita.

Uso (exemplo):

 $ 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 constrói a fonte do outro programa usando um HEREdoc e transformações de string e depois compara o resultado com a entrada.

histocrata
fonte
Isso foi fácil de escrever, mas agora uma parte do meu cérebro que não entende a recursão está insistindo que pode ser otimizada, mas não tem idéia de como.
histocrat
O que é p? E onde termina o heredoc?
aditsu
pé um método ruby ​​interno que imprime os argumentos passados ​​para ele e depois retorna esses argumentos, tornando-o útil para resultados com golfe. Quando chamado sem argumentos, ele retorna nulo. O argumento to getsé um delimitador, portanto, a passagem presulta em um delimitador nulo, o que significa que ele lê STDIN até chegar ao EOF. A expressão heredoc é <<2, portanto, termina em (e não inclui) os 2 no final do arquivo.
histocrat
O uso de 2como delimitador de heredoc é um pouco tradicional de ofuscação. Pode ser quase qualquer string.
histocrat
O conteúdo do heredoc é avaliado de alguma forma?
Aditsu
1

Haskell - 138

Não é realmente uma boa resposta, mas queria que os dois programas usassem a mesma fonte. Poderia salvar alguns caracteres renomeando o arquivo, mas isso não será uma solução vencedora, então não acho que valha a 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 fonte como ambos AeB .

Teste:

% 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
fonte
por que compilar duas vezes em A e copiar Apara B?
Mniip
Isso foi um erro da minha parte ao copypasting o código. Obrigado por apontar isso. Fixará.
Shiona
1

Node.js - 142 caracteres

Script |(também conhecido como Script A) - 80 caracteres

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

Script &(também conhecido 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 \&

Descrição

O Script B lê o conteúdo do Script A e o avalia após trocar os nomes dos arquivos e o andoperador para umor .

Eu nomeei os arquivos &e, |assim, posso executar uma única substituição no Script B.

JayQuerie.com
fonte
1

Python 3 - 102 caracteres

Imprime 1 se a entrada for igual ao programa 2, caso contrário nada:

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

Imprime 1 se a entrada não for igual ao programa 1, caso contrário, nada:

if input()==open('a.py').read():print('1')
Hosch250
fonte
O espaço em branco não pode ser removido? Também é possível encurtar os scripts de t.py e tt.py para a.py e b.py.
Timtech
@ Timtech Claro, boa ideia. Além disso, eu não estava contando espaço em branco - isso é apenas uma questão de legibilidade. As novas linhas não podem ser removidas.
precisa saber é o seguinte
Sim, estou ciente da sensibilidade da nova linha do Python.
Timtech
Somente uma das novas linhas pode realmente ser removida, após o cólon. Os outros precisariam de ponto e vírgula adicionados, portanto, não há vantagem em remover essas novas linhas.
precisa saber é o seguinte
@AJMansfield Sim, eu sei, mas não contei novas linhas de qualquer maneira.
precisa saber é o seguinte
0

bash / grep - 59 caracteres

51 caracteres se contarmos apenas a string do programa real.

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

R (62 caracteres)

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

produz:

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

Meta comentário: R é relativamente ruim no código de golfe, pois não há atalho para function...

Henrik
fonte