Spiral ASCII yang ditempatkan dengan baik

13

Pertimbangkan spiral ini

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########

Mulai di tengah:

  • Baris pertama (ke atas) memiliki 3 karakter.
  • Baris kedua memiliki jumlah karakter yang sama (3)
  • Selanjutnya, kita menambahkan dua karakter (5) untuk dua sisi berikutnya.
  • Pola ini berlanjut, dua sisi dengan panjang yang sama kemudian menambah panjangnya dengan 2.

Saya ingin menghasilkan spiral ini untuk garis N.

  • Tulis dalam bahasa apa pun.
  • Input / argumen, dll. Adalah jumlah baris dalam spiral Anda.
  • Setiap baris dimulai dengan karakter akhir dari baris sebelumnya ke arah 90 derajat searah jarum jam dari baris sebelumnya.
  • Saya tidak peduli berapa banyak spasi putih sebelum atau setelah setiap baris, selama elemen-elemen dari spiral naik.
  • Keluarkan teks untuk menggambar spiral dengan karakter non-spasi apa pun yang Anda pilih.
  • Coba lakukan ini dalam jumlah byte terkecil.

Uji kasus (menggunakan hash sebagai output):

N = 1

#
#
#

N = 2

###
#
#

N = 3

###
# #
# #
  #
  #

N = 10

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########
AJFaraday
sumber
@Shaggy "Keluarkan teks untuk menggambar spiral dengan karakter non-spasi putih apa pun yang Anda pilih." Yap, terserah kamu.
AJFaraday
3
Terkait 1 ; Terkait 2 .
Kevin Cruijssen
3
Gambar awal memiliki *bukan #. Diharapkan?
Wernisch
@Wernisch Itu dimaksudkan untuk menjadi titik awal yang bermanfaat, tapi saya kira itu menyesatkan. Anda dapat menggunakan karakter apa pun yang Anda suka.
AJFaraday

Jawaban:

11

05AB1E , 13 11 byte

Kode:

Terima kasih kepada Emigna karena telah menghemat dua byte!

LDÈ-Ì'#3Ý·Λ

Menggunakan penyandian 05AB1E . Cobalah online!

Penjelasan

Panjang setiap tepi individu pada spiral dimulai dengan panjang 3 dan secara bertahap meningkat setiap dua langkah dengan dua:

3,3,5,5,7,7,9,...

nn

L                # Create a list from [1 .. input]
 DÈ              # Duplicate and check for each number if even
   -             # Subtract that from the first list
    Ì            # Add 2

Ini pada dasarnya memberi kita daftar panjang yang diinginkan.

     '#          # Push the '#' character
       0246S     # Push the array [0, 2, 4, 6]
            Λ    # Write to canvas

Kanvas berfungsi sebagai fungsi yang muncul tiga parameter (di mana parameter paling kanan muncul pertama): <length (s)> , <char (s)> , <direction (s)> . Parameter penunjuk dalam hal ini adalah daftar angka. Angka-angka yang sesuai dengan arah adalah:

[70162543]

Dalam hal ini, [0, 2, 4, 6] sesuai dengan daftar arah [↑, →, ↓, ←]. Kanvas iterate atas setiap panjang yang diambil dari daftar panjang, menggunakan karakter '#' dan berulang secara berulang di atas daftar arah.

Adnan
sumber
0246S=3Ý·
Emigna
@Emigna Ah saya tidak memikirkan itu, terima kasih!
Adnan
6

Python 2 , 176 170 165 161 157 byte

g=lambda a,r:r and g(map(''.join,zip(*a))[::-1],r-1)or a
R=['#']
n=1
exec"R=g(['  '+l for l in g(R,n)][:-1]+[(n+2)*'#'],3*n);n+=1;"*input()
print'\n'.join(R)

Cobalah online!

Berulang: Penggunaan guntuk memutar niterasi spiral ke posisi 'kanonik' (mirip dengan N = 3 atau N = 7), menambahkan segmen baru dengan menambahkan 2 spasi di sebelah kiri setiap baris yang ada, kemudian mengganti baris terakhir dengan semua '#'s (menghasilkan posisi yang sebanding dengan N = 4 atau N = 8), dan akhirnya menggunakan glagi untuk memutarnya kembali ke posisi yang benar. Busa, bilas, ulangi.

Chas Brown
sumber
4

Arang , 16 15 14 byte

↶FN«¶×#⁺³⊗÷ι²↷

-2 byte terima kasih kepada @Neil .

Cobalah online (verbose) atau Coba online (murni) .

Penjelasan:

Arah pencetakan ke kanan secara default, dan kami ingin memulai ke atas, jadi kami mulai dengan memutar 45 derajat berlawanan arah jarum jam:

PivotLeft();
↶

Kemudian putar idalam kisaran [0, input):

For(InputNumber()){ ... }
FN« ...

Cetak baris baru untuk meniru efek mundur satu posisi:

Print("\n");
¶

Cetak "#" xjumlah kali dalam arah saat ini:

Print(Times("#", ... ));
×# ...

Dimana xadalah: 3 + i // 2 * 2:

Add(3,Doubled(IntegerDivide(i,2))
⁺³⊗÷ι²

Dan kemudian putar 45 derajat searah jarum jam untuk iterasi loop berikutnya:

PivotRight();
↷
Kevin Cruijssen
sumber
Saya berasumsi tidak ada perintah di Charcoal untuk bergerak mundur?
Emigna
@ Emigna Tidak yakin, tapi aku juga tidak bisa menemukannya. Memang mencari sendiri ketika saya menulis jawaban ini. Ada Pindah dengan arah tertentu, juga Lompatan dengan koordinat yang diberikan, tetapi sayangnya bukan MoveBack.
Kevin Cruijssen
1
⊗÷ι²byte lebih pendek dari ⁻ι﹪ι². Juga, Anda bisa mendapatkan efek bergerak kembali dengan mencetak huruf a \nsebelum huruf #s, yang akan memungkinkan Anda menghapusnya »#untuk penghematan byte keseluruhan tambahan.
Neil
@Neil Terima kasih untuk ⊗÷ι², tapi apa perubahan untuk mencetak \nsebelum #s? Spiral tidak benar jika saya menambahkanPrint("\n") .
Kevin Cruijssen
Karena lengan sekarang tumpang tindih, Anda perlu membuatnya lebih #lama.
Neil
3

Python 2 , 179 178 byte

terima kasih kepada Kevin Cruijssen untuk -1 byte.

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]*n
exec'exec k/2*2*"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

Cobalah online!


Python 2 , 179 byte

Dalam pendekatan ini, rumus digunakan untuk xdan ydelta alih-alih daftar pencarian.

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
exec'exec k/2*2*"x+=k%-2+k%4/3*2;y-=(k%2or k%4)-1;m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

Cobalah online!

ovs
sumber
n+1+n%2ke n%2-~nuntuk -1 byte. Dan saya harus ingat 0--n/4*21 lebih pendek dari -(-n/4*2). Jawaban yang bagus, +1 dari saya.
Kevin Cruijssen
1

JavaScript (ES6), 185 byte

Tentu ini bisa bermain golf lebih banyak, mungkin dengan kari, tapi inilah upaya saya yang sangat rendah hati. Jeda baris ditambahkan untuk dibaca kecuali karakter kedua dari belakang

r=(a,n=1)=>n?r(a.reduce((_,c)=>c).map((_,i)=>a.map(e=>e[i])).reverse(),n-1):a,
s=n=>n?r(s(n-1)).map((r,i)=>[...r,w,w].map(x=>i?x:'#')):[[w=' ']],
d=n=>r(s(n),1-i).map(r=>r.join``).join`
`

Penggunaan: d(10)mengembalikan string sesuai dengan contoh tantangan N = 10.

Menentukan fungsi r(a,n)untuk memutar array asecara nbergantian; fungsi s(n)untuk menghasilkan array 2 dimensi yang mewakili ukuran spiraln dengan memutar dan menambahkan spasi dan garis secara rekursif (tidak diputar kembali ke posisi awal); dan sebuah fungsid(n) untuk menggambar spiral ukuran n, diputar secara konsisten sesuai tantangan, dan diberikan sebagai string yang dikembalikan.

Ini adalah tantangan yang sangat menyenangkan: ¬)

Chris M.
sumber