Buat "H" dari "H" kecil


73

Tantangan

Buat fungsi atau program yang, ketika diberi bilangan bulat size, melakukan hal berikut:

Jika sizesama dengan 1, output

H H
HHH
H H

Jika sizelebih besar dari 1, output

X X
XXX
X X

di mana Xoutput dari program / fungsi untuksize - 1

(Jika Anda suka, Anda mungkin memiliki kasus dasar sesuai 0, selama Anda menentukan jawaban Anda)

Salah satu format output berikut dapat diterima, mana yang lebih nyaman bagi Anda:

  • String struktur yang diperlukan dengan dua karakter berbeda yang terkait dengan Hdanspace

  • Array dua dimensi dengan struktur yang diperlukan, dengan dua nilai berbeda yang sesuai dengan Hdanspace

  • Array / daftar string, dengan satu baris output di setiap string, dengan dua nilai berbeda yang terkait dengan Hdanspace

Ruang terkemuka diizinkan, selama ada jumlah ruang utama konstan di setiap baris. Dua karakter keluaran yang berbeda dapat bergantung pada apa pun yang Anda pilih, asalkan berbeda.

Tentukan format output apa yang dikembalikan oleh kode Anda.

Uji Kasus

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

Ini adalah , sehingga jumlah byte terendah untuk setiap bahasa menang!

code-golf  ascii-art  fractal  code-golf  code-golf  string  code-golf  string  matrix  code-golf  graph-theory  maze  binary-matrix  code-golf  kolmogorov-complexity  random  code-challenge  metagolf  test-battery  brain-flak  text-processing  code-golf  matrix  code-golf  number-theory  primes  code-golf  string  matrix  code-golf  binary  bitwise  code-golf  number  factorial  floating-point  code-golf  number  sequence  code-golf  sequence  cops-and-robbers  code-golf  sequence  cops-and-robbers  code-golf  string  code-golf  math  decision-problem  number-theory  integer  code-golf  number  decision-problem  functional-programming  code-golf  array-manipulation  matrix  code-golf  string  classification  string  code-challenge  binary  compression  decode  code-golf  string  string  code-challenge  balanced-string  encode  code-golf  number-theory  integer  base-conversion  code-golf  math  number-theory  geometry  abstract-algebra  code-golf  array-manipulation  sorting  optimization  code-golf  math  geometry  image-processing  generation  code-golf  string  cops-and-robbers  repeated-transformation  grammars  cops-and-robbers  repeated-transformation  grammars  code-challenge  restricted-source  tips  source-layout  javascript  code-challenge  kolmogorov-complexity  restricted-source  code-golf  combinatorics  counting  math  fastest-code  linear-algebra  code-golf  math  permutations  matrix  linear-algebra  code-golf  string  decision-problem  restricted-source  code-golf  number  array-manipulation  subsequence  code-golf  number  array-manipulation  matrix  code-golf  brainfuck  code-golf  color  code-golf  quine  source-layout  code-golf  subsequence  code-golf  string  ascii-art  code-golf  string  ascii-art  alphabet  code-golf  decision-problem  interpreter  hexagonal-grid  halting-problem  code-golf  string  polynomials  calculus  code-golf  math  decision-problem  matrix  complex-numbers  code-golf  random  code-golf  number  arithmetic 

4
Sempurna untuk Arang mungkin ... lol. Juga selamat datang di PPCG! : D
HyperNeutrino

10
Selamat datang di PPCG. Tantangan pertama yang bagus!
Adám

Bisakah kita menggunakan ukuran berdasarkan 0?
Adam


1
Saya akan menyebutnya "Sierpinski H"
mbomb007

Jawaban:


28

Bahasa Wolfram (Mathematica) , 46 byte

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

Mengembalikan array 2d dari 0s dan 1s.

Cobalah online!

Sarang [ArrayFlatten @ {r = {#, 0, #}, {#, #, #}, r} &, 1, #] & [3] // MatrixForm

Sarang [ArrayFlatten @ {r = {#, 0, #}, {#, #, #}, r} &, 1, #] & [5] // Gambar


17
apa sih Mathematica memiliki built-in untuk array bersarang rekursif lol. +1
HyperNeutrino

1
@HyperNeutrino dengan baik jelas
ASCII-satunya

7
@HyperNeutrino Bagaimana ini dianggap sebagai bawaan? Hanya Nest(berulang kali) fungsinya beberapa kali. Seperti kiriman lainnya (Jelly?) Ini ArrayFlattenadalah ... baik, built-in, tetapi berperilaku agak seperti Flatten[#,{{1,3},{2,4}}]dalam kasus ini. (tidak menguji)
user202729

6
Ada built-in untuk ini, tetapi lebih lama. Mathematica memiliki nama fungsi yang panjang.
alephalpha

1
Bagaimana tidak, mengingat kemenangannya di tantangan upgoat ?
ojdo

21

Kanvas , 14 12 byte

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

Coba di sini!

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

Di mana Iinput, Xadalah pola yang dihasilkan oleh loop sebelumnya ("H" untuk loop pertama), dan <space>merupakan ruang kosong pada baris pertama dan ketiga dari pola, ditambahkan secara implisit oleh .

-2 byte terima kasih kepada dzaima !


Jawaban singkat yang luar biasa: O
NL628

19

MATL , 12 11 byte

t:"[ACA]BX*

Input yang diberikan n, ini menghasilkan matriks yang berisi 0dan n.

Cobalah online!

Untuk mengonversikan ini menjadi matriks karakter Hdan spasi tambahkan g72*cdi header. Coba juga online!

Atau tambahkan ]1YCuntuk melihat matriks yang ditampilkan secara grafis. Cobalah di MATL Online!

Penjelasan

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 byte

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

Jalankan dan debug itu

Ini adalah representasi ascii dari program dengan komentar. Program ini membangun sisi H, dan kemudian transposes sekali di akhir.

'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

Program bonus 14 byte - menggunakan inputnya sebagai karakter keluaran. Secara teoritis, ini tidak akan menghasilkan bentuk yang tepat pada 10, karena memiliki 2 digit, tetapi mencoba menjalankan yang membuat browser saya mogok.


11

Ruby , 72 byte

Output adalah daftar string, satu string per baris.

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

Cobalah online!


Sudah selesai dilakukan dengan baik! Outputnya terlihat salah pada tio pada awalnya, tapi tidak masalah ketika diperbesar.
Eric Duminil



9

APL (Dyalog Classic) , 14 byte

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

Cobalah online!

input yang dievaluasi n

,⍳⎕⍴3 semua n-tupel dengan elemen dari 0 1 2

2| mod 2

×/¨∘.≥⍨ membentuk matriks dengan membandingkan setiap pasangan tupel a dan b - jika semua elemen a adalah ≥ elemen yang sesuai dari b, itu adalah 1, jika tidak 0



8

R , 64 byte

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

Cobalah online!

Dikurangi oleh produk Kronecker, sebagai port yang tidak tahu malu jawaban Luis Mendo .

Footer mencetak hasilnya baik, tapi ini adalah fungsi anonim yang mengembalikan matrixdari 1untuk Hdan 0untuk ruang.


8

Java (OpenJDK 9) , 135 byte

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;}

Cobalah online!

Mengembalikan int[][]dengan 0untuk Hdan 1untuk space. Ini sebenarnya "memahat" dinding Hbukannya "menumpuk" H.

Penjelasan

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

simpan 5 byte dengan menambahkan impor statis untuk Math.pow
Selim

4
@ Mulai impor statis diperlukan dalam jumlah byte. Jadi saya akan kehilangan ... 19 byte.
Olivier Grégoire



6

J , 25 22 byte

,./^:2@(*/#:@5 7 5)^:]

Cobalah online!

        */               multiply by
          #:@5 7 5       the binary matrix shaped like H
,./^:2                   assemble the 4-dimensional result into a matrix
                   ^:]   do it input times

6

Haskell, 73 67 64 55 byte

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

Ini hanya berfungsi dengan versi terbaru Prelude, karena diekspor <>dari Data.Semigroup. Untuk menjalankannya di TIO, tambahkan impor seperti yang dilakukan di sini: Coba online!

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

Edit: -9 byte terima kasih kepada @ Potato44.


3
Anda harus dapat golf (#)ke g#f=g<>f<>gjika Anda menggunakan GHC 8.4. Ini karena Semigroupsekarang di awal.
Potato44

@ Potato44: Saya cukup yakin ini akan membantu dalam banyak tantangan. Terima kasih!
nimi

5

Perl 5 , 46 44 43 41 40 byte

1 penghitungan berdasarkan. Penggunaan 0dan 1untuk Hdan ruang, memiliki terkemuka 1(ruang)

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

Didasarkan pada ide klasik oleh mtve.

Cobalah online!


1
Output untuk n ≥ 3 kurang tepat.
Primo

@primo Programnya benar tetapi TIO menggunakan versi UTF-8 dari karakter khusus. Saya memperbaiki tautan untuk menggunakan escapes, tetapi program ini masih berfungsi jika Anda menggunakan karakter literal yang sebenarnya
Ton Hospel

Saya tidak tahu mengapa \321perlu, karakter apa pun tampaknya berfungsi. //dan $'juga bisa mengganti //gdan $`, tapi saya tidak yakin itu mengarah ke perbaikan.
Primo

1
@primo Terima kasih! Saya masih bekerja dari kode yang berasal dari solusi mtve lama di mana \321sedikit komplemen .(digunakan untuk menghasilkan pola fraktal lain). Tapi saya menjatuhkan bit-komplemen jadi tentu saja saya tidak membutuhkan itu lagi. Saya menggunakan //gdan $ `jadi saya bisa dengan mudah menguji kode dari commandline ( //dan $'tidak mengarah ke gain yang saya lihat, byte yang diperoleh terbuang dengan spasi atau !lagi)
Ton Hospel

5

Vim - 66 56 54 byte

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

Input diambil sebagai angka dalam buffer.


Apa yang harus saya ketik, mulai dari bash prompt, dengan asumsi saya telah menginstal vim, untuk melihat hasilnya?
Fabien

Ketik vim, tekan enter, ketikkan nomor input (mis. 3) dalam buffer lalu, dari mode normal, tekan urutan tombol dari posting.
Chiel ten Brinke

Pastikan untuk menggunakan vanilla vim
Chiel ten Brinke

Ada salah ketik dalam kode. Perbaiki saja.
Chiel ten Brinke

1
Bekerja! <kbd> I </kbd> adalah huruf kapital i, bukan ell. :set nowrapuntuk melihat hasilnya, untuk 4 dan lebih banyak.
Fabien

4

APL (Dyalog Unicode) , 38 34 byte SBCS

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

Output adalah array 2 dimensi dengan 1mewakili H dan0 mewakili ruang.

Cobalah online!


2
Selamat datang di PPCG! Anda dapat menghilangkan f←dan menghitung karakter sebagai masing-masing 1 byte: codegolf.meta.stackexchange.com/questions/9428/... Ini juga dianggap sah untuk mengambil input dari , yaitu ganti ⍣⍵dengan ⍣⎕dan lepaskan kawat gigi dfn luar.
ngn

Terima kasih! Saya belum pernah benar-benar secara resmi golf APL sebelumnya jadi ini akan membantu.
MJacquet

1 1⍴1dapat ditulis sebagai ⍪1dan kemudian parens di sekitar operator menjadi tidak perlu. Jika Anda terbiasa dengan kereta - mereka bisa banyak membantu di sini.
ngn

Juga, adalah teman Anda: (⍵,(0×⍵),⍵)=>(⍵,⍵,⍨0×⍵)
Zacharý

4

Arang , 30 29 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

H

Cetak aslinya H.

FENX³ι«

Ulangi sizekekuatan pertama 3.

J⁰¦⁰

Pindahkan kursor kembali ke asal. Trimmembutuhkan ini, karena pencetakan asli Hdan pantulan di bawah ini menggerakkan kursor.

C⁰ι

Salin iterasi sebelumnya ke bawah, buat domino.

Cιι

Salin hasilnya ke bawah dan ke kanan, buat tetromino.

T⊗ι⊗ι

Potong kanvas ke bawah menjadi Ltriomino bentuk.

‖OO→↓ι

Refleksikan kanvas secara horizontal dan vertikal dengan tumpang tindih, menyelesaikan iterasi.

Arang lebih baik pada beberapa fraktal daripada yang lain. Ini ide yang serupa, tetapi hampir setengah ukurannya:

HFN«⟲C²⁶‖OOLX³ι

Cobalah online! Tautan adalah untuk mengucapkan versi kode.


4

Python 2 , 143 byte

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

Cobalah online!

-30 byte berkat rekursif

kode wrapper adalah untuk pemformatan yang bagus. itu berfungsi dengan baik jika Anda menghapusnya



4

PHP 7, 125 109 byte

pendekatan yang berbeda: Alih-alih bersarang dan meratakan hasilnya secara rekursif, ini hanya memotong baris dan kolom dan menggunakan loop ke-3 untuk mengetahui apakah akan mencetak Hatau _.

Sunting: Disimpan banyak dengan menggabungkan loop baris / kolom ke satu, meskipun butuh sedikit untuk mendapatkan penurunan untuk loop dalam yang benar. Membutuhkan PHP 7 untuk operator listrik.

Cobalah secara online !


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=_;

mencetak hasilnya. Jalankan sebagai pipa dengan -nR.

fungsi yang memenuhi syarat, 147 130 byte

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;}

mengembalikan satu string. Jalankan dengan konfigurasi default (tidak php.ini).


1
%3==1dapat diganti dengan %3&1.
Primo

3

Jelly , 25 byte

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

Cobalah online!


Meskipun ini lebih lama dari pengiriman Jelly yang ada , ia mencoba untuk menghasilkan setiap karakter secara mandiri hanya dari koordinat.

Khususnya, jika koordinatnya adalah (x,y)(1-indexing), tautan pertama akan kembali 0dan 1sesuai dengan masing H- masing.


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

Juga, 5 byte ị⁾ HYdigunakan untuk memformat, jadi program ini (20 byte) juga valid (tetapi hasilnya tidak terlihat bagus):

,’b3U×"3S_4A1e
3*çþ`

3

T-SQL , 267 261 byte

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

Ini adalah jawaban pertama saya di Code Golf, jadi tolong bantu saya jika saya melakukan kesalahan. Juga, bahasa pilihan saya adalah Transact-SQL, yang tidak terlalu cocok untuk kode pendek.
Razvan Socol

1
Selamat datang di PPCG dan postingan pertama yang bagus! Untuk tips tentang bermain golf di T-SQL, pastikan untuk memeriksa posting ini !
caird coinheringaahing

Saya mencoba menambahkan sqlfiddle, tetapi tidak berhasil dengan variabel tabel. Jika saya menggunakan tabel normal, ini bahkan lebih pendek 1 byte: sqlfiddle.com/#!18/eb14e/2 . Namun, output tidak diformat dengan benar oleh sqlfiddle, tetapi berfungsi dengan baik di SSMS.
Razvan Socol

1
Anda harus bisa mendapatkan ini ke 259 dengan menghapus beberapa spasi putih dan linefeeds yang tidak perlu
MickyT

Saya hanya sampai 261. Apa yang saya lewatkan?
Razvan Socol

2

PHP 7, 153 byte

    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;}

Jalankan dengan konfigurasi default (tidak php.ini) atau coba online .


2

Perl, 64 byte

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

Membutuhkan -p, input diambil dari stdin. Output adalah H Hs.

Cobalah online!


Menghitung di situs ini telah berubah, Anda tidak perlu menghitung -plagi (saya pikir itu terlalu toleran untuk perl, tapi begitulah sekarang)
Ton Hospel

2

PHP (5.6+), 94 byte

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

Digunakan dengan -Fopsi baris perintah. Mengasumsikan default juru bahasa ( -n). Tidak akan berfungsi pada versi sebelum 5.6, karena operator daya.

Penggunaan sampel

$ 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

Cobalah online!


1
Anda dapat menyimpan satu byte: $s.$s.$sbukan $s.=$s.$s. Dan Anda tidak perlu <?dengan -Rbukan -F.
Titus

Terima kasih atas bytenya. Mengenai -R, bisakah Anda menunjukkan kepada saya penggunaan lengkap?
Primo

Sama seperti -nF: echo <input> | php -nR '<code>'. -rhampir sama: php -nr '<code>' <arguments>.
Titus

Mungkin saya terlalu bodoh untuk membuatnya bekerja: / i.stack.imgur.com/jqpmk.png
primo

1
preg_filteradalah untuk mengulangi setiap baris sambil mempertahankan baris baru, kira-kira setara dengan join("\n",array_map(function(){...},split("\n",$s.$s.$s))), tetapi jauh lebih sedikit verbose. Saya awalnya str_padtetapi berubah menjadi sprintfkarena itu satu byte lebih pendek:'"\0".str_pad($$i++/$i&1?"\0":"",$i)."\0"'
primo

1

CJam - 103 97 87 76 byte

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

Program ini melakukan rekursi "handcoded" yang sangat verbose. Tidak ada perkalian matriks cerdas. Sepanjang rekursi, di atas tumpukan ada array yang mengumpulkan output yang diperoleh dari panggilan induk. Tepat setelah setiap set panggilan rekursif, output dari panggilan rekursif perlu di-zip bersama-sama, untuk memastikan output benar ketika tumpukan dicetak secara linier di akhir program. Tumpukan argumen yang diteruskan rekursi disimpan dalam variabel A.

Coba online



1

Japt , 23 byte

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

Cobalah online!

Dibongkar & Cara kerjanya

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

Menggunakan pola transpos

III
 I 
III

jauh lebih mudah untuk ditangani daripada Hpola aslinya , setidaknya di Japt di mana Idapat dilakukan dengan pengulangan string dan padding-tengah.


0

C ++ 11 - 138 byte

Namun, tidak yakin apakah jawaban ini memiliki sintaks yang valid.

#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':' '}{}};

Tidak digabungkan dengan kode kerja

#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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.