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->
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
       /
      /
     /
    /
   /
  /
 /
/
\
 \
  \
   \
    \
     \
      \
       \
Romulus3799
sumber
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!

Jonathan Frech
sumber
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.

Neil
sumber
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
Luis Mendo
sumber
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!

kata ganti saya adalah monicareinstate
sumber
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
Oh wow terima kasih!
kata ganti saya adalah monicareinstate
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
dzaima
sumber
3

Python 2 , 69 68 62 byte

-1 byte terima kasih kepada Jonathan Frech

lambda n:[[~i,i][i/n%2]%n*' '+'/\\'[i/n%2]for i in range(n*n)]

Cobalah online!

tongkat
sumber
68 byte .
Jonathan Frech
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

Keyu Gan
sumber
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!

jq170727
sumber
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
Kevin Cruijssen
sumber
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

DanielIndie
sumber
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.

AdmBorkBork
sumber
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
Jakube
sumber
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

Bassintag
sumber
] 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Λ
Emigna
sumber
2

C ++, 92 91 byte

-1 byte, terima kasih kepada Kevin Cruijssen

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

Berkat kekuatan sihirnya printf

HatsuPointerKun
sumber
Anda bisa meletakkan int i=0,jdi for-loop for(int i=0,j;i<n;++i)untuk menyimpan byte.
Kevin Cruijssen
88 byte
ceilingcat
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!

Roberto Graham
sumber
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ý

dzaima
sumber
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

Perl 5 , 70 + 1 ( -n) = 71 byte

$n=$_**2;$_=$"x--$_.'/';say&&s% /%/ %||s%\\ % \\%||y%\\/%/\\%while$n--

Cobalah online!

Xcali
sumber
1

Kotlin , 102 byte

(0..q-1).map{r->if(r%2<1)q-1 downTo 0 else{0..q-1}.map{(1..it).map{print(' ')};println('/'+45*(r%2))}}

Cobalah online!

jrtapsell
sumber
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
Taylor Scott
sumber
0

Jelly , 15 byte

ḶṚ⁶ẋm0ż⁾/\x$ṁ²Y

Cobalah online!

Program lengkap.

Erik the Outgolfer
sumber
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 .

jferard
sumber
cycle$ ...bukannya cycle( ... )menyimpan byte.
Laikoni
@Laikoni terima kasih!
jferard
0

Dyalog APL, 41 40 byte

⎕IOharus 0.

{⍪/((⌽⍵ ⍵⍴S↑'/')(⍵ ⍵⍴'\'↑⍨S←⍵+1))[2|⍳⍵]}

Cobalah online!

Zacharý
sumber
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.

Zacharý
sumber