Transpose quine


10

Nesta variante quine, seu programa deve emitir seu código-fonte transposto pela diagonal do canto superior esquerdo para o canto inferior direito. Por exemplo:

seu programa
em
quatro linhas

saídas

 yof
 ono
 u u
 r r
    
 p l
 r i
 o n
 g e
 r s
 a
 m

O espaço em branco na saída não é arbitrário. Os espaços aparecem em duas situações: onde há um espaço no original (por exemplo, entre re lna quarta coluna) e onde é necessário preencher caracteres (por exemplo, todos os espaços na primeira coluna). Ambos são obrigatórios e os espaços não podem aparecer em qualquer lugar mais na saída.

Uma única nova linha à direita na saída pode, opcionalmente, ser ignorada. Novas linhas à direita no código-fonte não têm efeito sobre a saída e as novas linhas à frente no código-fonte devem ser tratadas como no exemplo acima. Suponha que todo caractere que não seja uma nova linha tenha uma coluna de largura e uma linha de altura, mesmo que para caracteres como tab isso possa levar a uma saída feia.

Sua solução deve ter pelo menos duas linhas com pelo menos dois caracteres que não sejam de nova linha cada e não deve ser sua própria transposição (a saída não pode ser idêntica à origem).

Quines de trapaça que lêem do arquivo que contém seu código-fonte, extraem dados de uma URL, usam built-ins de citações e assim por diante.

Este é o código golf: o código mais curto em bytes vence.


Isso precisa ser uma verdadeira solução?
lirtosiast

2
@ThomasKwa Em oposição a?
Martin Ender

@ MartinBüttner Talvez exista uma linguagem na qual os literais sejam repetidos. Apenas no caso de.
lirtosiast

@ThomasKwa Tudo bem, desde que siga todas as regras especificadas.
21416 Luke

É proibido o uso de bibliotecas externas (como Lodash em Javascript)?
Mama Fun Roll

Respostas:


5

CJam, 14 bytes

{`"_~".+N*}
_~

Teste aqui.

Embora seja mais curto, provavelmente um pouco menos interessante que a solução de fissão.

Explicação

{       e# Quine framework. Runs the block while another copy of it is on the stack.
  `     e# Stringify the block.
  "_~"  e# Push the remaining code as a string.
  .+    e# Element-wise append... essentially puts the two strings in a grid and 
        e# transposes it.
  N*    e# Join with linefeeds.
}_~

10

Fissão , 17 bytes

Ainda é o meu idioma favorito para os peixes.

'"
!0
0+
;!
DN
"!

Experimente online!

Explicação

Isso é bastante semelhante ao quine básico da Fissão . De fato, se não fosse a regra "deve ter pelo menos duas linhas com pelo menos dois caracteres não-nova linha cada", eu simplesmente poderia ter transposto isso e substituído Rpor D. Essa regra torna as coisas um pouco mais interessantes, porque precisamos imprimir outra linha.

O fluxo de controle começa Dcom um único átomo indo para o sul. Uma vez que ele bate, "ele enrola e imprime

'!0;D

STDOUT, semelhante a como seria na rotina normal. '!depois define a massa do átomo para o código de caractere de !. O 0é um teleportador que transporta o átomo para a segunda coluna, onde ainda está se movendo para o sul.

Com +nós incrementamos a massa do átomo para o valor de ". !N!as impressões citam, alimentam, citam. STDOUT agora se parece com isso:

'!0;D"
"

Depois de contornar, o átomo atinge outro "e agora imprime a segunda linha literalmente:

'!0;D"
"0+!N!

Nós terminamos agora. O átomo usa o teletransportador mais uma vez e aterrissa no ;que o destrói e, assim, encerra o programa.

Suponho que a parte mais interessante aqui seja colocar uma "na parte inferior e a outra na parte superior, para que eu possa imprimi-las de uma só vez, sem precisar definir o valor !mais uma vez (porque seria sobrescrito ao entrar no modo de sequência novamente).


3

Javascript ES6, 90 bytes

$=_=>[...(_=`$=${$};$()`.split`
`)[0]].map((x,y)=>_.map(v=>[...
v][y]).join``).join`
`;$()

Nada mal nada mal.

Explicação

Aqui está a estrutura padrão do quine:

$=_=>`$=${$};$()`;$()

Para modificar, eu apenas dividi a sequência de caracteres quine ao longo de novas linhas e caracteres para criar uma matriz de caracteres, transposta usando 2 funções de mapa e unida para criar a saída.



2

Befunge-93 , 57 bytes

^
_^
,@
+,
5*
52
,+
*9
28
+|
9
8#
|!
 ,
##
!:
,^
#
:
^
""

Isso funciona colocando cada caractere na primeira coluna da pilha (exceto a cotação) e imprimindo cada item da pilha. Depois disso, imprime a cotação, imprime uma nova linha e depois passa para a segunda coluna. Faz a mesma coisa sem imprimir uma nova linha.

Você pode testá-lo no link do título, mas precisará copiar e colar o código na janela. Se você pressionar o botão 'lento', ele mostrará o caminho que o ponteiro segue e a pilha no momento.


Poderia ser mais curto mover a citação na segunda coluna para o topo, como fiz na minha resposta da Fissão?
Martin Ender

Eu pode mover-se as citações ao topo e reorganizar a segunda coluna e ter ainda o trabalho, mas ele acaba sendo ainda 57 bytes desde a primeira coluna ainda tem de ser a mesma altura
Kevin W.

Hum, tudo bem, imaginei que poderia permitir que você gerasse a "única vez, para que você pudesse mudar algum código da primeira coluna para a segunda.
Martin Ender

1

Python 2, 91 75 69 bytes

s='#%r;print"s#\\n="+"\\n".join(s%%s)';print"s#\n="+"\n".join(s%s)
##

Experimente online

Explicação:

Isso usa uma modificação do padrão quine:

s='s=%r;print s%%s';print s%s

Após modificação:

s='s=%r;print"\\n".join(s%%s)';print"\n".join(s%s)

Isso seria suficiente se uma única linha fosse permitida. Em seguida, adicionei dois caracteres à segunda linha para atender a esse requisito. Os #caracteres na segunda linha podem ser substituídos por qualquer coisa, desde que você os altere também na primeira linha e torne o programa sintaticamente válido.

Para imprimi-lo corretamente agora, tenho que imprimir #no final das duas primeiras linhas. Então, removo os dois primeiros caracteres da string se os imprimo #antes de imprimir s%s. Coloquei um dos #no início de spara salvar alguns bytes, removendo um literal de nova linha.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.