Намалюйте трикутник Рейтерсверда


33

Цей неможливий об’єкт - трикутник Рейтерсварда :

введіть тут опис зображення

Намалюйте власну версію відповідно до цих правил:

  • Рівно 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є дуже простою програмою вирішення складності Колмогорова, яка намагається знайти ефективний спосіб підштовхувати певний рядок до стеку.

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 байтів? Це запис?
Ніл

Можливо, кілька одинакових відповідей можуть перемогти це
Роман Ґраф


Ваш код Python мене заінтригує. Що value? ( Я не здогадуюсь, цей модуль на PyPI ?) Що kolmo?
Тім Педерік

@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, і спрямований вниз або вгору залежно від того, sє 1чи -1. Рядок 3 визначає pяк шаблон паралелограм , що складається з квітів і двох трикутників і ліній 4-6 визначають a, bі cбути три різних типи конкретних паралелограмів , які з'являються в кубах.

Рядок 8 визначає функцію, {a@#, b@#, c@#}&яка малює цілий куб із центром у точці #; рядки 9 і 10 застосовують це до дев'яти точок, необхідних для складання більшого трикутника. При цьому виходить дев'ять кубів, починаючи з правого верхнього кута і йдучи проти годинникової стрілки, де пізніші прикривають частини попередніх. Нарешті, рядок 11 перемальовує чотири паралелограми (у верхньому правому куті малюнка), щоб вони вкривали пізніші кубики так, як вони повинні. Вихід нижче:

введіть тут опис зображення


6
Зачекайте, що у Mathematica для цього немає вбудованої?
Цифрова травма

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-селектор, завдяки ETHproductions .
  • Збережено 9 байт , видаливши зайве margin:0на a-елементі.

Чи все-таки дійсний HTML без HEAD/BODYзакриття тегів? Я знаю, що браузери прагнуть ігнорувати синтаксичні помилки і намагаються відображати все, що ви кидаєте на них, але я не думаю, що цей код слід за специфікаціями. (Це сказало, чудове рішення!)
Федеріко Полоні

2
@FedericoPoloni Дякую Щодо html|head|body-елементів: їх можна опустити. Погляньте на "Необов’язкові теги" , ви здивуєтеся, скільки елементів і тегів, що закриваються, можна також опустити. Те, що немає в специфікаціях, але теж працює, - це опустити завершальні теги a-елементів. Однак браузер їх правильно закрив, тому що ви не можете їх вкласти. Також з точки зору Code Golf: Діє все, що " компілюється " і має правильний вихід. ;)
вставитикористувач туди

9

BBC BASIC, 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 BASIC, 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.) Це означає, що група 3 Вгорі праворуч розташована остання повна група, яка повертає походження до початкового місця. Тоді ми продовжуємо і намічаємо знову чорне та червоне (але не зелене) першої групи, загалом 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 + JavaScript (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

JavaScript (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.

viewBoxНеобхідно , щоб задовольняти вимогу 100 пікселів; підірвання всіх вимірювань відповідним коефіцієнтом також може працювати, але займе більше байтів. До речі, можна зберегти ще один байт, видаливши простір 0 -5в viewBoxвартості, але Firefox не братиме це як дійсний ( в той час як Chrome буде).

Співвідношення сторін 1: 1 замість справжніх 0,866: 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>

Результат

PNG-рендерінг вищезгаданого коду SVG для трикутника Reutersvärd


Я думаю, ви могли, мабуть, видалити сюди нові рядки, чи не так? IIRC, XML ігнорує пробіл у більшості контекстів.

@ ais523: Так, я забув це зробити, перш ніж публікувати це. facepalm Це все ж зроблено зараз. Є ще нові рядки, що дозволяють чітко читати, але лише в місцях (а саме між іменами тегів та атрибутами), де все-таки потрібний пробіл.
Тім Педерік

Ваше трактування правила співвідношення сторін правильне
Digital Trauma
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.