ゆっくりと収束するジグザグ


23

単一の正の奇数整数を入力として指定すると、次の形式で、文字列のリスト、文字のリストのリスト、または改行で区切られた文字列として収束ジグザグを返します。

#
 #
  #
   #
    #
   #
  #
 #
  #
   #
  #

#一貫性のある非空白文字に置き換えることができます。各行の末尾の空白は許可され、末尾の改行は許可されます。

ジグザグは列から始まり、1各行が1列ずつ右に移動し、列nn入力がある場所)に到達します。次いで、それは左て移動する2右へ、n-1次いで左、32つの境界の中央の列でジグザグ終了するまでに収束して、( (n+1)/2)。

テストケース

上記の例は、のテストケースです5

以下は、個々のテストケースです。

3
#
 #
  #
 #

7
#
 #
  #
   #
    #
     #
      #
     #
    #
   #
  #
 #
  #
   #
    #
     #
    #
   #
  #
   #
    #
   #

1

#

先頭の(ただし、一貫性のある、つまり形状を壊さない)空白は許可されますか?
エリックアウトゴルファー

@EriktheOutgolferそれについてはノーと言うつもりです。
ハイパーニュートリノ

回答:


15

C(gcc)、89バイト

f(n,a,b){puts("0");for(a=n;--a>n/2;)for(b=n-2*a;b<=2*a-n;)printf(" %*d\n",a-abs(b++),0);}

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

次のようにスペースの数のシーケンスを分析することにより機能します(n = 7の場合):

          0
1 2 3 4 5 6 5 4 3 2 1
    2 3 4 5 4 3 2
        3 4 3

n = 3の場合:

  0
1 2 1

中央の数字(aコード内)は[n-1、n / 2)から実行されていることがわかります。次に、最初の数字と中央の数字の違いは次のとおりです。

a  n  b  2a-n
-------------
6  7  5  5
5  7  3  3
4  7  1  1
2  3  1  1

したがって、b[-(2a-n)、2a-n]を通過a-abs(b)すると、目的のシーケンスが得られます。これは基本的にコードが行うことです。




3

ゼリー、14バイト

ṖṖṚ$ÐĿẎ0;⁶ẋp1Y

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

完全なプログラム。

を使用し1ます。

-1 ジョナサンアランに感謝します。
-1 ジョナサンアランに感謝します。


’R-> バイト。
ジョナサンアラン

@JonathanAllan Oohもちろんありがとう。私は以前のバージョンでそれを避けようとして、それを忘れていました...
エリックアウトゴルファー

”X-> 1別の。
ジョナサンアラン

@JonathanAllan Hehもう一つ見落としているようです...私も整数を避けようとしました。
エリックアウトゴルファー

3

Haskell、72バイト

g[]=[]
g a=a++g(reverse$init a)
r="#":map(' ':)r
("#":).g.tail.(`take`r)

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

左上隅から始まるs rの対角要素である無限リストを定義します#

次にg、作業の先駆けを行う関数を定義します。 gリストを取得し、リストを空にし、最初の要素を削除してリストを繰り返し、各アクションの結果を連結します。

ここでの主な機能は、ポイントフリー機能です。この関数nは無限リストから要素を取得することから始めr、最初の要素をチョップして適用しますg。最後に#最初に戻って追加する必要があります、これは質問の仕様が少し奇妙だからですaaを追加し#ます。


@nimi結局("#":).g.init.(テイクしましたr)が、ありがとうございます!
小麦ウィザード



2

05AB1E、6バイト

LN71SΛ

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

     Λ     use the canvas function with

L          a range list [1 .. input] as lengths for each path 

 N         a "0" as character to be printed 
           (N is the index variable used by loops. If there was no loop yet, its
           default value is 0. By using N, I avoid an extra space between 0 and 71)

  71S      and the directions 7 and 1 (NW and NE), that alternate automatically until
           the range list is finished.

いいえ、私は最初にそれを試しましたが、範囲リストの次の要素で続行する前に、両方の方向を描画しSます。したがって、出力は2倍の長さになります。+と×についてはまだ知りませんでした。数字と組み合わせると、非常に興味深いパターンを作成します
ドリアン

ああ、あなたは本当に正しい。私の悪い。私はそれをせずに働いた見たSが、出力に十分な注意を払っていなかった...>。>そして+そして×のために基本的に組み込みコマンドです[0,4,4,0,2,6,6,2][1,5,5,1,3,7,7,3]。そして8、元の場所にリセットされます。ここでもう少し情報。
ケビンクルーッセン



1

JavaScript、127バイト

g到達する目標()を計算します。この目標に到達したら、次の目標に向き直ります。また、すべての不均等な数にMath.round()追加0.5することにより、使用を避けるためのトリックを使用します。

f=n=>{c=0;for(i=0;i<n;i++){m=i/2;g=i%2==0?n-m:m+1.5;while(c!=g){c>g?c--:c++;console.log(' '.repeat(c-1)+'#'+' '.repeat(n-c))}}}

f=n=>{c=0;for(i=0;i<n;i++){m=i/2;g=i%2==0?n-m:m+1.5;while(c!=g){c>g?c--:c++;console.log(' '.repeat(c-1)+'#'+' '.repeat(n-c))}}}

f(5);


1

Haskell、74バイト

f[x]=[x]
f s=s++tail(f$reverse$tail s)
g n=f[(' '<$[2..x])++"#"|x<-[1..n]]

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

使い方:

    [(' '<$[2..x])++"#"|x<-[1..n]]     -- build the first diagonal, e.g. for n=3:
                                         -- ["#", " #", "  #"]
  f                                      -- call f, which is

f s = s ++                               -- the input list, followed by
           tail                          -- all but the first element of
                f                        -- a recursive call with
                  reverse                -- the reverse of
                          tail s         -- all but the first element of the input 
                                         -- list
f[x]=[x]                                 -- base case: stop if the input list a
                                         -- singleton list

f次の対角線を追加する各再帰呼び出し。



1

、19バイト

mo`:'#R' ∫`Ṙ¢e1_1tṫ

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

説明

これは少し不格好に感じます。

mo`:'#R' ∫`Ṙ¢e1_1tṫ  Input is n (e.g. 5)
                  ṫ  Range from input to 1: [5,4,3,2,1]
                 t   Drop first element: [4,3,2,1]
             e1_1    The list [1,-1]
            ¢        repeated infinitely: [1,-1,1,-1,..
          `Ṙ         Clone with respect to the list above: [1,1,1,1,-1,-1,-1,1,1,-1]
         ∫           Cumulative sum: [0,1,2,3,4,3,2,1,2,3,2]
mo                   For each element k (e.g. 3) do this:
      R'             Repeat space k times: "   "
  `:'#               Append '#': "   #"
                     Print implicitly separated by linefeeds.


1

網膜、71バイト

.+
$* 
^
:>
 $
:
;{*T`:<>`_#
( ) >(:)|( )<
$1<$2$3
(:)( )<|>( )
$2$1$3>

オンラインでお試しください!説明:最初の3つのステージは、入力をs :> :間の文字数が:入力数である形式に変換します。最後の2つのステージは、sの間をバウンスします>(または<、左に移動する場合):。4番目の段階では、バウンスをループし、文字列の必要な部分を毎回印刷します。;ループの後に印刷されてから文字列を停止します。


1

05AB1E、16バイト

Î<L¤F¦})˜Ôð×X«»

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

説明

Î<L               # push 0 and range [1 ... input-1]
   ¤              # get the last element of the list
    F             # that many times do
     Â            # bifurcate
      ¦           # remove the head
       })˜        # end loop and wrap in flattened list
          Ô       # remove consecutive duplicates
           ð×     # repeat space a number of times corresponding to each number in the list
             X«   # append 1 to each
               »  # join on newline

1

K(コナ)、27バイト

`0:{|x$"#"}'1,,/{1_|x}\-2-!

空になるまでベクトルの先頭を繰り返し反転してドロップすることにより、基礎となる数値シーケンスを生成します。


3
PPCG.SEへようこそ!ご存知のように、コードをTIO(オンラインで試す)と呼ばれるオンラインインタープリターに入れ、リンクして、人々がコードを試すことができるようにします。tio.run/#k-konaは、ここに送信するためのフォーマットされたPPCG投稿を提供します。
Notts90

0

PHP、65バイト

<?while(--$n||$n=$d=--$argn)echo str_pad("X
",2+$x-=$d&1?:-1);?>X

でパイプとして実行する-nF、オンラインでテストします

説明:

最初の反復:$nis NULLなので--$n、効果はなく、NULL
-> set $nおよび$d事前にデクリメントされた引数
1に評価されます。偶数の$x場合$dは増分、奇数の場合は減分$d
2. print X、改行および$xスペース

さらなる反復:デクリメント $n ; ヒットした場合0、事前にデクリメントされた引数にリセット$n(および$d)します

フィナーレ:もう1つ印刷しますX



0

Python 2、159 145 141 136バイト

print"".join([" "*p+"#\n"for p in(lambda l:[sum(l[:i])for i in range(len(l))])(sum([i*[1-i%2*2]for i in range(input())[::-1]],[])+[1])])

この問題に対するPythonのバージョンは既にかなりありますが、ひどいワンライナーをまだ投稿すると思いました。(ただし、セミコロンなし!)

編集:14バイト下、二重リスト内包表記の代わりに合計を使用

編集:Python 2では、raw_inputの代わりにinputを使用できます。私は常に後者を使用しています。


0

Mathematica、142 102バイト(独立)

このソリューションには、まろやかな味があります。

UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&

これは、基本的にどのセグメントにいるかを計算し(三角関数を逆にする)、-1のべき乗を加えて左右に移動します。

Wolfram Code Sandboxでテストするには、次のようなコードを貼り付けてUnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&@6//MatrixFormShift + EnterまたはNumpad Enterを押すか、Gear-> "Evaluate Cell"をクリックします。


これは、ErikのPython 2ソリューションの元の誤ったポートと同じ長さです(このポートは、1つ上の入力の出力を提供します)。

(Print[X];l=Range@#;Do[Do[Print[StringRepeat[" ",l[[j]]]<>"X"],{j,Length@l}];l=l[[-2;;1;;-1]],{i,#}])&

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.