Tạo một mô hình ngoằn ngoèo


25

Nhiệm vụ của bạn là nhận một đầu vào số nguyên và in một mẫu zigzag bằng cách sử dụng dấu gạch chéo và dấu gạch chéo ngược.

  • Đầu vào số nguyên xác định độ dài của mỗi zig và zag, cũng như số lượng zigs và zags
  • Mô hình luôn bắt đầu từ phải sang trái

Các trường hợp thử nghiệm

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

3
Chúng ta có thể xuất một mảng / danh sách các chuỗi cho mỗi dòng không? Được đào tạo hoặc hàng đầu hoặc không gian mới được phép?
Xù xì

2
Là khoảng trắng hàng đầu có ổn miễn là mô hình không bị ảnh hưởng?
Emigna

Câu trả lời:


10

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

  • Đã lưu sáu byte nhờ Kevin Cruijssen ; loại bỏ dấu ngoặc đơn và chơi golf N-n-1đểN+~n
  • Đã lưu một byte bằng cách di chuyển Zgia tăng vào điều kiện vòng lặp
  • Đã lưu ba byte bằng cách sử dụng printf("%c\n",...)thay vì putchar(...),puts("")
  • Đã lưu mười tám byte (!) Nhờ HatsuPulumKun ; sử dụng printf("%*s",n,"");để in ndấu cách thay vì sử dụng vòng lặp j;for(j=n;j--;)putchar(32);và kết hợp cả hai printf(...);cuộc gọi
  • Đã lưu bốn byte bằng cách sử dụng printf("%*c",-~n,...);thay vìprintf("%*s%c",n,"",...);
  • Lưu bốn byte nhờ nwellnhof ; di chuyển mọi thứ trong một vòng thay vì hai
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);}

Hãy thử trực tuyến!


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 . Loại bỏ các dấu ngoặc nhọn bằng cách đặt mọi thứ bên trong các vòng lặp; và đổi N-n-1thành N+~n.
Kevin Cruijssen

1
@KevinCruijssen Cảm ơn. Đã lưu một byte khác bằng cách hoán đổi cả hai Z%2?...:...và thay thế Z<N;Z++bằng Z++<N;.
Jonathan Frech

1
Bạn có thể lưu một vài byte bằng cách sử dụng ma thuật printf như tôi đã làm trong câu trả lời của mình . Bằng cách đó, bạn sẽ thoát khỏi vòng lặp for được sử dụng để in dấu cách. Để biết thêm chi tiết, hãy xem câu trả lời tràn ngăn xếp này về các khoảng trống đệm bên trái với printf
HatsuPulumKun

@HatsuPulumKun Cảm ơn; đó là một cách thực sự ngắn để lặp lại không gian trong C.
Jonathan Frech

4 byte ngắn hơn : 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);}. Hãy thử trực tuyến!
nwellnhof

10

Than , 16 10 9 byte

FN«↖Iθ→‖T

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã.


cái này hoạt động (Có InputNumberbị hỏng ở chế độ chơi gôn không?)
ASCII - chỉ

@ Chỉ ASCII Không, do đó, các liên kết riêng biệt với phiên bản ngắn gọn nhất định và phiên bản dài gần đúng.
Neil

Oh> _> không nhìn thấy liên kết nào tôi đã mở
ASCII - chỉ

@ ASCII-only Chỉ có một liên kết bây giờ ;-)
Neil

4

MATL , 17 byte

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

Hãy thử trực tuyến!

Giải trình

:         % 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++));}

Hãy thử trực tuyến!


Bạn có thể lưu 14 byte như thế này: 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 Bạn không cần tất cả các dấu ngoặc đơn đó; bạn có thể kết hợp int; và chỉ thêm +"\n"một lần.
Kevin Cruijssen


Hmm, bạn có thể lưu thêm 2 byte bằng cách in trực tiếp, thay vì trả về chuỗi: 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}ø

Hãy thử nó ở đây!

có thể là 8 byte ╝F{±↔}P}nếu không yêu cầu trường hợp kiểm tra 0

Giải trình:

       }   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

Toán học, 84 90 byte

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

Tôi không biết tại sao \rõ ràng là tối hơn /.

nhập mô tả hình ảnh ở đây


2
84 byte(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

Giải trình

  ["/","\\"][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

Chạy mẫu

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

Hãy thử trực tuyến!


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 nhờ @Nevay .

Giải trình:

Hãy thử nó ở đây.

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
Điều kiện của vòng lặp trong cùng có thể được viết dưới dạng 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

* giảm 1 byte với ES8 nhờ Shaggy

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

Kiểm tra tại đây


bất cứ ai đánh giá thấp giải pháp của tôi, bạn có thể giải thích tại sao? Tui bỏ lỡ điều gì vậy?
DanielIndie

2
Tôi không phải là người bị đánh giá thấp, nhưng tôi cho rằng đó là vì các chức năng cần phải được lặp lại để có hiệu lực. Bạn có thể sửa lỗi khá dễ dàng bằng cách tạo itham số mặc định. Số byte dường như cũng tắt.
Emigna

1
Thêm một liên kết TIO luôn luôn được đánh giá cao, để mọi người có thể dễ dàng kiểm tra giải pháp của bạn.
Emigna

1
@Emigna đã sửa nó (char khôn ngoan và Link khôn ngoan) :)
DanielIndie

1
74 byte với một số ES8. Ngoài ra, đối với JS, bạn chỉ có thể sử dụng Stack Snippet chứ không phải TIO.
Xù xì


2

PowerShell , 81 byte

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

Hãy thử trực tuyến!

Ugh, điều này thật xấu xí. Quá nhiều mã lặp lại, cộng với 7 byte cần thiết cho tài khoản cho 0trường hợp đặc biệt. Gợi ý chơi golf chào mừng.


2

Bình thường, 17 byte

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

Dùng thử trực tuyến: Trình diễn

Giải trình:

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 byte 82 byte

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

Cảm ơn @Jonathan Frech đã chỉ ra rằng in ấn là không cần thiết và zig đầu tiên là sai cách


] for-> ]for.
Jonathan Frech

Bạn không cần print(...), một hàm trả về một chuỗi sẽ hợp lệ. Ngoài ra, tôi nghĩ rằng zig ban đầu của bạn được định hướng sai (\ chứ không phải /).
Jonathan Frech

@JonathanFrech Cảm ơn! Tôi đã thay đổi nó
Bassintag

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

2

05AB1E , 17 16 byte

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

Hãy thử trực tuyến!

Giải trình

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

Nỗ lực tốt nhất hiện tại bằng cách sử dụng canvas:

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)));}

Hãy thử trực tuyến!


1
Bạn có thể xóa khá nhiều dấu ngoặc đơn: 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

APL Dyalog , 39 36 35 34 byte

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

Hãy thử trực tuyến!

Lưu 1 byte nhờ Zacharý


Dang nó, đánh tôi một byte. Bạn có thể làm ⎕IOđược 0, và sau đó loại bỏ ¯1+.
Zacharý

@ Zacharý Tôi vừa mới làm điều đó: p
dzaima

Ồ, một điều nữa: (⌽,⊢)⍳⍵thay vì(⌽⍳⍵),⍳⍵
Zacharý

@ Zacharý Vâng, tôi vẫn chưa hiểu về những kẻ lừa đảo, nhân chứng và những thứ đi kèm với điều đó: /
dzaima

Đừng lo lắng, tôi cũng không hiểu đầy đủ về cách tàu / dĩa / bất cứ thứ gì họ gọi là công việc.
Zacharý



1

VBA Excel, 84 83 byte

Chức năng cửa sổ tức thời VBE ẩn danh nhận đầu vào từ phạm vi [A1]và đầu ra cho cửa sổ ngay lập tức 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]]

Hãy thử trực tuyến!

Đã lưu một byte nhờ Laikoni

Lặp lại zig ++ một zag và lấy các n*ndòng đầu tiên .


cycle$ ...thay vì cycle( ... )tiết kiệm một byte.
Laikoni

@Laikoni cảm ơn!
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);}

Hãy thử trực tuyến!

Được nâng lên từ câu trả lời C ++ của HatsuPulumKun.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.