ทำรูปแบบซิกแซก


25

งานของคุณคือการป้อนข้อมูลจำนวนเต็มหนึ่งตัวและพิมพ์รูปแบบซิกแซกโดยใช้เครื่องหมายทับและแบ็กสแลช

  • อินพุตจำนวนเต็มพิจารณาความยาวของ zig และ zag แต่ละรายการรวมถึงจำนวนของ zigs และ zags
  • รูปแบบเริ่มต้นจากขวาไปซ้ายเสมอ

กรณีทดสอบ

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

3
เราสามารถส่งออกอาร์เรย์ / รายการของสตริงสำหรับแต่ละบรรทัดได้หรือไม่? การฝึกอบรมหรือการขึ้นบรรทัดใหม่หรือช่องว่างนำหน้าหรือไม่
Shaggy

2
ช่องว่างชั้นนำนำมาใช้ได้ตราบใดที่รูปแบบไม่ได้รับผลกระทบ
Emigna

คำตอบ:


10

C (gcc) , 108 102 101 98 80 76 72 ไบต์

  • บันทึกหกไบต์ด้วยKevin Cruijssen ; การลบวงเล็บและการเล่นกอล์ฟN-n-1ไปที่N+~n
  • บันทึกไบต์ด้วยการย้ายการZเพิ่มขึ้นของสภาพลูป
  • บันทึกสามไบต์โดยใช้printf("%c\n",...)แทนputchar(...)และ,puts("")
  • ไบต์สิบแปด (!) ที่บันทึกไว้ต้องขอบคุณHatsuPointerKun ; ใช้printf("%*s",n,"");เพื่อพิมพ์nช่องว่างแทนการใช้วนj;for(j=n;j--;)putchar(32);และรวมทั้งการprintf(...);โทร
  • บันทึกสี่ไบต์โดยใช้printf("%*c",-~n,...);แทนprintf("%*s%c",n,"",...);
  • บันทึกสี่ไบต์ต้องขอบคุณnwellnhof ; ย้ายทุกอย่างในวงเดียวแทนที่จะเป็นสองวง
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);}

ลองออนไลน์!


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 ไบต์ ถอดวงเล็บปีกกาออกโดยใส่ทุกอย่างไว้ในห่วง และมีการเปลี่ยนแปลงไปN-n-1 N+~n
Kevin Cruijssen

1
@KevinCruijssen ขอบคุณ ที่บันทึกไว้ไบต์อื่นโดยการแลกเปลี่ยนทั้งในZ%2?...:...และแทนที่ด้วยZ<N;Z++ Z++<N;
Jonathan Frech

1
คุณสามารถบันทึกหลายไบต์โดยใช้เวทมนตร์ printf เหมือนที่ฉันได้ในคำตอบของฉัน ด้วยวิธีนี้คุณจะกำจัด for วนที่ใช้ในการพิมพ์ช่องว่าง สำหรับรายละเอียดเพิ่มเติมโปรดดูที่นี้คำตอบที่แตกล้นเกี่ยวกับช่องว่าง padding ซ้ายกับ printf
HatsuPointerKun

@HatsuPointerKun ขอบคุณ; นั่นเป็นวิธีที่สั้นมากในการทำซ้ำช่องว่างใน C.
Jonathan Frech

4 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);}ไบต์สั้น: ลองออนไลน์!
nwellnhof

10

ถ่าน , 16 10 9 ไบต์

FN«↖Iθ→‖T

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด


ใช้งานได้ ( InputNumberแตกในโหมด golfy ด้วยหรือไม่)
เท่านั้น

@ ASCII-only ไม่ใช่ดังนั้นจึงแยกลิงก์ไปยังเวอร์ชั่นย่อที่ให้มาและรุ่น verbose โดยประมาณ
Neil

โอ้> _> ไม่ได้มองว่าจะเปิดลิงค์ไหน
ASCII- เท่านั้น

@ ASCII- อย่างเดียวตอนนี้มีลิงค์เดียวเท่านั้น ;-)
Neil

4

MATL , 17 ไบต์

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

ลองออนไลน์!

คำอธิบาย

:         % 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 ไบต์

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

ลองออนไลน์!


คุณสามารถบันทึก 14 ไบต์เช่นนี้: 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 ไบต์คุณไม่จำเป็นต้องใช้วงเล็บทั้งหมด คุณสามารถรวมint; และเพิ่มเพียง+"\n"ครั้งเดียว
Kevin Cruijssen

โอ้ว้าวขอบคุณ!
สรรพนามของฉันคือ monicareinstate

อืมคุณสามารถประหยัด 2 ไบต์ได้มากขึ้นโดยการพิมพ์โดยตรงแทนที่จะส่งคืนสตริง: a=>{for(int z=a+1,e=0;e<a*a;)System.Console.WriteLine(e++/a%2<1?"/".PadLeft(--z):@"\".PadLeft(z++));} 101 ไบต์
Kevin Cruijssen

3

SOGL V0.12 , 13 12 9 ไบต์

╝F{±↔}P}ø

ลองที่นี่!

อาจเป็น 8 ไบต์╝F{±↔}P}หากไม่จำเป็นต้องใช้กรณีทดสอบ 0 ข้อ

คำอธิบาย:

       }   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 ไบต์

(n=#;Grid@Array[If[Abs[n-(s=Mod[#-1,2n])-.5]==#2-.5,If[s<n,"‌​/","\\"],""]&,{n^2,n‌​}])&
  • ขอบคุณ Jenny_mathy สำหรับ -6 ไบต์

ผมมีความคิดว่าทำไมจะเห็นได้ชัดเข้มกว่า\/

ป้อนคำอธิบายรูปภาพที่นี่


2
84 ไบต์(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 ไบต์

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

คำอธิบาย

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

เรียกใช้ตัวอย่าง

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

ลองออนไลน์!


3

Java 8, 140 134 116 ไบต์

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 ไบต์ขอบคุณที่@Nevay

คำอธิบาย:

ลองที่นี่

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
เงื่อนไขของลูปด้านในสุดสามารถเขียนเป็นc-->f*(b-n-~b)(-6 ไบต์)
Nevay

1
116 ไบต์: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;}
2560

3

Javascript ES8, 83 79 78 76 75 74 71 ไบต์

* ลดลง 1 ไบต์ด้วย ES8 เนื่องจาก Shaggy

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

ทดสอบที่นี่


ใครก็ตามที่ลงคะแนนแก้ปัญหาของฉันคุณอธิบายได้ไหม ฉันพลาดอะไรไปรึเปล่า?
DanielIndie

2
ฉันไม่ใช่คนที่ถูกลดระดับลง แต่ฉันคิดว่ามันเป็นเพราะฟังก์ชั่นจะต้องทำซ้ำเพื่อให้ถูกต้อง ของคุณสามารถแก้ไขได้อย่างง่ายดายโดยการสร้างiพารามิเตอร์เริ่มต้น จำนวนไบต์ดูเหมือนจะปิดเช่นกัน
Emigna

1
การเพิ่มลิงค์ TIOก็เป็นที่นิยมเช่นกันเพื่อให้ผู้คนสามารถทดสอบโซลูชันของคุณได้อย่างง่ายดาย
Emigna

1
@Emigna คงมัน (ถ่านที่ชาญฉลาดและการเชื่อมโยงที่ชาญฉลาด) :)
DanielIndie

1
74 ไบต์พร้อม ES8 บางตัว นอกจากนี้สำหรับ JS คุณสามารถใช้ Stack Snippet แทน TIO
ปุย


2

PowerShell , 81 ไบต์

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

ลองออนไลน์!

ฮึนี่มันช่างน่าเกลียด รหัสซ้ำจำนวนมากบวก 7 ไบต์ที่จำเป็นสำหรับบัญชี0กรณีพิเศษ ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ


2

Pyth, 17 ไบต์

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

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย:

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

ขอบคุณ @Jonathan Frech ที่ชี้ให้เห็นว่าการพิมพ์นั้นไม่จำเป็นและซิกแซกแรกนั้นผิดวิธี


] for]for->
Jonathan Frech

คุณไม่ต้องการprint(...)ฟังก์ชันที่ส่งคืนสตริงจะใช้ได้ นอกจากนี้ฉันคิดว่าซิกแซกเริ่มต้นของคุณมุ่งเน้นไปในทางที่ผิด (\ มากกว่า /)
Jonathan Frech

@ JonathanFrech ขอบคุณ! ฉันเปลี่ยนมัน
Bassintag

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

2

05AB1E , 17 16 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

ความพยายามที่ดีที่สุดในปัจจุบันโดยใช้ Canvas:

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



2

Dyalog APL , 39 36 35 34 ไบต์

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

ลองออนไลน์!

บันทึก 1 ไบต์ขอบคุณZacharý


Dang it เอาชนะฉันทีละไบต์ คุณสามารถทำให้⎕IOเป็นและเอาออกแล้ว0 ¯1+
Zacharý

@ Zacharýฉันเพิ่งจะทำเช่นนั้น: p
dzaima

โอ้อีกอย่างหนึ่ง: (⌽,⊢)⍳⍵แทนที่จะ(⌽⍳⍵),⍳⍵
Zacharý

@ Zacharýใช่ฉันยังไม่เข้าใจ tacks, tacitness และสิ่งของที่มาพร้อมกับ: /
dzaima

ไม่ต้องกังวลฉันไม่เข้าใจเลยว่ารถไฟ / ส้อม / อะไรก็ตามที่พวกเขาเรียกว่าทำงานเช่นกัน
Zacharý



1

Excel VBA, 84 83 ไบต์

ฟังก์ชันหน้าต่าง VBE แบบไม่ระบุชื่อทันทีที่รับอินพุตจากช่วง[A1]และเอาต์พุตไปยังหน้าต่างทันที VBE

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





โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.