피아노 커브 그리기


13

소개

형상에서 Peano 곡선 은 1890 년 Giuseppe Peano에 의해 발견 된 공간 채우기 곡선의 첫 번째 예입니다. Peano의 곡선은 단위 간격에서 단위 사각형까지의 연속적이고 연속적인 함수이지만 주입되지는 않습니다. Peano는 Georg Cantor의 초기 결과에 의해이 두 세트가 동일한 카디널리티를 갖도록 동기를 부여했습니다. 이 예제로 인해 일부 저자는 "Peano curve"라는 구를 사용하여 공간 채우기 곡선을보다 일반적으로 나타냅니다.

도전

프로그램은 정수 n인 입력을 가져 n와서이 이미지의 가장 왼쪽 부분에 표시된 측면 2에서 시작하여 Peano 곡선의 반복을 나타내는 그림을 출력합니다 . Peano 곡선의 세 가지 반복

입력

nPeano 곡선의 반복 횟수를 나타내는 정수 입니다. 선택적인 추가 정보는 보너스 섹션에 설명되어 있습니다.

산출

nPeano 곡선의 반복 그림 . 드로잉은 ASCII 아트이거나 "실제"드로잉 중 가장 쉬운 방법이거나 가장 짧은 방법 일 수 있습니다.

규칙

  • 입력 및 출력은 편리한 형식으로 제공 될 수 있습니다 (언어 / 솔루션에 가장 적합한 형식을 선택하십시오).
  • 음수 값 또는 유효하지 않은 입력 을 처리 할 필요가 없습니다.
  • 전체 프로그램 또는 기능이 허용됩니다.
  • 가능하면 다른 사람들이 귀하의 코드를 시험해 볼 수 있도록 온라인 테스트 환경에 대한 링크를 포함하십시오!
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

보너스

이것은 공원에서 산책해서는 안되기 때문에 (적어도 내가 생각할 수있는 대부분의 언어로) 다음과 같은 경우 보너스 포인트가 부여됩니다.

  • 코드가에 페 아노 곡선의 건설의 GIF를 생성하는 경우 -100 바이트 n.
  • 코드가 직사각형 모양에 대해 공간 채우기 곡선을 그리는 경우 -100 바이트 (피노 곡선은 정사각형에 대해서만 작동 함). 사용자 입력은 다음 형태를 취한다고 가정 수 (반복 수) 이전과 동일한 의미를 가지고 있지만, 여기서 및 곡선을 그릴에 직사각형의 길이 및 폭이된다. 인 경우 일반 Peano 곡선이됩니다.n l wnlwl == w

음수 점수가 허용됩니다 (그러나 가능합니다 ...).

편집하다

에 대한 솔루션에 프로그램 출력을 포함하십시오 n == 3 (l == w == 1).


1
PPCG에 오신 것을 환영합니다 :) 한 눈에보기에는 좋은 첫 번째 도전처럼 보입니다. 익숙한 느낌이 들지만, 제가 생각하는 도전은 ASCII 기술이라고 생각합니다. 그러나 보너스를 강력히 권장하지 않으며 100 바이트 미만으로이를 달성 할 수있는 골프 언어가있을 것입니다. 또한 가장 중요한 것은 승리 기준이 필요합니다. 보너스가 솔루션의 점수에서 바이트를 뺀 것을 감안할 때 이것이 code-golf 일 것 입니다.
Shaggy

4
네, 보너스가 특히 이후, 좋은 아이디어 생각하지 않는다 적어도 두 개의 애니메이션 가능한 ASCII-예술 golflangs 집중
ASCII 전용

2
오, 또한 무엇을 할 n경우에 사용 l하고 w있습니다 또한 입력 ??????????? Peano 곡선은 특별한 경우가 될 것입니다. 이것은 유일한 공간 채우기 곡선이 아니기 때문에 일부 알고리즘은 그것을 특수화해야 할 수도 있습니다
ASCII 전용

2
또한 정사각형이 아닌 치수에 대해 사소한 공간 채우기 곡선 (지그재그 만 앞뒤로)을 만들지 못하게하는 요소
ASCII 전용

7
코드 골프 보너스는 도전 과제를 작성할 때 피해야 할 가장 합의 된 것 중 하나입니다. 난 당신이 그들을 제거하고 도전의 정식 버전이 될 결정하는 것이 좋습니다.
lirtosiast

답변:


6

Mathematica, 점수 60-100-100 = -140

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

순수한 기능. 취 n{l, w}입력으로 (폭 및 높이) 및 출력 등의 그래픽 애니메이션을 제공한다. 먼저로 n 차 Peano 곡선을 만듭니다 PeanoCurve. 때문에 L이 = 경우 여전히 페 아노 곡선을 만들어야 우리는 레벨 3에서 발현 플립 유사한 DavidC의 답변 ; 대한 Lw , 우리가 Scale사각형에 곡선. 이 곡선은 여전히 ​​공간을 채우며 두 번째 보너스를 만족시킵니다. 첫 번째 보너스는 Animate모든 크기에 걸쳐 적용됩니다. OP는 이것이 자신의 답변을 보증하기 위해 DavidC와는 충분히 다르다고 제안했습니다. n = 3, l = w에 대한 결과 = 1은 다음과 같습니다 :


아주 좋아요! (올바른 방향으로)
DavidC

13

GFA 기본 3.51 (아타리 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

펄 6 , 117 바이트

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

온라인으로 사용해보십시오!

인덱스가 0입니다. 유니 코드 문자의 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 done-바닥 글에서 바이트 수에 영향을 미치지 않음
ngn

5

Wolfram Language 83 36 바이트 (보너스와 함께 -48 바이트)

버전 11.1부터는 PeanoCurve내장 기능입니다.

내 원래 서투른 제출은 많은 바이트를 낭비 GeometricTransformation하고ReflectionTransform.

이 훨씬 축소 된 버전은 alephalpha 가 제안했습니다 . Reverse출력 방향을 올바르게 설정해야했습니다.

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

예 36 바이트

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

피아노 커브


보너스

이것이 100pt 보너스에 해당되는 경우, 무게는 52-100 = -48입니다. 코드 [5]는 계산되지 않았으며 순수한 기능 만있었습니다.

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

순서


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

Peano 곡선 자체를 계산하는 함수를 사용하는 것이 바람 피우는 것처럼 느껴지지만 그럼에도 불구하고 나는 그것을 인상적인 대답으로 받아 들일 것입니다. @ LegionMammal978 나는 당신이 당신의 자신의 답변을 게시 할 자격이 있다고 생각, 나는 그것을 승리 답변으로 받아 들일 것을 보증하기에 충분히 다르다고 주장합니다.
Peiffap


4

HTML + SVG + JS, 224213 바이트

출력은 수평으로 미러링됩니다.

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

Stax , 19 바이트

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

실행 및 디버깅

3에 대한 출력

███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
█                                 █ █                
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
                █ █                                 █
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.