Isso foi inspirado em Imprimir um Negativo do seu Código e Golf uma solução comum .
Considere um retângulo de caracteres que atenda às seguintes restrições:
- Consiste apenas em caracteres ASCII imprimíveis
- Dimensões maiores que 1
- Cada linha e cada coluna contém pelo menos um espaço.
- Cada linha e cada coluna contém pelo menos um caractere não espacial.
Por exemplo, a seguir é um retângulo 6x4 válido:
%n 2e
1 g 3
&* __
3
Um negativo para esse retângulo é definido como um retângulo de dimensões iguais, com todos os espaços substituídos por caracteres não espaciais e todos os caracteres não espaciais substituídos por espaços. Um negativo do retângulo acima pode ser:
f ^
33 >
9 $
^ }|Q'
Qualquer caractere ASCII imprimível sem espaço pode ser usado para substituir um espaço.
Tarefa
Sua tarefa é escrever um programa com código-fonte retangular, que produza um negativo válido para si mesmo. O resultado negativo também deve ser um programa válido, no mesmo idioma que o original, e deve gerar a origem do original.
Nenhum espaço em branco à direita pode ser adicionado ou removido, exceto por uma única nova linha à direita no final de qualquer saída, que é opcional.
Nenhum dos programas tem permissão para ler o código fonte de ambos; nem os ambientes REPL podem ser assumidos.
Pontuação
Sua pontuação é o produto das dimensões do seu código (ou seja, se seu código-fonte está em um retângulo de 12 por 25, sua pontuação é de 12 * 15 = 180). Além disso, para cada caractere usado em um comentário, sua pontuação aumenta em 2 (se você usar /* .. */
uma vez no seu código e seu código estiver em um retângulo de 10 por 10, sua pontuação será 10 * 10 + 8 * 2 = 116).
A pontuação mais baixa vence.
Se houver um empate, a submissão com o menor número de espaços no programa (o original ou o negativo, o que tiver menos espaços) vence.
Se ainda houver um empate, a resposta anterior vencerá.
Existe um bônus de -52% , se a combinação do original e do negativo produzir uma solução normal. Por exemplo:
Original Negative Combined
A A B B BABA
A A B B ABAB
fonte
Respostas:
CJam, (
51 49 47 46 4542 x 2) * 48% = 40,32A execução do código acima fornece esta saída:
executando o qual, imprime de volta a fonte original.
A fonte e a saída são simplesmente linhas trocadas.
Agora vem a mágica.
A sobreposição da origem e da saída resulta no seguinte código:
que é um quine perfeito!
Experimente-os online aqui
Como funciona
Toda a lógica de impressão está na primeira linha, que lida com os três casos explicados posteriormente.
A matriz na última linha acima é a matriz que possui blocos de código correspondentes aos três casos.
Caso 1
Nesse caso, o comprimento da pilha restante era 0, como quando o bloco foi executado, ele tinha apenas a cópia do próprio bloco, que foi inicialmente inicializada na terceira etapa acima. Então, retiramos o índice
0
da última matriz e o executamos:Nesse caso, a segunda linha é no-op no que diz respeito à impressão da saída.
Caso 2
Nesse caso, a pilha já continha uma sequência vazia, portanto, quando o bloco de código copiado foi executado, ele tinha 2 elementos - uma sequência vazia e o próprio bloco de código. Então, retiramos o índice
1
da última matriz e o executamos:Caso 3
Nesse caso, a pilha possui 6 elementos. Então, depois de exibir o último bloco de código, o comprimento restante da matriz é 5. Retiramos o índice
5
da matriz e o executamos. (Observe que em uma matriz de3
elementos, índice5
é índice5%3 = 2
)fonte
Python, 97x2 + 2 = 196
Não é uma ótima solução para começar, mas pelo menos funciona (eu acho).
Saída:
fonte
CJam, (
5856544846 x 2) * 48% = 44,16que imprime
Os caracteres não espaciais em cada linha permanecem os mesmos entre os dois quines mútuos.
Mas agora a parte realmente doce:
é um quine! :)
Teste aqui.
Como funciona
Eu recomendo que você leia a explicação em minha outra submissão primeiro, uma vez que explica os conceitos básicos de quining no CJam em geral.
Este é um pouco mais complicado. Para o quine mútuo, como no outro caso, modifico a representação em cadeia do bloco adicionando espaços antes ou depois de cada linha e trocando um 0 por um 2, para que o programa resultante coloque os espaços na extremidade oposta.
Observe que os espaços não afetam de maneira alguma os quines mútuos. No primeiro, eles estão em um bloco, que na verdade não é usado, e no segundo, em torno de todo o código.
Para obter um quine regular ao combinar os dois, precisamos encontrar uma maneira de evitar fazer toda essa modificação. Observe que a estrutura do espaço em branco e do código significa que, combinando ambos, inserimos a totalidade de um quine no outro. Portanto, se colocarmos todo o código de modificação em um bloco, podemos executá-lo dependendo do seu conteúdo real.
Então agora eu tenho esse bloco ... para os quines mútuos, ele contém apenas o código que realmente quero executar. Para o quine combinado, ele também contém todo o quine novamente, em uma posição aleatória, o que não faz sentido ... mas, como é um bloco, não é executado automaticamente. Portanto, podemos determinar se a string deve ser modificada com base no conteúdo desse bloco. É para isso que
_`'"#)!
serve. Duplica o bloco, converte-o em uma cadeia de caracteres, procura o caractere"
(que, nas linhas comuns, aparece apenas fora do bloco) - a pesquisa retorna-1
se o caractere não for encontrado e, caso contrário, um número inteiro positivo -, incrementa o resultado e nega isso logicamente. Portanto, se um"
foi encontrado, isso cede de0
outra forma1
. Agora apenas fazemos*
, que executa o bloco uma vez, se o resultado for 1 e não for o caso.Finalmente, é assim que o código modificador funciona:
Reivindicação da recompensa, (12 x 10) * 48% = 57,6
Acontece que esse código pode ser dividido em mais linhas com muita facilidade com algumas modificações. Adicionamos 2 caracteres, para obter 48 em uma linha, que podemos dividir convenientemente por 8, para que possamos ter 8 linhas com 6 caracteres de código e 6 espaços. Para fazer isso, também precisamos alterar alguns números e reorganizar um operador ou dois, para que eles não sejam divididos nas duas linhas. Isso nos dá uma versão de trabalho com tamanho 12 x 8 ... uma fora do requisito. Então, apenas adicionamos duas linhas que não fazem nada (pressione 1, digite 1, digite 1, digite 1 ...), para obter 12 x 10 :
Como o anterior, isso produz
(Observação: não há necessidade de continuar alternando a esquerda e a direita nas linhas intermediárias, apenas a posição da primeira e da última linha é importante. A esquerda e a direita podem ser escolhidas arbitrariamente para todas as outras linhas.)
E por pura coincidência, o quine completo também funciona:
(Digo coincidência, porque a parte que cuida de não executar o código interno agora fica estranhamente intercalada com a outra, mas ainda funciona bem.)
Dito isto, eu poderia ter adicionado 44 linhas
1;
à minha inscrição original para cumprir o requisito de recompensa, mas12 x 10
parece muito mais organizado. ;)Edit: Haha, quando eu disse "pura coincidência" eu não poderia estar mais no local. Eu examinei como a solução final agora realmente funciona, e é absolutamente ridículo. Existem três blocos aninhados (4 na verdade, mas o mais interno é irrelevante). A única parte importante do mais interno desses 3 blocos é que ele contém um
"
(e não o que ele fez na submissão original, mas o'"
que é usado no final para verificar esse mesmo caractere). Portanto, a estrutura básica do quine é:Vamos dissecar isso:
Portanto, isso realmente faz alguma mágica engraçada, mas como o bloco interno deixa uma única string na pilha,
)!*
isso transforma uma string vazia. A única condição é que as coisas no bloco interno depois+
não façam mais nada na pilha, então vamos ver isso:fonte
Y/2
na combinação combinada?CJam,
423733 x 2 = 66que imprime
(As linhas são trocadas e um se
1
transforma em um0
.)Teste aqui.
Como funciona
Primeiro, você deve entender o quine básico do CJam:
As chaves simplesmente definem um bloco de código, como uma função, que não é imediatamente executado. Se um bloco não executado permanecer na pilha, seu código-fonte (incluindo chaves) será impresso.
_
duplica o bloco e~
executa a segunda cópia. O próprio bloco simplesmente empurra a string que contém_~
. Portanto, esse código deixa a pilha no seguinte estado:O bloco e a cadeia de caracteres são simplesmente impressos lado a lado no final do programa, o que torna isso uma solução.
A vantagem disso é que podemos fazer o que quisermos no bloco, e isso permanece um problema, porque cada pedaço de código será automaticamente impresso no conteúdo do bloco. Também podemos modificar o bloco, obtendo sua representação de string com
`
(que é apenas uma string do bloco com chaves).Agora vamos olhar para esta solução. Observe que qualquer parte do quine mútuo contém o bloco do tipo quine com
_~
, e umL
. OL
empurra uma cadeia vazia para a pilha, o que não contribui para a saída. Então, aqui está o que o bloco faz:Portanto, isso fará a parte quine, mas troque um 1 por um 0 e também acrescentará outra linha a um
L
, onde o código acima tem um espaço. O problema é que a ordem dessas duas linhas é determinada pela troca interna{ }*
. E como a parte externa do quine mútuo0
substitui o a por um1
, ele nunca executa essa troca e, portanto, produz a ordem original novamente.fonte
CJam, 27 × 2 = 54
Saída:
'A'B>
compara os caracteres A e B.' '\n >
retorna 1 porque 32> 10 e' \n' >
retorna 0 porque os dois espaços são iguais.fonte
CJam,
3029 x 2 = 58Saídas:
que produz a fonte original.
Isso é baseado no mesmo princípio da minha outra solução.
Experimente online aqui
fonte