펜로즈 트라이앵글 코드 골프


19

펜로즈 삼각대 또는 불가능한 삼각대라고도 하는 펜로즈 삼각형 은 불가능한 물체입니다.

이 과제의 목표는 가능한 최소 바이트로 펜로즈 삼각형을 표시하는 것입니다.

펜로즈 삼각형

출처 : Wikipedia

규칙 :

  1. 펜로즈 트라이앵글을 생성 한 후 디지털로 표시해야합니다.
  2. 이미지를 직접 표시하지 않고 위의 위키 페이지 이미지 (위 소스)와 동일하게 표시되어야합니다.
  3. 동일한 색 구성표를 사용하는 동일한 이미지는 최소 400x400 크기로 표시되어야합니다.
  4. 가능한 한 정확해야합니다.

행운을 빌고 재미있게 보내!


2
나는 이것이 큰 도전이 될 수 있다고 생각하지만 이미지의 색상과 치수와 같이 명확해야 할 특정 사양이 있습니다.
Kritixi Lithos

5
추신! 도전이 종결되었다고 낙심하지 마십시오. 그것은 나쁜 도전 아이디어는 다음이라면 가까운 투표는 ... :) downvotes 동반 될 것이다
스튜이 그리핀

2
@DigitalTrauma 말할 수 없습니다. 여기에는 더 많은 세부 정보가 있습니다.
mbomb007

1
회색이 똑같은 회색이어야합니까? 후자 인 경우 챌린지 텍스트에 정확한 회색 톤을 제공하는 것이 좋습니다.
Martin Ender

1
종횡비는 정확하게 재현해야하는 경우에도 유용합니다.
Martin Ender

답변:


3

로고, 129 바이트

각 L 모양의 첫 4 면만 그린 다음 펜을 들어 올리고 다음 L 모양의 해당 지점으로 이동하고 펜을 내리고 4면을 그립니다. 각 L 모양은 이전 모양에서 2면을 빌립니다.

최신 편집 : 사용 회색 채우기 영역에 검은 색 채우기 영역에서 이동 fd대신 setx에서, 그리고 모든 움직임을 변경 fd하는 bk180 도의 회전에 한 바이트를 저장 : rt 210-> rt 30단축 setpencolorsetpc(내가 사용 intepreter (가),하지만 작동에 문서화 .)

rt 30 repeat 3[pd bk 200 lt 120 bk 360 rt 120 bk 80 rt 60 bk 440 pu rt 139 bk 211 rt 41] setx -2 fill fd 9 setpc 15 fill

로고, 140 바이트

각 L 모양의 6면을 그리고 마지막 가장자리에서 오버 슈트 한 다음 180도 회전하여 다음 모양을 시작합니다.

rt 30 repeat 3[rt 180 fd 200 lt 120 fd 360 rt 120 fd 80 rt 60 fd 440 rt 120 fd 360 rt 120 fd 200] pu setx -5 fill setx 5 setpencolor 15 fill

http://www.calormen.com/jslogo/# 에서 실행 하십시오.

할 것을 권장합니다 cs pd setpencolor 0화면이 분명하다 거북이를 중심으로 위쪽으로 가리키는 확인하기 위해 실행하기 전에, 펜은 다운, 블랙 (새로운 세션에 필요하지 않은 기본 설정)로 설정하고 또한 ht거북이 (숨길 st의지를 다시 보여주세요.)

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


11

SVG (HTML5), 191 바이트

<svg width=498 height=433 stroke=#000><path d=M211,134l38,66L154,365H496L458,431H40 /><path fill=#777 d=M211,2L2,365l38,66L211,134l95,165h76 /><path fill=#FFF d=M496,365L287,2H211L382,299H192


정말 좋습니다!
Steve Bennett

7

파이썬 2 211 201 195 188 175 173 바이트

from turtle import*
d="t(120);fd(333);rt(120);fd(67);"
s="color(0,%r);begin_fill();fd(200);l"+d+"rt(60);fd(400);r"+d+"end_fill();fd(133);rt(180);"
exec s%'#fff'+s%0+s%'gray'

불행히도 execTrinket에서는 구현되지 않으므로 온라인으로 그대로 테스트 할 수 없습니다. 적어도 무료 버전은 아닙니다. 나는 문자열을 인쇄 하고 테스트하는 코드로 붙여 넣기. 스크립트가 영리하다면 더 큰 캔버스를 얻기 위해 필요에 따라 html / css의 크기를 조정할 수 있습니다. 당신이 할 경우 알려주십시오.

온라인으로 시도 -사이트의 캔버스가 400 픽셀에 비해 너무 작기 때문에 더 작은 크기를 사용하지만 전체 출력을 볼 수 있습니다.

언 골프 드 :

from turtle import*
w=200
def f(n):
  c=255*n/2
  color(0,(c,c,c))
  begin_fill()
  fd(w)
  lt(120)
  fd(5*w/3)
  rt(120)
  fd(w/3)
  rt(60)
  fd(2*w)
  rt(120)
  fd(5*w/3)
  rt(120)
  fd(w/3)
  end_fill()
  fd(2*w/3)
  rt(180)
f(2);f(0);f(1)

부동 RGB 값이 어쨌든 반올림되어 픽셀 색상이 변경 될 것이라고 생각할 255*n/2수 있는지 궁금합니다 128*n.
Albert Renshaw

@AlbertRenshaw 이것이 ungolfed 코드입니다. 골프 버전에 대해서는 위의 코드를 참조하십시오. 또한 이것은 파이썬 2이므로 부동 소수점이 아니며 정수는 정수 나누기이므로 정수입니다.
mbomb007

아 알 겠어. 감사!
Albert Renshaw

6

PHP, 153 바이트

short_open_tag설정이 활성화 된 경우에만 작동합니다 . 소스 코드에는 인쇄 할 수없는 문자가 포함되어 있으므로 16 진 덤프를 대신 사용하십시오.

0000000: 3c3f 3d67 7a69 6e66 6c61 7465 2827 b329  <?=gzinflate('.)
0000010: 2e4b 5728 cb4c 2d77 caaf b0d5 3531 3000  .KW(.L-w....510.
0000020: 611d 0b08 5628 2e29 cacf 4eb5 5536 3030  a...V(.)..N.U600
0000030: b0b3 2948 2cc9 5048 b1f5 d535 35d6 3536  ..)H,.PH...55.56
0000040: b7d0 8152 c6a6 263a 8626 c6ba 8626 0660  ...R..&:.&...&.`
0000050: dac2 5cc7 14c8 b234 0452 510a 6999 3939  ..\....4.RQ.i.99
0000060: b6ca 6969 690a 2545 8979 c569 f945 b9b6  ..iii.%E.y.i.E..
0000070: 45f9 2589 25a9 1a06 9a0a fa14 990a 7415  E.%.%.........t.
0000080: a6a9 8646 949a 9b5e 945a 8969 ae2e cc60  ...F...^.Z.i...`
0000090: 7d60 88d9 0100 2729 3b                   }`....');

압축 해제 된 데이터는 다음과 같습니다 (가독성을 위해 줄 바꿈이 추가됨).

<svg viewBox=-400-400,800,800 stroke=#000>
<path d=M-53-378,53-378,354,143-140,143-87,50,191,50Z fill=#fff transform=rotate(0) />
<path d=M-53-378,53-378,354,143-140,143-87,50,191,50Z fill=#000 transform=rotate(120) />
<path d=M-53-378,53-378,354,143-140,143-87,50,191,50Z fill=grey transform=rotate(-120) />
</svg>

SVG 데이터가 완전히 유효하지는 않지만 PHP는 다음과 같이 제공합니다. text/html 기본적으로 . doctype 선언이 없으면 문서는 쿼크 모드에서 처리되므로 매우 관대합니다.

압축을 개선하기 위해 이미지를 거의 동일한 <path>요소를 사용하여 그릴 수있는 "7"모양의 세 부분으로 나누었습니다 . 결과 이미지가 확대되어 뷰포트를 채 웁니다. 다음은 500 × 500 픽셀 창에서 얻은 화면입니다.

500 × 500 픽셀 펜로즈 삼각형 SVG 이미지의 화면 잡기


5

HTML + JS (ES6), 34 + 306 = 340 바이트

30도 수평 스큐를 사용합니다-행렬 변환의 세 번째 인수에서 30 °의 탄젠트는 pow(3,-.5) .

추악한 마술 숫자가 꽤 ​​많으며 Wikipedia 이미지의 비율과 일치하지 않습니다. 나는 이것에 대해 더 "수학적"방법이 있다고 확신한다. 도움을 주시면 감사하겠습니다.

CodePen에서 ungolfed 버전을 참조하십시오.

f=

_=>{with(Math)with(C=c.getContext`2d`)for(l=lineTo.bind(C),lineWidth=.01,transform(50,0,0,50,200,224),N=4;N--;rotate(PI*2/3))beginPath(fill(save(fillStyle=N?N>1?'#fff':'#000':'#777'))),transform(-1,0,-pow(3,-.5),-1,3.965,1.71),l(0,0),l(0,6),l(1,6),l(1,1),l(4.616,1),l(5.772,0),closePath(restore(stroke()))}

f()
<canvas id=c width=400 height=400>


4

HTML + CSS, 9 + 315 (309) 308 = 317 바이트

국경과 비뚤어 짐! Chrome에서 테스트되었습니다. CodePen의 ungolfed 버전을 참조하십시오 .

body{margin:9em}b,:after{position:fixed;transform:rotate(240deg)}b:after{content:'';left:-6.1em;top:-7.95em;width:6em;height:9em;border-left:transparent 2.32em solid;border-right:2em solid;border-bottom:2em solid;transform:skew(30deg);filter:drop-shadow(0 0 .1em)}b{color:#777}b>b{color:#000}b>b>b{color:#fff
<b><b><b>


최소 400x400px의 요구 사항을 충족합니까?
sergiol

당신은 마지막이 필요하지 않습니다 >오른쪽?
스탠 스트 럼

4

매스 매 티카 171 바이트

w=(v=AnglePath)[s={{9,0},{11,2(b=Pi/3)},{2,b},{9,2b},{5,-2b},{2,b}}];x={w[[5]],2b}~v~s;y={x[[5]],-2b}~v~s;Graphics@{White,EdgeForm[Black],(p=Polygon)@w,Gray,p@x,Black,p@y}

AnglePath를 사용하여 60도 회전의 배수로 3 개의 다각형을 그리고 각 다각형의 시작점이 이전 다각형의 5 번째 점이라는 이점을 활용합니다.


1
좋은 접근 방법, 사용 AnglePath.
DavidC

1

은 Tcl / Tk의 205

grid [canvas .c -w 402 -he 402]
.c cr p 171 2 237 2 401 337 125 337 156 280 301 280 -f #FFF
.c cr p 2 335 171 2 310 280 250 280 171 121 31 401 -f gray
.c cr p 171 127 34 401 374 401 401 337 127 337 201 188

펜로즈 삼각형

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