Великая Пирамида Куайна


11

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

       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.
  • Ваша квинна должна быть в форме пирамиды.
    • Он должен сохранять исходный порядок вашего исходного кода.
    • Ваш исходный код НЕ может содержать символ, используемый для форматирования пирамиды.
    • Например, если ваш исходный код содержит пробел, вам понадобится еще один символ для формата.
  • Вы можете использовать комментарии в своей квине, чтобы «добавить» правильный размер.
    • Очевидно, что они должны быть выведены как часть квайн.
  • Если программа содержит символы новой строки / табуляции, они не являются частью квинуса и должны быть опущены в выводе.
  • Форма считается в символах, а не в байтах; если форма искажена, вы делаете это неправильно.

Наименьшая возможная оценка здесь должна быть 4.


Должна ли исходная квиня быть в форме пирамиды или только результат должен быть?
KrystosTheOverlord

@KrystosTheOverlord выходной, оригинал не имеет значения. Если в оригинале есть вкладки или новые строки, вы должны пропустить их и в выводе, чтобы сохранить форму вывода.
Волшебная урна осьминога

Допустимо ли, если на выходе есть куча завершающих пробелов / новых строк?
Emigna

@ Emigna это должно быть? Я не вижу проблемы с этим, если другие не делают в этом пункте. Кроме того, определите «связку», разве консенсус обычно «единственная конечная новая строка приемлема»?
Волшебная Урна Осьминога

1
Вы должны принять вызов, где вам нужно иметь quine в формате пирамиды :).
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 Кстати, все остальные ответы имеют завершающий символ новой строки, поэтому все будут недействительными, за исключением этого 36-байтового символа.
Кевин Круйссен

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расставаться, когда вместо этого вы можете иметь формат в цикле
Джо Кинг,

@ JoKing А, конечно. Спасибо. К сожалению, я должен уменьшить базовую программу без комментариев, по крайней мере, до 196 (14 2), чтобы сохранить байты (или только увеличить ее до 225 (15 2) и найти обходной путь, чтобы каким-то образом иметь нечетное количество байтов). Сейчас 228 без комментариев.
Кевин Круйссен

1
Попробовал другой подход и закончил только два байта, и только потому, что это нечетное число ... Обходной путь для нечетных длин - %%в строке и только один %в реальном коде, но это означает, что комментарии обязательны
Джо Король

1
@JoKing Хороший подход с заменой пробелов на вкладки, так что мы можем иметь начальные пробелы (и опускать вкладки в выводе из-за правил вызова). Я смог переработать ваш код ///в строке, чтобы строка была достаточно длинной, чтобы перейти к ожидаемой итерации, чтобы напечатать все, прежде чем остановиться на StringIndexOutOfBoundsExceptionfor .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)

Попробуйте онлайн!

Eval Quine, который использует пробелы в качестве символа-заполнителя.




или ... ну ... ясно, с таким большим количеством отступов вы могли бы поставить в нем подпись (то есть более интересную строку thatn aaaaaaaaa): P
только ASCII

@ Только для ASCII Хороший вопрос, смотрите обновленный ответ;)
Джо Кинг,

3

Perl 6 , 67 байт

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

Попробуйте онлайн!

Я использовал пару символов Юникода, чтобы выжать этот дополнительный слой. Выходы с использованием пробелов:

       <
      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 байт

При этом используется правило. Если программа содержит символы новой строки / табуляции, они не являются частью квинуса и должны быть опущены в выводе.

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

Gol> <> , 36 байт

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

Попробуйте онлайн!

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

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

Я чувствую себя так близко к тому, чтобы сделать это на одну строку короче, грррр ....

Попробуйте онлайн!

еще младшая версия, 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 #) , 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));//

Использует STX символ в качестве отступа. Не осознавал, что Кевин Круйссен уже отправил точную копию в java до публикации, пока я не закончу, но я решил опубликовать это в любом случае.

Попробуйте онлайн!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.