Нарисуй знак €


61

Цель состоит в том, чтобы вывести или отобразить изображение со знаком евро (евро) в соответствии со следующими характеристиками (игнорируя границу знака).

Знак евро

Источник: http://en.wikipedia.org/wiki/File:Euro_Construction.svg

Правила:

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

7
Хитрый! Пришло время пересмотреть мою геометрию / тригонометрию. Я вижу некоторые координаты, довольно трудно вывести.
Майкл М.

5
Мне пришлось искать «факультативно»
Цифровая травма

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

Mathematica, 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наклоны (об этом позже). Другой содержит то же кольцо, но просто обрезается по координате х точки D. Условия для двух регионов объединяются ||, что действует здесь как единый союз.

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

Полосы между ±.5и ±1.5. Мы можем обрабатывать обе полосы одновременно, беря модуль y , поэтому полосы (бесконечной длины) просто выполняются .5 < |y| < 1.5. Опять же, чтобы взять союз полос и кольца, я просто использую ||.

Интересно, наверное, как получить «маски», хотя. Точка Dимеет координату х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)(нижняя полоса). Так что это потребовало бы двух независимых правил для двух полос. Однако обратите внимание, что все точки, затронутые нижней маской, находятся в нижней полосе и, следовательно, имеют отрицательный у . И все точки, на которые влияет верхняя маска, имеют положительный у . Так что я могу просто переключить мое смещение с помощью 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, поэтому я буду благодарен за некоторые комментарии к вашему коду!
Томас В.

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 (изменить origin) и 25, эквивалентно оператору PLOT, который принимает дополнительный параметр действия (рисовать линию, окружность, треугольник и т. д. на заднем плане / переднем плане с относительным / абсолютным перемещением) перед параметрами X и Y.

Так что все, что мне нужно сделать, это отправить нагрузку символов на контроллер VDU. значения, оканчивающиеся точкой с запятой, являются 16-битными. другие 8 бит. Общее количество байтов, отправленных на контроллер VDU, равно 91 , хотя это само по себе не может считаться ответом, поскольку на этом этапе размер жестко закодирован.

Очевидное место для происхождения - центр круга, но на самом деле в создании баров задействовано больше команд. Поэтому я сместил начало координат вниз на 1,5 к нижней части нижней полосы, что уменьшает количество требуемых дробей и отрицательных чисел. Он остается на вертикальной линии с центром круга, что важно, потому что линия E начинается с этой вертикальной линии.

На самом деле мне нужно было только вычислить 3 числа на чертеже: верхний внутренний угол формы C (5 cos 40, 5 sin 40 + 1,5) = (3.8302,3.1394 + 1.5) = приблизительно (12 / 3.1, 4.6) и градиент линии E: x / y = 3,8302 / (6 + 3,1394) = 0,4157 = приблизительно 1 / 2,4

Поскольку у меня есть только бесплатная ознакомительная версия (интерпретированная), я принимаю высоту символа в качестве пользовательского ввода. Если вы покупаете полную версию (29,99GBP), вы можете скомпилировать и затем прочитать командную строку с помощью 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 все еще разрабатывается, в основном для мобильных устройств.
Уровень Река St

На самом деле! Я думаю, что мы получили наш в 1984 году. Я помню, как рисовал классные спрайты на миллиметровой бумаге, а затем вырабатывал их двоичные представления, как я уверен, что вы это сделали. На какой ноте я просто нарисовал твой символ евро от руки. Это очень хорошо, как только опечатка исправлена, и предпоследнее значение изменено с 30 на 33. Я вижу из вашего профиля, что вы также использовали LOGO, что снова возвращает меня к моим начальным школьным дням. Здорово узнать, что 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).
Томас В.

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-minification-fu

Предостережения:

Вышеприведенный код со всеми разделенными пикселями работает в 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трюк мог получить мое воздержание в одиночку.
manatwork

это именно то, что я начал писать вчера. ложные точки для вас тогда
Einacio

установка идентификатора на div и использование getElementByIdуменьшает 6 симв. а затем вы можете использовать идентификатор в CSS, чтобы уменьшить еще 2
Einacio

Кроме того, pзакрывающий тег может быть опущен, если после него больше нет содержимого (по спецификации). и я также проверил бы, если браузеры автоматически закрывают div(хотя это запрещено спецификацией, это работает в скрипке на FF)
Einacio

@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

+ Левые края горизонтальных полос не выровнены.
user2846289

@ m.buettner Наиболее важные имена PostScript могут быть выражены с использованием двухбайтовой последовательности. Это на самом деле не компиляция, как если бы вы компилировали программу на C или Java. Он будет проходить через тот же процесс синтаксического анализа, что и любая программа PostScript. Если вы посмотрите на hexdump или откроете двоичный файл в текстовом редакторе, вы увидите, что он почти такой же, как версия ASCII, но большинство имен были заменены двухбайтовой последовательностью.
Томас В.

@VadimR У тебя острый глаз! Я предполагаю, что я обменял слишком много точности для краткости (округление слишком агрессивно). Возможно, мне придется добавить несколько цифр.
Томас В.

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(...)вызов.
Alconja

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()это гораздо более эффективный способ масштабирования числовых значений. Этот код производит тот же вывод, что и оригинальная версия. (Изменить: дальнейшие сокращения благодаря Einacio )

<?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? х = 60

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

euro.php? х = 200

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


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

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

Ах! Теперь я вижу хитрость: text/htmlwith <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
Разве это не подпадает под стандартную лазейку жесткого кодирования вывода?
user80551

4
Это определенно подпадает под категорию «стандартные лазейки».
Igglyboo

2
@Igglyboo: как так?
Ry-

18
Это очень длинный ответ на вызов Code-Golf. :-)
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. Не то чтобы люди этого не понимали, программисты просто ленивы (по крайней мере, я). Ваш комментарий кажется немного резким.
Майкл М.

@ Я думал, что HTML + CSS + JS называется DHTML?
kinokijuf

6

PostScript, 270

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

Это просто определяет контур путем добавления элементов контура на основе координат, которые я рассчитал с помощью GeoGebra, а затем заполняет контур.

Я сохранил несколько символов, добавив ярлыки для lineto( /l{lineto}def) и источник круга ( /o{0 0}def).

Чтобы указать другой размер, добавьте команду формы после первой пустой строки.height width scale

При самостоятельном запуске он рисует знак евро в левом нижнем углу страницы с размером страницы по умолчанию. Просто сохраните его как anything.psи просмотрите с помощью средства просмотра документов.

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

размер по умолчанию в 90 ppi

В 4x размере:

4x размер при 90 ppi

Вы также можете скачать оригинал для собственного просмотра.


2
Читает ли он какой-либо аргумент для определения размера знака?
AL

@ 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

Ungolfed код (с дробями, гольф-код имеет округленные значения)

<?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
как вы можете выводить изображения на стандартный ввод?
phuclv

@ LưuVĩnhPhúc Вы не можете «выводить» на стандартный ввод. Он просто посылает загрузку символов в base64программу, которая декомпилирует ее в двоичные токены (очевидно, представляющие svg-файл), с которыми он делает больше вещей.
Томсминг

2
@tomsmeding Я полагаю, что их смутило название окна "stdin".
Мниип

@ColeJohnson Я думаю, что ни одна из версий не заполнена, но в уменьшенной версии внутренние и внешние линии отображаются достаточно близко, чтобы казаться сплошными. Сказав, что с ImageMagick явно происходят странные псевдонимы, которые я не до конца понимаю - но я думаю, что сгенерированное изображение достаточно близко для code-golf ;-)
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.