Треугольник Пенроуза Кодегольф


19

Пенроуза треугольник , также известная как трибар Пенроуза, или невозможный трибару, является невозможной задачей.

Цель этого задания - показать треугольник Пенроуза в наименьшем количестве байтов.

Треугольник Пенроуза

Источник: Википедия

Правила:

  1. Вы должны отобразить треугольник Пенроуза в цифровом виде после его генерации.
  2. Они должны выглядеть так же, как на изображении выше вики-страницы (источник выше) без непосредственного показа изображения.
  3. Одно и то же изображение с одинаковой цветовой схемой должно быть показано размером не менее 400x400.
  4. Должно быть максимально точным.

Удачи и приятного времяпровождения!


2
Я думаю, что это может быть большой проблемой, но есть определенные характеристики, которые необходимо уточнить, такие как цвета изображения и его размеры.
Kritixi Lithos

5
PS! Не расстраивайтесь только потому, что проблема закрыта. Если бы это была плохая идея, тогда близкие голоса сопровождались бы отрицательными голосами ... :)
Stewie Griffin

2
@DigitalTrauma Я бы сказал, нет. Это еще много деталей для рисования.
mbomb007

1
Подойдет ли какой-нибудь серый или он должен быть точно таким же серым? Если это последнее, было бы неплохо указать точный серый тон в тексте задания.
Мартин Эндер

1
Аспекты рациона также будут полезны, если они должны быть точно воспроизведены.
Мартин Эндер

Ответы:


3

логотип, 129 120 байт

Рисует только первые 4 стороны каждой формы L, затем поднимает перо, перемещается в соответствующее место на следующей форме L, опускает перо и рисует 4 стороны этого. Каждая форма L занимает 2 стороны от предыдущей.

Последние изменения: перейдите от области черной заливки к области серой заливки, используя fdвместо setx, и измените все движения с fdна, bkчтобы сохранить один байт при повороте на 180 градусов: rt 210-> rt 30, сократить setpencolorдо setpc(недокументировано в используемом мной интерпретаторе, но это работает .)

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 байт

Рисует 6 сторон каждой формы L, выходит за пределы последнего края, затем поворачивается на 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


Это действительно мило!
Стив Беннетт

7

Python 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'

К сожалению, execон не реализован в Trinket, поэтому он не может быть протестирован онлайн как есть. По крайней мере, не в бесплатной версии. Я распечатал строку и вставил ее как код для проверки. Если вы разбираетесь в сценариях, вы можете изменить размер html / css по мере необходимости, чтобы увеличить холст. Дайте мне знать, если вы делаете.

Попробуйте онлайн - использует меньший размер, так как холст сайта слишком мал для 400px, но вы можете увидеть весь результат.

Ungolfed:

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)

Мне интересно, 255*n/2можно ли уменьшить значение до, 128*nя думаю, значения RGB с плавающей запятой в любом случае будут округляться, так что произойдет ли изменение цвета пикселей?
Альберт Реншоу

@AlbertRenshaw Это незагрязненный код. Посмотрите код выше, что для версии для гольфа. Кроме того, это Python 2, поэтому они не являются числами с плавающей точкой, они являются целыми числами, поскольку деление является целочисленным делением.
mbomb007

А ну понятно; Благодарность!
Альберт Реншоу

6

PHP, 153 байта

Это будет работать, только если short_open_tagнастройка включена. Исходный код содержит непечатаемые символы, поэтому вместо этого используйте шестнадцатеричный дамп:

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 документ обрабатывается в режиме причуд, что очень простительно.

Чтобы улучшить сжатие, я разбил изображение на три части в форме «7», которые можно нарисовать, используя почти идентичные <path>элементы. Полученное изображение расширится, чтобы заполнить область просмотра. Вот снимок экрана из окна 500 × 500 пикселей:

Снимок экрана с изображением треугольника Пенроуза размером 500 × 500 пикселей SVG


5

HTML + JS (ES6), 34 + 306 = 340 байт

Использует горизонтальный наклон 30 градусов - в 3-м аргументе матричного преобразования тангенс 30 ° представляется как pow(3,-.5).

Есть довольно много уродливых магических чисел, и они не совсем соответствуют пропорциям изображения в Википедии. Я уверен, что есть более «математический» способ сделать это; любая помощь будет оценена.

Посмотрите версию без кода на CodePen.

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 .

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>


Удовлетворяет ли это требованию min 400x400px?
sergiol

Вам не нужен финал >, верно?
Стэн Струм

4

Mathematica 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}

Рисует 3 многоугольника, используя AnglePath, кратные поворотам на 60 градусов, и использует преимущество в том, что отправной точкой для каждого многоугольника является 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

Треугольник Пенроуза

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