Koch Snowflake-codegolf


21

コッホ曲線(もコッホスターとコッホの島として知られている)は、数学的な曲線と記載されているために最も初期のフラクタル曲線の一つです。これは、1904年の「接線のない連続曲線上で、基本幾何学から構築可能な」というタイトルのコッホ曲線に基づいています(元のフランスのタイトル:スウェーデンの数学者ヘルゲ・フォン・コッホ。

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

さまざまな反復のASCII表現を次に示します。

n=1
__
\/

n=2
__/\__
\    /
/_  _\
  \/

n=3
      __/\__
      \    /
__/\__/    \__/\__
\                /
/_              _\
  \            /
__/            \__
\                /
/_  __      __  _\
  \/  \    /  \/
      /_  _\
        \/ 

アスキー表現の解像度には明らかに制限があるため、余分な詳細を表示するには、反復ごとにスノーフレークのサイズを3倍に拡大する必要があります。

n = 4の場合と同じスタイルでスノーフレークを出力する最短のコードを記述します

プログラムは何も入力しないでください。
プログラムはスノーフレークをコンソールに書き込む必要があります。


Koch-snowflake ..aタグ..おもしろい.. !! ..このタグでさらに質問をするようです:)
アマンZeeK Verma

5
答えが短すぎます: wolframalpha.com/input/?i=koch+snowflake+4:D
Dr. belisarius

1
受け入れられた回答を変更する必要がありますか?現在、より短いソリューションがあります。
ティムウィ

回答:


2

Python、338バイト

#coding:u8
print u"碜䄎쀠ࢻ﬊翀蝈⼖㗎芰悼컃뚔㓖ᅢ鄒鱖渟犎윽邃淁挢㇌ꎸ⛏偾࿵헝疇颲㬤箁鴩沬饅앎↳\ufaa4軵몳퍋韎巃๧瓠깡未늳蒤ꕴ⁵ᦸ䥝両䣚蟆鼺伍匧䄂앢哪⡈⁙ತ乸ሣ暥ฦꋟ㞨ޯ⿾庾뻛జ⻏燀䲞鷗﫿".encode("utf-16be").decode("zlib")

別のユニコードエクスプロイト

イデオン走る


5
十分ですが、確かにソースファイルの長さは300バイトを超えます。
ティムウィ

リンクが壊れています
Chiel ten Brinke

10

Pythonの、650の 612 594 574文字

n='\n'
S='_a/G\F I\n'
A=dict(zip(S,('III','   ','__/','  G','\  ','F__','   ','III','')))
B=dict(zip(S,('III','   ','\  ',' aF','/a ','  G','   ','III','')))
C=dict(zip(S,('___','aaa','/  ','GII','II\\','  F','   ','III','')))
def T(s):
 a=b=c=d=r=u''
 for k in s:
    a+=A[k];b+=B[k];c+=C[k]
    if k=='I':a=a[:-3]+('II\\'if'a '==d[1:3]else'GII'if' a'==d[:2]else 3*k)
    d=d[3:]
    if k==n:d=c.replace('____','__/F').replace('aaaa','aa  ').replace('/  a','/a  ').replace('a  F','  aF');r+=a+n+b+n+d+n;a=b=c=''
 return r
print T(T(T('__\n\G\n'))).translate({97:95,71:47,73:32,70:92})

これは、毎回3倍に三角形を拡大することで機能します。そのためには、各シンボルが左または右の境界であるかどうかを追跡する必要があります(たとえば、どのよう/に展開されるかは、どちらの側が/内側かによって異なります)。次のように、考えられる2つのケースに異なるシンボルを使用します。

_: _, outside on the top
a: _, outside on the bottom
/: /, outside on the left
G: /, outside on the right
\: \, outside on the left
F: \, outside on the right
<space>: inside
I: outside

d可変ハンドルの拡張特殊ケースaニーズは次の行の3×3に拡張します。


ボード上の最初の回答を得るための+1。forループ内でダブルスペースをタブに置き換えることができると思います。また、K == "A"などの代わりにif k <"C"を使用してみてください。今、私はあなたのアルゴリズムを詳しく調べなければなりません:)
ニブラー

連想配列を持つ多数のifステートメントを削除できませんか?また、連鎖置換ステートメントは配列で短縮できます。
ナブ

('acEei',r'_/\\ ')=> ('aecEi','_\/\ ')さらに1つ節約できます。をチェックアウトすることもできunicode.translate()ます。
ニブラー

また、これは雪の結晶の前に約18改行を出力しますが、私はOPは何かどうかを指定しませんでしたと仮定し、他の雪片よりは、印刷することができます。
11

6

MS-DOS 16ビットマシンコード:199バイト

このサイトを使用してデコードし、「koch.com」ファイルとして保存し、WinXPコマンドプロンプトから実行します。

sCAAxo7ajsKLz/OquF9fulwvvUoBM9u+BADoiQDodgDocwDogADobQDoagDodwCK8TLSs0+I98cHDQrGRwIktAnNIf7GOO5+7MNWAVwBYwFsAXoBgwGJB4DDAsOIN/7D6QQA/suIF/7P6R0A/suAPyB1AogH/suIB8OBw/8AiDfpBgD+x4gX/sM4734Ciu84z30Cis/Dg8UIg8UCgf1WAXLzg+0Mw07/dgB0GV/o9v/o5v/o8P/o3f/o2v/o5//o1//o4f9Gww==

更新

読みやすいアセンブラバージョンを次に示します。

  ; L-System Description
  ;
  ; Alphabet : F
  ; Constants : +, -
  ; Axiom : F++F++F
  ; Production rules: F -> F-F++F-F 
  ;
  ; Register usage:
  ;                             _        _
  ; bp = direction: 0 = ->, 1 = /|, 2 = |\, 3 = <-, 4 = |/_, 5 = _\|
  ; cl = min y, ch = max y
  ; bl = x (unsigned)
  ; bh = y (signed)
  ; si = max level

  ; clear data
  mov al,20h
  add dh,al
  mov ds,dx
  mov es,dx
  mov cx,di
  rep stosb
  mov ax,'__'
  mov dx,'/\'

  ; initialise variables
  mov bp,Direction0
  xor bx,bx
  mov si,4

  call MoveForward
  call TurnRight
  call TurnRight
  call MoveForward
  call TurnRight
  call TurnRight
  call MoveForward

  mov dh,cl
  xor dl,dl
  mov bl,79
OutputLoop:
  mov bh,dh
  mov w [bx],0a0dh
  mov b [bx+2],24h
  mov ah,9
  int 21h
  inc dh
  cmp dh,ch
  jle OutputLoop  
  ret

Direction0:
  dw MoveRight
  dw MoveUpRight
  dw MoveUpLeft
  dw MoveLeft
  dw MoveDownLeft
  dw MoveDownRight
Direction6:

MoveRight:
  mov w [bx],ax
  add bl,2
  ret

MoveUpRight:
  mov b [bx],dh
  inc bl
  jmp DecBHCheckY

MoveUpLeft:
  dec bl
  mov b [bx],dl
DecBHCheckY:  
  dec bh
  jmp CheckY

MoveLeft:
  dec bl  
  cmp b [bx],20h
  jne MoveLeftAgain
  mov [bx],al
MoveLeftAgain:
  dec bl  
  mov [bx],al
  ret

MoveDownLeft:
  add bx,255
  mov b [bx],dh
  jmp CheckY

MoveDownRight:
  inc bh
  mov b [bx],dl
  inc bl

CheckY:
  cmp bh,ch
  jle NoMaxChange
  mov ch,bh
NoMaxChange:  
  cmp bh,cl
  jge NoMinChange
  mov cl,bh
NoMinChange:  
  ret

TurnRight:
  add bp,8

TurnLeft:
  add bp,2

  cmp bp,Direction6
  jb ret
  sub bp,12
  ret

MoveForward:
  dec si
  push [bp]
  jz DontRecurse
  pop di
  call MoveForward
  call TurnLeft
  call MoveForward
  call TurnRight
  call TurnRight
  call MoveForward
  call TurnLeft
  call MoveForward
DontRecurse:
  inc si
  ret

絶対的な魔法:)、これを理解するのを手伝ってください(少なくともあなたがしたことのリンクを提供してください)
アマンZeeK Verma

@Aman:コッホ曲線のLシステム記述を使用して出力を描画します。詳細レベルはSIレジスタで設定されますが、サイズは1行あたり252文字に制限されています。79文字より長い行を取得するには、印刷コードを変更する必要があります(つまり、「\ n $」文字を書き込む場所を変更します)。
スキズ

"scAA...w==".decode("base64")Python2でのデコードにも使用できます(Python3では機能しません)
ニブラー

+1を実行するWindowsマシンがあります。asmバージョンを含めることができますか?
ニブラー

2
@mellamokb:エラー、おそらくすべてのソースコードが利用可能だからですか?
スキズ

4

Perl、176 175バイト

バイナリソースファイルを使用しているため、これを別の回答として投稿します。しかし、それがまだPerl ソースコードであることを考えると、MS-DOS マシンコードをしのぐことは驚くべきことだと思います。ソリューションに!

base64エンコードされたソース

JF89IsLApwag0dhnMmAmMEcGIAcGQNHYwsDRFLsQ0djCwKcGoNHYwsDRFDdbECYwcRUxe1DCwNEUuxDR2
CI7c14uXiR4PW9yZCQmOyQieCgkeD4+MykucXcoXCAvXyBfXy8gXC8gX18gX1wgLyBfXy9cX18pWyR4Jj
ddXmVnO3NeLnsyN31eJF89cmV2ZXJzZSQmO3l+L1xcflxcL347cHJpbnQkJi4kXy4kL15lZw==

やや読みやすい

のすべてのインスタンスを/<[0-9a-f]+>/関連するバイナリデータに置き換えます。

# Raw data!
$_="<c2c0a706a0d1d86732602630470620070640d1d8c2c0d114bb10d1d8c2>".
   "<c0a706a0d1d8c2c0d114375b1026307115317b50c2c0d114bb10d1d8>";

# Decode left half of the snowflake (without newlines)
s^.^$x=ord$&;$"x($x>>3).qw(\ /_ __/ \/ __ _\ / __/\__)[$x&7]^eg;

# Reconstruct the right half and the newlines
s^.{27}^$_=reverse$&;y~/\\~\\/~;print$&.$_.$/^eg

このバージョンでは、スノーフレークは次の方法でエンコードされます。

  • 各バイトの8ビットは次のように分割されます。

    +---+---+---+---+---+---+---+---+
    |      5 bits       |   3 bits  |
    +---+---+---+---+---+---+---+---+
              R               C
    
  • R一連のスペースをエンコードします。最長の実行は27文字なので、すべての実行は5ビットに収まります。

  • Cリテラル配列で単純に検索される一連の文字をエンコードします。(私はここに配列が含まれているだけで少しクレイジーなエンコーディングを使用していました/ \ _が、デコードに必要なPerlコードは長くなりました...)

  • バイナリデータに"/ が含まれていないことは幸運です'\、またはエスケープが必要です。私はこれを計画していませんでした。しかし、たとえそれが行われたとしても、配列内の項目の順序を変更して修正することもできたでしょう。

  • このソリューションが、私がこれを思い付く前に経験した他の数十のソリューションと比較してどれほど簡単かは驚くべきことです。私はこれよりも多くの異なるビット単位のエンコードを実験しましたが、単純なものはそれをデコードするPerlコードが短くなるという理由だけで価値があるとは思いもしませんでした。また、変数補間を使用してデータ内の繰り返しを圧縮しようとしました(他の回答を参照)が、文字を取得しない最新バージョンを使用しました。


3

Python、284

for s in "eJyVkNENACEIQ/+dgg1YiIT9tzgENRyWXM4/pH1tIMJPlUezIiGwMoNgE5SzQvzRBq52Ebce6cr0aefbt7NjHeNEzC9OAalADh0V3gK35QWPeiXIFHKH8seFfh1zlQB6bjxXIeB9ACWRVwo=".decode('base64').decode('zlib').split('\n'):print s+'  '*(27-len(s))+'\\'.join([c.replace('\\','/')for c in s[::-1].split('/')])

もう少し空白がある場合:

for s in "eJyVkNENACEIQ/+dgg1YiIT9tzgENRyWXM4/pH1tIMJPlUezIiGwMoNgE5SzQvzRBq52Ebce6cr0aefbt7NjHeNEzC9OAalADh0V3gK35QWPeiXIFHKH8seFfh1zlQB6bjxXIeB9ACWRVwo=".decode('base64').decode('zlib').split('\n'):
  print s + '  '*(27-len(s)) + '\\'.join([c.replace('\\','/') for c in s[::-1].split('/')])

左側は圧縮されています。右側は左側から再現されます。


3

Perl、224 223文字

use MIME::Base64;$_=decode_base64 wsCnBqDR2GcyYCYwRwYgBwZA0djCwNEUuxDR2MLApwag0djCwNEUN1sQJjBxFTF7UMLA0RS7ENHY;s^.^$x=ord$&;$"x($x>>3).qw(\ /_ __/ \/ __ _\ / __/\__)[$x&7]^eg;s^.{27}^$_=reverse$&;y~/\\~\\/~;print$&.$_.$/^eg

やや読みやすい

use MIME::Base64;

# raw binary data in base-64-encoded form as a bareword
$_=decode_base64
    wsCnBqDR2GcyYCYwRwYgBwZA0djCwNEUuxDR2MLApwag0djCwNEUN1sQJjBxFTF7UMLA0RS7ENHY;

# Decode left half of the snowflake (without newlines)
s^.^$x=ord$&;$"x($x>>3).qw(\ /_ __/ \/ __ _\ / __/\__)[$x&7]^eg;

# Reconstruct the right half and the newlines
s^.{27}^$_=reverse$&;y~/\\~\\/~;print$&.$_.$/^eg

使い方

それがどのように機能するかの説明については、バイナリで同じを投稿する他の回答を参照してください。私が実際に生成していないことは本当に残念ですKochスノーフレークをせ、圧縮するだけで ...

以前のバージョン

  • (359)左半分だけではなく、スノーフレーク全体をエンコードしました。ビットエンコードにはスペースが含まれていました。ランレングスはまだありません。いくつかの補間変数と、@_を使用してアクセスされる配列を使用しましたs/\d/$_[$&]/eg。改行はとしてエンコードされました!

  • (289)スノーフレークの左半分のみをエンコードした最初のバージョン。

  • (267)スペースにランレングスエンコーディングを使用した最初のバージョン。

  • (266)に変更' '$"ます。

  • (224) base-64としてエンコードされた根本的に異なる圧縮。(現在はバイナリバージョンと同等です。)

  • (223)最後のサブステーション内に印刷を配置して、セミコロンを保存できることを認識しました。

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