코흐 눈송이-CodeGolf


21

코크 곡선 (도 코흐 스타 코흐 섬라고도 함) 수학적 곡선 초기 프랙탈 곡선 중 하나를 설명하는 것이다. 이 책은 1904 년 논문에서 "탄젠트가없는 연속 곡선에서 기초 기하학으로 구성 가능"(원본 프랑스 제목 : "Sur une courbe 계속 sans tangente, obtenue par une construction géométrique élémentaire")이라는 제목의 Koch 곡선을 기반으로합니다. 스웨덴의 수학자 Helge von Koch.

여기에 이미지 설명을 입력하십시오

다음은 다양한 반복에 대한 ASCII 표현입니다.

n=1
__
\/

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

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

아스키 표현의 해상도에는 분명히 제한이 있기 때문에 추가 세부 사항을 표시하려면 각 반복마다 눈송이의 크기를 3 배로 확대해야합니다.

n = 4에 대해 같은 스타일로 눈송이를 출력하는 가장 짧은 코드 작성

당신의 프로그램은 어떤 입력도받지 않아야합니다.
프로그램은 눈송이를 콘솔에 작성해야합니다.


.. 그게 전부 흥미를 ..a 태그를 코흐 - 눈송이 .. !! .. 당신이 :)이 태그에 대한 질문에 발사 될 것 같다
아만 ZeeK 베르을

5
대답이 너무 짧습니다 : wolframalpha.com/input/?i=koch+snowflake+4 : D
Dr. belisarius

1
수락 된 답변을 변경해야합니까? 더 짧은 솔루션이 있습니다.
Timwi

답변:


2

파이썬, 338 바이트

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

또 다른 유니 코드 악용

이데온 에서 달리다


5
충분히 공평하지만 소스 파일의 길이는 300 바이트 이상이되어야합니다.
Timwi

링크가 끊어짐
Chiel ten Brinke

10

파이썬, 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요구가 다음 행 × 3으로 연장한다.


보드에서 첫 번째 답변을 얻는 +1. 이중 공간을 for 루프의 탭으로 바꿀 수 있다고 생각합니다. 또한 K == "A"대신 k < "C"if를 사용해보십시오. 이제 알고리즘을 자세히 살펴 봐야합니다. :)
gnibbler

연관 배열이있는 많은 if 문을 제거 할 수 없습니까? 또한 체인으로 대체 된 문을 배열로 단축 할 수 있습니다.
Nabb

('acEei',r'_/\\ ')=> ('aecEi','_\/\ ')는 1을 더 절약합니다. 를 확인하고 싶을 수도 있습니다 unicode.translate().
gnibbler

이것은 눈송이 앞에 약 18 줄 바꿈을 인쇄하지만 OP가 눈송이 이외의 다른 것을 인쇄 할지 여부를 지정하지 않았다고 가정합니다 .
RomanSt

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

Abolute 마법 :), 나 (이상이어야 당신이 무슨 짓을했는지에 대한 링크를 제공)이 이해를 도와주세요
아만 ZeeK 베르

@Aman : Koch 곡선의 L- 시스템 설명을 사용하여 출력을 그립니다. 크기는 한 줄에 252 자로 제한되지만 세부 수준은 SI 레지스터에서 설정됩니다. 인쇄 문자를 수정하여 79 자보다 긴 행을 가져와야합니다 (예 : '\ n $'문자를 쓰는 위치를 변경).
Skizz

또한 "scAA...w==".decode("base64")Python2에서 디코딩 하는 데 사용할 수 있습니다 (Python3에서는 작동하지 않음)
gnibbler

+1 이제 Windows 컴퓨터를 실행할 수 있습니다. asm 버전을 포함시킬 수 있습니까?
gnibbler

2
@mellamokb : 오류가 발생했습니다. 모든 소스 코드를 사용할 수 있습니까?
Skizz

4

펄, 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

파이썬, 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

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.