Wielka Piramida Quine

11

Zadanie jest dość prostym wyzwaniem quine z niespodzianką, musisz wygenerować kod źródłowy w kształcie piramidy. Kształt piramidy zdefiniowano poniżej:

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

Głównym ograniczeniem tego wyzwania jest to, że twój quine musi zawierać dokładnie tyle bajtów, aby nie zakłócał wzoru piramidy. Na przykład działałyby następujące długości programów:

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...

Więc jeśli twój program to:

QWERTY

Nie byłby ważny, ponieważ miałby postać:

  Q
 WER
TY

Jeśli jednak twoim programem był QWERTYUIO, byłoby dobrze:

  Q
 WER
TYUIO

Zasady

  • Standardowe luki są oczywiście niedozwolone, bez czytania własnego źródła.
  • Piramida musi być wyśrodkowana, znaki końcowe są dozwolone, ale nie są wymagane.
    • Ponadto, dowolna postać może być użyta do wyśrodkowania piramidy, nie musi tak być (char)32.
  • Twój quine musi mieć kształt piramidy.
    • Musi zachować oryginalną kolejność kodu źródłowego.
    • Twój kod źródłowy NIE może zawierać znaku używanego do formatowania piramidy.
    • EG, jeśli Twój kod źródłowy zawiera spację, będziesz potrzebować innego znaku dla tego formatu.
  • Możesz użyć komentarzy w quine, aby „dopasować” do właściwego rozmiaru.
    • Oczywiście muszą być one wyprowadzane jako część quine.
  • Jeśli program zawiera znaki nowej linii / tabulatory, nie są one częścią quine i powinny zostać pominięte w danych wyjściowych.
  • Kształt jest liczony w znakach, a nie bajtach; jeśli kształt jest zniekształcony, nie robisz tego dobrze.

Najniższy możliwy wynik powinien wynosić 4.

Urna Magicznej Ośmiornicy
źródło
Czy oryginalny quine musi mieć kształt piramidy, czy może tylko wynik?
KrystosTheOverlord
@KrystosTheOverlord wyjście, oryginał nie ma znaczenia. Jeśli oryginał ma tabulatory lub znaki nowej linii, należy je również pominąć na wydruku, aby zachować kształt wydruku.
Magic Octopus Urn
Czy jest poprawne, jeśli wyjście zawiera kilka spacji / znaków nowej linii?
Emigna
@Emigna powinna być? Nie widzę z tym problemu, chyba że inni robią to w tym momencie. Ponadto, zdefiniuj „wiązkę”, czy konsensus zwykle nie jest „akceptowalny jest pojedynczy znak nowej linii”?
Magic Octopus Urn
1
Powinieneś podjąć wyzwanie, w którym musisz mieć quine w formie piramidy :).
KrystosTheOverlord

Odpowiedzi:

4

05AB1E , 36 bajtów

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

Wypróbuj online!

Jeśli trailing characters are allowedtakże oznacza na końcu wyniku, 0"D34çýā·<£.c"D34çýā·<£.coznacza, że ​​warstwa jest krótsza o 25 bajtów.

Emigna
źródło
34çjest podstawą wszystkich quines 05AB1E, prawda? Poza tym nie jestem pewien, co sądzę o losowej liczbie końcowych znaków nowej linii ... Wolałbym, żeby ktoś inny wykonał to połączenie (jaka jest norma, że ​​dozwolone jest 1 śledzenie / wyprzedzanie?), Co wydaje się super na krawędzi.
Magic Octopus Urn
@MagicOctopusUrn: Tak, to trochę wątpliwe. Zakładam, że moja krótsza wersja nie jest OK, dlatego nie użyłem jej jako programu podstawowego, ale czułem, że powinienem zapytać, ponieważ zaoszczędziłoby mi to całą warstwę.
Emigna
Dang, pobiłeś mnie do tego. I zamiast tego ā·<użyłem 9ÅÉ(w 25 bajtach, nie myślałem o końcowym
nowym wierszu
@MagicOctopusUrn Btw, wszystkie inne odpowiedzi mają końcowy nowy wiersz, więc wszystkie byłyby nieprawidłowe, z wyjątkiem tego 36-bajtowego ..
Kevin Cruijssen
4

Java 11, 324 256 227 bajtów

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 bajtów dzięki @JoKing .

Dane wyjściowe z wiodącymi spacjami do utworzenia trójkąta. (Uwaga: białe znaki między var si int ito tabulatory, a nie spacje).

Wypróbuj online.

Wyjaśnienie:

-part:

  • var s zawiera niesformatowany kod źródłowy String
  • %s służy do umieszczenia tego ciągu w sobie s.format(...)
  • %c, %1$cI 34są wykorzystywane do formatowania cudzysłowia ( ")
  • %% służy do formatowania %
  • s.format(s,34,s) łączy to wszystko razem

Część wyzwania:

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

Co kończy się java.lang.StringIndexOutOfBoundsException: begin 225, end 256, length 226błędem String#substring(int,int)metody, iteracja po wydrukowaniu wyniku ( co jest w porządku według meta ).

Kevin Cruijssen
źródło
nic tak naprawdę nie oszczędza, ale nie musisz się s=s.formatrozstać, gdy możesz zamiast tego mieć format w pętli
Jo King
@JoKing Ah oczywiście. Dzięki. Niestety muszę zmniejszyć program podstawowy bez komentarzy do co najmniej 196 (14 2), aby zaoszczędzić bajty (lub tylko zagrać w golfa do 225 (15 2) i znaleźć sposób obejścia nieparzystej liczby bajtów). Obecnie jest 228 bez komentarzy.
Kevin Cruijssen
1
Wypróbowałem inne podejście i skończyło się to tylko dwoma bajtami i tylko dlatego, że jest to liczba nieparzysta ... Obejściem dla nieparzystych długości jest %%ciąg znaków i tylko jeden %w rzeczywistym kodzie, ale to oznacza, że ​​komentarze są obowiązkowe
Jo Król
1
@JoKing Ładne podejście z spacjami zastąpionymi tabulatorami, dzięki czemu możemy mieć spacje wiodące (i pominąć tabulatory w danych wyjściowych ze względu na reguły wyzwań). Byłem w stanie przerobić twój kod ///w ciągu, więc ciąg jest wystarczająco długi, aby mógł przejść do oczekiwanej iteracji, aby wydrukować wszystko, zanim zatrzyma się StringIndexOutOfBoundsExceptionna .substring. I tylko dwa końcowe //na końcu rzeczywistego programu, ponieważ drukuje tylko dwa końcowe //. :)
Kevin Cruijssen
Och wow, nie spodziewałem się odpowiedzi Java! Niezłe!!!
Magic Octopus Urn
4

Python 2 , 81 bajtów

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

Wypróbuj online!

Eval quine, która używa spacji jako znaku wypełniającego.

Jo King
źródło
bez błędu?
Tylko ASCII
lub ... no cóż ... wyraźnie przy takim wypełnieniu można umieścić w nim podpis (tj. bardziej interesujący ciąg, który aaaaaaaaa): P
tylko ASCII
@ Tylko ASCII Dobra uwaga, patrz zaktualizowana odpowiedź;)
Jo King
3

Perl 6 , 67 bajtów

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

Wypróbuj online!

Użyłem kilku znaków Unicode, aby wycisnąć tę dodatkową warstwę. Dane wyjściowe przy użyciu spacji:

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

Wyjaśnienie:

<say("<$_>~~.EVAL"                                  )   >~~.EVAL   # Normal quine
                  .substr($!++²,$!*2-1)              xx⁸  # Split into layered substrings
                                       .indent(8-$!)      # And indent each one
Jo King
źródło
3

Python 2 , 169 bajtów

Zastosowania 0do formatowania piramidy.

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))

Wypróbuj online!


Python 2 , 147 bajtów

Wykorzystuje to regułę Jeśli program zawiera znaki nowej linii / tabulatory, nie są one częścią quine i powinny zostać pominięte w danych wyjściowych.

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))##

Wypróbuj online!

ovs
źródło
2

Gol> <> , 36 bajtów

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

Wypróbuj online!

jeszcze młodsza wersja, 36 bajtów

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

Czuję się tak bliski skrócenia o jedną linię, grrrr ....

Wypróbuj online!

nawet młodsza wersja, 36 bajtów

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

Ten kod jest mniejszy, ale wciąż niestety wydaje się w tej samej ilości, komentarz zajmuje resztę miejsca.

Wypróbuj online!

nieco młodsza wersja, 36 bajtów

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

Wowza! Heh, właśnie tego użyłem, aby wypełnić trochę miejsca, ale program działa, aby grać w golfa, użyłem kilku gotowych wartości zamiast używać zmiennych!

Wypróbuj online!

Starsza wersja, 42 bajty

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

Ma on końcowy znak nowej linii i ma więcej znaków, niż chciałbym ...

Będę grał w ten surowo ...

Wypróbuj online!

KrystosTheOverlord
źródło
25 bajtów
Jo King
2

Czysty , 256 bajtów

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

Wypróbuj online!

Praktycznie standardowy quine, dogodnie również szablon quine, z dodaną funkcją formatowania.

Obrzydliwe
źródło
1
Mimo, że jest to gra w golfa, uwielbiam te dłuższe odpowiedzi. Święta krowa, która robi wrażenie.
Magic Octopus Urn
2

R , 169 144 bajtów

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))

Wypróbuj 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))

Udało się go skrócić, przechodząc do parsowanego łańcucha zamiast wyrażenia, które odeszło. Musiał jednak użyć redefinicji jednoargumentowego operatora, aby uzyskać go poniżej 144.

Nick Kennedy
źródło
1

C # (interaktywny kompilator Visual C #) , 225 bajtów

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));//

Wykorzystuje STX znaku jako wypełnienia. Nie zdawałem sobie sprawy, że Kevin Cruijssen przesłał już dokładną kopię w java przed wysłaniem, dopóki nie skończyłem, ale postanowiłem to opublikować.

Wypróbuj online!

Wcielenie ignorancji
źródło