Buat pola zig-zag


25

Tugas Anda adalah mengambil satu input integer dan mencetak pola zigzag menggunakan garis miring dan garis miring terbalik.

  • Input integer menentukan panjang masing-masing zig dan zag, serta jumlah zig dan zag
  • Polanya selalu dimulai dari kanan ke kiri

Uji Kasus

4->
   /
  /
 /
/
\
 \
  \
   \
   /
  /
 /
/
\
 \
  \
   \
2->
 /
/
\
 \
0->
1->
/
8->
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \

3
Bisakah kita menampilkan array / daftar string untuk setiap baris? Apakah pelatihan atau baris baru atau ruang memimpin diizinkan?
Shaggy

2
Apakah memimpin spasi putih tidak apa-apa asalkan polanya tidak terpengaruh?
Emigna

Jawaban:


10

C (gcc) , 108 102 101 98 80 76 72 byte

  • Disimpan enam byte berkat Kevin Cruijssen ; menghapus tanda kurung dan golf N-n-1keN+~n
  • Menyimpan byte dengan memindahkan Zpeningkatan ke kondisi loop
  • Disimpan tiga byte dengan menggunakan printf("%c\n",...)alih-alih putchar(...)dan,puts("")
  • Disimpan delapan belas (!) Byte berkat HatsuPointerKun ; gunakan printf("%*s",n,"");untuk mencetak nspasi alih-alih menggunakan lingkaran j;for(j=n;j--;)putchar(32);dan menggabungkan kedua printf(...);panggilan
  • Disimpan empat byte dengan menggunakan printf("%*c",-~n,...);bukanprintf("%*s%c",n,"",...);
  • Disimpan empat byte berkat nwellnhof ; memindahkan segala sesuatu di dalam satu lingkaran, bukan dua
j;f(k){for(j=0;j<k*k;j++)printf("%*c\n",j/k%2?j%k+1:k-j%k,j/k%2?92:47);}

Cobalah online!


Z,n,j;f(N){for(Z=0;Z<N;Z++)for(n=N;n--;putchar(Z%2?92:47),puts(""))for(j=Z%2?N+~n:n;j--;)putchar(32);} 102 byte . Menghapus kurung keriting dengan meletakkan segala sesuatu di dalam loop; dan diubah N-n-1menjadi N+~n.
Kevin Cruijssen

1
@KevinCruijssen Terima kasih. Menyimpan byte lain dengan menukar keduanya Z%2?...:...dan mengganti Z<N;Z++dengan Z++<N;.
Jonathan Frech

1
Anda dapat menyimpan beberapa byte dengan menggunakan sihir printf seperti yang saya lakukan dalam jawaban saya . Dengan begitu Anda akan menghilangkan for loop yang digunakan untuk mencetak spasi. Untuk lebih jelasnya, lihat jawaban overflow tumpukan ini tentang ruang bantalan kiri dengan printf
HatsuPointerKun

@HatsuPointerKun Terima kasih; itu adalah cara yang sangat singkat untuk mengulang spasi di C.
Jonathan Frech

4 byte pendek: i;f(N){for(i=0;i<N*N;i++)printf("%*c\n",i/N%2?i%N+1:N-i%N,i/N%2?92:47);}. Cobalah online!
nwellnhof

10

Arang , 16 10 9 byte

FN«↖Iθ→‖T

Cobalah online! Tautan adalah untuk mengucapkan versi kode.


ini bekerja (Apakah InputNumberrusak dalam mode golf juga?)
ASCII-hanya

@ Hanya ASCII Tidak, dengan demikian tautan terpisah ke versi ringkas yang diberikan dan perkiraan versi verbose.
Neil

Oh> _> tidak melihat untuk melihat tautan mana yang saya buka
hanya ASCII pada

@ ASCII-only Yah hanya ada satu tautan sekarang ;-)
Neil

4

MATL , 17 byte

:"GXy@o?P47}92]*c

Cobalah online!

Penjelasan

:         % Implicit input, n. Push range [1 2 ... n]
"         % For each k in that range
  G       %   Push n again
  Xy      %   Identity matrix of that size
  @       %   Push k
  o?      %   If it's odd
    P     %     Flip the matrix upside down
    47    %     Push 47 (ASCII for '/')
  }       %   Else
    92    %     Push 92 (ASCII for '\')
  ]       %   End
  *       %   Multiply each entry of the matrix by that number
  c       %   Convert to char. Char 0 is shown as space
          % Implicit end. Implicit display

4

C # (.NET Core) , 117 103 101 byte

a=>{for(int z=a+1,e=0;e<a*a;)System.Console.WriteLine(e++/a%2<1?"/".PadLeft(--z):@"\".PadLeft(z++));}

Cobalah online!


Anda dapat menyimpan 14 byte seperti ini: a=>{var o="";for(int z=a+1,e=0;e<a*a;)o+=(e++/a%2<1?"/".PadLeft(--z):@"\".PadLeft(z++))+"\n";return o;} 103 byte Anda tidak memerlukan semua tanda kurung itu; Anda dapat menggabungkan int; dan hanya menambahkan +"\n"sekali.
Kevin Cruijssen


Hmm, Anda dapat menyimpan 2 byte lebih banyak dengan mencetak langsung, alih-alih mengembalikan string: a=>{for(int z=a+1,e=0;e<a*a;)System.Console.WriteLine(e++/a%2<1?"/".PadLeft(--z):@"\".PadLeft(z++));} 101 byte
Kevin Cruijssen

3

SOGL V0.12 , 13 12 9 byte

╝F{±↔}P}ø

Coba Di Sini!

bisa 8 byte ╝F{±↔}P}jika 0 test case tidak diperlukan

Penjelasan:

       }   implicitly started loop repeated input times
╝            create a down-right diagonal of the input
 F           get the current looping index, 1-indexed
  {  }       that many times
   ±↔          reverse the diagonal horizontally
      P      print that
        ø  push an empty string - something to implicitly print if the loop wasn't executed


3

Mathematica, 84 90 byte

(n=#;Grid@Array[If[Abs[n-(s=Mod[#-1,2n])-.5]==#2-.5,If[s<n,"‌​/","\\"],""]&,{n^2,n‌​}])&
  • Terima kasih Jenny_mathy untuk -6 byte.

Saya tidak tahu mengapa \jelas lebih gelap dari /.

masukkan deskripsi gambar di sini


2
84 bytes(n=#;Grid@Array[If[Abs[n-(s=Mod[#-1,2n])-.5]==#2-.5,If[s<n,"/","\\"],""]&,{n^2,n}])&
J42161217

3

Jq 1.5 , 94 89 byte

["/","\\"][range($n)%2]as$s|range($n)|[(range(if$s=="/"then$n-.-1 else. end)|" "),$s]|add

Penjelasan

  ["/","\\"][range($n)%2] as $s                         # for $s= / \ / \ $n times 
| range($n)                                             # for .=0 to $n-1
| [(range(if $s=="/" then $n-.-1 else . end)|" "), $s]  # form list of spaces ending with $s
| add                                                   # concatenate

Contoh Jalankan

$ jq -Mnr --argjson n 5 '["/","\\"][range($n)%2]as$s|range($n)|[(range(if$s=="/"then$n-.-1 else. end)|" "),$s]|add'
    /
   /
  /
 /
/
\
 \
  \
   \
    \
    /
   /
  /
 /
/
\
 \
  \
   \
    \
    /
   /
  /
 /
/

Cobalah online!


3

Java 8, 140 134 116 byte

n->{String r="";for(int a=0,b,c;a++<n;)for(b=n;b-->0;r+=a%2>0?"/\n":"\\\n")for(c=b-n+b|-a%2;++c<b;r+=" ");return r;}

-24 byte berkat @Nevay .

Penjelasan:

Coba di sini.

n->{                // Method with integer parameter and String return-type
  String r="";      //  Result-String
  for(int a=0,b,c;  //  Index integers
      a++<n;)       //  Loop (1) from 0 to the input (exclusive)
    for(b=n;        //   Reset `b` to the input
        b-->0;      //   Inner loop (2) from the input to 0 (exclusive)
                    //     After every iteration: 
        r+=a%2>0?"/\n":"\\\n") 
                    //      Append either of the slashes + a new-line
      for(c=b-n+b|-a%2;++c<b;r+=" ");
                    //    Append the correct amount of spaces
                    //   End of inner loop (2) (implicit / single-line body)
                    //  End of loop (1) (implicit / single-line body)
  return r;         //  Return the result-String
}                   // End of method

1
Kondisi loop paling dalam dapat ditulis sebagai c-->f*(b-n-~b)(-6 byte).
Nevay

1
116 byte:n->{String r="";for(int a=0,b,c;a++<n;)for(b=n;b-->0;r+=a%2>0?"/\n":"\\\n")for(c=b-n+b|-a%2;++c<b;r+=" ");return r;}
Nevay

3

Javascript ES8, 83 79 78 76 75 74 71 byte

* berkurang 1 byte dengan ES8 berkat Shaggy

A=(m,i=0)=>i<m*m?`/\\`[x=i/m&1].padStart(x?i%m+1:m-i%m)+`
`+A(m,++i):""

Tes di sini


siapa pun yang menurunkan solusi saya, dapatkah Anda menjelaskan mengapa? Apakah saya melewatkan sesuatu?
DanielIndie

2
Saya bukan orang yang downvoted, tetapi saya berasumsi bahwa itu karena fungsi harus berulang agar valid. Milik Anda dapat diperbaiki dengan mudah dengan membuat iparameter default. Hitungan byte tampaknya tidak aktif juga.
Emigna

1
Menambahkan tautan TIO juga selalu dihargai, sehingga orang dapat dengan mudah menguji solusi Anda.
Emigna

1
@Emigna memperbaikinya (char wise and Link wise) :)
DanielIndie

1
74 byte dengan beberapa ES8. Juga, untuk JS Anda bisa menggunakan Stack Snippet daripada TIO.
Shaggy


2

PowerShell , 81 byte

param($a)if($a){1..$a|%{((1..$a|%{" "*--$_+'\'}),($a..1|%{" "*--$_+'/'}))[$_%2]}}

Cobalah online!

Ugh, ini jelek. Begitu banyak kode yang diulang, ditambah 7 byte yang diperlukan untuk menjelaskan 0kasus khusus. Saran bermain golf diterima.


2

Pyth, 17 byte

js<*_+RV"\/"_B*L;

Cobalah online: Demonstrasi

Penjelasan:

js<*_+RV"\/"_B*L;QQQ   implicit Qs at the end
              *L;Q     list with ["", " ", "  ", ..., " "*(input-1)]
            _B         bifurcate with reverse: [["" to "   "], ["   " to ""]]
     +RV"\/"           append to each one either "\" or "/": 
                       [["\", to "   \"], ["   /" to "/"]]
    _                  reverse
   *              Q    repeat input times
  <                Q   but only take the first input many
 s                     flatten the list of lists
j                      print on each line

2

Python 3: 90 Bytes 82 Bytes

lambda n:"\n".join(" "*(abs(i%(n*2)-n+i//n%2)-1)+"/\\"[i//n%2]for i in range(n*n))

Terima kasih kepada @Jonathan Frech karena menunjukkan bahwa cetakan tidak diperlukan dan zig pertama adalah cara yang salah


] for-> ]for.
Jonathan Frech

Anda tidak perlu print(...), fungsi yang mengembalikan string akan valid. Juga, saya pikir zig awal Anda berorientasi dengan cara yang salah (\ daripada /).
Jonathan Frech

@JonathanFrech Terima kasih! Saya mengubahnya
Bassintag

1
(abs(...)-1)-> ~-abs(...).
Jonathan Frech

2

05AB1E , 17 16 byte

F<„/\Nèú.sNƒR}»,

Cobalah online!

Penjelasan

F                  # for N in [0 ... input-1] do
  „/\              # push the string "/\"
     Nè            # cyclically index into this string with N
 <     ú           # prepend input-1 spaces to this string
        .s         # get suffixes
          NƒR}     # reverse the list of suffixes input+1 times
              »,   # join on newline and print

Upaya terbaik saat ini menggunakan kanvas:

F„/\Nè©53NèΛ2®ð«4Λ


2

Java (OpenJDK 8) , 131 106 98 96 94 91 byte

i->{for(int j=0;j<i*i;System.out.printf("%"+(j/i%2<1?i-j%i:j%i+1)+"c\n",47+45*(j++/i%2)));}

Cobalah online!


1
Anda dapat menghapus beberapa tanda kurung: i->{for(int j=0;j<i*i;System.out.printf("%"+(j/i%2<1?i-j%i+1:j%i+2)+"s",j++/i%2<1?"/\n":"\\\n"));}(98 byte).
Nevay

2

Dyalog APL , 39 36 35 34 byte

{↑((,⍵ ⍵⍴(⌽,⊢)⍳⍵)/¨' '),¨⍵/⍵⍴'/\'}

Cobalah online!

1 byte disimpan berkat Zacharý


Sial, pukul saya satu byte. Anda dapat membuat ⎕IOmenjadi 0, dan kemudian menghapus ¯1+.
Zacharý

@ Zacharý Saya baru saja akan melakukan itu: p
dzaima

Oh, satu hal lagi: (⌽,⊢)⍳⍵bukannya(⌽⍳⍵),⍳⍵
Zacharý

@ Zacharý Ya, saya belum memahami paku payung, saksi dan hal-hal yang datang dengan itu: /
dzaima

Jangan khawatir, saya tidak sepenuhnya mengerti bagaimana kereta / garpu / apa pun yang mereka sebut bekerja juga.
Zacharý



1

Excel VBA, 84 83 Bytes

Fungsi jendela langsung VBE anonim yang mengambil input dari jarak [A1]dan keluaran ke jendela langsung VBE

For i=1To[A1]:For j=1To[A1]:?IIf(i mod 2,Space([A1]-j)&"/",Space(j-1)&"\"):Next j,i


0

Haskell , 86 85 byte

f n=take(n*n)$cycle$[(' '<$[x..n-1])++"/"|x<-[1..n]]++[(' '<$[2..x])++"\\"|x<-[1..n]]

Cobalah online!

Disimpan satu byte berkat Laikoni

Ulangi zig ++ a zag, dan ambil n*nbaris pertama .


cycle$ ...bukannya cycle( ... )menyimpan byte.
Laikoni

@Laikoni terima kasih!
jferard



0

D , 105 byte

import std.stdio;void m(T)(T n){for(T i,j;i<n;++i)for(j=0;j<n;++j)printf("%*c\n",i%2?j+1:n-j,i%2?92:47);}

Cobalah online!

Diangkat dari jawaban C ++ HatsuPointerKun.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.