ASCII Padovanスパイラルを生成する


22

これはこの挑戦の ASCIIバージョンです。最初の投稿は、Martin Enderによるリクエストごとに分離されました

前書き

フィボナッチ数列と同様に、パドバン数列OEIS A000931)は、数列の前の項を追加することによって生成される数の数列です。初期値は次のように定義されます。

P(0) = P(1) = P(2) = 1

0番目、1番目、および2番目の用語はすべて1です。繰り返しの関係は次のとおりです。

P(n) = P(n - 2) + P(n - 3)

したがって、次のシーケンスが生成されます。

1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151, 200, 265, 351, ...

これらの数値を正三角形の辺の長さとして使用すると、フィボナッチスパイラルのように、それらをすべて一緒に配置すると素敵なスパイラルが得られます。

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

ウィキペディアの厚意による画像


仕事

あなたの仕事は、どのスパイラルをASCIIアートで再作成するプログラムを書くことです。ASCIIで辺の長さ1(1文字)の三角形をうまく表現することは不可能であるため、辺の長さは2倍に拡張されています。したがって、辺の長さ1の三角形は実際には次のように表されます。

 /\
/__\

したがって、たとえば、入力が5(第5項)だった場合、出力は次のようになります。

   /\
  /  \
 /    \
/______\
\      /\
 \    /__\ 
  \  /\  /
   \/__\/

最初の5項は1、1、1、2、2であったため、三角形は膨張のために辺の長さが2、2、2、4、4でした。入力8の別の例:

     __________
   /\          /\
  /  \        /  \
 /    \      /    \
/______\    /      \
\      /\  /        \
 \    /__\/          \
  \  /\  /            \
   \/__\/______________\
    \                  /
     \                /
      \              /
       \            /
        \          /
         \        /
          \      /
           \    /
            \  /
             \/

ルール

  • 結果を出力する必要があり、入力は用語番号に対応する整数でなければなりません
  • 末尾と先頭の改行が許可され、行の後のスペースも許可されます
  • 提出物は少なくとも10期目まで処理できる必要があります(9)
  • 提出するものは、入力を取得して結果を出力する完全なプログラムまたは機能でなければなりません
  • 出力の回転は60度の倍数で許可されますが、三角形のサイズは表現とともに同じままでなければなりません
  • 反時計回りに行くこともできます
  • 標準的な抜け穴は禁止されています

入力が> 0であり、入力の正しい形式が指定されると想定できます。

得点

これはであるため、バイト単位の最短コードが優先されます。みなさん、おめでとうございます!


1
私の言語Turtlèdは10を基数とする入力を取り、それを適切に処理できますが、単項として入力を受け取った場合、この課題は非常に簡単になります。それは許可されますか?
破壊可能なレモン

1
@DestructibleWatermelonはい。入力は、何らかの形式の整数でなければなりません。
アンドリューリー

クール。今すぐ作業を開始します
破壊可能なレモン

3
待って、それはまだ本当に難しいです
破壊可能なレモン

回答:


13

Befunge、871 836 798バイト

&00p45*:10p20p030p240p050p060p9010gp9110gp1910gp1-91+10gpv
<v-g03+g06*2g041g055_v#!:%6:p06p05+p04g05g06:g04<p*54+292<
->10g:1\g3+:70p110gv >:5- #v_550g:01-\2*40g+1-30g
/\110:\-g03:\1:g055 _v#!-4:<vp01:-1g01-g03-1\-
^1<v07+1:g07< p08p < >:1-#v_550g:01-\40g+60g+1-30g-50g>v
 _0>p80gp:5-|v1\+66\:p\0\9:$<:p02:+1g02-g03+g06-\g04\1:<
0v|-g00:+1$$<>\p907^>p:!7v>3-#v_550g:30g+:30p1\0\-
1>10g+::0\g3-:70p\0^^07<v<>50#<g::30g+:30p-1-01-\
v >\$0gg> :1+10gg1- #v_^>0g10gg*+\:!2*-70g2+10gv>:#->#,"_"$#1_:1#<p
+1+g03$_^#`gg011+3:+3<g07\+*2+*`0:-\gg01+5g07:g<>1#,-#*:#8>#4_$#:^#
>55+,p30g40p10gg10g1>#v_
#v:#p0$#8_:$#<g!#@_0^ >
 >>:180gg`>>#|_:2+80gg:!v
3+^g\0p08:<vgg08+2::+3<$_100p1-v>g,\80gg+\80gp:2+90g:!01p\80gp
!#^_80g:1+^>\180gg`+!#^_20g80g`
5*g10!g09p04-1-\0\+g04:gg08:p09<^3`0:gg08+1:::$$_1#!-#\\:,#\<g

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

Befungeでよくあることですが、限られたスペースで最初にパターンをメモリにレンダリングするのは現実的ではないため、上から下にパターンをレンダリングできるアルゴリズムを考えています。

これが機能する方法は、最初にスパイラルを描くために必要なエッジを表す単純なデータ構造を構築することです。2番目の段階では、その構造を上から下に解析し、出力の各行に必要なエッジフラグメントをレンダリングします。

この手法を使用すると、8ビットメモリセルでオーバーフローの問題が発生する前に、リファレンス実装で最大n = 15をサポートできます。セルサイズが大きい通訳者は、メモリが不足する前に最大n = 25をサポートできる必要があります。


それは非常に印象的です...しかし、あなたはこれらのプログラムを読むことができると思いますか?笑私にはそれはとてもランダムに見えます。どのようにデータ構造を構築しますか?どのようなデータ構造を使用していますか?ありがとう!
明るい

1

go、768バイト

func 卷(n int){
    数:=0
    p:=[]int{1,1,1}
    for i:=3;i<n;i++ {p=append(p,p[i-2]+p[i-3])}
    宽:=p[len(p)-1]*10+10
    素:=make([]int,宽*宽)
    for 数=range 素 {素[数]=32}
    for i:=0;i<数;i+=宽 {素[i]=10}
    态:=[]int{1,1,宽/2,宽/2,92}
    表:=[70]int{}
    s:="SRSQTSPQQ!QOQP~QQQQQQSQR~ORQR!OPOPTSQRQ$QPPQNQPPPXQQQQQQRRQXQRRRNOQPQ$"
    for i:=range s {表[i]=int(s[i])-33-48}
    表[49],表[59]=48,48
    for i:=0;i<4*n;i++ {
        梴:=p[i/4]*2
        if 态[1]==0 {梴=梴*2-2}
        for k:=0;k<梴;k++ {
            址:=(态[2]+态[3]*宽)%len(素)
            if 素[址]==32 {素[址]=态[4]}
            态[2]+=态[0]
            态[3]+=态[1]
        }
        数=((态[0]+1)*2+态[1]+1)*5
        if i%4>2 {数+=35}
        for k:=0;k<5;k++ {态[k]+=表[数+k]}
    }
    for i:=0;i<宽*宽;i++ {fmt.Printf("%c",rune(素[i]))}
}

これはもちろん最適ではありませんが、悪いスタートではありません。ゴルフの基準としてはおそらく少しシンプルだと思いますが、楽しかったし、将来の自分にメモを残しても気にならないことを願っています。

使い方

基本的に、ASCIIピクセルグリッド上のLOGOのような「カメの描画」をシミュレートしますが、カメは次の3つのコマンドしか実行できません。

rt   - right turn, turn 120 degrees right (1/3 of a Turn)
rth  - right turn half, turn  60 degrees right (1/6 of a Turn)
fd n - forward, go forward n steps, drawing a trail of _, /, or \

ここで、各三角形について、次のようにします。ここで、Pはn番目のパドバン数の2倍です。

fd P
rt
fd P
rt 
fd P
rt
fd P
rth

4番目の「fd」は、各三角形の最初の辺を再トレースしていることを意味します。これは、次の三角形の出発点に戻るのに役立ちます。右半分に曲がると、次の三角形が正しい向きになります。


カメをゴルフするために、5つの状態変数を状態arrayに保存します:x位置、y位置、x速度、y速度、および「描画ルーン」。各アニメーションフレームで、x + = x速度、y + = y速度、およびルーンが描画されます。

次に、実際にターンを実行する方法を示すテーブルTableを設定しました。ASCIIアートの動作方法のため、ターンコードは扱いにくいものです。ピクセルディスプレイのような単純な動きではありません。xとyの速度によって決定される亀の方向は、ターンが適切に見えるようにするために必要な変化を決定します。

回転するには、現在のxおよびy速度を調べ、それらをインデックスに結合します。

xv = x velocity, yv = y velocity. 
i.e. a turtle facing down and to the right has 
xv of 1, and yv of 1. It can only face 6 
different directions. Formula is (xv+1)*2+yv+1

xv  yv    index
-1  -1    0
-1   0    1
-1   1    2
 1  -1    4
 1   0    5
 1   1    6

このインデックスは、テーブルテーブルの5つの値のセットを検索するために使用されます。次に、テーブルテーブルのこれら5つの値は、状態STATUSの5つの変数のそれぞれに追加されます。その後、亀は効果的に向きを変えられ、次の「fd」の準備が整います。

rth(右折の半分)には、テーブルテーブルの別のセクションがあります。これは、表の最初のテーブルから7 * 5または35エントリだけオフセットされます。

最後に、テーブルの整数をASCII文字列に簡単にエンコードしました。

Hanziを削除することで「バイトを節約」できることはわかっていますが、先ほど言ったように、これは最適ではなく、ゴルフも可能です...他に最適化できない場合は削除します。それらの漢字は、実際の意味に基づいて実際には大まかに意味を持ち、中国語はわかりませんが、プログラムについて考えるのに役立ちます。

数  index number
宽  screen width
素  pixel data
梴  length of side of triangle
态  current state
址  address of pixel
表  state transition table

コードをテストするには、このヘッダーを持つ完全なgolangファイルが必要です。

package main
import "fmt"

このフッター

func main ()  {
    for i := 0; i<15; i++ {
       卷(i)
    }
}

ありがとう

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