ペアノ曲線を描く


13

前書き

幾何学において、ペアノ曲線は、1890年にジュゼッペペアノによって発見された空間充填曲線の最初の例です。ペアノ曲線は、単位間隔から単位正方形への単射的で連続的な関数ですが、単射ではありません。ペアノは、これら2つのセットのカーディナリティが同じであるという以前のGeorg Cantorの結果に動機付けられました。この例のため、一部の著者は、「Peano curve」というフレーズを使用して、より一般的に任意の空間充填曲線を指します。

チャレンジ

プログラムは、整数nである入力を受け取り、nこの画像の左端に示されている横2から始まるペアノ曲線の3番目の反復を表す図面を出力します。 ペアノ曲線の3つの反復

入力

nペアノ曲線の反復数を示す整数。オプションで、追加の入力はボーナスのセクションで説明されています。

出力

nペアノ曲線の3番目の反復の図。描画は、ASCIIアートまたは「実際の」描画のどちらでも、最も簡単なものと最も短いもののどちらでもかまいません。

ルール

  • 入力および出力は、任意の便利な形式で指定できます(言語/ソリューションに最適な形式を選択してください)。
  • 負の値や無効な入力を処理する必要はありません
  • 完全なプログラムまたは機能のいずれかが受け入れられます。
  • 可能であれば、他の人があなたのコードを試すことができるように、オンラインテスト環境へのリンクを含めてください!
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

ボーナス

これは公園を散歩するべきではないので(少なくとも私が考えることのできるほとんどの言語では)、以下に対してボーナスポイントが与えられます。

  • コードがPeanoカーブの構築のgifを生成する場合、-100バイトまでn
  • コードが任意の長方形の形状に対してスペースを埋める曲線を描く場合、-100バイト(明らかにPeano曲線は正方形に対してのみ機能します)。あなたは、入力が、フォームを取ることを前提とすることができます(反復の数)前と同じ意味を持っていますが、どこと曲線を描画する矩形の長さと幅になります。の場合、これは通常のペアノ曲線になります。n l wnlwl == w

負のスコアは許可されます(ただし、可能です...)。

編集

のソリューションにプログラムの出力を含めてくださいn == 3 (l == w == 1)


1
PPCGへようこそ:)これは、一見したところ、素敵な最初の挑戦のように見えます。馴染みがあるように感じますが、私が考えている課題はASCIIアートの課題だったと思います。ただし、ボーナスは強くお勧めしません。100バイト未満でこれを達成できるゴルフ言語があることに注意してください。また、そして最も重要なことには、勝利の基準が必要です。ボーナスがソリューションのスコアからバイトを引くことを考えると、これはcode-golfであると思われると思います。
シャギー

4
ええ、私はボーナスが特にそこから、良いアイデアとは思わない、少なくとも 2アニメーション可能なアスキーアートがgolflangs重視
ASCIIのみの

2
ああ、また何を考えnている場合に使用することlwしているにも入力??????????? そして、ペアノ曲線は特殊なケースだろう-いくつかのアルゴリズムがそれをspecialcaseする必要がありますので、それは、唯一の空間充填曲線ではありません
ASCIIのみ

2
また、非正方形の寸法に対して誰もが些細な空間充填曲線を作成するのを妨げる(前後にジグザグに移動する)
ASCIIのみ

7
コードゴルフのボーナスは、チャレンジを書くときに避けるべき最も合意されたものの1つです。それらを削除し、どちらがチャレンジの標準バージョンになるかを決定することをお勧めします。
リルトシアスト

回答:


6

Mathematica、スコア60-100-100 = -140

Graphics[PeanoCurve@a~Reverse~3~Scale~#2]~Animate~{a,1,#,1}&

純粋な機能。入力としてnand {l, w}(幅と高さ)を取り、出力としてアニメーショングラフィックを提供します。最初にn次のペアノ曲線を作成しPeanoCurveます。以来、L = Wの場合は、まだ我々が同様のレベル3での発現を反転、ペアノ曲線を作成する必要がDavidCの答え。用Lwを、私たちはただScaleの長方形にカーブ。この曲線はまだスペースがいっぱいで、2番目のボーナスを満たします。最初のボーナスについては、Animateすべてのサイズでそれだけです。OPは、これがDavidCのそれと十分に異なり、独自の答えを保証することを示唆したことに注意してください。n = 3、l = wの結果 = 1は次のとおりです。


非常に素晴らしい!(正しい向きでも)
DavidC

13

GFA Basic 3.51(Atari ST)、156 134 124バイト

.LST形式の手動で編集されたリスト。最後の行CRを含め、すべての行はで終わります。

PRO f(n)
DR "MA0,199"
p(n,90)
RET
PRO p(n,a)
I n
n=n-.5
DR "RT",a
p(n,-a)
DR "FD4"
p(n,a)
DR "FD4"
p(n,-a)
DR "LT",a
EN
RET

展開およびコメント

PROCEDURE f(n)      ! main procedure, taking the number 'n' of iterations
  DRAW "MA0,199"    !   move the pen to absolute position (0, 199)
  p(n,90)           !   initial call to 'p' with 'a' = +90
RETURN              ! end of procedure
PROCEDURE p(n,a)    ! recursive procedure taking 'n' and the angle 'a'
  IF n              !   if 'n' is not equal to 0:
    n=n-0.5         !     subtract 0.5 from 'n'
    DRAW "RT",a     !     right turn of 'a' degrees
    p(n,-a)         !     recursive call with '-a'
    DRAW "FD4"      !     move the pen 4 pixels forward
    p(n,a)          !     recursive call with 'a'
    DRAW "FD4"      !     move the pen 4 pixels forward
    p(n,-a)         !     recursive call with '-a'
    DRAW "LT",a     !     left turn of 'a' degrees
  ENDIF             !   end
RETURN              ! end of procedure

出力例

ペアノgfa


10

Perl 6、117バイト

{map ->\y{|map {(((++$+y)%2+$++)%3**(y+$^v,*/3...*%3)??$^s[$++%2]!!'│')xx$_*3},<┌ ┐>,$_,<└ ┘>,1},^$_}o*R**3

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

0インデックス付き。Unicode文字の2D配列を返します。基本的な考え方は、下の行の場合、式

(x + (x+y)%2) % (3 ** trailing_zeros_in_base3(3*(y+1)))

パターンを生成します

|....||....||....||....||..  % 3
..||....||....||....||....|  % 3
|................||........  % 9
..||....||....||....||....|  % 3
|....||....||....||....||..  % 3
........||................|  % 9
|....||....||....||....||..  % 3
..||....||....||....||....|  % 3
|..........................  % 27

上の行の場合、式は

(x + (x+y+1)%2) % (3 ** trailing_zeros_in_base3(3*(y+3**n)))

説明

{ ... }o*R**3  # Feed $_ = 3^n into block

map ->\y{ ... },^$_  # Map y = 0..3^n-1

|map { ... },<┌ ┐>,$_,<└ ┘>,1  # Map pairs (('┌','┐'),3^n) for upper rows
                               # and (('└','┘'),1) for lower rows.
                               # Block takes items as s and v

( ... )xx$_*3  # Evaluate 3^(n+1) times, returning a list

 (++$+y)%2  # (x+y+1)%2 for upper rows, (x+y)%2 for lower rows
(         +$++)  # Add x
                   (y+$^v,*/3...*%3)  # Count trailing zeros of 3*(y+v) in base 3
                3**  # nth power of 3
               %  # Modulo
??$^s[$++%2]  # If there's a remainder yield chars in s alternately
!!'│'         # otherwise yield '│'

6

K(ngn / k)37 27 26バイト

{+y,(|'y:x,,~>+x),x}/1,&2*

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

ブール行列を返します

|'yngn / k固有の構文です。他の方言では:、それぞれの動詞を単項にする必要があります。|:'y


1
出力をより美しくするために、(ブラウザでサポートされている場合)すべての発生を強調表示します
user202729

3
@ user202729行わ-フッタにそれがバイト数には影響しませんので、
NGN

5

Wolfram言語83 36バイト、(おそらくボーナスで-48バイト)

バージョン11.1ではPeanoCurve、ビルトインです。

私の元々の不器用な提出は、多くのバイトを無駄にしGeometricTransformationReflectionTransform.

この大幅に削減されたバージョンは、alephalphaによって提案されましたReverse出力を適切に方向付けるために必要でした。

Graphics[Reverse/@#&/@PeanoCurve@#]&

例36バイト

Graphics[Reverse/@#&/@PeanoCurve@#]&[3]

ペアノ曲線


ボーナス

これが100 ptのボーナスの対象となる場合、52-100 = -48になります。コード[5]はカウントされず、純粋な関数のみがカウントされました。

Table[Graphics[Reverse/@#&/@PeanoCurve@#]&@k{k,#}&[5]

シーケンス


Graphics[Reverse/@#&/@PeanoCurve@#]&
alephalpha

ペアノ曲線を単独で計算する関数を持っているのはごまかしのように感じますが、それでもかなり印象的なので、受け入れられた答えとしてそれを取り上げます;)。@ LegionMammal978私はあなたがあなた自身の答えを投稿するに値すると思います、私はそれが勝利の答えとしてそれを受け入れることを保証するのに十分異なると主張します。
Peiffap


4

HTML + SVG + JS、224 213バイト

出力は水平にミラーリングされます。

n=>document.write(`<svg width=${w=3**n*9} height=${w}><path d="M1 ${(p=(n,z)=>n--&&(p(n,-z,a(a(p(n,-z,d+=z)),p(n,z))),d-=z))(n*2,r=d=x=y=1,a=_=>r+=`L${x+=~-(d&=3)%2*9} ${y+=(2-d)%2*9}`)&&r}"fill=#fff stroke=red>`)

オンラインでお試しください!(HTMLを印刷)


3

ロゴ、89バイト

to p:n:a
if:n>0[rt:a
p:n-1 0-:a
fw 5
p:n-1:a
fw 5
p:n-1 0-:a
lt:a]end
to f:n
p:n*2 90
end

@ArnauldのAtari BASIC回答のポート。使用するには、次のようにします

reset
f 3

3

スタックス、19 バイト

∩▐j>♣←╙~◘∩╗╢\a╘─Ràô

実行してデバッグする

3の出力:

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