Создайте «H» из меньших «H»

73

Вызов

Создайте функцию или программу, которая при задании целого числа sizeвыполняет следующие действия:

Если sizeравно 1, выведите

H H
HHH
H H

Если sizeбольше 1, выведите

X X
XXX
X X

где Xвывод программы / функции дляsize - 1

(Если вы предпочитаете, базовый случай может соответствовать 0, если вы укажете в своем ответе)

Любой из следующих форматов вывода является приемлемым, в зависимости от того, что вам удобнее:

  • Строка требуемой структуры с любыми двумя различными символами, соответствующими Hиspace

  • Двумерный массив с требуемой структурой, с любыми двумя различными значениями, соответствующими Hиspace

  • Массив / список строк, с одной строкой вывода в каждой строке, с любыми двумя различными значениями, соответствующими Hиspace

Допускаются пробелы, если в каждой строке есть постоянное количество пробелов. Два разных выходных символа могут зависеть от всего, что вы выберете, если они различны.

Укажите, какой формат вывода ваш код возвращает.

Тестовые случаи

1

H H
HHH
H H

2

H H   H H
HHH   HHH
H H   H H
H HH HH H
HHHHHHHHH
H HH HH H
H H   H H
HHH   HHH
H H   H H

3

H H   H H         H H   H H
HHH   HHH         HHH   HHH
H H   H H         H H   H H
H HH HH H         H HH HH H
HHHHHHHHH         HHHHHHHHH
H HH HH H         H HH HH H
H H   H H         H H   H H
HHH   HHH         HHH   HHH
H H   H H         H H   H H
H H   H HH H   H HH H   H H
HHH   HHHHHH   HHHHHH   HHH
H H   H HH H   H HH H   H H
H HH HH HH HH HH HH HH HH H
HHHHHHHHHHHHHHHHHHHHHHHHHHH
H HH HH HH HH HH HH HH HH H
H H   H HH H   H HH H   H H
HHH   HHHHHH   HHHHHH   HHH
H H   H HH H   H HH H   H H
H H   H H         H H   H H
HHH   HHH         HHH   HHH
H H   H H         H H   H H
H HH HH H         H HH HH H
HHHHHHHHH         HHHHHHHHH
H HH HH H         H HH HH H
H H   H H         H H   H H
HHH   HHH         HHH   HHH
H H   H H         H H   H H

Это , поэтому выигрывает самое низкое число байтов для каждого языка!

Bazinga_9000
источник
4
Идеально подходит для древесного угля, наверное ... лол. Также добро пожаловать в PPCG! : D
HyperNeutrino
10
Добро пожаловать в PPCG. Хороший первый вызов!
Адам
Можем ли мы использовать 0 на основе размеров?
Адам
1
Я бы назвал это "
Sierpinski

Ответы:

28

Wolfram Language (Mathematica) , 46 байтов

Nest[ArrayFlatten@{r={#,0,#},{#,#,#},r}&,1,#]&

Возвращает 2d массив 0s и 1s.

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

Гнездо [ArrayFlatten @ {г = {#, 0, #}, {#, #, #}, г} &, 1, #] & [3] // MatrixForm

Гнездо [ArrayFlatten @ {г = {#, 0, #}, {#, #, #}, г} &, 1, #] & [5] // Изображение

alephalpha
источник
17
какого черта, конечно, Mathematica имеет встроенный для рекурсивных вложенных массивов LOL. +1
HyperNeutrino
1
@HyperNeutrino хорошо очевидно
только ASCII
7
@HyperNeutrino Как это считается встроенным? Просто Nest(несколько раз) функцию несколько раз. Как и любые другие материалы (Jelly?). Это ArrayFlatten... ну, встроенный, но Flatten[#,{{1,3},{2,4}}]в этом случае он ведет себя примерно так же, как и . (не тестировал)
user202729
6
Есть встроенный для этого, но дольше. Mathematica имеет длинные имена функций.
алефальфа
1
Как это не могло, учитывая его триумф на вызове для начинающих ?
Ojdo
21

Холст , 14 12 байтов

H;[⌐⌐∔*×∔;3*+

Попробуй это здесь!

Объяснение:
Code    |Instruction                                                         |Stack
--------+--------------------------------------------------------------------+-------------------------
        |Push input to stack (implicit)                                      |I
H       |Push "H" to stack                                                   |I,"H"
;      |Swap the top two stack items                                        |"H",I
[      |The following ToS (input) times:                                    |X
    ⌐⌐  |Duplicate ToS (result from last loop ("H" if first loop)) four times|X,X,X,X,X
    ∔   |Join vertically                                                     |X,X,X,X\nX
    ×   |Prepend                                                             |X,X,XX\nX
    ∔   |Join vertically                                                     |X,X\nXX\nX
    ;  |Swap top two stack items                                            |X\nXX\nX,X
    3*|Repeat three times vertically                                       |X\nXX\nX,X\nX\nX
    +  |Join horizontally                                                   |X<space>X\nXXX\nX<space>X
        |End loop (implicit)                                                 |X
        |Print ToS (implicit)                                                |

Где Iввод, Xэто шаблон, сгенерированный предыдущим циклом («H» для первого цикла), и <space>это пустое пространство в первой и третьей строке шаблона, добавленное неявно с помощью .

-2 байта благодаря дзайме !

hakr14
источник
Удивительно короткий ответ: O
NL628
19

MATL , 12 11 байт

t:"[ACA]BX*

С учетом входных данных nвыводится матрица, содержащая 0и n.

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

Чтобы преобразовать это в символьную матрицу Hи пробел добавить g72*cв заголовок. Попробуйте тоже онлайн!

Или добавьте, ]1YCчтобы матрица отображалась графически. Попробуйте это в MATL Online!

объяснение

t          % Input (implicit): n. Duplicate
:          % Range. Gives the array [ 1 2 ... n]
"          % For each (that is, do n times)
  [ACA]    %   Push the array [5 7 5]
  B        %   Convert to binary. Gives the 3×3 matrix [1 0 1; 1 1 1; 1 0 1]
  X*       %   Kronecker product
           % End (implicit). Display (implicit)
Луис Мендо
источник
16

Stax , 16 15 байт

╛c_mê║6{│◙ÖmπV"

Запустите и отладьте его

Это представление программы в ascii с комментариями. Эта программа строит Н вбок, а затем транспонирует один раз в конце.

'H]                 ["H"]
   {         },*    repeat block specified number of times
    c               copy the matrix
     {3*m           triplicate each row
         |S         surround; prepend and append like b + a + b
           |C       horizontally center rows with spaces
                M   transpose back to original orientation
                 m  output each row

Бонусная 14-байтовая программа - использует свой ввод в качестве выходного символа. Теоретически, это не даст правильную форму на 10, так как он имеет 2 цифры, но попытка запустить, что приводит к сбою моего браузера.

рекурсивный
источник
11

Рубин , 72 байта

Выход - это список строк, по одной строке на строку.

f=->n{n<1?[?H]:[*a=(x=f[n-1]).map{|i|i+' '*i.size+i},*x.map{|i|i*3},*a]}

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

Значение чернил
источник
Отлично сработано! Сначала вывод tio выглядит неправильно, но при уменьшении он работает нормально.
Эрик Думинил
9

APL (Dyalog Classic) , 14 байтов

×/¨∘.≥⍨2|,⍳⎕⍴3

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

оценил вход n

,⍳⎕⍴3 все n-кортежи с элементами из 0 1 2

2| мод 2

×/¨∘.≥⍨ сформировать матрицу, сравнивая каждую пару кортежей a и b - если все элементы a являются ≥ соответствующими элементами b, это a 1, иначе 0

СПП
источник
8

R , 64 байта

function(n)Reduce(`%x%`,rep(list(matrix(c(1,1,1,0,1,0),3,3)),n))

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

Сокращает продукт Кронекера, как бесстыдный порт ответа Луиса Мендо .

Сноска печатает результат хорошо, но это анонимная функция , которая возвращает matrixиз 1для Hи 0для пространства.

Giuseppe
источник
8

Java (OpenJDK 9) , 135 байт

n->{n+=Math.pow(3,n)-n;int s=1,H[][]=new int[n][n],x,y;for(;s<n;s*=3)for(x=n;x-->0;)for(y=n;y-->0;)H[x][y]|=~(x/s%3)&y/s%3&1;return H;}

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

Возвращает int[][]с 0для Hи 1для space. Это на самом деле "вырезает" стену H, а не "наваливает H".

Пояснения

n->{                        // An int to int[][] lambda function
  n+=Math.pow(3,n)-n;       //  change n to 3^n, through +=...-n to avoid an explicit cast
  int s=1,                  //  size of the carvings.
      H[][]=new int[n][n],  //  the 2D array to return, filled with 0s
      x,                    //  counter for the 2D array
      y;                    //  counter for the 2D array
  for(;s<n;s*=3)            //  for each size
    for(x=n;x-->0;)         //   for each row
      for(y=n;y-->0;)       //    for each column
        H[x][y] |=          //     assign 1 to a cell of the array if...
           ~(x/s%3)         //      it is located in the "holes" of the H
          &y/s%3            //
          &1;               //      
  return H;                 //  return the array
}                           // end the lambda
Оливье Грегуар
источник
сохранить 5 байтов, добавив статический импорт для Math.pow
Selim
4
@Selim статический импорт требуется в количестве байтов. Так что я бы потерял ... 19 байт.
Оливье Грегуар
7

Python 2 , 70 байт

f=lambda r:-r*'H'or[x+[x,' '*3**r][b]+x for b in 1,0,1for x in f(r-1)]

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

Функция выводит список строк.


Python 2 , 84 байта

r=input()
for i in range(3**r):x,s=' H';exec"s+=[x,s][i%3%2]+s;x*=3;i/=3;"*r;print s

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

Использует тот же шаблон, что и другие 3 * 3 фрактальные модели:

XNOR
источник
6

Haskell, 73 67 64 55 байт

g#f=g<>f<>g
w=map.(id#)
(iterate(w(>>" ")#w id)["H"]!!)

Это работает только с последней версией Prelude, потому что он экспортирует <>из Data.Semigroup. Чтобы запустить его на TIO, добавьте импорт, как здесь: попробуйте онлайн!

g#f=              -- function # takes two functions g and f and a list s
                  -- and returns
   g <> f <> g    -- g(s), followed by f(s) and another g(s)

w=                -- w takes a function and a list of lists
                  -- (both as unnamed parameters, because of pointfree style,
                  -- so let's call them f and l)
  map.(id#)       -- return map(id#f)l, i.e. apply (id#f) to every element of l

  w(>>" ")#w id   -- this partial application of # is a function that
                  -- takes the missing list (here a list of lists)
                  -- remember: (>>" ") is the function that replaces every element
                  -- of a list with a single space

iterate(   )["H"] -- starting with a singleton list of the string "H"
                  -- which itself is a singleton list of the char 'H'
                  -- repeatedly apply the above function
              !!  -- and pick the nth iteration



Example for ["H H", "HHH", "H H"], i.e.

   H H
   HHH
   H H

call the iterated function:
                    ( w(>>" ")         # w id       ) ["H H","HHH","H H"]

expand w:           ( map(id#(>>" "))  # map(id#id) ) ["H H","HHH","H H"]

expand outermost #: map(id#(>>" "))["H H","HHH","H H"] ++
                    map(id#id)     ["H H","HHH","H H"] ++
                    map(id#(>>" "))["H H","HHH","H H"]

expand map:         [(id#(>>" "))"H H",   (id#(>>" "))"HHH",   (id#(>>" "))"H H"] ++
                    [(id#id)     "H H",   (id#id)     "HHH",   (id#id)     "H H"] ++
                    [(id#(>>" "))"H H",   (id#(>>" "))"HHH",   (id#(>>" "))"H H"]

expand other #:     ["H H"++"   "++"H H", "HHH"++"   "++"HHH", "H H"++"   "++"H H"] ++
                    ["H H"++"H H"++"H H", "HHH"++"HHH"++"HHH", "H H"++"H H"++"H H"] ++
                    ["H H"++"   "++"H H", "HHH"++"   "++"HHH", "H H"++"   "++"H H"]

collaps ++:         ["H H   H H", "HHH   HHH", "H H   H H",
                     "H HH HH H", "HHHHHHHHH", "H HH HH H",
                     "H H   H H", "HHH   HHH", "H H   H H"]

which is printed line by line: 

  H H   H H
  HHH   HHH
  H H   H H
  H HH HH H
  HHHHHHHHH
  H HH HH H
  H H   H H
  HHH   HHH
  H H   H H

Редактировать: -9 байт благодаря @ Potato44.

Ними
источник
3
Вы должны быть в состоянии играть в гольф (#), g#f=g<>f<>gесли вы используете GHC 8.4. Это потому что Semigroupсейчас в прелюдии.
Potato44
@ Potato44: Я уверен, что это поможет в решении многих задач. Спасибо!
Nimi
5

Perl 5 , 46 44 43 41 40 байт

1 основанный подсчет Использует 0и 1для Hи пространства, имеет ведущий 1(пространство)

say//,map/$'/^1,@;for@;=glob"{A,.,A}"x<>

По мотивам классической идеи от mtve.

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

Тон Хоспел
источник
1
Вывод для n ≥ 3 не совсем правильный.
Примо
@primo Программа была правильной, но TIO использует версию специальных символов UTF-8. Я исправил ссылку, чтобы использовать вместо
нее
Я понятия не имею, почему \321это необходимо, любой персонаж, кажется, работает. //а $'также может заменить //gи $`, но я не уверен , что это приводит к улучшению.
Примо
1
@ primo Спасибо! Я все еще работал над кодом, полученным из старого решения mtve, где \321был битовый набор .(использовался для генерации другого фрактального паттерна). Но я бросил бит-комплемент, поэтому, конечно, он мне больше не нужен. Я использовал //gи $ `, так что я могу легко протестировать код из командной строки ( //и $'я не вижу выигрыша, который я вижу, полученный байт теряется с пробелом или !снова)
Ton Hospel
5

Vim - 66 56 54 байта

A @ c H esc " r d ^ q c { ctrl-v } " a y g v r space g v d " a P P " a P V G " b y P g v ctrl-v $ d " a P . . G " b p q @ r

Ввод берется как число в буфере.

Чиль тен бринке
источник
Что мне нужно набрать, начиная с приглашения bash, при условии, что у меня установлен vim, чтобы увидеть результат?
Фабьен
Введите vim, нажмите enter, введите номер буфера (например, 3) в буфере, затем в обычном режиме нажмите последовательность клавиш из сообщения.
Чиль тен Бринке
Обязательно используйте vanilla vim
Chiel ten Brinke
В коде была опечатка. Просто исправил это.
Чиль тен Бринке
1
Работает! <kbd> I </ kbd> это заглавная буква i, а не ell. :set nowrapчтобы увидеть результат, на 4 и более.
Фабьен,
4

APL (Dyalog Unicode) , 38 34 байта SBCS

({(⍵,(0×⍵),⍵){⍺⍪⍵⍪⍺}⍵,⍵,⍵}⍣⎕)1 1⍴1

Выходные данные - это двумерный массив, 1представляющий H и 0представляющий пространство.

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

MJacquet
источник
2
Добро пожаловать в PPCG! Можно опустить f←и считать символы как 1 байт каждого: codegolf.meta.stackexchange.com/questions/9428/... Это также считается законным принимать входные данные от , т.е. заменить ⍣⍵с ⍣⎕и падение брекеты внешней DFN в.
августа
Спасибо! Я никогда раньше не играл в гольф официально, поэтому это должно помочь.
MJacquet
1 1⍴1можно записать как, ⍪1и тогда паренсы вокруг оператора становятся ненужными. Если вы знакомы с поездами - они могут помочь здесь.
августа
Кроме того, ваш друг: (⍵,(0×⍵),⍵)=>(⍵,⍵,⍨0×⍵)
Zacharý
4

Древесный уголь , 30 29 байт

HFENX³ι«J⁰¦⁰C⁰ιCιιT⊗ι⊗ι‖OO→↓ι

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

H

Распечатайте оригинал H.

FENX³ι«

Цикл по первым sizeстепеням 3.

J⁰¦⁰

Переместите курсор назад к началу координат. TrimЭто необходимо, так как исходная печать Hи отражение ниже перемещают курсор.

C⁰ι

Скопируйте предыдущую итерацию вниз, создав домино.

Cιι

Скопируйте результат вниз и вправо, создав тетромино.

T⊗ι⊗ι

LОбрежьте холст до формы триомино.

‖OO→↓ι

Отразите холст по горизонтали и вертикали с перекрытием, завершив итерацию.

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

HFN«⟲C²⁶‖OOLX³ι

Попробуйте онлайн! Ссылка на подробную версию кода.

Нил
источник
4

Python 2 , 143 байта

def g(a,x,y,s):
	if s:s/=3;[g(a,x+k/3*s,y+k%3*s,s)for k in 0,2,3,4,5,6,8]
	else:a[x][y]=1
def f(s):s=3**s;a=eval("s*[0],"*s);g(a,0,0,s);print a

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

-30 байт благодаря рекурсивной

Код обертки для хорошего форматирования. это работает нормально, если вы удалите его

HyperNeutrino
источник
Несколько гольфов
рекурсивный
4

PHP 7, 125 109 байт

другой подход: вместо того, чтобы рекурсивно вкладывать и выравнивать результат, он просто перебирает строки и столбцы и использует 3-й цикл, чтобы выяснить, печатать Hили _.

Редактировать: Сохранено много путем объединения циклов строки / столбца в один, хотя потребовалось немного, чтобы получить правильное уменьшение для внутреннего цикла. Требуется PHP 7 для оператора питания.

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


for($z=3**$argn;$z*$z>$q=$p;print$c."
"[++$p%$z])for($c=H;$q;$q-=$q/$z%3*$z,$q/=3)if($q%3==1&&$q/$z%3-1)$c=_;

печатает результат. Беги как труба с -nR.

квалифицированная функция, 147 130 байт

function r($n){for($z=3**$n;$z*$z>$q=$p;$r.=$c."
"[++$p%$z])for($c=H;$q;$q-=$q/$z%3*$z,$q/=3)if($q%3==1&&$q/$z%3-1)$c=_;return$r;}

возвращает одну строку. Запустить с настройкой по умолчанию (нет php.ini).

Titus
источник
1
%3==1можно заменить на %3&1.
Примо
3

Желе , 25 байт

,’b3U×"3S_4A1e
3*çþ`ị⁾ HY

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


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

В частности, если координата (x,y)(1-индексирование), первая ссылка возвращается 0и 1соответствует Hи соответственно.


,                Pair. Get (x,y)
 ’               Decrement. Get (x,y) (0-indexing)
  b3             Convert to base 3 digits.
    U            Upend. So next operations can pair the corresponding digits.
     ×"3         Multiply the first element (list) by 3.
        S        Sum (corresponding digit together). Let the sum be s.
         _4A1e   Check if any of abs(s-4) is 1. Equivalently, check
                 if there is any 3 or 5 in the list of s.

Кроме того, 5 байтов ị⁾ HYиспользуются для форматирования, поэтому эта программа (20 байтов) также допустима (но вывод не выглядит так же хорошо):

,’b3U×"3S_4A1e
3*çþ`
user202729
источник
3

T-SQL , 267 261 байт

DECLARE @N INT=3DECLARE @ TABLE(I INT,H VARCHAR(MAX))INSERT @ VALUES(1,'H H'),(2,'HHH'),(3,'H H');WITH
T AS(SELECT 1 A,3 P,I J,H S FROM @ UNION ALL SELECT A+1,P*3,J*P+I,REPLACE(REPLACE(S,' ','   '),'H',H)FROM @,T
WHERE A<@N)SELECT S FROM T WHERE A=@N ORDER BY J
Разван Соколь
источник
Это мой первый ответ на Code Golf, поэтому, пожалуйста, помогите мне, если я допустил какие-либо ошибки. Кроме того, я предпочитаю язык Transact-SQL, который не очень подходит для короткого кода.
Разван Соколь
1
Добро пожаловать в PPCG и хороший первый пост! Чтобы получить советы по игре в гольф в T-SQL, обязательно прочитайте этот пост!
Caird Coneheringaahing
Я попытался добавить sqlfiddle, но он плохо работает с табличными переменными. Если я использую обычные таблицы, это даже на 1 байт короче: sqlfiddle.com/#!18/eb14e/2 . Тем не менее, выходные данные не отформатированы правильно sqlfiddle, но он отлично работает в SSMS.
Разван Соколь
1
Вы должны быть в состоянии уменьшить это до 259, удалив ненужные пробелы и
переводы строк
Я получил только 261. Что мне не хватает?
Разван Соколь
2

PHP 7, 153 байта

    function p($n){$r=["H H",HHH,"H H"];if(--$n)foreach(p($n)as$s){$r[+$i]=$r[$i+6*$p=3**$n]=str_pad($s,2*$p).$s;$r[3*$p+$i++]=$s.$s.$s;}ksort($r);return$r;}

Запустите с настройками по умолчанию (нет php.ini) или попробуйте его онлайн .

Titus
источник
2

Perl, 64 байта

//;$_ x=3,$.=s|.+|$&@{[$$_++/$.&1?$&:$"x$.]}$&|g for($_=H.$/)x$'

Требуется -p, вход взят из стандартного ввода. На выходе получается H Hs.

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

Примо
источник
Счет на этом сайте изменился, вам больше не нужно считать -p(я думаю, что это слишком снисходительно для Perl, но это так и сейчас)
Тон Хоспел
2

PHP (5,6+), 94 байта

<?for(;$H>$e*=3or$e=($i+=$e&&print"$s
")<${$s=H}=3**$argn;)$s.=str_pad($i/$e%3&1?$s:'',$e).$s;

Используется с -Fопцией командной строки. Предполагает, что интерпретатор по умолчанию ( -n). Не будет работать на версиях, предшествующих 5.6, из-за оператора питания.

Пример использования

$ echo 3|php -nF h-carpet.php
H H   H H         H H   H H
HHH   HHH         HHH   HHH
H H   H H         H H   H H
H HH HH H         H HH HH H
HHHHHHHHH         HHHHHHHHH
H HH HH H         H HH HH H
H H   H H         H H   H H
HHH   HHH         HHH   HHH
H H   H H         H H   H H
H H   H HH H   H HH H   H H
HHH   HHHHHH   HHHHHH   HHH
H H   H HH H   H HH H   H H
H HH HH HH HH HH HH HH HH H
HHHHHHHHHHHHHHHHHHHHHHHHHHH
H HH HH HH HH HH HH HH HH H
H H   H HH H   H HH H   H H
HHH   HHHHHH   HHHHHH   HHH
H H   H HH H   H HH H   H H
H H   H H         H H   H H
HHH   HHH         HHH   HHH
H H   H H         H H   H H
H HH HH H         H HH HH H
HHHHHHHHH         HHHHHHHHH
H HH HH H         H HH HH H
H H   H H         H H   H H
HHH   HHH         HHH   HHH
H H   H H         H H   H H

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

Примо
источник
1
Вы можете сохранить один байт: $s.$s.$sвместо $s.=$s.$s. И вам не нужно <?с -Rвместо -F.
Титус
Спасибо за байт. Что касается -R, вы можете показать мне полное использование?
Примо
Так же , как -nF: echo <input> | php -nR '<code>'. -rэто почти то же самое php -nr '<code>' <arguments>.
Титус
Может быть, я просто слишком глуп, чтобы заставить его работать: / i.stack.imgur.com/jqpmk.png
primo
1
preg_filterсостоит в том, чтобы повторять каждую строку, сохраняя при этом новые строки, примерно эквивалентные join("\n",array_map(function(){...},split("\n",$s.$s.$s))), но значительно менее многословные. Первоначально я str_padизменился, sprintfпотому что он на один байт короче:'"\0".str_pad($$i++/$i&1?"\0":"",$i)."\0"'
primo
1

CJam - 103 97 87 76 байт

{H{ae_,S*}%}:Il~a:A];{A_W={)(a9*+:A;[[HIH][HHH][HIH]]{z~}%}{);:A;"H"}?}:H~N*

Эта программа выполняет довольно многословную рекурсию с «ручным кодированием». Нет умных матричных умножений. На протяжении всей рекурсии в верхней части стека находится массив, собирающий выходные данные, полученные от родительских вызовов. Сразу после каждого набора рекурсивных вызовов выходные данные рекурсивных вызовов необходимо сжать вместе, чтобы убедиться, что выходные данные верны, когда стек печатается линейно в конце программы. Стек аргументов, передаваемых по рекурсии, сохраняется в переменной A.

Попробуй онлайн

Чиль тен бринке
источник
1

Japt , 23 байта

_·£[X³XX³]Ãy c ·û}gQq)y

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

Распаковано и как это работает

Z{ZqR mXYZ{[Xp3 XXp3]} y c qR û}gQq)y

Z{    Declare a function that accepts a string...
  ZqR   Split by newline...
  mXYZ{   and map each row into...
    [Xp3 XXp3]  an array of [X.repeat(3), X, X.repeat(3)]
  }
  y   Transpose the resulting 2D array
  c   Flatten
  qR  Join with newline
  û   Center-pad each row to the longest
}
gQq)  Apply the above function to '"' recursively
y     Transpose the resulting 2D string

Использование транспонированного шаблона

III
 I 
III

гораздо легче обрабатывать, чем исходный Hшаблон, по крайней мере, в Japt, где это Iможно сделать с помощью повторения строки и заполнения по центру.

фонтанчик для питья
источник
0

C ++ 11 - 138 байт

Однако не уверен, что этот ответ имеет правильный синтаксис.

#define A a?1:0
template<int N>struct H{H<N-1>h[9];H(int a):h{A,0,A,A,A,A,A,0,A}{}};template<>struct H<0>{char h;H(int a):h{a?'H':' '}{}};

Разгруженный с рабочим кодом

#include <iostream>

#define A a?1:0

template<int N>
struct H
{
  H<N-1> h[9];

  H(int a) : h{A,0,A,A,A,A,A,0,A}
  {}
};

template<>
struct H<0>
{
  char h;

  H(int a) : h{a?'H':' '}
  {}
};

int pow(int a, int b)
{
  int res=1;

  for (int i=1; i<=b; ++i)
    res *= a;

  return res;
}

template<int N>
char getHvalue(int i, int j, H<N> &hn)
{
  int n3=pow(3, N-1);

//std::cout << N << " " << i << " " << j << std::endl;

  return getHvalue(i%n3, j%n3, hn.h[i/n3*3+j/n3]);
}

template<>
char getHvalue<0>(int, int, H<0> &hn)
{
  return hn.h;
}

int main()
{
  H<0> h0(1);

  std::cout << getHvalue(0, 0, h0) << std::endl;

  std::cout << "\n====================\n" << std::endl;

  H<1> h1(1);

  for (int i=0; i<3; ++i) {
    for (int j=0; j<3; ++j)
      std::cout << getHvalue(i, j, h1);
    std::cout << std::endl;
  }

  std::cout << "\n====================\n" << std::endl;

  H<2> h2(1);

  for (int i=0; i<9; ++i) {
    for (int j=0; j<9; ++j)
      std::cout << getHvalue(i, j, h2);
    std::cout << std::endl;
  }

  std::cout << "\n====================\n" << std::endl;

  H<3> h3(1);

  for (int i=0; i<27; ++i) {
    for (int j=0; j<27; ++j)
      std::cout << getHvalue(i, j, h3);
    std::cout << std::endl;
  }

  return 0;
}
Tsathoggua
источник