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


19

Пенроуза трикутник , також відома як трібар Пенроуза, або неможливий трібару, є неможливим завданням.

Мета цього завдання - відобразити трикутник Пенроуза у найменших можливих байтах.

Трикутник Пенроуза

Джерело: Вікіпедія

Правила:

  1. Ви повинні відобразити трикутник Пенроуза в цифровому вигляді після його створення.
  2. Вони повинні виглядати так само, як наведене вище зображення сторінки вікі (джерело вгорі), не показуючи зображення безпосередньо.
  3. Те саме зображення з однаковою кольоровою гамою повинно бути відображено розміром не менше 400х400.
  4. Слід бути максимально точним.

Хай щастить!


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

5
PS! Не відволікайтеся лише тому, що виклик закритий. Якби це була погана ідея виклику, то закриття голосів супроводжувалося б голосуванням ... :)
Гріффін,

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

Пітон 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 за необхідності, щоб отримати велике полотно. Дайте мені знати, якщо ви це зробите.

Спробуйте в Інтернеті - використовує менший розмір, оскільки полотно сайту занадто мало для 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)

Мені цікаво, чи 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за замовчуванням. Без декларації доктрипу документ обробляється в режимі химерності, що дуже прощає.

Для поліпшення стиснення я розбив зображення на три частини "7", які можна намалювати за допомогою майже однакових <path>елементів. Отримане зображення розшириться, щоб заповнити вікно перегляду. Ось захоплення екрана з вікна 500 × 500 пікселів:

Знімок екрана у форматі SVG-зображення трикутника Пенроуза 500 × 500 пікселів


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>


Чи відповідає вона вимозі не менше 400x400px?
серхіол

Вам не потрібен фінал >, правда?
Стен Струм

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}

Намалюйте 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.