Намалюйте знак €


61

Мета - вивести або відобразити зображення зі знаком € (євро) відповідно до наступних специфікацій (ігнорування межі знака).

€ знак

Джерело: http://en.wikipedia.org/wiki/File:Euro_Construction.svg

Правила:

  • Програма / сценарій повинна приймати висоту знака в пікселях як аргумент (порожній простір навколо знаку необов’язковий)
  • Знак не може бути звернено , як і від характеру, безпосередньо (це заборонено в зображенні) або побічно (обчислення потім відображати його в HTML - сторінки)print8364
  • Вихід не потрібно зберігати в жодному файлі, він може бути відображений, а потім просто показаний як скріншот
  • Стандартні «лазівки» заборонені
  • Найкоротший код виграє

7
Хитрий! Настав час переглянути мою геометрію / тригонометрію. Я бачу деякі координати досить важко вивести.
Майкл М.

5
Довелося шукати "факультативно"
Digital Trauma

2
Я дуже сподіваюся на відповідь LaTeX + TikZ :)
Коул Джонсон

12
Без Євро ця проблема не існувала б, тим самим ще раз продемонструвавши істинність «Мо грошових проблем»
Томас Джонсон

1
Я не знаю, що може бути типографічно придатним, і я не типограф. Якщо ви хочете досконалий знак €, просто використовуйте символ €. Але це не мета цього питання. Я не очікував ідеальних піксельних зображень. Сміливо додайте ще одне запитання з іншими правилами, якщо це вам не подобається.
AL

Відповіді:


22

PostScript / GhostScript, 100

(96 для програми, 4 для префіксу комутатора командного рядка)

Повністю гольф і токенізовані рукою:

$ hexdump -C euro.ps
00000000  68 20 88 78 92 36 92 38  92 8b 88 4b 88 3c 92 ad  |h .x.6.8...K.<..|
00000010  88 00 88 00 88 3c 88 2d  88 ce 92 05 88 00 88 00  |.....<.-........|
00000020  88 32 88 d8 88 28 92 06  92 16 88 b9 88 fb 92 6b  |.2...(.........k|
00000030  88 b5 88 f1 92 63 88 13  88 f1 92 63 88 17 88 fb  |.....c.....c....|
00000040  92 63 92 16 88 b9 88 0f  92 6b 88 b5 88 05 92 63  |.c.......k.....c|
00000050  88 1b 88 05 92 63 88 1f  88 0f 92 63 92 16 92 42  |.....c.....c...B|
00000060

Ви можете отримати копію тут , для власного перегляду.

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

Токенізована версія еквівалентна цій:

h 120 div dup scale
75 60 translate

0 0 60 45 -50 arc
0 0 50 -40 40 arcn
closepath

-71 -5 moveto
-75 -15 lineto
19 -15 lineto
23 -5 lineto
closepath

-71 15 moveto
-75 5 lineto
27 5 lineto
31 15 lineto
closepath

fill

Пояснення оптимізацій:

По-перше, я перетворив своє перше рішення в союз декількох простіших підпутівників, а не в один шлях, який описує всю справу. Я запозичив метод введення параметра Томаса, що набагато краще, ніж у мене.

Тоді я помножив усі координати на 10 і округлив усе, щоб дати мені лише цілі координати. Я також округлив кути і перетворив два великих на еквівалентні негативні кути. Це зручно змушує кожне число випадати між -128 та 127.

А потім я все токенізував . Кожен оператор може бути представлений двобайтовою послідовністю кожен. І оскільки кожне число може бути представлене одним підписаним байтом, кожне також стає лише двома байтами. Єдина частина, з якою я не могла це зробити, - це hна початку, але це також лише два байти, просто hта пробіл після нього.

Виконайте це як:

gs -dh=200 euro.ps

200 пт висотою

gs -dh=80 euro.ps

80 пт висотою

gs -dh=20 euro.ps

20 пт у висоту


Нове: Ще коротші версії!

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

92 байти:

hexdump -C euro.ps
00000000  68 20 88 78 92 36 92 38  92 8b 88 4b 88 3c 92 ad  |h .x.6.8...K.<..|
00000010  7b 7b 88 b5 88 c4 88 2d  88 3c 30 20 30 88 3c 88  |{{.....-.<0 0.<.|
00000020  2d 88 cf 30 20 30 88 32  88 d8 88 28 88 b9 88 fb  |-..0 0.2...(....|
00000030  88 b5 88 f1 88 13 88 f1  88 17 88 fb 88 b9 88 0f  |................|
00000040  88 b5 35 88 1b 35 88 1f  88 0f 7d 8e 0b 00 07 08  |..5..5....}.....|
00000050  0a 01 23 03 0a 01 23 03  0a 7d 92 b3              |..#...#..}..|
0000005c

Що еквівалентно:

h 120 div dup scale
75 60 translate
{
 {-75 -60 45 60
  0 0 60 45 -50
  0 0 50 -40 40
  -71 -5
  -75 -15
  19 -15
  23 -5
  -71 15
  -75 5
  27 5
  31 15}
  <00 07 08 0A 01 03 03 03 0A 01 03 03 03 0A> 
} ufill

А трохи контрінтуїтивне заплутане рішення економить ще один персонаж лише 91 рік:

$ hexdump -C euro.ps
00000000  68 20 88 78 92 36 92 38  92 8b 88 4b 88 3c 92 ad  |h .x.6.8...K.<..|
00000010  5b 5b 8e 1e b5 c4 2d 3c  00 00 3c 2d ce 00 00 32  |[[....-<..<-...2|
00000020  d8 28 b9 fb b5 f1 13 f1  17 fb b9 0f b5 05 1b 05  |.(..............|
00000030  1f 0f 7b 92 38 88 7f 92  50 7b 32 35 36 92 a9 7d  |..{.8...P{256..}|
00000040  92 54 7d 92 49 5d 92 32  8e 0b 00 07 08 0a 01 23  |.T}.I].2.......#|
00000050  03 0a 01 23 03 0a 5d 92  32 92 b3                 |...#..].2..|
0000005b

Що еквівалентно:

h 120 div dup scale
75 60 translate
[
  [
   <b5 c4 2d 3c
    00 00 3c 2d ce
    00 00 32 d8 28
    b9 fb
    b5 f1
    13 f1
    17 fb
    b9 0f
    b5 05
    1b 05
    1f 0f> {dup 127 gt {256 sub} if} forall 
  ] cvx
  <00 07 08 0A 01 23 03 0A 01 23 03 0A> 
] cvx
ufill

1
Чудова робота! Я думаю, мені доведеться дізнатися все про двійкові лексеми.
Томас У.

@ThomasW. Хоча я ще не повністю закінчений; Я все ще читаю документацію з кодованих рядків каналу ...
AJMansfield

Вам не потрібно місця, hоскільки двійкові жетони саморозмежовуються. До речі, як ви це кодували? Я зробив це зі стандартним шестигранним редактором, що нудно.
Томас В.

2
@ n.1 токенізовані файли працюють точно так само, як і звичайні файли PostScript, і ви можете навіть змішувати двійкові маркери та стандартний звичайний PostScript в одному файлі. Кожен бінарний маркер відповідає безпосередньо оператору або іншому об'єкту, тому ви можете легко замінити або вставити операції або навіть скопіювати фрагменти в іншу програму. Точні деталі щодо токенізованої форми можна знайти у Довідковому посібнику з мови PostScript (червона книга) у розділі 3.12. Кодовані шляхи користувача описані в 4.6.2.
AJMansfield

1
@ n.1 З цієї причини я скористався шестигранним редактором. Байти роздільника лексеми зазвичай відповідають керуючим символам в кодуванні ISO-latin-1 та іншої фіксованої ширини, але якщо редактор інтерпретує його в UTF-8 або іншому кодуванні змінної ширини, ви отримаєте такі речі, як і будь-які інший файл, що включає двійкові дані.
AJMansfield

50

Математика, 193 183 177 173 169 166 байт

Так, математика! Я будую регіон, який задовольняє певний (досить складний) набір нерівностей:

e=RegionPlot[(1<Abs@y<3||c)&&{x,y+12}.(d=2{-5Sin@40°-6,m=5Cos@40°})*{x+15,y+1-2Sign@y}.d<0||c&&x<2m/.c->100<x^2+y^2<144,{x,-15,9},{y,-12,12},Frame->0>1,ImageSize->#]&

Використання e[height], наприклад e[100]:

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

Або e[200]:

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

Ви можете помітити, що гостріші краї трохи закруглені. Це тому, що область може бути побудована тільки за допомогою вибірки точок у просторі, а Mathematica не вибірку кожного пікселя за замовчуванням. Роздільну здатність вибірки можна збільшити, додавши інший варіант PlotPoints->#(для якого використовується один зразок на піксель), який додає 14 символів . Я не рекомендую запускати його з цим варіантом, оскільки це значно збільшує час виконання та ледве збільшує візуальну привабливість за межами #/4. Отже, (після затвердження ОП) він не включається до балу.

Ось злегка незворушена версія:

e[height_] := (
  angle = 40°;
  d = {-5 Sin[angle] - 6, 5 Cos[angle]};
  RegionPlot[
      (Abs[y] > .5 && Abs[y] < 1.5
        ||
       r > 25 && r < 36)
    &&
      {x, y + 6}.d > 0
    &&
      {x + 7.5, y + .5 - Sign[y]}.d < 0
    ||
      r > 25 && r < 36 && x < 5 Cos[angle] 
    /. r -> x^2 + y^2
    ,
    {x, -7.5, 4.5},
    {y, -6, 6},
    Frame -> False,
    ImageSize -> height
  ]
);

Зауважте, що у версії для гольфу я масштабував систему координат в 2 рази, щоб уникнути .5s, але виявляється, що кількість символів насправді однакова.

Ось пояснення того, як я опрацював формулу. Я поділив фігуру на дві області. Одна містить кільце та смуги і відрізається праворуч BCDEнахилом та ліворуч з ухилами IJта GHсхилами (докладніше про це пізніше). Інше містить те саме кільце, але воно просто відрізане в координаті точки xD . Умови для двох регіонів поєднуються з ||, що виступає тут як встановлений союз.

Кільце просто визначається як 5 < r < 6, де rвідстань від початку. хоч і легше пропрацювати ( x²+y²), тому я використовую, 25 < x² + y² < 36щоб отримати всі очки на рингу.

Смуги знаходяться між ±.5і ±1.5. Ми можемо обробляти обидві смуги одночасно, приймаючи модуль y , тому смуги (нескінченної довжини) просто виконуються .5 < |y| < 1.5. Знову ж таки, щоб взяти з’єднання смуг і кільця, я просто використовую ||.

Цікаво, напевно, як отримати "маски", хоча. Точка Dмає x координату 5 cos 40°, тому маска, що береже нижній край (поєднується лише з кільцем), є просто x < 5 cos 40°. Це можна застосувати через встановлений перетин, який перекладається &&в логіку.

Інші маски - справді хитра частина. Спочатку давайте розберемось по схилу BCDE. Ми можемо легко побудувати точки Cі D, як (0, -6)і 5 (cos 40°, sin 40°), відповідно. Вектор, що вказує уздовж лінії, тоді справедливий D - C = (5 cos 40°, 5 sin 40° + 6). Щоб застосувати маску праворуч, мені потрібно лише з’ясувати, чи лежить точка ліворуч або праворуч від цієї лінії (назвемо вектор лінійки p). Я можу це зрозуміти, взявши вектор Cдо моєї цікавої точки та спроектувавши його на вектор, перпендикулярний до p. Знак проекції підкаже мені, на якій стороні знаходиться точка. Отримати перпендикулярний вектор досить просто в 2D: переверніть координати і поверніть знак однієї з них. Це змінна dв моєму коді:(-5 sin 40° - 6, 5 cos 40°). Вектор від Cточки до інтересу q = (x, y)є q - C = (x, y + 6). Проекція - це просто скалярний добуток (або крапковий продукт) між qі d. Те, як я вибрав dце, трапляється вказувати ліворуч, тому я хочу d.(q-C) > 0. Ця умова стосується правої маски.

Для лівої маски я можу використовувати в основному ту саму ідею. Нахил однаковий і тому так і є d. Мені просто потрібно змістити свою точку від нижнього лівого кута смуг замість від C. Вони мають координати (-7.5, 0.5)(верхня смуга) та (-7.5, -1.5)(нижня смуга). Отже, це вимагатиме створення двох незалежних правил для двох смуг. Однак зауважте, що всі точки, на які впливає нижня маска, знаходяться в нижній смузі і, отже, мають від'ємний y . І всі точки, на які впливає верхня маска, мають позитивний у . Так що я можу просто перемкнути моє зміщення з допомогою Sign[y]яких є 1для позитивних і -1для негативних y. Так стає моєю точкою зміщення(-7.5, -0.5 + Sign[y]). Інакше маска працює так само, як і права маска. Звичайно, цього разу прогноз повинен бути негативним. Отже, наївно це було б щось на кшталт RH-projection > 0 && LH-projection < 0(що теж було у мене в коді). Але ми можемо скоротити це, оскільки множення додатного і від’ємного числа має дати негативне число, тож це просто RH * LH < 0(де RHі LHє відповідні прогнози).

Це воно. Зведення все це призводить до такої логічної структури:

(
  (is_in_circle || is_in_stripe)
  &&
  is_between_left_and_right_mask
)
||
(
  is_in_circle && left_of_edge
)

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


1
Я порівняно новачок у Mathematica, тому я буду вдячний за деякими коментарями до вашого коду!
Thomas W.

2
@ThomasW. ну, власне матеріал Mathematica - це лише дзвінок, до RegionPlotякого просто кольори у всіх точках простору, які відповідають заданій умові. Тому даючи це x^2+y^2<1намалювати коло одиниці. Я додаю пояснення для фактичної математики, хоча (пізніше сьогодні ввечері).
Мартін Ендер

1
Яка довжина коду з не закругленими краями? Я думаю, що у вас є найкоротший код на даний момент, але я не можу прийняти вашу відповідь із закругленими кутами, було б несправедливо до інших відповідей, які не закруглили кути. Будь ласка, чітко дотримуйтесь технічних умов. Дякую
AL

@ n.1 Якщо ви не дискваліфікуєте PostScript відповідь Томаса В., тому що вона є двійковою чи тому, що вона закруглена занадто агресивно, його відповідь, безумовно, коротша. Однак виправлення роздільної здатності займає 14 символів, тому моя відповідь все ж є найкоротшою після його. Я відредагую.
Мартін Ендер

1
@ThomasW. ось так!
Мартін Ендер

29

BBC BASIC, 202

INPUTh:w=h/12s=w/2.4p=25VDU22,6,29,640;400;p,4,0;1.5*w;p,153,6*w;0;p,4,0;1.5*w;p,159,h/3.1;4.7*w;p;9*s;9*w;p,87,h/3.1;-19*w;p,4,-7.5*w;0;p;s;w;p,85,4.5*s;0;p,81,s;w;p;s;w;p;s;w;p,85,-7.5*w;2*w;p,81,s;w;

завантажте емулятор за адресою http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

У програмі BBC basic всі графічні зображення обробляються на низькому рівні за допомогою спеціальних символів управління ASCII (але для зручності доступні також деякі команди високого рівня). Тут використовуються 22 (змінити режим відображення) 29 (змінити походження) та 25, що еквівалентно оператору PLOT, який приймає додатковий параметр дії (малювати лінію, коло, трикутник тощо у фоновому режимі / передньому плані з відносним / абсолютним переміщенням) перед параметрами X та Y.

Тому все, що мені потрібно зробити, - це надіслати на контролер VDU набір символів. Значення, що закінчуються крапкою з комою, становлять 16 біт. інші - 8 біт. Загальна кількість байтів, надісланих контролеру VDU, становить 91 , хоча саме по собі це не буде кваліфікуватися як відповідь, оскільки до цього етапу розмір твердо кодується.

Очевидним місцем для початку є центр кола, але насправді більше команд, що беруть участь у створенні брусків. Тому я змістив початок вниз на 1,5 до нижньої частини нижньої смуги, що зменшує кількість потрібних дробів та від’ємних чисел. Він залишається на вертикальній лінії з центром кола, що важливо, оскільки лінія Е починається від цієї вертикальної лінії.

Насправді мені довелося лише обчислити 3 числа від креслення: верхній внутрішній кут форми C (5 cos 40, 5 sin 40 + 1,5) = (3.8302,3.1394 + 1.5) = прибл. (12 / 3.1, 4.6) і градієнт лінії Е: x / y = 3.8302 / (6 + 3.1394) = 0.4157 = приблизно 1 / 2.4

Оскільки у мене є лише безкоштовна версія оцінки (інтерпретована), я приймаю висоту символу як введення користувача. Якщо ви купуєте повну версію (29,99 ГБ), ви можете скласти та прочитати командний рядок w=VAL(@cmd$)/12.

Невикористаний код

У гольф-коді є лише одне твердження VDU, але в коді, що не перебуває, я розбиваю його на кілька для наочності. Крім того, оскільки BBC basic є мало ендіатичним, комбінацію p,0,можна пограти в гольф, p;але я залишив це для неясного для ясності.

  INPUT h
  w=h/12                   :REM w is the width of the line, which is 1/12 the height of the symbol, hardcoded at 900.
  s=w/2.4                  :REM s/w is the gradient x/y of line E. s is the horizontal offset of the top and bottom of the ends of horizontal bars
  p=25                     :REM VDU p,action,x;y; is the equivalent of PLOT action,x,y

  VDU 22,6                 :REM change mode
  VDU 29,640;400;          :REM set origin

  VDU p,4,0;1.5*w;         :REM move to centre of circle
  VDU p,153,6*w;0;         :REM draw circle in foreground colour
  VDU p,4,0;1.5*w;         :REM move to centre of circle
  VDU p,159,h/3.1;4.6*w;   :REM draw circle in background colour, ending at the upper inner point of the C shape.
  VDU p,0,9*s;9*w;         :REM move relative along slant gradient, 9 spaces in y direction, to define the upper cut on the circle
  VDU p,87,h/3.1;-19*w;    :REM draw triangle in background colour, based on the last two points and the absolute point specified here (vertical line for lower cut)

  VDU p,4,-7.5*w;0;        :REM move absolute to bottom left of lower bar
  VDU p,0,s;w;             :REM move relative to top left of lower bar
  VDU p,85,4.5*s;0;        :REM draw triangle to bottom right corner of lower bar (absolute)
  VDU p,81,s;w;            :REM draw triangle to top right of lower bar (relative)

  VDU p,0,s;w;             :REM move relative to bottom right of upper bar
  VDU p,0,s;w;             :REM move relative to top right of upper bar
  VDU p,85,-7.5*w;2*w;     :REM draw triangle to bottom left of upper bar (absolute)
  VDU p,81,s;w;            :REM draw triangle to top left of upper bar (relative)

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


BBC BASIC. Дивовижно! Це повертає мене майже тридцять років!
Том Чентлер

1
@Dommer BBC Basic вперше вийшов у 1981 році, за 20 років до того, як були надруковані перші банкноти Євро (2002 р.). Це єдиний спосіб, коли можна було намалювати великий знак євро на такій машині! Як альтернативи ви можете перевизначити ASCII символ nв символ євро з 8х8 бітової карти, як це: VDU 23,n,30,33,120,32,120,30,30,0. За даними Вікіпедії, BBC Basic все ще розробляється, в основному, для мобільних пристроїв.
Річка Рівня Св

Справді! Я думаю, що ми отримали своє в 1984 році. Я пам'ятаю, як малювати круті спрайти на графічному папері, а потім опрацьовувати їх бінарні уявлення, як я впевнений, що ви це теж зробили. На якій ноті я просто намалював ваш символ Євро вручну. Це дуже добре, коли помилка друку зафіксована і допотожне значення зміниться з 30 на 33. З вашого профілю я бачу, що ви також використовували ЛОГО, який знову повертає мене до моїх початкових шкільних днів. Чудово дізнатися, що BBC Basic використовується і сьогодні. Якби це було нам досить добре ...
Том Чантлер

Додамо лише, що біт-карту BBC Basic 8x8 можна було зробити більш "курсивом" (відповідно до більшого логотипу), змінивши його на VDU 23,n,30,33,124,32,120,33,30,0. Дякуємо за подорож по смузі пам'яті.
Том Чантлер

25

HTML, 250 249 248 242 244 234 229

<svg viewBox=-7.5,-6,12,12
onload=this.style.height=prompt()><clipPath
id=c><path
d=M5-6,1.8,1.5,3.8,3.2V6H-9.4L-7.1,.5-7.5-.5-5.2-6>
</clipPath><g
clip-path=url(#c) fill=none stroke=#000><circle
r=5.5 /><path
d=M-8,1h15M-8-1h15>

Хоча це використовується лише у форматі SVG, воно в значній мірі покладається на розслаблений HTML-аналіз і повинен слугувати як HTML. Строгий SVG вимагає набагато більше байтів.

Спробуй це!


13
(-: ǝɯ oʇ ǝuıɟ sʞoo⅂
гидливо грифа

1
Так, я думав про координати PostScript, які є навпаки! Замінив вісь y зараз.
Томас В.

3
Працюйте для мене (Chrome 34) навіть без останнього </svg>. О, і ця розмітка жахлива . Сподіваюся, ви соромитесь себе. ;-)
Ілмарі Каронен

2
@IlmariKaronen я буду соромно ;-). Зазвичай я навіть віддаю перевагу чистому XHTML над HTML. У будь-якому випадку, якщо я залишю подальше прорив </svg>, я бачу лише коло, а не рядки (у окремому файлі, не всередині розмітки, яку може додати JS Bin).
Thomas W.

1
Можна скоротити evt.targetдо thisекономії 6 байт.
Зубна щітка

17

CSS, 512 494 байт

<style>*,:after,:before{position:absolute;width:20;content:"";background:#fff}#a{margin:150;height:20;border:2px solid;border-radius:20px}#a:after{width:10;height:10;bottom:0;right:-8}p{top:7;left:-6;width:29;height:2;border:solid;border-width:2 0;transform:skewX(-23deg);margin:0;background:0}p:before{width:2;height:4;bottom:-3;left:-.5}p:after{width:16;height:16;bottom:-3;right:-8}</style><div id=a><p><script>document.getElementById('a').style.transform='scale('+(prompt()/24)+')'</script>

Не найменша відповідь справедливою шматочком, але такою ж маленькою, яку я міг би отримати, навіть коли скликав усі мої css-мінімізації-фу

Застереження:

Вищевказаний код із усіма видаленими 'px' роботами працює у Firefox & IE, але не в Chrome та Safari, які сутушать щодо своїх одиниць :)

Я також повинен був повторно додати px, щоб заставити jsfiddle працювати:

http://jsfiddle.net/9A3J9/

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

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

неозорений код:

 <style>
*,:after,:before{
    position:absolute;
    width:20;
    content:"";
    background:#fff
}
#a{
    margin:150;
    height:20;
    border:2px solid;
    border-radius:20px
}
#a:after{
    width:10;
    height:10;
    bottom:0;
    right:-8
}
p{
    top:7;
    left:-6;
    width:29;
    height:2;
    border:solid;
    border-width:2 0;
    transform:skewX(-23deg);
    margin:0;
    background:0
}
p:before{
    width:2;
    height:4;
    bottom:-3;
    left:-.5
}
p:after{
    width:16;
    height:16;
    bottom:-3;
    right:-8
}
</style>

<div id=a><p>

<script>
document.getElementById('a').style.transform='scale('+(prompt()/24)+')'
</script>

3
Оце Так! Цей skewXтрюк міг отримати мою нагороду в спокої.
манатура

саме про це я почав писати вчора. неправдиві пункти до вас тоді
Ейнасіо

встановлення ідентифікатора на діві та використання getElementByIdзменшує 6 знаків. а потім ви можете використовувати ідентифікатор у css, щоб зменшити ще 2
Einacio

також pзавершальний тег можна опустити, якщо після нього більше немає вмісту (за специфікацією). і я би перевірив, чи браузери автоматично закривають div(хоча це заборонено спец., він працював у скрипці на ФФ)
Ейнасіо,

@einacio чудові пропозиції! ми знизилися до 494 Б. спасибі :)
caitriona

16

PostScript + Ghostscript 137 + 6 = 143 (двійковий), 209 + 6 = 215 байт

Повністю гольф-версія з двійковими жетонами:

$ hexdump -C euro_golfed.ps 
00000000  68 20 31 32 20 92 36 92  38 92 8b 37 2e 35 20 36  |h 12 .6.8..7.5 6|
00000010  92 ad 35 20 36 0a 31 2e  38 20 2d 31 2e 35 0a 33  |..5 6.1.8 -1.5.3|
00000020  2e 38 20 2d 33 2e 32 0a  33 2e 38 20 2d 36 0a 2d  |.8 -3.2.3.8 -6.-|
00000030  39 2e 34 20 2d 36 0a 2d  37 2e 31 20 2d 2e 35 0a  |9.4 -6.-7.1 -.5.|
00000040  2d 37 2e 35 20 2e 35 0a  2d 35 2e 32 20 36 92 6b  |-7.5 .5.-5.2 6.k|
00000050  37 7b 92 63 7d 92 83 35  2e 35 92 14 30 92 6f 2d  |7{.c}..5.5..0.o-|
00000060  38 20 2d 31 0a 2d 38 20  31 92 6b 32 7b 31 35 20  |8 -1.-8 1.k2{15 |
00000070  30 92 85 92 6b 7d 92 83  30 20 30 20 35 2e 35 20  |0...k}..0 0 5.5 |
00000080  30 20 33 36 30 92 05 92  a7                       |0 360....|
00000089

Завантажте вручну закодований двійковий файл

Версія ASCII:

h 12 div dup scale
7.5 6 translate
5 6
1.8 -1.5
3.8 -3.2
3.8 -6
-9.4 -6
-7.1 -.5
-7.5 .5
-5.2 6
moveto
7{lineto}repeat
clip newpath
5.5 0
-8 -1
-8 1
moveto
2{15 0 rlineto moveto}repeat
0 0 5.5 0 360 arc
stroke

Збережіть як euro.psі запустіть з Ghostscript, як

gs -dh=80 euro.ps

Знак Євро, 80 балів, наданий Ghostscript

gs -dh=20 euro.ps

Знак Євро, 20 балів, наданий Ghostscript

Оскільки в PostScript немає такого поняття, як піксель, ця висота інтерпретується натомість. Я вирахував +6 для перемикача в командному рядку.


1
Мех, як я маю бити розмір складеного файлу. : D ... Як працюють ці двійкові лексеми? Це в основному не так, як компілювати код вручну?
Мартін Ендер

DCлінія не ріже горизонтальні смуги правильно. Перпендикуляр донизу Dне вирізає фігуру "кола" в потрібному місці, нижче :(. Схоже, і у вашій SVG-відповіді.
user2846289

+ Ліві краї горизонтальних смуг не вирівнюються.
користувач2846289

@ m.buettner Найважливіші імена PostScript можна виразити за допомогою двобайтової послідовності. Це насправді не компілюється так, як ви б склали програму C або Java. Він пройде той же процес розбору, що і будь-яка програма PostScript. Якщо ви подивитеся на hexdump або відкриєте двійковий файл у текстовому редакторі, то можна побачити, що він майже такий же, як версія ASCII, але більшість імен були замінені двобайтовою послідовністю.
Thomas W.

@VadimR У тебе гостре око! Я думаю, я торгував занадто великою кількістю точності для стислості (округлення занадто агресивно). Можливо, мені доведеться додати кілька цифр.
Thomas W.

13

Пітон - черепаха - 517

import turtle,sys
from math import *
q=sqrt
h=int(sys.argv[1])/24
t=turtle.Turtle()
z=t.begin_fill
y=t.end_fill
x=t.goto
w=t.towards
v=t.fd
u=t.circle
r=t.seth
o=t.setx
n=t.xcor
t.pu()
x(10*h,0)
t.left(90)
t.circle(10*h,40)
z()
A=w(0,-12*h)
B=2/sin(A*pi/180)
u(10*h,280)
r(-90)
C=n()/h
v((q(144-C*C)-q(100-C*C))*h)
D=w(0,0)
r(D+90)
u(-12*h,D+135.42)
y()
F=2*pi/9
G=h*cos(F)/(5*sin(F)+6)
x(45*G,-3*h)
z()
o(-15*h)
r(A)
v(B*h)
o(45*G+15*h+n())
y()
x(65*G,h)
z()
o(-15*h)
r(A)
v(B*h)
o(65*G+15*h+n())
y()
t.ht()
input()

python % 100і python % 500відповідно:


3
Ви можете зберегти багато символів, позбувшись кількох визначених вами ярликів. Ви використовуєте лише cодин раз, так що насправді буде коротше, щоб просто викликати це як math.cos, і я думаю, що, ймовірно, є інші, які ви могли б скасувати скорочення загальної довжини.
AJMansfield

1
Ви можете поголити шість знаків, скориставшись from math import *тим самим math.префіксами.
alexwlchan

3
Ви визначаєте u=t.circle, але через кілька рядків ви забули замінити t.circle(...)дзвінок.
Алькоя

2
Черепаха намалювати €. Який час бути живим.
Ніт

13

PHP, 432 435 367 356 334 байт

(Редагувати: мабуть, IJ та GH повинні бути паралельними BCDE. Тепер виправлено)

Цей скрипт виводить SVG-зображення, але буде служити ним text/htmlза замовчуванням. Я думаю, що більшість браузерів сприйматимуть це як веб-сторінку HTML, що містить вбудоване зображення SVG. Здається, для мене все одно добре.

Висота зображення передається як параметр рядка запиту. (Примітка: кількість байтів включає символ нового рядка в кінці рядка 3, який необхідний для правильної роботи).

<?php $x=$_GET['x']/12;$a=$x*5;$b=$x*6;$c=$x*7;$d=$x*12.4884;$e=$x*2.2863;$f=$x*5.5;$g=$x*.4157;$h=$x*6.5;$i=$x*7.5;$j=$x*12;$k=$x*11.3302;$l=$x*9.1628;$m=$x*8;$s=$x*12;echo<<<Q
<svg width="$s" height="$s"><clipPath id="c"><path d="M$d 0H$e L0 $f L$g $h L0 $i V$s H$k V$m H$l z"/></clipPath><g clip-path="url(#c)" fill="none" stroke="#000" stroke-width="$x"><circle cx="$i" cy="$b" r="$f"/><path d="M0 $a H$k M0 $c H$k"/></g></svg>
Q;

Оновлена ​​версія ( 367 356 334 байт):

preg_replace_callback()є набагато ефективнішим способом масштабування числових значень. Цей код дає такий же вихід, як і оригінальну версію. (Редагувати: Подальші скорочення завдяки Ейнасіо )

<?php
echo preg_replace_callback('/[\d\.]+/',function($m){return$m[0]*$_GET['x']/12;},'<svg width=12 height=12><clipPath id=c><path d=M12.4884,0H2.2863L0,5.5,0.4157,6.5,0,7.5V12H11.3302V8H9.1628z /></clipPath><g clip-path=url(#c) fill=none stroke=black stroke-width=1><circle cx=7.5 cy=6 r=5.5 /><path d=M0,5H11M0,7H11 /></g></svg>');

Вихід:

euro.php? x = 60

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

euro.php? x = 200

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


widthі heightтут непотрібні. І вам потрібно вказати xmlnsдля того, щоб він відображався в більшості браузерів (перевірені Firefox та Chrome; навіть при надсиланні належного типу MIME SVG, вони обидва рендерують його як XML, а не SVG). ideone.com/JkqVL0 (видаліть жорстке кодування значення x для рішення 369 байт)
Тім С.

@TimS. Ні, він не працюватиме належним чином, якщо запустити PHP-код у ideone та скопіювати результати у файл SVG. Але якщо ви фактично публікуєте скрипт на веб-сервері, PHP (за замовчуванням) обслуговуватиме результати з типом MIME text/html. У Chrome і Firefox з цим проблем немає, хоча я щойно виявив, що Safari - трохи більше розбещеності.
кричуча костінь

Ах! Я бачу хитрість зараз: text/htmlз <svg>...інтерпретується як HTML-файл з svgелементом, який не потрібен, xmlnsале потрібно widthі height. Я думав з точки зору файлу SVG, який потребує належного xmlns. Ваш код добре.
Тім С.

у другому коді, якщо ви використовуєте 24 замість 12, чи не зменшите ви 1 байт на кожне значення x.5?
Ейнасіо

@Einacio Так! :-) На жаль, я також набираю байт при кожному появі "5", "6", "7" і "8". Отримана довжина точно така ж.
кричуча костінь

9

ш, 8604

Я думаю, що хтось, мабуть, може зробити краще, але почнемо з цього.

echo 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|base64 -d|unxz>e.svg;echo \<img src=e.svg height=$1\>>e.htm;firefox e.htm

3
Хіба це не потрапило б під стандартну лазівку жорсткого кодування виводу?
користувач80551

4
Це, безумовно, підпадає під категорію "стандартні лазівки".
Ігглібу

2
@Igglyboo: Як так?
Ри-

18
Це дуже довга відповідь на проблему з кодовим гольфом. :-)
AL

2
@Igglyboo Не погоджуюсь. .svg вектором, тому його можна нескінченно масштабувати - і це за $1вхідним параметром.
Цифрова травма

9

HTML5, 395

==> Спробуйте в Інтернеті

<canvas id=c><script>_='function e,t,n){c.savtranslate,trotatn?0:.42)}v=docuEleById("c"c=vContex"2d"scalw=(v.width=v.height=promp))/12,w76,1arc(56--114.2,6,66-13,6.-   2,1 11.5)c.clearRec2restor-7mov-71lin6,.5,strokt(   .5--e(0,);1,ment.geteTo(';for(Y in $='  ')with(_.split($[Y]))_=join(pop());eval(_)</script>

Код стискається за допомогою JSCrush .

Ось нестиснений код:

<canvas id=c>
<script>
v=document.getElementById('c');
c=v.getContext('2d');
function r(){c.rotate(0.42)}
function t(x,y){c.save();c.translate(x,y)}
c.scale(w=(v.width=v.height=prompt())/12,w);
t(7.5,6);
c.arc(0,0,5.5,0,6);
c.stroke();
c.moveTo(-7.5,-1);c.lineTo(6,-1);
c.moveTo(-7.5,1);c.lineTo(6,1);
c.stroke();
c.clearRect(4.2,0,6,6);
t(0,6);r();
c.clearRect(0,-11,3,6.2);
c.restore();
t(-7.5,-0.5);r();
c.clearRect(-1,-2,1,2);
c.restore();
t(-7.5,1.5);r();
c.clearRect(-1,-1.5,1,1.5)
</script>

Це можна зменшити до 378, погравши в джерело перед застосуванням розчавлення: jsfiddle.net/_nderscore/EUBG8
nderscore

Це JavaScript, а не HTML. Мені набридло, щоб люди не розуміли, як це працює.
Черепаха

1
Так, оскільки <canvas>тег - JavaScript ... HTML5 часто використовується для запису HTML / CSS / JS. Не те, щоб люди цього не розуміли, програмісти просто часто лінуються (принаймні, я). Ваш коментар здається трохи суворим.
Майкл М.

@Mig Я думав, що HTML + CSS + JS називається DHTML?
kinokijuf

6

PostScript, 270

7 7 перекладати
/ l {lineto} def
/ o {0 0} деф
o 6 44,85 165,52 арк
-7,08 1,5 л
-7,5 .5 л
o 6 175,22 184,74 арк
-7,08 -,5 л
-7,5 -1,5 л
o 6 194,48 309,67 арк
o 5 320 197,46 арк
1,87 -1,5 л
2,29 -,5 л
o 5 185,74 174,26 арк
2,7 .5 л
3,12 1,5 л
o 5 162,54 40 арк
Заливка ближнього шляху

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

Я зберег кілька символів, додавши ярлики для lineto( /l{lineto}def) та походження кола ( /o{0 0}def).

Щоб вказати інший розмір, додайте команду форми після першого пустого рядка.height width scale

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

Ось його зображення за розміром за замовчуванням, розсіяне до трохи більше 90 пікселів на дюйм:

розмір за замовчуванням у 90 ppi

У розмірі 4х:

Розмір 4x в 90 ppi

Ви також можете завантажити оригінал для власного задоволення від перегляду.


2
Чи читає він якийсь аргумент для визначення розміру знака?
АЛ

@ n.1 о, вибачте, я не прочитав цю частину специфікації. Я виправлю це після обіду.
AJMansfield

Додайте скріншот зображеного файлу.
AL

1
@ n.1 Я додав зображення.
AJMansfield

5

PHP (без SVG), 628 597 байт

Завдяки AsksAnyway за хороший ярлик для функцій (наприклад $c = print; $c('Hello world!');).

<?php header('Content-type:image/png');$h=$_GET['h'];$i=imagecreatetruecolor($h*1.1,$h*1.1);$c=imagecolorallocate;$b=$c($i,0,0,0);$w=$c($i,255,255,255);imagefill($i,0,0,$w);$l=$h*.7;$t=$h*.55;$u=$h/12;$e=imagefilledellipse;$e($i,$l,$t,$h,$h,$b);$e($i,$l,$t,$h*5/6,$h*5/6,$w);$f=imagefilledpolygon;$f($i,array($l+$u*5,$t+$u*1.5,$l-$u*7.5,$t+$u*1.5,$l-$u*7.125,$t+$u*0.5,$l+$u*4,$t+$u*.5,$l+$u*4,$t-$u*.5,$l-$u*7.5,$t-$u*.5,$l-$u*7.125,$t-$u*1.5,$l+$u*5,$t-$u*1.5),8,$b);$f($i,array($l+$u*4.24,$t-$u*4.24,$l+$u*1.84,$t+$u*1.5,$l+$u*3.84,$t+$u*3.26,$l+$u*3.84,$t+$u*4.62,$h*2,$t,),5,$w);imagepng($i);

Зателефонуйте file.php?h=200зі свого браузера, щоб побачити зображення

Координати ґрунтуються на вимірюваннях, виконаних за допомогою GIMP

100 пікселів:

€ 100 пікселів

200 пікселів:

€ 200 пікселів

Шари, додані поетапно:

# GIF

Код без гольфу (з дробами код гольфу має округлені значення)

<?php
header('Content-type: image/png');

$h = $_GET['h'];

$i = imagecreatetruecolor($h * 1.1,$h * 1.1);

$c = imagecolorallocate;

# black
$b = $c($i,0,0,0);
# white
$w = $c($i,255,255,255);

imagefill($i,0,0,$w);

$l = $h * .7; # distance between left and center of the circle
$t = $h * .55; # distance between top and center of the circle

# one "unit", as defined by the specs
$u = $h / 12;

$e = imagefilledellipse;
# disk is black
$e($i, $l, $t, $h, $h, $b);
# inner disk is white
$e($i, $l, $t, $h * (5 / 6), $h * (5 / 6), $w);

$f = imagefilledpolygon;
# draw 2 bars in black
$f($i, array(
# bottom bar
$l + $u * 5, $t + ($u * 1.5), # bottom right
$l-$u * 7.5, $t + ($u * 1.5), # bottom left
$l-$u * 7.125, $t + ($u * 0.5), # top left
$l + $u * 4, $t + ($u * 0.5), # top right
# top bar
$l + $u * 4, $t - ($u * 0.5), # bottom right
$l-$u * 7.5, $t - ($u * 0.5), # bottom left
$l-$u * 7.125, $t - ($u * 1.5), # top left
$l + $u * 5, $t - ($u * 1.5) # top right
), 8, $b);

# hide right parts of bars and circle by drawing white
$f($i, array(
$l + $u * 6 * (212 / 300), $t - ($u * 6 * (212 / 300)), # right of the disk
$l + $u * 6 * (92 / 300), $t + ($u * 6 * (74 / 300)), # left = bottom right of bottom bar
$l + $u * 6 * (191 / 300), $t + ($u * 6 * (163 / 300)), # bottom of the circle
$l + $u * 6 * (191 / 300), $t + ($u * 6 * (231 / 300)), # bottom of the circle too
$h * 2, $t, # some point at the right of the image (outside the image)
), 5, $w);

imagepng($i);

4

Інструменти командного рядка Bash + ImageMagick + linux, 460 байт

base64 -d<<<H4sIADBMaVMAAy1Ru27DMAz8FUJdBVsk9QziLFo8uD/QrUDSOIDTBo1Rt39fUsl0POp0PEr7+88Zfq/L530w87redn2/bVu3cff1fe7JOdeLwsB2Oa7zYDw7A/Ppcp5XJWQO+9v7OsN9/VtOg/m4LMvuRS4ZOA7m1VkseQpBoQZvyXlQQPeA2JpEjVEGURL7EePkLCU3Rqw5Wo4EmLALVgaC9BUrk392OAWt0HUBPHrb+NQq4i5UzigeSU6Zsii5xOYiWLE0BCT1Z89QVKLD2dPEIbdEBasINWIDaiDxG2BjslpBXXTk5CeWFkYa1a2KuS0OMBfJ8RgdKzMr03DRP5Ojy5O8sE2ksdU1g+pcu+SqvILUWddNCBHbCIxvpj/s9ZsO/xXfC57OAQAA|zcat|convert -scale $1 svg:- png:-|xview stdin

Це та сама техніка, що і у відповіді @ minitech . Але дані .svg походять звідси, що набагато коротше: http://commons.wikimedia.org/wiki/File:Euro_symbol_black.svg . ImageMagick перетворює векторні дані в .png дані в потрібному масштабі і передає xview.

Вихід для ./euro.sh 30:

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

Вихід для ./euro.sh 300:

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


7
Чому велика версія не заповнена?
Коул Джонсон

2
як можна виводити зображення на stdin?
phuclv

@ LưuVĩnhPhúc Ви не можете "вивести" на стандартний вхід. Він просто надсилає набір символів base64, це програма, яка декомпілює його у двійкові маркери (мабуть, представляє SVG-файл), з яким він робить більше матеріалів.
Томмедінг

2
@tomsmeding Я вважаю, що їх збентежила назва "вікна".
МНІІП

@ColeJohnson Я думаю, що жодна версія не заповнена, але на невеликій версії внутрішня та зовнішня лінії виглядають досить близькими, щоб здаватися суцільними. Сказавши, що з ImageMagick явно відбувається якась дивна рівнозначна річ, яку я не повністю розумію, - але я думаю, що сформоване зображення досить близьке для коду-гольфу ;-)
Digital Trauma

2

POV-Ray (370 байт)

Я не міг зрозуміти, як відобразити ту саму вертикальну площу і зберегти співвідношення сторін одночасно, тому вирішив перейти на правильну висоту і її до користувача, щоб відображати лише у форматі 4: 3

camera{angle 9 location 102*z right x*8 up y*6 look_at 0}
light_source{99*z color 1}
plane{z,0 pigment{color rgb 1}}
#declare b=difference{box{<-5,-.5,1>,<8,.5,1>}box{-2,2 rotate-67*z translate 9.4*x}}
difference{union{torus{5.5,.5 rotate 90*x}object{b translate y}object{b translate -y}}box{<-3.83,-5,-3>,<-7,0,3>}box{<0,7,3>,<-4,-2,-3>rotate 23*z translate-2.5*x}}

бігати з povray.exe /RENDER euro.pov -w600 -h800

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


2

Обробка, 232 байти

Обробка насправді не дозволяє приймати аргументи командного рядка, оскільки вона настільки спеціалізована для малювання, але моя функція приймає параметр як висоту для компенсації. Координати жорстко закодовані / наближені до зображення вище, і все полотно масштабується на основі вхідного параметра, щоб отримати малюнки довільних розмірів.

void E(int h){scale(h/12,h/12);noFill();strokeWeight(1);arc(7.5,6,11,11,0.7,PI*2-0.7,OPEN);noStroke();fill(0);shearX(-PI/6);rect(3.2,4.5,9,1);rect(4.4,6.5,8,1);shearX(PI/6);fill(255);rect(11,6,9,6);triangle(8.75,6,12.25,6,12.25,0);}

Ungolfed + вся програма

void setup()
{
  size(575, 500);
}

void draw()
{
  background(255);
  E(height);
  noLoop();
}

void E(int h)
{
  scale(h/12,h/12);
  //Main "C"
  noFill();
  strokeWeight(1);
  arc(7.5,6,11,11,0.7,PI*2-0.7,OPEN);
  //settings for other shapes
  noStroke();
  //the two bars
  fill(0);
  shearX(-PI/6);
  rect(3.2,4.5,9,1);
  rect(4.4,6.5,8,1);
  //bottom cut of "C"
  shearX(PI/6);
  fill(255);
  rect(11,6,9,6);
  //top cut of "C"
  triangle(8.75,6,12.25,6,12.25,0);
}

Вихід

Обробка ескізу Євро


1
Ви можете грати в гольф, використовуючи 1замість OPEN, а змінюючи 255в backgroundі fillвиклики-1
Kritixi Lithos
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.