Намалюйте трикутник Реле!


27

Трикутник Рело є формою , утворене перетином трьох кіл, причому кожної окружність , що проходить через центри чужих. Незалежно від обертання, ширина трикутника Реле завжди дорівнює радіусу кіл:

З Вольфрама MathWorld

Зображення: Wolfram MathWorld

Напишіть програму, яка приймає ширину rв якості введення та відображає трикутник Реле такої ширини (у пікселях).

Ви повинні відображати фігуру ізольовано, тобто з твердим наповненням, без штриху та над суцільним фоном.

- Найкоротша програма в байтах.


1
Чи повинен rбути радіус у пікселях чи просто якийсь коефіцієнт масштабування?
Карл Напф

@Karl Napf Pixels.
darrylyeo

Чи можемо ми що-небудь вивести на STDOUT, якщо правильно намалювати трикутник Реле?
Ерік Аутгольфер

@EriktheOutgolfer Це добре.
darrylyeo

Відповіді:


21

JavaScript + HTML, 164 158 + 13 = 171 байт

w=+prompt(f=(x,y)=>x*x+y*y<w*w);C.width=C.height=w*2;for(y=-w;++y<w;)for(x=-w;++x<w;)f(x,y)&f(w-x,y)&f(w/2-x,y-w*.866)&&C.getContext`2d`.fillRect(x+w,y+w,1,1)
<canvas id=C>

Я не знаю, чому мені подобається відповідати на ці виклики з математичного малювання <canvas>так багато ...


13

Love2D, 320 байт.

j=math.rad(60)i="increment"m=math s=m.sin C=m.cos g=love.graphics f="fill"S=g.stencil function love.draw()r=arg[2]c=function(x,y)return function()g.circle(f,x,y,r,r*4)end end X=r/2 Y=0 S(c(X,Y),i,1)S(c(X+C(j)*r,Y+s(j)*r),i,1,true)S(c(X-C(j)*r,Y+s(j)*r),i,1,true)g.setStencilTest("greater",2)g.rectangle(f,0,0,2*r,2*r)end

Можливо, це не оптимальне рішення, він використовує трафарети Love2D, налаштовуючи 3 кола і заповнюючи там, де вони перетинаються.

Телефонуйте через командний рядок, наприклад love tri.love 256

Приклад Вихід


5
Це дуже чудово
Атако


9

Mathematica 101 100 98 байт

Приймаючи інший підхід, ніж @MichaelSeifert, і, ймовірно, інтерпретуючи це трохи більш буквально стосовно пункту пікселів:

Image@Boole@Table[And@@(({x,y}∈#~Disk~2)&/@{{0,c=√3},d={1,0},-d}),{x,-1,1,2/#},{y,c-2,c,2/#}]&

Приклад використання:

%@10

10 пікселів 10-піксельне зображення

50 пікселів 50 піксельних зображень

100 пікселів Зображення на 100 пікселів

Збережено байт завдяки @MartinEnder (позначення інфіксу) та ще 2 байти, визначивши d.


6

PHP + SVG, 165 байт

<?$h=3/8*$w=2*$d=2*$r=$_GET[0];$q=$r+sqrt($r**2-($r/2)**2);echo"<svg width=$w height=$w><path d='M$r,$r A$r,$r 0 0 1 $d,$r A$r,$r 0 0 1 $h,$q A$r,$r 0 0 1 $r,$r'/>";

Приклад Вихід для введення 128

<svg width=512 height=512><path d='M128,128 A128,128 0 0 1 256,128 A128,128 0 0 1 192,238.85125168441 A128,128 0 0 1 128,128'/>


6

PostScript, 96 86 85 75 73 72 байт

dup(^@^^Z<^@Z<){sin mul exch dup}forall
0 1 2{newpath 369 arc clip}for fill

Приймає вхід як значення на стеку. ^^і ^@представляють буквальні контрольні символи. (^@^^Z<^@Z<)- рядок символів з кодовими точками 0, 30, 90, 60, 0, 90 і 60 відповідно. Потім вони інтерпретуються як кути в градусах, тому що, очевидно, для цього потрібні кодові точки.

Збережено 10 байтів, оскільки closepathце не потрібно (як clipі fillнеявно закрити шлях).

Збережено 1 байт, використовуючи repeatзамість визначення функції.

Збережено 10 байт, перейшовши на зовсім інший підхід.

Збережено 2 байти, виконуючи трюки зі стеком.

Збережено 1 байт, використовуючи 0 1 2{}forзамість 3{}repeat.


5

Математика, 134 131 байт

Примітка. Це рішення більше не є дійсним, оскільки питання було відредаговано пізніше, щоб вимагати вимірювання r у пікселях. Дякую Мартіну Ендеру за те, що він допоміг мені відголити кілька байт у коментарях.

r=Input[];RegionPlot[And@@((Abs[y+I x-#]^2<3r^2)&/@Table[Exp[2n I/3Pi]r,{n,3}]),{x,-1,1},{y,-1,1},Frame->False,BoundaryStyle->None]

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

Для роботи цього коду вхідне значення повинно бути масштабоване між 0 і 1. Зауважте, що майже чверть цього коду потрібна для відображення фігури "ізольовано", оскільки це не є типовим для Mathematica.


3
Ласкаво просимо до PPCG! r Exp[2 I Pi n/3]можна Exp[2I n/3Pi]rзберегти пробіли. І це зазвичай коротше , щоб написати неназвані функції, тобто опускати r=Input[];, замініть rз , #і додати &.
Мартін Ендер

Я думаю, що вхід повинен бути пікселями, а не коефіцієнтом масштабування.
internet_user

1
@pycoder: Так, це обмеження було відредаговано після публікації рішення.
Майкл Сейферт

4

BBC BASIC, 58 байт

I.r:L.r,r,r,r:F.i=0TO9S.PI/1.5PLOT177,r*COS(i),r*SIN(i)N.

Завантажте перекладача за посиланням http://www.bbcbasic.co.uk/bbcwin/download.html

Безумовно

INPUTr                       :REM input a radius
LINEr,r,r,r                  :REM draw a line of length 0 from r,r to r,r to establish a cursor history away from the corner of the screen
FORi=0 TO 9 STEP PI/1.5      :REM in steps of 120 degrees (going round and round the three sides of an equilateral triangle)
  PLOT177,r*COS(i),r*SIN(i)  :REM move relative by r*COS(i),r*SIN(i) and draw a sector with arc between new and last graphics cursor positions,
NEXT                         :REM with the centre of the arc at the penultimate graphics cursor position.

Нічого собі, це практично вбудований!
Ніл

4

TeX / TikZ, 128 121 112 байт

\input tikz\footline{}\tikz\draw[draw=none,fill=red](0,1)\foreach~ in{1,2,3}{[rotate=~*120]arc(0:60:\r pt)};\bye

Код заснований на цьому відповідь на TeX.se .

TeX на основі вектора, тому не робить пікселів. Радіус - це поплавок, максимум близько 15 до того, як він потрапить на край сторінки. Він також насправді не створений для введення командного рядка, тому його потрібно запускати як

pdftex  "\def\r{2} \input rt.tex"

де збережений код вище rt.tex


Кілька порад для скорочення цього: вам не потрібен жоден з нових рядків; вам не потрібно .tex; \footline{}так само добре, як і \nopagenumbers; використовувати ~як ім'я змінної замість \i. Щоб задовольнити вимогу "пікселів", ви можете використовувати \r sp; 1sp - це подібний еквівалент пікселю для TeX, оскільки це найкраще місце, яким TeX може керувати (я не знаю, чи це стосується tikz).
Жил "ТАК - перестань бути злим"

@Gilles Я нічого не можу отримати, spале я думаю pt, що це гарна ідея. Всі ваші інші ідеї спрацювали (деякі не здавались у моїх тестах). Дякую
Chris H

Ви можете видалити пробіл, ~щоб зберегти ще один байт. \input tikz\footline{}\tikz\draw[draw=none,fill=red](0,1)\foreach~in{1,2,3}{[rotate=~*120]arc(0:60:\r sp)};\byeпрацює для мене. Спробуйте pdftex "\def\r{2000000} \input rt.tex"- у 2sp візуально знайти форму буде важко, враховуючи, наскільки вона маленька.
Жил "ТАК - перестань бути злим"

@Gilles Я повинен визнати, що я піднявся лише до 20000 с.
Кріс Х

1
1pt = 65536sp, тому 20000sp все ще крихітний.
Жил "ТАК - перестань бути злим"

3

GLSL, 298 229 символів

precision lowp float;
uniform vec2 resolution;float r=100.;void main(){vec2 p=gl_FragCoord.xy-resolution.xy/2.;float h=sqrt(3.)/4.*r;gl_FragColor=vec4(length(p+vec2(r/2.,h))<r&&length(p+vec2(-r/2.,h))<r&&length(p-vec2(0.,h))<r);}

Спробуйте тут

Бонус

  • Радіус можна встановити, змінивши rзмінну
  • Ширина трикутника вказана в пікселях (потрібно зробити масштаб, встановлений на 1x в пісочниці GLSL).

Чи є у GLSL стандартний метод введення, який ви могли використовувати?
darrylyeo

У glslsandbox можна отримати положення курсору миші. Це можна використовувати для управління радіусом трикутника (наприклад: радіус буде відстань миші від центру).
tigrou

2

JavaScript (ES6) + HTML, 196 + 13 = 209 байт

Використовує підхід на основі шляху замість підходу до заповнення пікселів.

r=>{c.width=c.height=r*2
with(Math)with(c.getContext`2d`)scale(e=r*.578,e),beginPath(a=s=>s*PI/3),moveTo(2,1),[2,4,6].map(s=>arcTo(cos(i=a(s-1))+1,sin(i)+1,cos(j=a(s))+1,sin(j)+1,sqrt(3))),fill()}

<canvas id=c>


2

Логотип, 53 байти

to t :r filled 0[repeat 3[arc 60 :r fd :r rt 120]]end

використовує filledкоманду для заповнення фігури кольором 0 (чорний.) Код у зовнішніх квадратних дужках виконується без малювання жодного рядка, але логотип відслідковує переміщення черепахи і заповнює форму, коли дужка вийде.

Логотип, 64 61 байт

to t :r repeat 3[pd arc 60 :r pu fd :r rt 120]fd 9 fill end

Пером вниз, намалюйте дугу 60 градусів з черепашкою в центрі, Ручку вгору, перемістіть ручку до початку дуги, поверніть на 120 град.

Повторіть 3 рази, потім перемістіть всередину форми і заповніть її.

Спробуйте на веб-сайті http://turtleacademy.com/playground/en

Дзвінки на зразок cs ht t 100(очищення екрана, приховати черепашку, tз r = 100.)


2

MATL , 35 байт

9Bo&ZQ*3X^/G_G&:t!J*+8L&!-|G<A&e0YG

Це створює файл під назвою image.png. Для введення rрозмір зображення дорівнює 2*r+1, а ширина трикутника - rяк потрібно.

Спробуйте в MATL Online! Інтернет-перекладач автоматично відкриває створений файл і виводить зображення з довільним масштабуванням; натисніть на неї, щоб отримати версію фактичного розміру.

Крім того, ось два приклади виходів із офлайн-компілятора, що працює на Matlab, із входами 50та 100. Остання частина коду 0YGбула замінена на IYGтак, щоб цифра була безпосередньо відображена (з потрібним розміром) замість записаної у файл.

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

Пояснення

9B      % Push 9 in binary: [1 0 0 1] with logical values
o       % Convert to double
&ZQ     % Roots of polynomial with coefficients [1 0 0 1], as a 3×1 column vector
*       % Multiply by implicit input r
3X^/    % Divide by sqrt(3). This gives a 3×1 vector with the circle centers
G_G&:   % Push row vector [-r -r+1 ... r-1 r], with size 1×(2*r+1)
t!J*    % Duplicate, transpose, multiply by 1j
+       % Add with broadcast. This gives a (2*r+1)×(2*r+1) 2D-array of complex
        % numbers, which defines the pixel grid
8L      % Push [3 1 2]
&!      % Permute dimensions as indicated. This gives a 1×(2*r+1)×(2*r+1) 3D-array
-|      % Subtract with broadcast. Absolute value. This gives a 3×(2*r+1)×(2*r+1)
        % 3D-array with the distance from each circle center to each grid point
G<      % Less than r? Gives a 3×(2*r+1)×(2*r+1) 3D-array containing true or false
A       % All: this gives a 1×(2*r+1)×(2*r+1) array containing true for
        % columns of the original 3D-array that contained all true values
&e      % Squeeze the first singleton dimension to give a (2*r+1)×(2*r+1) 2D-array
0YG     % Save as image file with default file name

2

JavaScript (ES6) + SVG (HTML5), 28 + 102 = 130 байт

f=
n=>s.setAttribute('width',n)
<input type=number value=82 oninput=f(this.value)><br>
<svg id=s width=82 viewbox=0,0,82,82><path d=M0,71a82,82,0,0,0,82,0A82,82,0,0,0,41,0A82,82,0,0,0,0,71>

Кількість байтів виключає код, необхідний для зручного введення користувачем потрібного розміру.


Розумний! n=>s.style.width=nтакож працюватиме.
darrylyeo

Я не можу зрозуміти, як ти дійшов до 112 байт.
darrylyeo

@darrylyeo Ця пропозиція не спрацювала для мене, вибачте, але я погоджуюся на кількість байтів, я не можу зрозуміти, як я прийшов до цього.
Ніл

Хм, напевно, працює лише в Chrome.
darrylyeo

1

MetaPost ( 242 226 байт)

outputtemplate:="%j-%c.ps";
prologues:=1
beginfig(1);
 len:=1cm;
 path p[];
 p[1]:=len * dir -30 {dir 90} .. len * dir  90;
 p[2]:=p[1] rotated 120;
 p[3]:=p[1] rotated 240;
 fill p[1] -- p[2] -- p[3] -- cycle;
endfig;
end.

Це можливо дещо зменшити, я новачок у метапості.


Я трохи лінивий і використовував кількість байтів текстових редакторів. Я не знав, що ви можете видалити колонок, спасибі. У мене буквально є година MetaPost під поясом ^ _ ^
Карел

1
Я все-таки рахую 223, а не 226. Також чи можете ви видалити пробіли len * dirта крапку в кінці?
Rɪᴋᴇʀ

1

k, 141 100 98 байт

s:*/2#;l:2*r:.:0:`
`0:(,"P1")," "/'$(,l,l),&/{(s'n+x)</:(s r)-s'y+n:r-!l}./:r*%(0 0;4 0;1 3)%4
\\

Вхід береться з stdin, вихід stderr(або stdinзалежно від перекладача) у pgmформаті. Наприклад:

Приклад роботи програми.

Пояснення:

s:*/2#               /set s to a squaring function
r:.:0:`              /get user input, set to r
l:2*                 /width/height is 2 times r
r*%(0 0;4 0;1 3)%4   /the coordinates of circle centers
{ }./:               /for each coordinate pair (x, y) get a circle
                     /function to get a circle:
n:r-!l               /  set n to {r, r-1, ..., -(r-1)}
(s'n+x)</:(s r)-s'y+ /  use b^2<r^2-a^2 on all points to get a circle
                     /  where x and y shift the circle right and down
&/                   /get intersections of circles (fold binary and)
(,l,l),              /prepend height and width for PGM format
" "/'$               /convert to string, add spaces
(,"P1"),             /prepend PGM header
`0:                  /output to stderr
\\                   /exit

0

05AB1E , 66 байт

’)
¨€(ÿ,60)
lt(60’Ð’€š éà £Ø*
ht()
ï…_œã(ÿÿÿ)
„–_œã()
„ˆ 1:ht()’.e

Неможливо використовувати TIO, оскільки воно відкриває вікно і малює там трикутник Реле.

Запрошує введення, а потім відкриває вікно черепашки Python, що малює трикутник.

Відповідь Джонатана Аллана дала мені натхнення на це, хоча я трохи змінив його код.

По суті, це поєднання можливостей стиснення 05AB1E і простоти графіки черепах Python.


0

OpenSCAD , 91 байт

module t(r){intersection_for(t=[0,120,240]){rotate(t)translate([r/sqrt(3),0,0])circle(r);}}

Я не впевнений, наскільки це кошерно, оскільки пікселі насправді не є чітко визначеною одиницею у будь-яких мережевих сітчастих форматах, про які я знаю. Замість цього модуль tмалює трикутник reuleaux заданого радіуса rв будь-яких природних одиницях.

Вибірка попереднього перегляду для t(100): t (100)


0

SmileBASIC, 87 86 85 83 82 81 79 78 77 76 75 байт

INPUT R
C.5Y=R*.87C 1C.GPAINT.,0DEF C X
A=X*240GCIRCLE R*X,Y+2,R,A-60,A
END

Безголівки:

INPUT RADIUS
CIRCLE 0.5
Y=RADIUS*(SQR(3)/2)
CIRCLE 1
CIRCLE 0
GPAINT 0,0
DEF CIRCLE X
 ANGLE=X*240
 GCIRCLE RADIUS*X,Y+2,RADIUS,ANGLE-60,ANGLE
END
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.