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!

Bazinga_9000
sumber
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
3
terkait
ngn
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

alephalpha
sumber
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 !

hakr14
sumber
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)
Luis Mendo
sumber
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.

rekursif
sumber
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!

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

Haskell , 50 byte

f 0=[[1]]
f n=[x++map(*c)x++x|c<-[0,1,0],x<-f$n-1]

Cobalah online!

Membuat kisi 0 dan 1. Satu karakter lebih panjang untuk spasi dan H.

Haskell , 51 byte

f 0=["H"]
f n=[x++map(min c)x++x|c<-" H ",x<-f$n-1]

Cobalah online!

Tidak
sumber
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

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

Giuseppe
sumber
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
Olivier Grégoire
sumber
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
7

V , 22 byte

éHÀñäLgvr PGï3PkyHGpH

Cobalah online!

Hexdump:

00000000: e948 c0f1 e416 4c67 7672 2050 47ef 3350  .H....Lgvr PG.3P
00000010: 6b79 4847 7048                           kyHGpH

Ini pada dasarnya adalah pendekatan yang sama persis seperti karpet Sierpinski dan The Fractal Plus on Anarchy Golf.

DJMcMayhem
sumber
Apakah itu bahasa Prancis?
Stan Strum
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
FrownyFrog
sumber
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.

nimi
sumber
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!

Ton Hospel
sumber
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.

Chiel ten Brinke
sumber
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!

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

Neil
sumber
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

HyperNeutrino
sumber
Beberapa golf
rekursif
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).

Titus
sumber
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*çþ`
pengguna202729
sumber
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
Razvan Socol
sumber
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 .

Titus
sumber
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!

primo
sumber
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!

primo
sumber
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

Chiel ten Brinke
sumber
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.

Bubbler
sumber
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;
}
Tsathoggua
sumber