Велика піраміда Квіне


11

Завдання - це досить простий виклик квитка з поворотом, ви повинні вивести свій вихідний код у формі піраміди. Форма піраміди визначена нижче:

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

Основне обмеження цього завдання полягає в тому, що ваша квітка повинна містити достатньо байтів, щоб не перешкоджати схемі піраміди. Наприклад, працюватимуть наступні тривалості програми:

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

Отже, якщо ваша програма:

QWERTY

Це не буде дійсним, тому що він би впорядковував:

  Q
 WER
TY

Однак якщо ваша програма була QWERTYUIO, було б добре:

  Q
 WER
TYUIO

Правила

  • Стандартні лазівки, очевидно, заборонені, не читаючи власне джерело.
  • Піраміда повинна бути в центрі, дозволені символи дозволені, але не обов'язкові.
    • Крім того, будь-який символ може використовуватися для центру піраміди, не повинен бути (char)32.
  • Ваша квілка повинна бути здатна перетворитись у піраміду.
    • Він повинен зберігати початкове впорядкування вашого вихідного коду.
    • Ваш вихідний код НЕ може містити символу, який використовується для форматування піраміди.
    • EG, якщо ваш вихідний код містить пробіл, вам знадобиться ще одна таблиця для формату.
  • Ви можете використовувати коментарі у вашій королеві, щоб "прокладати" правильний розмір.
    • Очевидно, що вони повинні виводитись у складі quine.
  • Якщо програма містить нові рядки / вкладки, вони не входять до складу quine і їх слід опустити у висновку.
  • Форма рахується в символах, а не в байтах; якщо форма неправильна, ви не робите це правильно.

Тут можливий найменший бал - 4.


Чи потрібна оригінальна квінка у формі піраміди, чи повинен бути лише вихід?
KrystosTheOverlord

@KrystosTheOverlord вихід, оригінал не має значення. Якщо в оригіналі є вкладки або нові рядки, слід також опустити їх у висновку, щоб зберегти форму виводу.
Чарівний восьминіг Урна

Чи справедливо, якщо на виході є купа пробілів / нових рядків?
Емінья

@Emigna це має бути? Я не бачу проблеми з цим, якщо інші цього не роблять. Крім того, визначте "купу", невже консенсус зазвичай "неприйнятний єдиний новий рядок"?
Чарівний восьминога Урна

1
Вам слід зробити виклик, коли вам потрібно мати квінку у форматі піраміди :).
KrystosTheOverlord

Відповіді:


4

05AB1E , 36 байт

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

Спробуйте в Інтернеті!

Якщо trailing characters are allowedтакож означає в кінці виводу, 0"D34çýā·<£.c"D34çýā·<£.cце шар коротший на 25 байт.


34çце основа всіх лав 05AB1E, чи не так? Крім того, не впевнений, що я відчуваю щодо випадкової кількості зворотних нових рядків ... Я вважаю за краще, щоб хтось інший здійснив цей дзвінок (яка норма, дозволено 1 затримка / передування?), Що здається супер на межі.
Чарівний восьминога Урна

@MagicOctopusUrn: Так, це якось сумнівно. Я припускаю, що моя коротша версія не в порядку, тому я не використовував її як основну програму, але відчув, що слід запитати, оскільки це врятує мені цілий шар.
Емінья

Данг, ти мене до цього побив. І замість того, щоб ā·<я використав 9ÅÉ(у 25 байт, не думав про
останній

@MagicOctopusUrn Btw, всі інші відповіді мають зворотний новий рядок, тому всі недійсні, за винятком цього 36-байтного ..
Kevin Cruijssen

4

Java 11, 324 256 227 байт

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 байт завдяки @JoKing .

Виводимо з провідними пробілами, щоб скласти трикутник. (Зауважте, що пробіл між var sта int iє вкладками, а не пробілами.)

Спробуйте в Інтернеті.

Пояснення:

-part:

  • var s містить неформатоване вихідний код String
  • %s використовується для того, щоб поставити цю струну в себе s.format(...)
  • %c, %1$cі 34використовуються для форматування подвійних лапок ( ")
  • %% використовується для форматування %
  • s.format(s,34,s) зводить це все разом

Частина виклику:

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

Яка зупиняється на java.lang.StringIndexOutOfBoundsException: begin 225, end 256, length 226помилці String#substring(int,int)методу, ітерації після того, як він надрукував результат ( що нормально відповідно до мета ).


це насправді нічого не заощадить, але вам не потрібно s=s.formatрозлучатися, коли натомість ви можете мати формат у циклі
Jo King

@JoKing Ну звичайно. Дякую. На жаль, я маю зменшити базову програму без коментарів до принаймні 196 (14 2), щоб зберегти байти (або лише гольф до 225 (15 2) і знайти обхідне рішення, щоб якось мати непарну кількість байтів). Зараз 228 без коментарів.
Kevin Cruijssen

1
Спробував інший підхід, і в кінцевому підсумку вийшов лише два байти, і лише через те, що він є непарним числом ... Обхід для непарних довжин - це %%рядок і лише один %у фактичному коді, але це означає, що коментарі є обов'язковими
Джо Король

1
@JoKing Хороший підхід з пробілами, заміненими на вкладки, щоб ми могли мати провідні пробіли (і опускати вкладки з результату через правила виклику). Мені вдалося переробити ваш код ///у рядку, тому рядок достатньо довгий, щоб перейти до очікуваної ітерації, щоб надрукувати все, перш ніж зупинятися StringIndexOutOfBoundsExceptionна .substring. І лише два кінці //в кінці фактичної програми, оскільки вона друкує також два трейлінга //. :)
Кевін Кройсейсен

О, о, я не очікував відповіді на Java! Хороший!!!
Чарівний восьминіг Урна

4

Python 2 , 81 байт

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

Спробуйте в Інтернеті!

Еваль, що використовує пробіли як символ заповнення.




або ... ну ... чітко за допомогою такої великої прокладки ви можете поставити підпис (тобто більш цікаву струну, яка є aaaaaaaaa): P
лише ASCII

@ ASCII Тільки хороша точка, дивіться оновлену відповідь;)
Джо Кінг,

3

Perl 6 , 67 байт

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

Спробуйте в Інтернеті!

Я використав пару символів unicode для того, щоб видавити цей додатковий шар. Виходи з пробілами:

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

Пояснення:

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

3

Python 2 , 169 байт

Використання 0для форматування піраміди.

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

Спробуйте в Інтернеті!


Python 2 , 147 байт

Тут використовується правило. Якщо програма містить нові рядки / вкладки, вони не входять до складу quine і їх слід опустити у висновку.

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

Спробуйте в Інтернеті!


2

Гол> <> , 36 байт

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

Спробуйте в Інтернеті!

ще молодша версія, 36 байт

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

Я відчуваю себе так близько, щоб отримати його на один рядок коротше, grrrr ....

Спробуйте в Інтернеті!

ще молодша версія, 36 байт

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

Цей код менший, але він все одно виходить на стільки ж сумно, коментар займає решту місця.

Спробуйте в Інтернеті!

трохи молодша версія, 36 байт

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

Wowza! Хе, я просто використав це, щоб заповнити простір, але програма працює, аби гольф вниз, я використав кілька попередньо заданих значень, а не використання змінних!

Спробуйте в Інтернеті!

Старіша версія, 42 байти

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

У ньому є останній новий рядок, і він має більше символів, ніж я хотів би ...

Я буду сильно гольфувати це ...

Спробуйте в Інтернеті!



2

Чисто , 256 байт

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

Спробуйте в Інтернеті!

В основному стандартна quine, зручна також шаблонна quine, з доданою функцією форматування.


1
Хоча це кодовий гольф, я люблю ці довші відповіді. Свята корова, що вражає.
Чарівний восьминога Урна

2

R , 169 144 байт

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

Спробуйте в Інтернеті!

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

Вдалося скоротити його, перемістившись до рядка, який проаналізований, а не відхиленого виразу. Довелося використовувати переопределення унарного оператора, щоб отримати його під 144.


1

C # (Visual C # Interactive Compiler) , 225 байт

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

Використовує a STX вугілля як підкладку. Не усвідомлював, що Кевін Крейссен вже подав точну копію в java перед публікацією, поки мене не зробили, але я все-таки вирішив опублікувати це.

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.