Нарисуй Треугольник Реутерсварда


33

Этот невозможный объект является треугольником Реутерсварда :

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

Нарисуйте свою версию в соответствии с этими правилами:

  • Всего 9 кубов
  • Каждая сторона состоит из ровно 4 кубов
  • Кажется, что кубы перекрываются, так что визуализированный объект на самом деле является невозможным объектом.
  • Используются 4 разных цвета - один для фона и 3 для каждой грани кубов
  • В растровом изображении полный треугольник должен иметь высоту не менее 100 пикселей и ширину не менее 100 пикселей
  • Соотношение сторон: ширина и высота полного треугольника не должны превышать более чем в 2 раза
  • Треугольник можно повернуть на любую величину относительно приведенного выше изображения.
  • Треугольник может или не может быть отражен относительно изображения выше

Ответы:


14

Brain-Flak, 487810 327722 75564 + 1 = 75565 байт

К сожалению, это немного большой, чтобы вписаться в ответ.

Pastebin

Попробуйте онлайн

С этим -Aфлагом выводится ppm-файл ASCII, который выглядит следующим образом:

New output

объяснение

Возможно, вы уже догадались, я не писал это вручную. Вот как я это сделал:

Сначала я сделал изображение, которое вы видите выше, из изображения, предоставленного задачей. Он отличается тем, что не имеет никакого цветового канала, который имеет любое значение, кроме 255или 0таким образом, что мы можем обернуть его в меньший файл с максимальным цветовым каналом, установленным в 1. Затем я написал скрипт на python для игры в гольф с программой 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 байтов? Это запись?
Нил

Может быть, некоторые унарные ответы могут побить это
Роман Gräf


Ваш код Python меня заинтриговал. Что value? ( Я полагаю, не этот модуль на PyPI ?) Что kolmo?
Тим Педерик

@TimPederick К сожалению об этом. Это модуль, который я написал для игры в гольф Brain-Flak. Я включу ссылку в теле.
Пшеничный волшебник

13

Mathematica, 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 перерисовывает четыре параллелограмма (в верхнем правом углу рисунка) так, чтобы они в конечном итоге покрывали более поздние кубы, как и предполагалось. Выход ниже:

enter image description here


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>

Я сохранил новые строки для лучшей читаемости. Возможно, кто-то замечает потенциал для большего количества игры в гольф. Однако они не включены в число байтов.

Результат

enter image description here

jsFiddle Demo

Попробуй сам

Используйте Goole Chrome. Другие браузеры могут иметь проблемы сz-indexes .

редактировать

  • Сохранение 2 байтов путем удаления дубликата a-selector, благодаря ETHproductions .
  • Сохраненные 9 байт , удалив ненужный margin:0на a-элементе.

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

2
@FedericoPoloni Спасибо. Относительно html|head|bodyэлементов: они могут быть опущены. Взгляните на «Необязательные теги» , вы удивитесь, сколько элементов и закрывающих тегов также можно опустить. То, чего нет в спецификациях, но тоже работает, - это опустить закрывающие теги a-elements. Однако они корректно закрываются браузером, потому что вы не можете их вкладывать. Также с точки зрения 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 мы перемещаем начало координат (запад, запад, запад, юго-восток, юго-восток, северо-восток, северо-восток.) ​​Это означает, что группа из 3 в правом верхнем углу находится последняя полная группа, которая будет построена, возвращая источник в исходное местоположение. Затем мы продолжаем и снова рисуем черное и красное (но не зеленое) первой группы, всего 29 ромбов.

Ungolfed

  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

Выход

enter image description here


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>

Результат

A PNG rendering of the above SVG code for Reutersvärd's Triangle


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

@ ais523: Да, я забыл сделать это до публикации. Facepalm Это сделано сейчас, хотя. По-прежнему есть переводы строк, что делает его читабельным для чтения, но только в тех местах (а именно между именами тегов и атрибутами), где в любом случае требуется какой-то пробел.
Тим Педерик

Ваша интерпретация правила соотношения сторон правильная
Цифровая травма
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.