Bangun Semi-Zigzag

29

Anda akan diberikan bilangan bulat positif Nsebagai input. Tugas Anda adalah membangun Semi-Zigzag, Nsisi, masing-masing panjangnya N. Karena relatif sulit untuk menggambarkan tugas dengan jelas, berikut adalah beberapa contoh:

  • N = 1:

    HAI
    
  • N = 2:

    HAI
     OO
    
  • N = 3:

    OO
     OO
      OOO
    
  • N = 4:

    OOOOO
     OO
      OO
       OOOO
    
  • N = 5:

    OOOOOO
     OOO
      OOO
       OOO
        OOOOOO
    
  • N = 6:

    OOOOOOO
     OOO
      OOO
       OOO
        OOO
         OOOOOOOOOOOO
    
  • N = 7:

    OOOOOOOOO
     OOOO
      OOOO
       OOOO
        OOOO
         OOOO
          OOOOOOOOOOOOOO
    
  • Kasing uji yang lebih besar dengan N = 9

Seperti yang Anda lihat, Semi-Zigzag terbuat dari garis diagonal dan horizontal bergantian, dan selalu dimulai dengan garis diagonal kiri atas ke kanan. Perhatikan bahwa karakter pada garis horizontal dipisahkan oleh spasi.

Aturan

  • Anda dapat memilih karakter non-spasi putih alih-alih O, bahkan mungkin tidak konsisten.

  • Anda dapat menampilkan / mengembalikan hasilnya sebagai String atau sebagai daftar String, masing-masing mewakili satu baris .

  • Anda mungkin memiliki baris tambahan atau baris baru.

  • Berlaku celah default .

  • Anda dapat mengambil input dan memberikan output dengan cara standar apa pun .

  • Jika memungkinkan, harap tambahkan tautan pengujian ke kiriman Anda. Saya akan menjawab setiap jawaban yang menunjukkan upaya bermain golf dan memiliki penjelasan.

  • Ini adalah , jadi kode terpendek dalam byte di setiap bahasa menang!

Tuan Xcoder
sumber
1
Pos Kotak Pasir .
Tn. Xcoder
Apakah kita harus meletakkan spasi di antara O yang horizontal?
HatsuPointerKun
1
@HatsuPointerKun Perhatikan bahwa karakter pada garis horizontal dipisahkan oleh spasi. - Ya, Anda harus meletakkan spasi.
Tn. Xcoder
1
Ah iya. Saya harus belajar membaca. Terima kasih
HatsuPointerKun
1
@ JohnHamilton Jawabannya secara teoritis harus berfungsi untuk nomor apa pun yang diberikan sebagai masukan. Mereka tidak perlu khawatir tentang apa yang bisa dipegang layar.
Tn. Xcoder

Jawaban:

10

Arang , 24 byte

FN«↶§7117ι×⁺#× ﹪ι²⁻Iθ¹»#

Cobalah online!

Terima kasih kepada Neil .

AST:

Program
├F: For
│├N: Input number
│└Program
│ ├↶: Pivot Left
│ │└§: At index
│ │ ├'7117': String '7117'
│ │ └ι: Identifier ι
│ └Print
│  └×: Product
│   ├⁺: Sum
│   │├'#': String '#'
│   │└×: Product
│   │ ├' ': String ' '
│   │ └﹪: Modulo
│   │  ├ι: Identifier ι
│   │  └2: Number 2
│   └⁻: Difference
│    ├I: Cast
│    │└θ: Identifier θ
│    └1: Number 1
└Print
 └'#': String '#'
Erik the Outgolfer
sumber
Itu terlalu mudah untuk Charcoal :)
Mr. Xcoder
@ Mr.Xcoder Rasanya benar-benar tidak tahu apa-apa ... tidak yakin bagaimana cara membuatnya.
Erik the Outgolfer
OP mengatakan bahwa karakter dapat berupa apa saja dan tidak perlu konsisten, jadi saya akan mencari sesuatu di sepanjang baris FN§⟦↘→↗→⟧ι⁻Iθ¹→(hanya 15 byte), tetapi daftar arah tampaknya tidak berfungsi dengan baik di Charcoal. Sayang sekali.
Charlie
@CarlosAlejo Sudah mencobanya juga, tapi sayangnya tidak berhasil.
Erik the Outgolfer
1
@CarlosAlejo FN✳§⟦↘→↗→⟧ι⁻θ¹Oakan bekerja setelah Dennis menarik, dilemparkan ke arah
ASCII
7

Python 2 , 157 153 byte

n=input()
o,s=q='O '
def p(k,t=q*n+s*(4*n-6)):print(t*n)[k*~-n:][:n*3/2*~-n+1]
p(2)
for i in range(n-2):p(0,i*s+s+o+s*(4*n-7-2*i)+o+s*(2*n+i-2))
n>1>p(5)

Cobalah online!

  • n*3/2*~-n+1 adalah lebar setiap baris: ⌊3n / 2⌋ · (n − 1) + 1 karakter.
  • String q*n+s*(4*n-6)mewakili baris atas dan bawah. Jika kita mengulanginya dan mengiris [2*(n-1):]kita mendapatkan baris paling atas; jika kita mengiris [5*(n-1):]kita mendapatkan baris paling bawah. Oleh karena itu definisi pdan panggilan ke p(2)dan p(5). Tetapi karena kita membutuhkan pengulangan dan pengirisan panjang garis untuk semua jalur lain, kita menggunakan kembali pdalam loop.
  • Itu i*s+s+o+…hanya ekspresi yang membosankan untuk baris tengah.
  • n>1>p(5)akan korsleting jika n≯1, menyebabkan p(5)tidak dievaluasi. Oleh karena itu, singkatan untuk if n>1:p(5).
Lynn
sumber
Wow, solusi yang luar biasa, sangat pintar. Anda mendapatkan upvote saya
Tn. Xcoder
Wow, tidak pernah tahu Python melakukan hubungan arus pendek pada perbandingan seperti itu, +1.
Zacharý
6

Mathematica, 126 125 121 112 104 89 86 byte

(m=" "&~Array~{#,#^2-#+1};Do[m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X",{j,#},{i,#}];m)&
  • #adalah nomor input untuk fungsi anonim (diakhiri oleh final &).
  • m=" "&~Array~{#,#^2-#+1};membuat matriks karakter ruang dengan ukuran yang tepat dengan mengisi array dimensi yang diberikan #,#^2-#+1dengan output dari fungsi anonim konstan "menghasilkan spasi" " "&.
  • Do[foo,{j,#},{i,#}]adalah sepasang do loop bersarang, di mana jberkisar dari 1ke #dan di dalam itu iberkisar dari 1ke #.
  • m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X"menetapkan bagian yang sesuai dari matriks menjadi karakter Xberdasarkan jdan i. The -imenggunakan pengindeksan negatif untuk menyelamatkan byte dari #-i+1. (Saya lupa menulis Mod[j,4]seperti j~Mod~4dalam versi asli kode ini.) Jenny_mathy menunjukkan bahwa kita dapat menggunakan residu modular untuk mengindeks ke dalam daftar secara langsung (daripada menggunakan Switch) untuk menghemat 9 byte, dan JungHwan Min menunjukkan bahwa kita tidak melakukannya t perlu digunakan ReplacePartkarena kita dapat mengatur bagian dari array dan yang 1[i,#,-i][[j~Mod~4]]menggunakan perilaku aneh dan generalitas [[foo]]untuk menyimpan byte{1,i,#,-i}[[j~Mod~4+1]]
  • Karena meta menetapkan bahwa daftar karakter adalah string (seperti yang ditunjukkan JungHwan Min ), kita tidak perlu memetakan fungsi apa pun di baris-baris matriks karakter karena sudah daftar "string".

Anda dapat menguji ini di kotak pasir Wolfram Cloud dengan menempelkan kode seperti berikut ini dan menekan Shift + Enter atau Enter numpad:

(m=" "&~Array~{#,#^2-#+1};Do[m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X",{j,#},{i,#}];m)&@9//MatrixForm
Tanda.
sumber
1
Sangat bagus! Anda dapat mengganti StringJoin dengan "" <> # & untuk menyimpan 4 byte
J42161217
@ Jenny_mathy Terima kasih atas tipnya! Itu sepertinya cukup berguna.
Mark S.
2
Anda juga dapat mengganti Switch [...] dengan {1, i, #, - i} [[j ~ Mod ~ 4 + 1]] dan simpan 9 byte!
J42161217
1
Anda sebenarnya tidak perlu di ReplacePartsini. m=ReplacePart[...]bisa m[[{1,i,#,-i}[[j~Mod~4+1]],j#-#+i+1-j]]="X"- Anda dapat Setsuatu Partdaftar. Itu menghilangkan 15 byte.
JungHwan Min
1
{1,i,#,-i}[[j~Mod~4+1]]bisa juga 1[i,#,-i][[j~Mod~4]]. Trik ini berfungsi karena [[0]]mengembalikan Headekspresi.
JungHwan Min
4

C ++, 321 234 byte

-87 byte terima kasih kepada Zacharý

#include<vector>
#include<string>
auto z(int n){std::vector<std::string>l;l.resize(n,std::string(n*n+n/2*(n-1),32));l[0][0]=79;int i=0,j,o=0;for(;i<n;++i)for(j=1;j<n;++j)l[i%4?i%4-1?i%4-2?0:n-j-1:n-1:j][i*n+j-i+(o+=i%2)]=79;return l;}

Mengembalikan vektor string

HatsuPointerKun
sumber
Saya mendapatkannya hingga 318 byte: repl.it/JpJ2
Zacharý
Koreksi, saya mendapatkannya hingga 239 byte : repl.it/JpJ2/1
Zacharý
Maaf untuk spam, 234 byte: repl.it/JpJ2/3
Zacharý
1
Apa yang bisa saya katakan kecuali Anda dipersilakan!
Zacharý
@ Zacharý terima kasih banyak pak
HatsuPointerKun
4

Mathematica, 179 byte

Rotate[(c=Column)@(t=Table)[{c@(a=Array)[" "~t~#<>(v="o")&,z,0],c@t[t[" ",z-1]<>v,z-1],c@a[t[" ",z-2-#]<>v&,z-1,0],c@t[v,z-Boole[!#~Mod~4<1]-1]}[[i~Mod~4+1]],{i,0,(z=#)-1}],Pi/2]&

edit untuk @JungHwanMin

J42161217
sumber
Saya tidak berharap itu sesingkat itu, dilakukan dengan baik!
Tn. Xcoder
Hanya sebuah pertanyaan: Bisakah Mod[z,4]==0diganti Mod[z,4]<1?
Tn. Xcoder
ya, saya bisa bermain golf beberapa hal ...
J42161217
3
Saya tidak benar-benar tahu Mathematica, tetapi dapatkah Anda mengganti Mod[#,4]dengan #~Mod~4untuk -1 byte?
Tn. Xcoder
1
Ups ... tidak sengaja dibatalkan. Bisakah Anda mengedit jawabannya sehingga saya bisa membalikkannya?
JungHwan Min
4

05AB1E , 21 20 19 byte

Kode

Menggunakan mode kanvas baru:

Fx<)Nè'ONÉúR3212NèΛ

Menggunakan penyandian 05AB1E . Cobalah online!

Penjelasan:

F                      # For N in range(0, input)
 x<)                   #   Push the array [input, 2 × input - 1]
    Nè                 #   Retrieve the Nth element
      'ONÉúR           #   Push "O" if N is odd, else "O "
            3212Nè     #   Retrieve the Nth element of 3212
                  Λ    #   Write to canvas

Untuk input 6 , ini memberikan argumen berikut (dalam urutan yang sama) untuk kanvas:

[<num>, <fill>, <patt>]
[6,     'O',     3]
[11,    'O ',    2]
[6,     'O',     1]
[11,    'O ',    2]
[6,     'O',     3]
[11,    'O ',    2]

Untuk menjelaskan apa yang dilakukan kanvas, kami memilih kumpulan argumen pertama dari daftar di atas.

Angka 6 menentukan panjang string yang akan ditulis ke kanvas. Pengisi digunakan untuk menulis di atas kanvas, yang dalam hal ini adalah O. Secara siklikal berjalan melalui string pengisi. Arah string ditentukan oleh argumen terakhir, arah. Arahannya adalah:

7  0  1
 \ | /
6- X -2
 / | \
5  4  3

Ini berarti bahwa 3 menetapkan arah ke tenggara , yang juga dapat dicoba online .

Adnan
sumber
juga perhatikan bahwa mode kanvas sedang dalam pengembangan dan sangat tidak stabil
Adnan
: O 05AB1E bermutasi menjadi Arang (juga ini mengalahkan Arang O_o)
ASCII
@ Khusus ASCII Ya, saya melihat kebangkitan semua bahasa berbasis ASCII (Charcoal, SOGL, V, dll.) Dan melihat 05AB1E tenggelam di latar belakang, jadi saya harus melakukan sesuatu tentang hal itu: p
Adnan
jadi kamu menyalin arang? : P 05ab1e bahkan memiliki pencetakan kanvas dan terarah (walaupun arang hanya mendukung gaya pencetakan ini dengan panjang melalui python)
ASCII-only
2

SOGL V0.12 , 36 byte

╝.H∫2\?.╝}F2%?№@.┌Ο};1w⁄Hh1ž}.4%1>?№

Coba Di Sini!

Ide dasarnya adalah untuk setiap nomor rentang input pilih menambahkan diagonal atau bagian bertitik horisontal, dalam hal ini akan membalikkan array agar lebih mudah ditambahkan. Penjelasan:

╝                                     get a diagonal from the bottom-left corner with the length of the input - the starting canvas
 .H∫                        }         for each number in the range [1,inp-1] do, pushing counter
    2\?  }                              if it divides by 2, then
       .╝                                 create another diagonal of the input
          F2%                           push counter % 2
             ?     }                    if that [is not 0]
              №                           reverse the current canvas upside down
               @.┌Ο                       get an alternation of spaces and dashes with the dash amount of the input length
                    ;                   get the canvas on top of the stack
                     1w⁄                get its 1st element length
                        H               decrease it
                         h              swap the bottom 2 items - the canvas is now at the bottom and the current addition ontop
                          1             push 1
                           ž            at 1-indexed coordinates [canvasWidth-1, 1] in the canvas insert the current part made by the Ifs
                             .4%1>?   if input%4 > 1
                                   №    reverse the array vertically

Jika input 1 tidak diizinkan, maka ο.∫2%?.╝}F2\?№@.┌Ο};1w⁄Hh1ž}.4%1>?№akan berfungsi juga. Jika angka acak yang melayang diizinkan .∫2%?.╝}F2\?№@.┌Ο};1w⁄Hh1ž}.4%1>?№akan bekerja juga. Jika saya tidak malas dan diimplementasikan , }F2%?bisa diganti dengan -4 byte

dzaima
sumber
2

Mathematica, 106 87 byte

SparseArray[j=i=1;k=#-1;Array[{j+=Im@i;k∣#&&(i*=I);j,#+1}->"o"&,l=k#+1,0],{#,l}," "]&

Mengembalikan SparseArrayobjek Strings. Untuk memvisualisasikan output, Anda dapat menambahkan Grid@. Melempar kesalahan untuk kasus 1, tetapi aman untuk diabaikan.

Penjelasan

j=i=1

Atur idan jke 1.

k=#-1

Setel kke input - 1.

l=k#+1

Setel lkek*input + 1

Array[ ..., l= ...,0]

Ulangi lwaktu, mulai dari 0, bertambah 1setiap kali ...


j+=Im@i

Tambahkan komponen imajiner ike j...

k∣#&&(i*=I)

Jika iterasi saat ini dapat dibagi dengan k, kalikan idengan unit imajiner ...

{... j,#+1}->"o"

Buat Ruleobjek yang mengubah elemen di posisi {j, current iteration + 1}ke"o"


SparseArray[ ...,{#,l}," "]

Buat SparseArrayobjek menggunakan objek yang dihasilkan Rule, dengan dimensi {input, l}, gunakan " "sebagai kosong.

Cobalah di Wolfram Sandbox!

JungHwan Min
sumber
1
ada yang salah dengan case n = 3
J42161217
1
n = 2, 4,5,6 juga memiliki masalah kebenaran, tapi saya pikir ini berfungsi untuk 7 dan di atasnya. Saya ingin tahu: apakah ada preseden untuk menentukan apakah SparseArraysebuah array? Dapat divisualisasikan menggunakan Gridatau MatrixForm, tapi saya biasanya tidak akan menghitungnya sebagai "daftar string" di sini. Jika array 2D karakter sudah mencukupi, itu memotong 8 byte dari solusi saya (12 sebelum bantuan Jenny_mathy), misalnya.
Mark S.
1
@Tanda. Juga, array string tidak apa-apa per konsensus meta . Jika ada sesuatu yang tidak jelas, silakan tanyakan OP (karena dia membuat aturan, bukan kita). Pencarian sederhana "SparseArray" di situs ini memberikan banyak SparseArraytanggapan, jadi saya kira itu baik-baik saja.
JungHwan Min
1
@Tanda. Juga, halaman ini memiliki banyak trik dalam bermain golf Mathematica.
JungHwan Min
1
@JungHwanMin Saya mengedit jawaban saya ketika Anda bertanya
J42161217
2

Python 3 , 228 226 224 215 197 195 byte

-11 byte Terima kasih kepada @Mr. Xcoder

-2 byte Terima kasih kepada @Mr. Xcoder

def f(n,s=range):
 x=y=t=c=0;z=[]
 for i in s(n*n-n+2):c+=i%(n-(2<=n))<1;z+=[[x,y]];t=max(t,x);x+=2-c%2;y+=[-1,1][c%4<3]*(c%2)
 return'\n'.join(''.join(' O'[[k,j]in z]for k in s(t))for j in s(n))

Cobalah online!

Penjelasan dan kode kurang golf:

def f(n):
 x=y=t=c=0;z=[]                       #initialize everything
 for i in range(n*n-n+2):             #loop n*n-n+2 times which is the numberr of 'o's expected
    c+=i%[~-n,n]<n-1                  #if one cycle has been completed, increase c by 1, if n>1.                                            
    z+=[[x,y]]                        #add [x,y] to z(record the positions of 'o')
    t=max(t,x)                        #trap maximum value of x-coordinate(to be used later while calculatng whole string)
    r=[[2,0],[1,1],[2,0],[1,-1]][c%4] #r gives direction for x and y to move, adjust it as per c i.e. cycles
    x+=r[0];y+=r[1]                   #yield newer values of x and y 
 return '\n'.join(''.join(' o'[[k,j]in z]for k in range(t))for j in range(n)) #place space or 'o' accordingly as per the recorded posititons in z
officialaimm
sumber
1
Kerja yang sangat bagus. Selamat!
Tn. Xcoder
@ Mr.Xcoder Terima kasih. Saya harus mengatakan ini sulit, terutama memiliki masalah mengidentifikasi kisaran yang benar.
officialaimm
1
215 byte , if 2>n:return'o'cukup berlebihan. Saya membuat penyelesaian dengan c+=i%[~-n,n][2>n]<1bukannya c+=i%~-n<1.
Tn. Xcoder
1
Maaf untuk perbaikan yang sangat terlambat, 195 byte
Mr. Xcoder
1

Haskell , 197 byte

a n c=take(2*n)$cycle$c:" "
r i n x y=take(div(3*n)2*(n-1)+1)$(' '<$[1..i])++(cycle$"O "++(a(2*n-i-3)y)++"O "++(a(n+i-2)x))
z n=take n$(r 0 n 'O' ' '):[r i n ' ' ' '|i<-[1..n-2]]++[r(n-1)n ' ' 'O']

Cobalah online!

Terima kasih kepada @Lynn: memperbaiki spasi antara Os pada segmen horizontal zigzag, tetapi harganya sangat mahal!

Beberapa penjelasan:

  • radalah deretan output: ia memiliki 0 y y y y y 0 x x x 0 y ...format, jumlahx dan ytergantung pada baris dan inisialn
  • untuk baris atas, x='0' dany=' '
  • untuk baris tengah, x=' ' dany=' '
  • untuk baris bawah, x=' 'dany='0'
  • take(div(3*n)2*(n-1)+1) memotong baris tanpa batas di tempat yang tepat
  • setiap output memiliki satu baris atas dan satu baris bawah kecuali ketika n=1: take nmenangani case ini.
jferard
sumber
Golf yang bagus! Anda dapat menjatuhkan beberapa ruang itu, saya pikir. Dan replicate n xbisa diganti dengan x<$[1..n]. Juga, jawaban Anda tidak memiliki spasi antara Os pada segmen horizontal zigzag.
Lynn
@ Lynn terima kasih! dengan spasi pada segmen horisontal, metode saya menjadi rumit, tetapi saya tetap ingin memperbaiki kode ...
jferard
Anda dapat menghemat sedikit dengan menggunakan operator dan menghapus ruang yang tidak dibutuhkan, lihat di sini .
ბიმო
1

Python 2 , 155 151 146 137 byte

m=input()
n=m-1
r=range(n+2)
for L in zip(*[' '*i+'O'+n*' 'for i in(r+[n,m]*~-n+r[-2::-1]+([m,0]*n)[:-1])*m][:1+3*m/2*n]):print''.join(L)

Cobalah online!

TFeld
sumber
@ Mr.Xcoder Ahh. Saya mengerti sekarang.
TFeld
@ Mr.Xcoder Tetap sekarang.
TFeld
Saya terlambat satu tahun ke pesta golf, tetapi `L`[2::5]menghemat satu byte lebih''.join(L)
Tn. Xcoder