Saya menemukan betapa menariknya huruf "H" dan "Saya" sangat mirip. "H" adalah goresan horizontal yang dikelilingi oleh dua goresan vertikal; "I" adalah goresan vertikal yang dikelilingi oleh dua goresan horizontal (tergantung font Anda). Saya yakin ini bisa disarangkan ... Anda tahu apa yang mengingatkan saya? Fraktal !!!
Mari kita mendefinisikan piramida "IHIH" sebagai berikut: Iterasi pertama adalah representasi ASCII dari huruf "I":
---
|
---
Iterasi berikutnya memiliki stroke vertikal di kedua sisi.
| |
|---|
| | |
|---|
| |
Jika Anda melihat "I" di tengah sebagai satu pukulan horizontal tunggal, maka iterasi kedua ini pada dasarnya adalah "H". Iterasi ketiga menambahkan goresan horizontal di bagian atas dan bawah
-------
| |
|---|
| | |
|---|
| |
-------
Sekali lagi, jika Anda melihat "H" di tengah sebagai stroke vertikal tunggal, maka iterasi ini pada dasarnya adalah "I". Pola ini berlanjut, bergantian antara "H" dan "I" pada setiap iterasi. Untuk referensi, berikut adalah 6 iterasi pertama:
1:
---
|
---
2:
| |
|---|
| | |
|---|
| |
3:
-------
| |
|---|
| | |
|---|
| |
-------
4:
| |
|-------|
| | | |
| |---| |
| | | | |
| |---| |
| | | |
|-------|
| |
5:
-----------
| |
|-------|
| | | |
| |---| |
| | | | |
| |---| |
| | | |
|-------|
| |
-----------
6:
| |
|-----------|
| | | |
| |-------| |
| | | | | |
| | |---| | |
| | | | | | |
| | |---| | |
| | | | | |
| |-------| |
| | | |
|-----------|
| |
Tantangan:
Menulis sebuah program atau fungsi yang output n'th iterasi dari piramida IHIH, dan baris baru opsional. Masukan Anda akan menjadi bilangan bulat positif tunggal dalam format wajar apa pun yang Anda inginkan. Anda tidak harus menangani input yang tidak valid, misalnya non-integer, angka lebih kecil dari 1, dll. Program Anda paling tidak harus menghasilkan output yang tepat untuk input hingga 20. Karena ini adalah kode-golf , celah standar tidak diperbolehkan dan jawaban tersingkat dalam byte menang!
Jawaban:
Pyth ,
50403125 byteSuite uji.
Penjelasan
Ini adalah algoritma rekursif.
Dalam setiap iterasi, kami melakukan tiga tindakan:
"-"
atau"|"
tergantung pada jumlah iterasi.Setelah iterasi, output bernomor ganjil akan dialihkan. Karena itu, kami memindahkannya.
sumber
Python,
165145133123 byteSolusi rekursif:
Disebut dengan
print ("\n".join(i(int(sys.argv[1]))))
, di mana parameter adalah nomor iterasi dari piramida IHIH.Terima kasih kepada @DJMcMayhem karena telah menghemat 20 byte. Mengambil ide di balik saran-saran tersebut selanjutnya menyelamatkan 12 byte lagi. Terima kasih kepada @Maltysen untuk saran yang memangkas beberapa byte lagi.
Fungsi mengatur pembatas
d
ke"|"
dan ruang intervensi ke" "
(untuk iterasi ganjil), berurusan dengan pengembalian dalam kasus degenerasi, kemudian mengatur ulang pembatas ke" "
dan ruang intervensi ke"-"
untuk iterasi genap genap. Fungsi mengembalikan daftar string untuk setiap baris IHIH, setelah menyematkan hasil dari panggilan rekursif ke fungsi di tempat yang tepat dalam daftar.sumber
if e<1:return'|'
(tidak ada baris baru di antara mereka) lalu hapus "lain" dan hapus lekukan ekstra.return
. Selain itu, Anda dapat menggabungkan garis tanpaif
s dengan titik koma, dan menghemat indentasiCheddar ,
186177165154148131 byteGunakan rekursi. Akan menambah penjelasan begitu selesai bermain golf.
Cobalah online!
Penjelasan
Yang ini agak rumit juga melacak semua variabel yang saya gunakan, tetapi saya akan mencoba membuatnya tetap sederhana:
Ini menyakitkan untuk golf tetapi 55 byte lebih pendek dari aslinya.
sumber
Python 2, 93 byte
Leaky Nun menghemat 7 byte.
sumber
int(x/2.)
karena saya mengambilrange(-n,n+1)
tetapi sekarang saya bisa menggunakannya. Terima kasih!Matricks ,
8062 byteSolusi berulang (Rekursi dalam Matricks sulit ...)
Jalankan dengan
python matricks.py ihih.txt [[]] <input> --asciiprint
Penjelasan:
sumber
JavaScript (ES6),
9290 byteSolusi rekursif bekerja dengan mengambil iterasi sebelumnya, menambahkan
v
karakter ke samping, lalu menambahkanc
karakter ke sudut-sudut danh
karakter di sepanjang bagian atas dan bawah. Himpunan karakter hanya bergantian setiap iterasi. Sunting: Disimpan 2 byte dengan mengembalikanv
kapann=0
.sumber
Dyalog APL ,
5243 bytev h s←'|- '
ditunjuk tiga karakter untuk tiga nama ( v ertical, h orizontal, s kecepatan)⊃
yang pertama, yaitu|
⍪
buat menjadi 1 × 1 meja{
...}⍣⎕
dapatkan input dan terapkan fungsi bracing yang berulang kaliv=⊃⍵:
jika karakter kiri atas argumen adalah vertikal, maka:h⍪⍨
horizontal di bawah inih⍪
horizontal di atass,
spasi di sebelah kiri⍵,s
argumen dengan spasi di sebelah kanan⋄
lain:v,⍨
vertikal ke kananv,
vertikal ke kiris⍪
ruang di atas⍵⍪s
argumen dengan spasi di bawah iniTryAPL online!
sumber
Brachylog , 84 byte
Cobalah online!
Port jawaban saya di Pyth .
sumber
C, 110 byte
Diminta sebagai
f(n)
. Untuk 111 byte, saya bisa melakukan:yaitu,
#define
menyimpan tepat satu byte.sumber
Dyalog APL, 34 byte
{
...}⍣⍵⍪'|'
Terapkan fungsi dalam kurung kurawal⍵
mulai dengan 1x1 matriks karakter|
. Hasil dari setiap aplikasi adalah argumen untuk aplikasi berikutnya.s b←' -|'~⊃⍵
s adalah ruang dan b adalah bilah tidak di sudut kiri atas argumen (' -|'~'-'
menghilangkan bilah horizontal dan meninggalkan ruang serta bilah vertikal)s,⍵,⊃s b
tambahkan ruang ke kiri dan kanan (⊃
mengambil s dari vektor sb)b,b,⍨⍉
transpos dan tambahkan b ke kiri dan kananUntuk bilangan ganjil, ini meninggalkan hasil yang ditransformasikan, sehingga transpos akhir diperlukan.
⍉⍣⍵
Atur ulang⍵
waktu (satu kali sudah cukup, tetapi lebih pendek untuk kode dengan cara ini)TryAPL online
sumber
Cheddar , 107 byte
Cobalah online!
sumber
Cheddar, 85 byte
Jawaban Cheddar pertamaku. Cobalah online!
Jika saya mencoba menulis
r=(-n|>n).map(v->abs v).map
, dan kemudianr(y->r(x->…))
, penerjemah macet. ; -;sumber
v->abs v
ke(abs)
(misalnyar.map((abs))
) yang akan mengembalikan fungsi yang memiliki perilaku fungsi abs. misalnya(+)(1,2)
->3
.(^)(2,6)
-> 64. Juga besar untuk mengalahkan saya hampir 50%Runtime Error: `abs` has no behavior for types `Number` and `Number`
(karenamap
menerima elemen dan indeksnya, mungkin.)APL (Dyalog Classic) , 34 byte
Cobalah online!
(menggunakan
⎕io←1
)⍳⎕
aku s1 2 ... N
(⌽,0,⊢)
adalah kereta yang mengubahnya menjadi-N ... -1 0 1 ... N
∘.( )⍨
mengeksekusi tanda kurung untuk setiap pasangan koordinat⍺ ⍵
kereta
(≤-(1+=)×2|⌈)
atau yang setara dfn{(⍺≤⍵)-(1+⍺=⍵)×2|⍺⌈⍵}
menghasilkan matriks seperti:'- |'[2+ ]
membuat indeks yang valid ini⎕IO=1
dan mengambil karakter yang sesuaisumber
Ruby,
817877 byteIni didasarkan pada jawaban Lynn Python . Saran golf diterima.
Sunting: 3 byte berkat Lynn. Koreksi dan golf 1 byte berkat Jordan.
Tidak melakukan pelanggaran:
sumber
.map(&:abs)
?*
tidak melakukan apa-apa. Anda bisa menggunakan*""
bukan.join
. Juga, menggunakanp
mengelilingi setiap baris dengan tanda kutip (panggilaninspect
pada argumennya), yang mungkin mendiskualifikasi Anda.&:abs
(map &:abs
). Anda mungkin bisa melakukan sesuatu denganArray#product
bukan bersarangmap
, tetapi itu akan membuat jeda baris menjadi rumit.r.product(r).map
(namun itu berfungsi) lebih panjang dan tampaknya tidak memungkinkan jeda baris dengan mudah.MATLAB,
168163 byteIni mungkin bukan cara paling cerdas untuk melakukannya: Memperluas string di semua sisi dalam
n
langkah-langkah:Penggunaan: Simpan sebagai
g.m
(apakah saya harus menambahkannya ke jumlah byte?) Dan memanggil misg(15)
.Tidak Disatukan:
sumber
' '
dengan0
(Matlab memperlakukan char 0 sebagai spasi) dan'-'
dengan45
. Nama file tidak harus dimasukkan dalam hitungan byteSebenarnya ,
484544 byteIni adalah upaya untuk mengirim jawaban Ruby saya ke Actually. Ini terlalu lama dan saran bermain golf sangat dihargai. Cobalah online!
Ini adalah versi 46-byte yang memisahkan fungsi-fungsi yang disarangkan sehingga kita dapat mendefinisikan
"| -"
dalam lebih sedikit byte. Cobalah online!Tidak melakukan pelanggaran:
Algoritma pertama
Algoritma kedua
sumber
u;±ux♂A╗╜`;2@%2╛%u╛(2±&<I"| -"E`#"╝╜%r£Mεj."%£M
lebih panjang dari apa yang Anda miliki saat ini (2 byte), tetapi Anda mungkin menemukan beberapa inspirasi untuk membuatnya lebih pendek yang tidak saya lihat.Kanvas ,
19181714 byteCoba di sini!
Jika saya diizinkan untuk mengeluarkan setiap keluaran lainnya yang diputar 90 °, 4 karakter terakhir dapat dihapus.
Penjelasan (beberapa karakter telah diubah agar terlihat ~ monospace):
sumber
05AB1E ,
2928 byteCobalah online!
-1 terima kasih kepada Dzaima ...
Ini adalah solusi berulang.
Intinya Ini dibuat dengan membuat pola berikut:
Kemudian, berpasangan, transposing setiap elemen bersama-sama dan menambahkan padding.
Dengan transposing setelah setiap iterasi, kita akhirnya menciptakan satu sudut pola.
Kemudian, kita bisa menggunakan perintah refleksi 05AB1E.
sumber
Mathematica,
158164 byteSecara matematis menghitung simbol yang benar pada koordinat (i, j), di mana keduanya berjalan dari -n ke n. Manusia diformat:
sumber
PHP, 166 byte
bermain golf lebih dari 100 byte dari pendekatan pertama saya dan itu masih jawaban terpanjang di sini.
kerusakan
ungolfed
sumber
Perl 5 , 150 byte
Cobalah online!
sumber
Haskell , 110 byte
Cobalah online!
Penjelasan / Tidak Diundang
Fungsi helper
g
mengambil karakter dan daftar string, lalu mendahului dan menambahkan karakter itu ke setiap string:Selanjutnya operator
(!)
mengambil fungsi (g
), angka (n
) dan karakter (c
). Kemudian menghitung output untukn-1
, menerapkan fungsig
untuk itu dan menambahkan string dengan lebar yang sama yang terdiri daric
s ke awal dan akhir:Dengan ini kami siap untuk menghasilkan output secara rekursif, pertama-tama kita perlu membahas kasus dasar:
Dan kemudian rekursi:
sumber
J , 37 byte
TIO
sumber
Stax , 22 byte
Jalankan dan debug itu
Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.
Jalankan yang ini
sumber