科赫雪花-Codegolf


21

Koch雪花(也被称为科赫星和科克岛)是数学曲线,并已经描述了最早的分形曲线中的一个。它基于Koch曲线,该曲线出现在1904年的一篇论文中,该论文的标题为“在无切线的连续曲线上,可以从基本几何构造而成”(法文原版标题:“ Sur une courbecontinu sans tangente,旁观的建筑学意义”)瑞典数学家Helge von Koch。

在此处输入图片说明

以下是各种迭代的一些ascii表示形式:

n=1
__
\/

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

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

由于ASCII表示的分辨率显然存在限制,因此对于每次迭代,我们必须将雪花的大小放大3倍,以显示更多细节。

编写最短的代码以相同的样式输出雪花,其中n = 4

您的程序不应接受任何输入。
您的程序应将雪花写入控制台。


Koch-snowflake ..a标签..有趣的是.. !! ..看来您会在这个标签上提出更多的问题:)
Aman ZeeK Verma 2011年


1
是否应该更改接受的答案?现在有更短的解决方案。
Timwi,时间

Answers:


2

Python,338字节

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

只是另一个Unicode漏洞利用

ideone上跑


5
足够公平,但是可以肯定会使源文件超过300个字节。
Timwi

链接已断开
Chiel十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倍来实现的。为此,我们需要跟踪每个符号是左边界还是右边界(例如,如何/扩展取决于其/内部是哪一侧)。对于两种可能的情况,我们使用不同的符号,如下所示:

_: _, 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需求的扩展需要扩展到下一行的3x3中。


+1获取第一个答案。我认为您可以在for循环中使用制表符替换双精度空格。也可以尝试使用k <“ C”代替K ==“ A”等。现在,我将不得不仔细看一下您的算法:)
gnibbler 2011年

您不能删除具有关联数组的许多if语句吗?也许可以使用数组缩短链接的replace语句。
Nabb 2011年

('acEei',r'_/\\ ')=>再('aecEi','_\/\ ')节省1个。您可能还需要检查unicode.translate()
gnibbler 2011年

这也打印有关的雪花之前18个换行,但我想的任择议定书没有指定任何是否其他比雪花可以打印。
2011年

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

废话:),请帮助我理解这一点(至少提供您所做的链接)
Aman ZeeK Verma 2011年

@Aman:它使用Koch曲线的L系统描述来绘制输出。尽管大小限制为每行252个字符,但在SI寄存器中设置了详细程度。您需要修改打印代码,以使行的长度超过79个字符(即更改其写入'\ n $'字符的位置)。
Skizz

还可用于"scAA...w==".decode("base64")在Python2中解码(不适用于Python3)
gnibbler

+1,因为我现在可以在Windows机器上运行它了。您是否可以包括asm版本?
gnibbler 2011年

2
@mellamokb:错误,因为所有源代码都是可用的?
Skizz

4

Perl,176175字节

将其作为单独的答案发布,因为它使用了二进制源文件,这也许有点作弊。但是考虑到它仍然是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

怎么运行的

有关其工作原理的解释,请参见另一个答案,其中我将其发布为binary。我真的很抱歉,我没有实际产生的Koch雪花,只是压缩它...

之前的版本

  • (359)对整个雪花进行编码,而不仅仅是左半部分。位编码中包含空格;没有游程长度。使用了多个插值变量以及@_使用进行访问的数组s/\d/$_[$&]/eg。换行符编码为!

  • (289)第一个版本,仅对雪花的左半部分进行编码。

  • (267)对空格使用游程长度编码的第一个版本。

  • (266)更改' '$"

  • (224)完全不同的压缩,编码为base-64。(现在等效于二进制版本。)

  • (223)意识到我可以将打印内容放在最后一个替代中,从而节省了分号。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.