Secara perlahan konvergen zigzag

23

Diberikan bilangan bulat ganjil positif tunggal sebagai input, kembalikan zigzag konvergen sebagai daftar string, daftar daftar karakter, atau string yang dipisahkan baris baru, dalam bentuk ini:

#
 #
  #
   #
    #
   #
  #
 #
  #
   #
  #

Anda dapat mengganti #dengan karakter non-spasi kosong yang konsisten. Trailing whitespace pada setiap baris diizinkan dan baris tambahan tambahan diizinkan.

Zig-zag dimulai pada kolom 1dan untuk setiap baris bergerak ke kanan satu kolom, hingga mencapai kolom n(di mana ninput). Kemudian, ia bergerak ke kiri ke 2, kemudian ke kanan n-1, lalu ke kiri 3, dengan kedua batas menyatu sampai zigzag berakhir di kolom tengah ( (n+1)/2).

Uji Kasus

Contoh di atas adalah test case untuk 5.

Berikut ini adalah kasus uji individual:

3
#
 #
  #
 #

7
#
 #
  #
   #
    #
     #
      #
     #
    #
   #
  #
 #
  #
   #
    #
     #
    #
   #
  #
   #
    #
   #

1

#
HyperNeutrino
sumber
Apakah memimpin (tapi konsisten dengan tidak merusak bentuk) diizinkan spasi?
Erik the Outgolfer
@EriktheOutgolfer Saya akan mengatakan tidak untuk itu.
HyperNeutrino

Jawaban:

15

C (gcc) , 89 byte

f(n,a,b){puts("0");for(a=n;--a>n/2;)for(b=n-2*a;b<=2*a-n;)printf(" %*d\n",a-abs(b++),0);}

Cobalah online!

Bekerja dengan menganalisis urutan jumlah spasi sebagai (untuk n = 7):

          0
1 2 3 4 5 6 5 4 3 2 1
    2 3 4 5 4 3 2
        3 4 3

Dan untuk n = 3:

  0
1 2 1

Kita dapat melihat bahwa angka tengah ( adalam kode) berjalan dari [n-1, n / 2). Kemudian, perbedaan antara angka pertama dan angka tengah adalah:

a  n  b  2a-n
-------------
6  7  5  5
5  7  3  3
4  7  1  1
2  3  1  1

Jadi, jika kita telah bmelalui [- (2a-n), 2a-n], a-abs(b)akan memberi kita urutan yang diinginkan. Ini pada dasarnya adalah apa yang dilakukan kode.

Gagang pintu
sumber
14

Arang , 10 8 byte

FN«↗ι‖»/

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 2 byte, terima kasih kepada @dzaima karena telah menunjukkan bahwa saya tidak harus menggunakan #s.

Neil
sumber
Akhirnya, sesuatu yang mengalahkan Jelly
JungHwan Min
3

Jelly , 14 byte

ṖṖṚ$ÐĿẎ0;⁶ẋp1Y

Cobalah online!

Program lengkap.

Penggunaan 1.

-1 terima kasih kepada Jonathan Allan .
-1 terima kasih kepada Jonathan Allan .

Erik the Outgolfer
sumber
’R-> untuk satu byte.
Jonathan Allan
@ Jonathan Allan Ooh tentu saja terima kasih. Saya telah mencoba menghindarinya di verison sebelumnya dan melupakannya ...
Erik the Outgolfer
”X-> 1untuk yang lain.
Jonathan Allan
@JonathanAllan Heh mengabaikan lain rupanya ... Saya mencoba untuk menghindari bilangan bulat juga.
Erik the Outgolfer
3

Haskell , 72 byte

g[]=[]
g a=a++g(reverse$init a)
r="#":map(' ':)r
("#":).g.tail.(`take`r)

Cobalah online!

Kami mendefinisikan daftar tak terbatas rsebagai diagonal #s mulai dari sudut kiri atas.

Kami kemudian mendefinisikan fungsi gyang melakukan pekerjaan paling berat. gakan mengambil daftar dan berulang kali membalikkannya dan menghapus elemen pertama sampai daftar kosong, lalu menyatukan hasil dari setiap tindakan.

Fungsi utama kami di sini adalah fungsi point-free. Fungsi ini dimulai dengan mengambil nelemen dari daftar yang tak terbatas r, kemudian memotong elemen pertama dan berlaku g. Terakhir kita harus menambahkan #kembali ke awal, ini karena spesifikasi untuk pertanyaannya sedikit aneh, saya tidak yakin mengapa diagonal pertama selalu lebih panjang dari yang seharusnya, tetapi itu, jadi kita harus tambahkan aa #.

Wisaya Gandum
sumber
@nimi saya akhirnya ("#":).g.init.(menerima r)tetapi terima kasih!
Wheat Wizard
2

05AB1E , 6 byte

LN71SΛ

Cobalah online!

     Λ     use the canvas function with

L          a range list [1 .. input] as lengths for each path 

 N         a "0" as character to be printed 
           (N is the index variable used by loops. If there was no loop yet, its
           default value is 0. By using N, I avoid an extra space between 0 and 71)

  71S      and the directions 7 and 1 (NW and NE), that alternate automatically until
           the range list is finished.
Dorian
sumber
Tidak, saya sudah mencoba itu dulu, tetapi menarik kedua arah, sebelum dilanjutkan dengan elemen berikutnya dari daftar rentang, ketika saya menghapus S. Jadi output akan menjadi dua kali lebih lama. Saya belum tahu tentang + dan ×. Mereka membuat pola yang sangat menarik ketika Anda menggabungkannya dengan angka
Dorian
Ah, kamu memang benar. Salahku. Aku melihatnya bekerja tanpa S, tapi tidak cukup memperhatikan output ..>.> Dan +dan ×pada dasarnya builtin untuk [0,4,4,0,2,6,6,2]dan [1,5,5,1,3,7,7,3]. Dan 8akan diatur ulang ke tempat asal Anda memulai. Di sini sedikit lebih banyak informasi.
Kevin Cruijssen
1

Pyth, 23 byte

8JStQKdVQjbm+*\ d8J=_PJ

Coba di sini.

Erik the Outgolfer
sumber
1

JavaScript, 127 byte

Hitung sasaran ( g) untuk sampai ke. Ketika tujuan ini tercapai, berbaliklah ke tujuan berikutnya. Juga menggunakan trik untuk menghindari penggunaan Math.round()dengan menambahkan 0.5ke setiap nomor yang tidak rata.

f=n=>{c=0;for(i=0;i<n;i++){m=i/2;g=i%2==0?n-m:m+1.5;while(c!=g){c>g?c--:c++;console.log(' '.repeat(c-1)+'#'+' '.repeat(n-c))}}}

f=n=>{c=0;for(i=0;i<n;i++){m=i/2;g=i%2==0?n-m:m+1.5;while(c!=g){c>g?c--:c++;console.log(' '.repeat(c-1)+'#'+' '.repeat(n-c))}}}

f(5);

Thomas W
sumber
1

Haskell, 74 byte

f[x]=[x]
f s=s++tail(f$reverse$tail s)
g n=f[(' '<$[2..x])++"#"|x<-[1..n]]

Cobalah online!

Bagaimana itu bekerja:

    [(' '<$[2..x])++"#"|x<-[1..n]]     -- build the first diagonal, e.g. for n=3:
                                         -- ["#", " #", "  #"]
  f                                      -- call f, which is

f s = s ++                               -- the input list, followed by
           tail                          -- all but the first element of
                f                        -- a recursive call with
                  reverse                -- the reverse of
                          tail s         -- all but the first element of the input 
                                         -- list
f[x]=[x]                                 -- base case: stop if the input list a
                                         -- singleton list

Setiap panggilan rekursif untuk fmenambahkan diagonal berikutnya.

nimi
sumber
1

Sekam , 19 byte

mo`:'#R' ∫`Ṙ¢e1_1tṫ

Cobalah online!

Penjelasan

Ini terasa agak kikuk.

mo`:'#R' ∫`Ṙ¢e1_1tṫ  Input is n (e.g. 5)
                  ṫ  Range from input to 1: [5,4,3,2,1]
                 t   Drop first element: [4,3,2,1]
             e1_1    The list [1,-1]
            ¢        repeated infinitely: [1,-1,1,-1,..
          `Ṙ         Clone with respect to the list above: [1,1,1,1,-1,-1,-1,1,1,-1]
         ∫           Cumulative sum: [0,1,2,3,4,3,2,1,2,3,2]
mo                   For each element k (e.g. 3) do this:
      R'             Repeat space k times: "   "
  `:'#               Append '#': "   #"
                     Print implicitly separated by linefeeds.
Zgarb
sumber
1

Python 3 , 82 byte

def z(n):l=range(1,n);print(8);exec("[print(' '*i+'8')for i in l];l=l[-2::-1];"*n)

Cobalah online!

Erik the Outgolfer
sumber
1

Retina , 71 byte

.+
$* 
^
:>
 $
:
;{*T`:<>`_#
( ) >(:)|( )<
$1<$2$3
(:)( )<|>( )
$2$1$3>

Cobalah online! Penjelasan: Tiga tahap pertama mengkonversi input ke dalam bentuk di :> :mana jumlah karakter antara :s adalah nomor input. Dua tahap terakhir kemudian memantul >(atau <, ketika bergerak ke kiri) di antara :s. Tahap keempat memotong pantulan, mencetak bagian-bagian string yang diperlukan setiap kali. The ;berhenti string dari yang dicetak setelah loop.

Neil
sumber
1

05AB1E , 16 byte

Î<L¤F¦})˜Ôð×X«»

Cobalah online!

Penjelasan

Î<L               # push 0 and range [1 ... input-1]
   ¤              # get the last element of the list
    F             # that many times do
     Â            # bifurcate
      ¦           # remove the head
       })˜        # end loop and wrap in flattened list
          Ô       # remove consecutive duplicates
           ð×     # repeat space a number of times corresponding to each number in the list
             X«   # append 1 to each
               »  # join on newline
Emigna
sumber
1

K (Kona), 27 byte

`0:{|x$"#"}'1,,/{1_|x}\-2-!

Menghasilkan urutan numerik yang mendasari dengan berulang kali membalikkan dan menjatuhkan kepala vektor sampai kosong.

Julian Squires
sumber
3
Selamat datang di PPCG.SE! Asal tahu saja, Anda bisa memasukkan kode Anda ke juru bahasa online bernama TIO (Coba online) dan tautkan ke sana sehingga orang-orang bisa mencoba kode Anda. tio.run/#k-kona bahkan akan memberi Anda pos PPCG yang diformat untuk Anda kirimkan di sini.
Notts90
0

PHP, 65 byte

<?while(--$n||$n=$d=--$argn)echo str_pad("X
",2+$x-=$d&1?:-1);?>X

Jalankan sebagai pipa dengan -nFatau uji secara online .

penjelasan:

iterasi pertama: $nadalah NULL, jadi --$ntidak memiliki efek dan mengevaluasi untuk NULL
-> mengatur $ndan $duntuk pra-pengurangan argumen
1. kenaikan $xuntuk genap $d, penurunan untuk $d
cetak 2. ganjil X, baris baru dan $xspasi

iterasi lebih lanjut: pengurangan $n; ketika hits 0, setel ulang $n(dan $d) ke argumen yang telah ditentukan sebelumnya

finale: cetak satu lagi X.

Titus
sumber
0

Japt , 31 byte

Ç+V ç +QÃê ¯-2 c´U?ß´UVÄ :Vç +Q

Solusi rekursif yang mengembalikan array garis.

Cobalah online! menggunakan -Rbendera untuk menggabungkan output dengan baris baru.

Justin Mariner
sumber
0

Python 2, 159 145 141 136 byte

print"".join([" "*p+"#\n"for p in(lambda l:[sum(l[:i])for i in range(len(l))])(sum([i*[1-i%2*2]for i in range(input())[::-1]],[])+[1])])

Sudah ada versi Python yang cukup bagus untuk masalah ini, tetapi saya pikir saya masih akan memposting satu liner yang mengerikan. (Tanpa titik koma!)

Sunting: 14 byte ke bawah, menggunakan jumlah alih-alih pemahaman daftar ganda

Sunting: Baru saja diperhatikan di python 2 Anda dapat menggunakan input alih-alih raw_input. Saya selalu menggunakan yang terakhir.

SydB
sumber
0

Mathematica, 142 102 byte (independen)

Solusi ini memiliki rasa yang khas:

UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&

Ini pada dasarnya menghitung segmen mana kita (dengan membalik fungsi angka segitiga) dan kemudian bergerak ke kiri atau kanan dengan menambahkan kekuatan -1.

Anda dapat mengujinya di Wolfram Code Sandbox dengan menempelkan kode suka UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&@6//MatrixFormdan menekan Shift + Enter atau Numpad Enter atau mengklik Gear -> "Evaluate Cell".


Ini kebetulan memiliki panjang yang sama dengan port salah saya yang asli dari solusi Python 2 Erik (Port ini memberikan output untuk input yang lebih tinggi):

(Print[X];l=Range@#;Do[Do[Print[StringRepeat[" ",l[[j]]]<>"X"],{j,Length@l}];l=l[[-2;;1;;-1]],{i,#}])&

Tanda.
sumber