A Grande Pirâmide de Quine

11

A tarefa é um desafio quine bastante simples, com uma reviravolta, você deve exibir seu código-fonte na forma de uma pirâmide. A forma de uma pirâmide é definida abaixo:

       1
      234
     56789
    ABCDEFG
   HIJKLMNOP
  QRSTUVWXYZa
 bcdefghijklmn
......etc......

A principal limitação desse desafio é que seu quine deve conter exatamente exatamente bytes para não obstruir o padrão da pirâmide. Por exemplo, os seguintes tamanhos de programa funcionariam:

1-byter: 1st layer of the pyramid (not allowed by definition of a quine).
4-byter: 1st and 2nd layers of the pyramid.
9-byter: 1st, 2nd and 3rd layers of the pyramid.
etc...

Portanto, se seu programa foi:

QWERTY

Não seria válido, porque organizaria como:

  Q
 WER
TY

No entanto, se o seu programa fosse QWERTYUIO, tudo bem:

  Q
 WER
TYUIO

Regras

  • As brechas padrão são obviamente proibidas, não é possível ler sua própria fonte.
  • A pirâmide deve estar centralizada, caracteres finais são permitidos, mas não são necessários.
    • Além disso, qualquer personagem pode ser usado para centralizar a pirâmide, não precisa ser (char)32.
  • Sua solução deve poder ser transformada em pirâmide.
    • Ele deve manter a ordem original do seu código-fonte.
    • Seu código-fonte NÃO pode conter o caractere usado para formatar a pirâmide.
    • Por exemplo, se seu código-fonte contiver um espaço, você precisará de outro caractere para o formato.
  • Você pode usar comentários em seu quine para "preencher" o tamanho correto.
    • Obviamente, estes devem ser produzidos como parte da solução.
  • Se o programa contiver novas linhas / guias, elas não fazem parte do quine e devem ser omitidas na saída.
  • A forma é contada em caracteres, não em bytes; se a forma estiver malformada, você não está fazendo certo.

A pontuação mais baixa possível aqui deve ser 4.

Urna de polvo mágico
fonte
O quine original precisa ter a forma de uma pirâmide ou apenas o resultado precisa ter?
KrystosTheOverlord 15/02/19
@KrystosTheOverlord a saída, o original não importa. Se o original tiver guias ou novas linhas, você também deve omiti-las na saída, a fim de manter a forma da saída.
Magic Octopus Urn
É válido se a saída tiver vários espaços à direita / novas linhas?
Emigna
@Emigna deveria ser? Não vejo problema com isso, a menos que outros o façam neste momento. Além disso, defina "um monte de", não é geralmente o consenso "uma única nova linha à direita é aceitável"?
Magic Octopus Urn
1
Você deve fazer um desafio no qual precisa ter o quine no formato de uma pirâmide :).
KrystosTheOverlord 15/02/19

Respostas:

4

05AB1E , 36 bytes

"34çs«DJā·<£õK.cJ?"34çs«DJā·<£õK.cJ?

Experimente online!

Se trailing characters are allowedtambém significa no final da saída, 0"D34çýā·<£.c"D34çýā·<£.cé uma camada mais curta com 25 bytes.

Emigna
fonte
34çé a base de todos os 05AB1E quines, não é haha? Além disso, não tenho certeza de como me sinto sobre a quantidade aleatória de novas linhas à direita ... Eu preferiria que outra pessoa fizesse essa ligação (qual é a norma, é permitido 1 rastreamento / precedimento?) Que parece super-avançado.
Magic Octopus Urn
@MagicOctopusUrn: Sim, é meio questionável. Presumo que minha versão mais curta não esteja correta, por isso não a usei como programa principal, mas achei que deveria perguntar, pois isso me salvaria uma camada inteira.
Emigna 15/02/19
Dang, você me venceu. E em vez de ā·<eu usei 9ÅÉ(no 25 Byter, não pensou sobre a nova linha de fuga ..)
Kevin Cruijssen
@MagicOctopusUrn Btw, todas as outras respostas têm uma nova linha de fuga, então tudo seria inválido, exceto para este 36-Byter ..
Kevin Cruijssen
4

Java 11, 324 256 227 bytes

v->{var s="v->{vars=%c%s%1$c;for(inti=0;;)System.out.printf(%1$c%%%1$c+(15+i)+%1$cs%%n%1$c,s.format(s,34,s).substring(i*i,++i*i));}///";for(int i=0;;)System.out.printf("%"+(15+i)+"s%n",s.format(s,34,s).substring(i*i,++i*i));}//

-29 bytes graças a @JoKing .

Saídas com espaços à esquerda para fazer o triângulo. (Observe que os espaços em branco entre var se int isão tabulações, não espaços.)

Experimente online.

Explicação:

-part:

  • var s contém o código-fonte não formatado String
  • %s é usado para colocar essa String em si mesma com s.format(...)
  • %c, %1$cE 34são usados para formatar as aspas duplas ( ")
  • %% é usado para formatar o %
  • s.format(s,34,s) coloca tudo junto

Parte do desafio:

for(int i=0;;)         // Loop `i` indefinitely upwards from 0
  System.out.printf(   //  Print with format:
    "%"+(15+i)+"s      //   Add leading spaces to make the line length size 15+`i`
                 %n",  //   And include a trailing newline
    s.format(s,34,s).substring(
                       //   And append a substring of the source code-String
       i*i,            //    From index `i` squared
       ++i*i));}       //    To index `i+1` squared

O que para com um java.lang.StringIndexOutOfBoundsException: begin 225, end 256, length 226erro no String#substring(int,int)método, a iteração após a impressão do resultado (o que é bom de acordo com a meta ).

Kevin Cruijssen
fonte
realmente não salva nada, mas você não precisa se s=s.formatseparar quando pode ter o formato no loop
Jo King
@JoKing Ah, é claro. Obrigado. Infelizmente, tenho que diminuir o programa base sem comentários para pelo menos 196 (14 2) para salvar bytes (ou apenas aumentar para 225 (15 2) e encontrar uma solução alternativa para ter um número ímpar de bytes). Atualmente, é 228 sem os comentários.
Kevin Cruijssen
1
Tentei uma abordagem diferente e acabei com apenas dois bytes de diferença e apenas por ser um número ímpar ... A solução alternativa para comprimentos ímpares é uma %%na string e apenas uma %no código real, mas isso significa que os comentários são obrigatórios
Jo Rei
1
@JoKing Boa abordagem com os espaços substituídos por tabulações para que possamos ter espaços à esquerda (e omitir as guias da saída devido às regras de desafio). Consegui refazer seu código ///na string para que a string seja longa o suficiente para que ela vá para a iteração esperada para imprimir tudo, antes de parar com a StringIndexOutOfBoundsExceptionfor .substring. E com apenas dois finais //no final do programa real, pois ele também imprime dois finais //. :)
Kevin Cruijssen
Oh uau, eu não esperava uma resposta Java! Agradável!!!
Magic Octopus Urn
4

Python 2 , 81 bytes

s='n=0;\nprint(8-n)*chr(32)+("s=%r;exec(s*9)"%s)[n*n:][:n-~n];n+=1;#JK';exec(s*9)

Experimente online!

Uma avaliação avalia que usa espaços como o caractere de preenchimento.

Brincadeira
fonte
sem erro?
somente ASCII
ou ... bem ... claramente com tanto preenchimento, você poderia colocar uma assinatura (ou seja, uma string mais interessante que não seja aaaaaaaaa): P
ASCII-only
@ Apenas ASCII Bom ponto, ver resposta atualizada;)
Jo King
3

Perl 6 , 67 bytes

<say("<$_>~~.EVAL".substr($!++²,$!*2-1).indent(8-$!))xx⁸>~~.EVAL

Experimente online!

Usei alguns caracteres unicode para extrair essa camada extra. Saídas usando espaços:

       <
      say
     ("<$_
    >~~.EVA
   L".substr
  ($!++²,$!*2
 -1).indent(8-
$!))xx⁸>~~.EVAL

Explicação:

<say("<$_>~~.EVAL"                                  )   >~~.EVAL   # Normal quine
                  .substr($!++²,$!*2-1)              xx⁸  # Split into layered substrings
                                       .indent(8-$!)      # And indent each one
Brincadeira
fonte
3

Python 2 , 169 bytes

Usa 0para formatar a pirâmide.

s='s=%r;k=s%%s;print"\\n".join(`1-1`*(12-n)+k[n*n:][:n-~n]for n in range(13))#######################';k=s%s;print"\n".join(`1-1`*(12-n)+k[n*n:][:n-~n]for n in range(13))

Experimente online!


Python 2 , 147 bytes

Isso usa a regra Se o programa contém novas linhas / guias, elas não fazem parte do quine e devem ser omitidas na saída.

s='s=%r;k=s%%s;print"\\n".join(`1-1`*(12-n)+k[n*n:][:n-~n]forninrange(13))##';k=s%s;print"\n".join(`1-1`*(12-n)+k[n*n:][:n-~n]for	n	in	range(13))##

Experimente online!

ovs
fonte
2

Gol> <> , 36 bytes

":P}r6&56F:M}F0ss|&:P&Roao{|;Nooooo!

Experimente online!

uma versão ainda mais nova, 36 bytes

":P}r6&56F:M}R` &:P&Fo|ao{|;Noooooo!

Eu me sinto tão perto de conseguir uma linha mais curta, grrrr ....

Experimente online!

versão ainda mais nova, 36 bytes

"r2ss6&56F:M}R` &:P&Fo|ao{|;what????

O código dessa pessoa é menor, mas ainda sai da mesma quantidade, infelizmente, o comentário ocupa o restante do espaço.

Experimente online!

versão um pouco mais nova, 36 bytes

"r2ss156F:M}F` o|:PP}Fo|ao{{|;Wowza!

Wowza! Hei, eu apenas usei isso para preencher um pouco de espaço, mas o programa funciona, para jogar golfe, usei alguns valores pré-pressionados em vez de usar variáveis!

Experimente online!

Versão antiga, 42 bytes

"r2ss0V_~6:&F&:M&F` o|_PPV_Fo|ao|;empty...

Isso tem uma nova linha à direita e tem mais caracteres do que eu gostaria ...

Eu vou jogar isso severamente ...

Experimente online!

KrystosO Soberano
fonte
25 bytes
Jo King
2

Limpo , 256 bytes

module QQ;import StdEnv,Text;q=dec'#';$n#k=(s<+q<+s<+q)%(n^2,n^2+n*2)=lpad k(16+n)(dec q);Start=join{toChar 10}(map$[0..15]);s="module QQ;import StdEnv,Text;q=dec'#';$n#k=(s<+q<+s<+q)%(n^2,n^2+n*2)=lpad k(16+n)(dec q);Start=join{toChar 10}(map$[0..15]);s="

Experimente online!

Praticamente o quine padrão, convenientemente também um template quine, com a função de formatação adicionada.

Furioso
fonte
1
Mesmo sendo código de golfe, eu amo essas respostas mais longas. Vaca sagrada, isso é impressionante.
Magic Octopus Urn
2

R , 169 144 bytes

s='`!`=intToUtf8;cat(sprintf("%*s",11+(i=1:12),substring(paste0("s=",q<-!39,s,q,";eval(parse(t=s))"),(i-1)^2+1,i^2)),sep=!010)';eval(parse(t=s))

Experimente online!

           s
          ='`
         !`=in
        tToUtf8
       ;cat(spri
      ntf("%*s",1
     1+(i=1:12),su
    bstring(paste0(
   "s=",q<-!39,s,q,"
  ;eval(parse(t=s))")
 ,(i-1)^2+1,i^2)),sep=
!010)';eval(parse(t=s))

Conseguiu encurtá-lo movendo-se para uma sequência que é analisada em vez de uma expressão que se foi. Teve que usar uma redefinição de um operador unário para colocá-lo sob os 144.

Nick Kennedy
fonte
1

C # (compilador interativo do Visual C #) , 225 bytes

var s="var s={0}{1}{0};for(int i=0;;)WriteLine(string.Format(s,(char)34,s).Substring(i*i++,2*i-1).PadLeft(i+14,(char)2));//";for(int i=0;;)WriteLine(string.Format(s,(char)34,s).Substring(i*i++,2*i-1).PadLeft(i+14,(char)2));//

Usa um STXcaractere como preenchimento. Não sabia que Kevin Cruijssen já havia enviado uma cópia exata em java antes de postar até que eu terminasse, mas decidi postar de qualquer maneira.

Experimente online!

Modalidade de ignorância
fonte