ジグザグパターンを作る


25

あなたの仕事は、1つの整数入力を取り、スラッシュとバックスラッシュを使用してジグザグパターンを印刷することです。

  • 整数入力は、各ジグとザグの長さ、およびジグとザグの数を決定します
  • パターンは常に右から左に始まります

テストケース

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

3
各行に文字列の配列/リストを出力できますか?トレーニングや主要な改行やスペースは許可されていますか?
シャギー

2
パターンに影響がない限り、先頭の空白は問題ありませんか?
エミグナ

回答:


10

C(GCC) 108 102 101 98 80 76 72バイト

  • Kevin Cruijssenのおかげで6バイト節約されました。括弧を削除してゴルフN-n-1をするN+~n
  • Zの増分をループ条件に移動してバイトを保存しました
  • およびのprintf("%c\n",...)代わりに使用して3バイトを保存putchar(...)しました,puts("")
  • HatsuPointerKunのおかげで18(!)バイト節約さました。ループを使用して両方の呼び出しを結合する代わりにスペースprintf("%*s",n,"");を印刷するためnに使用するj;for(j=n;j--;)putchar(32);printf(...);
  • printf("%*c",-~n,...);代わりにを使用して4バイトを保存しましたprintf("%*s%c",n,"",...);
  • nwellnhofのおかげで4バイト節約されました。すべてを2つではなく1つのループ内に移動する
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
ケビンCruijssen

1
@KevinCruijssenありがとう。両方Z%2?...:...を交換Z<N;Z++し、に置き換えることで別のバイトを保存しましたZ++<N;
ジョナサンフレッチ

1
あなたが私の答えでやったようにprintfマジックを使用することで、いくつかのバイトを節約できます。そうすれば、スペースを印刷するために使用されるforループを取り除くことができます。詳細については、printfを使用した左パディングスペースに関するこのスタックオーバーフローの回答を参照してください
HatsuPointerKun

@HatsuPointerKunありがとう。それはC.にスペースを繰り返す本当に短い方法です
ジョナサン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ゴルフモードでも壊れていましたか?)
ASCIIのみ

@ASCIIのみいいえ、したがって、特定の簡潔なバージョンとおおよその詳細なバージョンへの個別のリンク。
ニール

ああ> _>これは私が開いたリンクをご覧して見ていなかった
ASCIIのみ

@ASCIIのみさて、リンクは1つしかありません;-)
ニール

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 103101バイト

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"一度だけ追加します。
ケビンCruijssen

わあ、ありがとう!
私の代名詞は、

うーん、文字列を返すのではなく、直接印刷することでさらに2バイト節約できますa=>{for(int z=a+1,e=0;e<a*a;)System.Console.WriteLine(e++/a%2<1?"/".PadLeft(--z):@"\".PadLeft(z++));}
。101

3

SOGL V0.1213の 12 9 バイト

╝F{±↔}P}ø

ここで試してみてください!

╝F{±↔}P}0テストケースが不要な場合、8バイトになります

説明:

       }   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‌​}])&
  • -6バイトありがとう、Jenny_mathy。

なぜ\がなぜよりも暗いのかわからない/

ここに画像の説明を入力してください


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.594の 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

ジャワ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;}

@Nevayのおかげで-24バイト。

説明:

ここで試してみてください。

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バイト)と書くことができます。
ネベイ

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

3

ジャバスクリプトES8、83 79 78 76 75 74 71バイト

* ES8でShaggyのおかげで1バイト削減

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

ここでテスト


誰が私の解決策に反対票を投じたとしても、その理由を説明してもらえますか?何か不足していますか?
ダニエルインディー

2
私はダウン票を投じた人ではありませんが、それは機能が有効であるために再現可能である必要があるからだと思います。iデフォルトのパラメータを作成することで、簡単に修正できます。バイトカウントもオフのようです。
エミグナ

1
TIOリンクを追加することも常に歓迎されるため、ユーザーはソリューションを簡単にテストできます。
エミグナ

1
@Emignaはそれを修正しました(char wiseおよびLink wise):)
DanielIndie

1
ES8で74バイト。また、JSの場合、TIOではなくStack Snippetを使用できます。
シャギー


2

PowerShell、81バイト

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

オンラインでお試しください!

うーん、これはいです。あまりにも多くのコードが繰り返され、0特別な場合を考慮するために7バイトが必要です。ゴルフの提案を歓迎します。


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バイト 82バイト

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
ジョナサンフレッチ

print(...)文字列を返す関数は有効である必要はありません。また、最初のジグの向きが間違っている(/ではなく\)と思われます。
ジョナサンフレッチ

@JonathanFrechありがとう!私はそれを変更
Bassintag

1
(abs(...)-1)-> ~-abs(...)
ジョナサンフレッチ

2

05AB1E17 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

キャンバスを使用した現在の最良の試み:

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



2

Dyalog APL39 36 35 34バイト

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

オンラインでお試しください!

Zacharýのおかげで1バイト節約


それをやった、私を1バイト倒した。⎕IObe を作成0してから削除でき¯1+ます。
ザカリー

@ザカリー私はちょうどそれをやろうとしていた:p
dzaima

ああ、もう一つ:(⌽,⊢)⍳⍵代わりに(⌽⍳⍵),⍳⍵
ザカリー

@Zacharýええ、私はまだそれに付随するタック、暗黙、およびものを理解していません:/
dzaima

心配しないでください、私は電車/フォーク/それらが何と呼ばれているかを完全に理解していません。
ザカリー



1

Excel VBA、84 83バイト

範囲から入力を受け取り[A1]、VBEイミディエイトウィンドウに出力する匿名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.