ICS Морской флаг алфавит


14

Алфавит флага Международного кода сигналов используется судами для связи, особенно для статических сигналов.

Ваша задача - написать программу или функцию, которая будет принимать строку из STDIN или в качестве аргумента и отображать соответствующий текст в алфавитном флаге ICS. Если ваш язык не отображается на экране, сохранение в файл приемлемо.

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

Дисплей должен быть достаточно большим, чтобы отображать, по меньшей мере, 8 флагов по горизонтали и 6 флагов по вертикали. Поведение не определено, если правый край достигнут до того, как получена новая строка, или если сообщение слишком длинное, чтобы поместиться на дисплее вертикально.

Алфавит флага показан ниже (латинские буквы приведены только для справки, они не требуются при выводе).

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

Габаритные размеры

Не существует универсально согласованного стандарта для размеров этих флагов, поэтому для целей этой задачи должно применяться следующее:

Флаги должны быть 60x60 пикселей, с промежутком в 30 пикселей между ними как по горизонтали, так и по вертикали.

Обрезка ласточкиного хвоста на А и В должна иметь глубину 15 пикселей.

Все остальные линии должны быть горизонтальными, вертикальными или под углом 45 градусов.

Элементы должны быть расположены путем деления флага на воображаемую сетку NxN со стороной 3,4,5 или 6 квадратов. Обратитесь к изображению выше, но для уточнения:

A, E, H, K, L и U основаны на сетке 2x2: ширина каждой цветовой зоны должна составлять 30 пикселей. Также точки алмаза в F должны быть на полпути вдоль каждой стороны флага.

J и T основаны на сетке 3x3: каждая полоса должна быть 20 пикселей.

P, N и S основаны на сетке 4x4. Также диагональные линии Y должны разделить края флага на 4.

C, D, R и X должны быть основаны на сетке 5x5. Ширина полос и крестов должна составлять 12 пикселей.

G, W, M, V основаны на сетке 6x6. Полосы G и границы W должны иметь ширину 10 пикселей. Крестики на M и V должны покрывать первые и последние 10 пикселей каждого края флага, оставляя треугольные зоны размером 40 пикселей по длинному краю.

Круг I должен быть в центре флага и иметь диаметр 30 пикселей.

Ошибка в +/- 1 пиксель из приведенного выше текста допускается. Если ваш язык поддерживает только масштабируемую графику, вы можете интерпретировать «пиксели» как «единицы».

Цвета

Цвета должны быть красным, белым, синим, желтым и черным в соответствии с вашим языком или документацией. Если ваш язык не определяет цвета, вы можете использовать следующее: красный FF0000, белый FFFFFF, синий 0000FF, желтый FFFF00, черный 0000000.

Фон должен быть серым (каналы r, g и b равны, интенсивность между 25% и 75%.)

Скоринг / лазейки

Это кодегольф. Самый короткий код в байтах побеждает.

Стандартные лазейки запрещены.

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

пример

JFK got
my VHS
PC
and XLR
web quiz

должен произвести следующее

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


Я не совсем уверен, что вы подразумеваете под « Дисплей должен быть достаточно большим, чтобы отображать по крайней мере 8 флагов по горизонтали и 6 флагов по вертикали », особенно учитывая, что в вашем тестовом примере вывод выводится только с 5 флагами. Это просто, что ответы должны обрабатывать сообщения вплоть до этих измерений и не должны обрабатывать большие, или вы намереваетесь требовать, чтобы все строки были дополнены как минимум до 8 символов, а все сообщения - как минимум до 6 строк?
Питер Тейлор

1
@PeterTaylor Если ваша программа или язык достаточно умны, чтобы изменить размер дисплея в соответствии с выводом, нет необходимости дополнять дисплей до 8x6, если вывод меньше. Выходные данные должны иметь серый фон и быть прямоугольными (все линии должны быть заполнены по крайней мере до длины самой длинной строки.)
Уровень River St

Ответы:


15

CJam, 464 байта

Вы думали, что у CJam нет функций манипулирования изображениями? Ну, ты думал правильно! Но я не позволил этому остановить меня.

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[{XY+Z<[E8][9C]?XY<=}WWWW{XH<9F?}C{YC/[9FCF]=}{YC/3&9E?}{YH<9F?}{X29.5:R-zYR-z+H>FC?}{XA/1&9E?}{XH<FC?}{XR-_*YR-_*+F_*>E8?}{YK/(9F?}{XH<E9?}{XH<YH<^8E?}{XY+Z-A/XY-A/e&9F?}{XF/YF/^1&F9?}{XY<EC?}{XH-F/YH-F/|9F?}E{XHm6/YHm6/e&CE?}{XH-F/YH-F/|F9?}{XK/[CF9]=}{XH<YH<^FC?}{XY+Z-A/XY-A/e&FC?}{XR-zYR-ze>iA/[CF9]=}{XHm6/YHm6/e&F9?}{XY+F/1&CE?}]=:P~!!{60:Z{Z30:HYH-z-N*-{YV+_2$=XU+P2b1>4f*tt}fX}fY}*U90+:U;}/V90+:V;}/`"[]"-

Эта программа наилучшим образом выводит изображение, которое может CJam: в виде текста, представляющего изображение при сохранении в виде файла PPM . Кстати, даже не пытайтесь запустить его с онлайн-переводчиком; ты взорвешь стек Запустите его с интерпретатором Java и передайте вывод в файл с помощью команды вроде java -jar cjam-0.6.4.jar flags.cjam > flags.ppm. После того как вы предоставили свои данные, отправьте EOF (возможно, сразу после новой строки) с помощью ctrl + D в Unix или ctrl + Z в Windows.

Образец

Если это действительно желательно, я могу попытаться вставить оригинальный источник изображения ~ 3MB куда-нибудь. Но вот результат, открытый в GIMP и связанный с PNG:

ABCDEFG
hijklmn
OPQRSTU
vwxyz z

flags_alphabet.png

объяснение

Заголовок изображения, легко идентифицируемый в источнике, состоит из магического числа, ширины, высоты и максимального значения канала. Таким образом, на выходе получается изображение размером 690 * 690 (достаточно для флагов размером 8 * 8 60px с интервалом 30 пикселей между ними) с каждым значением R, G и B в диапазоне от 0 до 4.

Данные изображения инициализируются в виде массива 690 * 690 * 3, заполненного 3, что делает все изображение светло-серым. Затем ввод читается, преобразуется в верхний регистр и разбивается на строки. Строки обрабатываются в цикле, увеличивая координату Y флага на 90 на каждой итерации, и в каждой строке каждый символ обрабатывается в цикле, увеличивая координату X флага на 90 на каждой итерации. Теперь волшебство начинается.

Каждый символ сопоставляется с функцией пикселя флага, которая при вызове возвращает цвет пикселя в позиции (X, Y) на флаге. Вот куда делась большая часть тяжелой работы: кратко описать 26 изображений как математические функции. Каждая из этих функций возвращает значение цвета от 8 до 15. Этот диапазон использует тот факт, что при преобразовании в базу 2 результирующий битовый массив можно интерпретировать как [1, R, G, B]. Первый элемент может быть удален, а остальные умножены на 4, чтобы легко получить значение пикселя в желаемом формате, который охватывает все возможные цвета флага (а также зеленый, голубой и пурпурный). Также хорошо получается, что есть односимвольные переменные, инициализированные до 10-15, и так как переменным не нужно место для синтаксического разделения их,

Как только функция извлечена, нужно просто выполнить итерации по X и Y от 0 до 60, вызвать функцию на каждом шаге и записать результат обратно в массив данных изображения. Проницательный наблюдатель может заметить, что значения цвета, возвращаемые каждой функцией флага, не допускают серого. Так что есть немного дополнительной логики, чтобы пропустить пробелы. Но есть все еще сокращения 'ласточкиного хвоста' на 'A' и 'B'. Так что здесь тоже есть немного дополнительной логики. Если значение символа меньше, чем «C», значение устанавливается таким образом, что верхняя граница в цикле X изменяется правильно относительно Y, и области выреза никогда не рисуются.

В целом, я очень доволен тем, как это получилось. Это заняло много работы, но было весело. Некоторые флаги не совсем соответствуют эталонному изображению, но я думаю, что все фигуры находятся в пределах 1 пикселя от цели (если какие-либо отклонены более чем на это, дайте мне знать, и я исправлю их). И, безусловно, потенциал для оптимизации еще есть, поскольку между функциями 26 флагов существует значительная избыточность.


Интересная первая попытка, 559 байт

Хотя я так и не закончил, я тоже выложу, потому что это довольно интересно. Вместо того, чтобы моделировать каждый флаг функцией (X, Y) → цвет, флаги рисуются в виде композиции простых фигур. Но я беспокоился о необходимости написания значительного количества кода рендеринга для каждой отдельной фигуры. После долгих размышлений я понял, что могу отрисовать их все, с некоторым умным наложением и наложением, только с одной псевдо-формой: все точки в пределах определенного расстояния от указанной точки, где определение «расстояния» является переменным. Расстояние на шахматной доске дает квадрат, расстояние на Манхэттене - ромб, а евклидово - круг. Это означало, что каждая фигура имела одинаковые пять параметров (цвет, режим расстояния, х, у,

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[[8EX30:Q0Q9X60:ZQQCXQZQ]LLLL[F9TTQQ]Ca[9FTQ42QCTQ54QFTQ66Q9TQ78Q][E9TIQI9T42QI][9FTQZQ][FCXQQQ][E9T40QQET50QQ9TZQQET70QQ9T80QQ][FCTZQQ][E8YQQF][9FTQAQ9TQ9~Q][E9TZQQ][8ETTTQETZZQ][F9XQTK9XZQK9XQZK9XTQK][F4{4{JW^1&6*9+TJ)F*W)F*F}fJ}fW][CEX0ZZ][9FTQQF]Ea[E[TZ]_m*{CT@~24}/][F9TQQF][9FTAQQCT9~QQ][FCTTTQCTZZQ]C9$1>9a/Fa*+[9FTQQKCTQQA]9 6$1>Ca/Fa*+[C7{7\-_1&2*C+X@TT@F*}/]]=_!!{([TQQQ]+\+}*5/{~:R;.5-:H;.5-:G;:M;2b1>4f*:O;Z{ZQWQ-z-N*-{JG-{zM_!+#}:P~WH-PM{+}{e>}?RP<{WV+_2$=JU+Ott}*}fJ}fW}/U90+:U;}/V90+:V;}/`"[]"-

1
Отлично, это тот творческий ответ, который я искал. Попробую запустить его позже.
Уровень Река Сен

1
Это, возможно, самый длинный код CJam, который я когда-либо видел. Хорошая работа, хотя, +1.
Алекс А.

Опять же, CJam, кажется, чтобы спасти день.
ASCIIThenANSI

9
К сожалению, публикация кода CJam длиннее 200 байт является федеральным преступлением. Я должен взять тебя под стражу.
Деусови

2

PHP, 811 байт

function f($s){echo"<body bgcolor=#ccc>";$z=split("\n",gzinflate(base64_decode("vVfNasMwDL7vKQK7xlT+iaHQ9LDTLnuIQus6ENhgxS19+kmO0yRrkhbqGIxtyV8sWbIkZ/Prjtm52p9suYbMHqqjPdHMVYfzx/elhBzyNbXtZoXQ7dvm+Q9+dieb7csvZFkJToNlEq6Zqeq6fAcw2arDqCKXUPMCEYQicIc1xmNfUkBDzXgQkpMQ3W0PEGF7fz49dT7IuSCQ1APJ5h9IKAIhdGn1jIHH6oUzvCpZzhtGjoDiePzuzAPJEkG1JPk1uw29G5rC7pxAvAFxuHqd+nQxpCP65S4gR6wzAkphE4rPHfbYaAueky59BrmrZ4wU0Ss8SES/pCNugMduiBSYs25oJTeBSYNMbHO6+bUg22PPhA8E5LCWhT3SFBjEwxaWiOMYD1+FtZSZxateEAZ7pvsEL7w1aQxD3HxLcmayfNA9ZeXzcdteJLm0H5ZITzAwolDkXeGwVAvlSzUOSDDkMRqRxDkuLquVecbKMRKFaESLSYOMg4b6qVHQMnkMns5jyZLBAnksRehirQWrwClEqakDNrqKpjqKpZ8K5rVYTFE56ZmCyT68KinJX+n/puFpyHXg4RRLwg1oW6YipqfimfJTt6/c6XIv6Tnc/HxNXIj+a9nORdwN5Qa3qzvGHw==")));while($c=ord(ucfirst($s))){$s=substr($s,1);echo$c<32?'<br>':($c^32?$z[$c-64]:$z[0]);}}

Сжатый BLOB-объект содержит код SVG для каждого из 26 флагов. Затем простой цикл извлекает и выводит изображение SVG, соответствующее каждому символу ввода.

Пример вывода для «Это \nтест»:

<body bgcolor=#ccc><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#fff /><path d=M30,0h30v60h-30z fill=#f00 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><br><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#00f /><path d=M45,30l15-30h-30v60h30z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v30h-60z fill=#00f /><path d=M0,30h60v30h-60z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg>

( Вы можете попробовать его на ideone , хотя он не будет отображать страницу для вас.)

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