로이터 스 바르의 삼각형 그리기


33

불가능한 물체Reutersvärd의 삼각형입니다 .

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

다음 규칙에 따라 자신의 버전을 그리십시오.

  • 정확히 9 큐브
  • 각면은 정확히 4 개의 큐브로 구성됩니다.
  • 큐브는 렌더링 된 객체가 사실상 불가능한 객체가되도록 겹치는 것처럼 보입니다.
  • 4 개의 다른 색상이 사용됩니다-배경에 하나씩, 큐브의 각면에 3 개
  • 비트 맵 출력에서 ​​전체 삼각형은 최소 100 픽셀 이상, 너비는 100 픽셀 이상이어야합니다.
  • 종횡비 : 전체 삼각형의 너비와 높이는 2 배 이상 떨어져서는 안됩니다.
  • 삼각형은 위의 이미지를 기준으로 어느 정도 회전 할 수 있습니다
  • 삼각형은 위 이미지와 관련하여 반영되거나 반영되지 않을 수 있습니다

답변:


14

Brain-Flak, 487810 327722 75564 + 1 = 75565 바이트

불행히도 이것은 대답에 맞는 큰 것입니다.

PasteBin

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

-A플래그를 사용하면 다음과 같은 ASCII ppm 파일이 출력됩니다.

새로운 출력

설명

내가 직접 손으로 쓰지 않았다고 생각했을 것입니다. 그래서 내가 한 방법은 다음과 같습니다.

먼저 도전에서 제공 한 이미지로 위에서 본 이미지를 만들었습니다. 그것은 다른 값 255이나 다른 색상의 채널을 가지고 있지 않다는 구별 0이 있습니다.이 방법으로 최대 색상 채널을 1로 설정하여 더 작은 파일로 묶을 수 있습니다. 그런 다음 Brain-Flak 프로그램을 골프로 만들기 위해 파이썬 스크립트를 작성했습니다. 여기 에서 찾을 수있는 직접 작성한 모듈을 사용하여이 문제를 해결합니다 . 그것은 내가 이런 것들을 위해 함께 던진 해킹을 연마하지는 않았습니다. push는 효율적인 Brain-Flak 코드를 반환하여 숫자를 스택으로 푸시하는 함수이며 kolmo특정 문자열을 스택으로 푸시하는 효율적인 방법을 찾으려는 매우 간단한 Kolmogorov 복잡도 해결 프로그램입니다.

from value import push,kolmo

def group(a, n):
    return zip(*[a[i::n]for i in range(n)]) 

f=open("R.ppm")
a=["".join(x)for x in group(f.read().split()[3:][::-1],3)]
f.close()

def hardcode(string):
    result = push(ord("\n")).join("(<>({})<>"+{"0":"","1":"()"}[x]+")"for x in string)
    return result

last = ""
acc = 0
result = push(ord("0"))+"<>"
for x in a+[""]:
    if x != last:
        string = ("" if not last else kolmo("\n")+hardcode(last))
        result += min([push(acc)+"{({}[()]<%s>)}{}"%string,acc*string],key=len)
        acc=1
    else:
        acc += 1
    last = x
print result+kolmo("P3 100 100 ")

이것은 꽤 재미 있었고 내 대답을 향상시키기를 바랍니다.


14
당신은 합법적으로 160088 바이트를 골프? 그게 기록인가요?
Neil

아마도 일부 단항 답변이 그것을 이길 수 있습니다
Roman Gräf


파이썬 코드가 흥미 롭습니다. 무엇입니까 value? ( PyPI 에서이 모듈이 아니라고 추측합니다.) 무엇입니까 kolmo?
팀 Pederick

@TimPederick 죄송합니다. 그 모듈은 Brain-Flak 골프를 위해 직접 작성했습니다. 나는 몸에 링크를 포함시킬 것이다.
밀 마법사

13

수학, 237 바이트

n={-1,1}#&;c_~g~s_:=Polygon[c+s#&/@{k={12,9},m=n@k,t={0,-12}}];p={#,#2~g~1,#3~g~-1}&;a=p[Cyan,#-k,#+m]&;b=p[Blue,#-t,#+k]&;c=p[Red,#-m,#+t]&;Graphics@{{a@#,b@#,c@#}&/@{j=4k,s=4{4,9},n@s,4m,r={-32,8},q=-4{4,5},4t,n@q,n@r},a@j,b@s,c@j,c@s}

더 읽기 쉬운 버전 :

1  n = {-1, 1} # &;
2  c_~g~s_ := Polygon[c + s # & /@ {k = {12, 9}, m = n@k, t = {0, -12}}];
3  p = {#, #2~g~1, #3~g~-1} &;
4  a = p[Cyan, # - k, # + m] &;
5  b = p[Blue, # - t, # + k] &;
6  c = p[Red, # - m, # + t] &;
7  Graphics@{
8    {a@#, b@#, c@#} & /@
9      {j = 4 k, s = 4{4, 9}, n@s, 4 m, r = {-32, 8},
10       q = -4{4, 5}, 4 t, n@q, n@r},
11   a@j, b@s, c@j, c@s}

1 행 n은 정렬 된 쌍의 첫 번째 좌표를 무효화 하는 함수 를 정의합니다 . 2 행 g은 점을 중심으로 (거의) 정삼각형을 생성하고 c아래를 향하거나 위를 가리키는 함수 를 정의 합니다.s1-1. 3 행 p은 색상과 2 개의 삼각형으로 구성된 평행 사변형 템플릿으로 정의 a되며 4-6 행 은 b, 및c 큐브에 표시 평행 사변형의 세 가지 특정 유형이 될 수 있습니다.

8 행 {a@#, b@#, c@#}&은 점을 중심으로 전체 큐브를 그리는 함수 를 정의합니다 #. 선 9와 10은 더 큰 삼각형을 만드는 데 필요한 9 개의 점에 적용됩니다. 이렇게하면 오른쪽 상단에서 시작하여 시계 반대 방향으로 9 개의 큐브가 만들어집니다.이 큐브에서는 나중에 큐브가 이전 큐브의 일부를 덮습니다. 마지막으로 11 행은 4 개의 평행 사변형 (그림의 오른쪽 상단에 있음)을 다시 그려서 나중에 원하는 큐브를 덮도록합니다. 출력은 다음과 같습니다.

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


6
Mathematica에 내장되어 있지 않은 것을 기다려?
Digital Trauma

10

HTML + CSS 3D (855 866 바이트)

HTML 117 바이트 + CSS 738 바이트

z-indexes순서대로 유지하는 것은 약간 까다로 웠습니다. ;)

/* CSS */
p{position:absolute;left:110px;top:0;width:50px;height:50px;transform-style:preserve-3d;transform:rotateX(-45deg)rotateY(21deg)rotateZ(20deg)}
p+p{left:140px;top:50px}
p+p+p{left:170px;top:100px}
p+p+p+p{left:200px;top:150px}
p+p+p+p+p{left:140px;top:150px}
p+p+p+p+p+p{left:80px;top:150px}
p+p+p+p+p+p+p{left:20px;top:150px}
p:nth-child(8){z-index:1;left:50px;top:100px}
p:nth-child(9){z-index:-1;left:80px;top:50px}
p:nth-child(10){z-index:1;left:67px;top:59px;transform:rotateX(-45deg)rotateY(21deg)rotateZ(20deg)scale(0.6)}
a{position:absolute;width:50px;height:50px;background:red;transform:rotateY(0deg)translateZ(25px)}
a+a{background:tan;transform:rotateY(-90deg)translateZ(25px)}
a+a+a{background:navy;transform:rotateX(90deg)translateZ(25px
<!-- HTML -->
<p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a><a><p><a><a>

가독성을 높이기 위해 새로운 줄을 유지했습니다. 아마 더 많은 골프를 할 가능성이있는 사람이있을 수 있습니다. 그러나 바이트 수에는 포함되지 않습니다.

결과

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

jsFiddle 데모

직접 해보십시오

Goole Chrome을 사용하십시오. 다른 브라우저에서에 문제가z-indexes 있을 수 있습니다 .

편집하다

  • 저장된 2 바이트를 중복 제거 a에 감사를 -selector을 ETHproductions .
  • 저장 9 바이트 불필요한 제거하여 margin:0a- 요소.

HEAD/BODY태그가없고 닫는 유효한 HTML 입니까? 브라우저가 구문 오류를 무시하고 던지는 것을 표시하려고 시도한다는 것을 알고 있지만이 코드가 사양을 따르는 것으로 생각하지 않습니다. (말했다, 훌륭한 솔루션!)
페데리코 Poloni

2
@FedericoPoloni 감사합니다. html|head|body-elements 와 관련하여 : 생략 할 수 있습니다. "선택적 태그"를 살펴보면 얼마나 많은 요소와 닫는 태그를 생략 할 수 있는지 놀랄 것입니다. 스펙에 없지만 작동하는 것은 a-elements 의 닫는 태그를 생략하는 것 입니다. 그러나 중첩 할 수 없기 때문에 브라우저에서 올바르게 닫힙니다. 또한 코드 골프 관점에서 : " 컴파일 "하고 올바른 출력을 가진 모든 것이 유효합니다. ;)
insertusernamehere

9

BBC 기본, 147 바이트

토큰 화 된 파일 크기 129 바이트

t=PI/1.5x=500y=x:FORi=0TO28b=i MOD3GCOL0,b:b*=t:a=i DIV9*t:IFb=0x-=99*COSa:y-=99*SINa
MOVEx,y:VDU25;66*COSb;66*SINb;28953;66*COS(b-t);66*SIN(b-t);:NEXT

절대 좌표 사양을 사용하여 2 바이트 절약MOVE모든 절대 사양을 사용할 수 있도록 원점을 변경하는 대신 )과 평행 사변형 당 두 개의 상대 사양 . 1 바이트의 불필요한 공백이 제거되었습니다.

BBC 기본, 150 바이트

토큰 화 된 파일 크기 127 바이트

http://www.bbcbasic.co.uk/bbcwin/download.html 에서 통역사 다운로드

t=PI/1.5x=500y=x:F.i=0TO28b=i MOD3GCOL0,b:b*=t:a=i DIV9*t:IFb=0 x-=99*COSa:y-=99*SINa:ORIGINx,y
L.66*COSb,66*SINb,0,0PLOT117,66*COS(b-t),66*SIN(b-t)N.

설명

우리는 오른쪽 상단의 좌표로 시작하고 3 개의 그룹으로 마름모를 플로팅합니다. 3 개의 각 그룹 전에 원점을 이동합니다 (서쪽, 서쪽, 서쪽, SE, SE SE, NE, NE NE). 오른쪽 상단에는 플롯 할 마지막 전체 그룹이 있으며 원점을 원래 위치로 되돌립니다. 그런 다음 계속해서 첫 번째 그룹의 검은 색과 빨간색 (녹색은 아님), 총 29 개의 마름모를 다시 그립니다.

언 골프

  t=PI/1.5                                 :REM 120 deg
  x=500                                    :REM coordinates of top right corner
  y=x
  FORi=0TO28
    b=i MOD3:GCOL0,b                       :REM set colour 0=black,1=red,2=green
    b*=t                                   :REM convert b to a multiple of 120deg
    a=i DIV9*t
    IFb=0 x-=99*COSa:y-=99*SINa:ORIGINx,y  :REM before each group of 3 rhombs move the graphics origin
    LINE66*COSb,66*SINb,0,0                :REM define one side of a rhombus
    PLOT117,66*COS(b-t),66*SIN(b-t)        :REM define one further corner and plot the rhombus
  NEXT

산출

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


8

HTML + 자바 스크립트 (ES6), 351 374 384

<canvas id=C></canvas><script>c=C.getContext("2d");`133124222162184253104213162164244191224182133191064104222093164253122224284151284`.match(/.../g).map((v,i)=>(c.fillStyle=['#fc0','#f04','#08a'][a=i%3],c.beginPath(),c[l='lineTo'](x=5*~~v/10,y=v%10*25),c[l](x-10,y+(--a+!a)*17),a&&c[l](x-30,y+a*17),c[l](x-20,y),!a&&c[l](x-10,y-17),c.fill()))</script>

덜 골프

<canvas id=C></canvas>
<script>
  c=C.getContext("2d");
  [133,124,222,162,184,253,104,213,162,164,244,191,224,182,133,191,64,104,222,93,164,253,122,224,284,151,284]
  .map((v,i)=>(
    a = i % 3,
    x = 5 * ~~ v / 10,
    y = v % 10 * 25,
    c.fillStyle = ['#fc0','#f04','#0a8'][a],
    c.beginPath(),
    --a,
    c[l='lineTo'](x, y),
    c[l]( x -10, y + (a+!a) * 17),
    a&&c[l](x - 30, y + a * 17),
    c[l](x - 20, y),
    !a&&c[l](x - 10, y - 17),
    c.fill()
  ))
</script>

테스트

<canvas id=C></canvas><script>c=C.getContext("2d");`133124222162184253104213162164244191224182133191064104222093164253122224284151284`.match(/.../g).map((v,i)=>(c.fillStyle=['#fc0','#f04','#08a'][a=i%3],c.beginPath(),c[l='lineTo'](x=5*~~v/10,y=v%10*25),c[l](x-10,y+(--a+!a)*17),a&&c[l](x-30,y+a*17),c[l](x-20,y),!a&&c[l](x-10,y-17),c.fill()))</script>


5

자바 스크립트 (ES6) / SVG (HTML5), (350) 312 바이트

document.write(`<svg width=390 height=338>`)
a=`195,52;240,130;285,208;330,286;240,286;150,286;60,286;105,208;150,130;`
a=(a+a).split`;`
for(i=9;i--;)document.write(`<path fill=#FD0 d=M${a[i]}h60l-30,-52h-60z /><path fill=#088 d=M${a[i+3]}h60l-30,52h-60z /><path fill=#F64 d=M${a[i+6]}l-30,-52l-30,52l30,52z />`)


3

SVG, 562 540 520 504 487 473 바이트

이것은 처음으로 골프를 치는 SVG (또는 실제로는 마크 업)입니다. 부드럽게!

가정 된보기 환경은 일반적인 창 크기와 같은 SVG 지원 웹 브라우저입니다. Firefox 50 및 Chrome 55에서 테스트했습니다.

viewBox100 픽셀의 요구 사항을 충족 할 필요가있다; 적절한 계수로 모든 측정을 수행하면 작동하지만 더 많은 바이트가 필요합니다. 또한 공간을 제거하여 다른 바이트를 저장할 수 있습니다 0 -5.viewBox 값 있지만 Firefox는이를 유효한 것으로 허용하지 않습니다 (Chrome과 동일).

종횡비는 실제 0.866 : 1 대신 1 : 1입니다. 나는 "2의 요소"규칙이 어떻게 해석되어야하는지 잘 모르겠습니다 (0.433 : 1 또는 1.732 : 1만큼 과장된 것이 과장 될 수 있음을 의미한다고 생각합니다). 어쨌든.

SVG

<svg xmlns="http://www.w3.org/2000/svg"
xmlns:l="http://www.w3.org/1999/xlink"
viewBox="0 -5 26 26"><g
id="a"><path d="m7,9H3V5h6z"/><g
id="f"><path fill="red" d="m9,5H3V1h4z"/><path
fill="blue" d="m3,1l2,4L3,9l-2-4z"/></g></g><use
l:href="#a" x="3" y="6"/><use
l:href="#e" x="12"/><g
id="e"><use l:href="#a" x="-6" y="12"/><use l:href="#a" x="-12" y="12"/></g><use
l:href="#a" x="-9" y="6"/><use
l:href="#a" x="-6"/><use
l:href="#a" x="-3" y="-6"/><use
l:href="#f"/></svg>

결과

Reutersvärd의 Triangle에 대한 위 SVG 코드의 PNG 렌더링


아마 여기서 줄 바꿈을 삭제할 수 있다고 생각합니다. IIRC, XML은 대부분의 문맥에서 공백을 무시합니다.

@ ais523 : 예, 게시하기 전에하는 것을 잊었습니다. facepalm 이제 끝났습니다. 여전히 개행 문자가있어 모호하게 읽을 수는 있지만 어쨌든 일종의 공백이 필요한 장소 (즉, 태그 이름과 속성 사이)에만 있습니다.
팀 Pederick

종횡비 규칙에 대한 귀하의 해석은 정확합니다
Digital Trauma
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.