Морський прапор ICS абетка


14

Міжнародний кодекс алфавіту сигналів застосовується суднами для зв'язку, зокрема для статичних сигналів.

Ваше завдання полягає в тому, щоб написати програму або функцію, яка буде приймати рядок з STDIN або як аргумент, і відобразити відповідний текст в алфавіті прапора ICS. Якщо ваша мова не відображається на екрані, збереження у файлі є прийнятним.

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

Дисплей повинен бути досить великим для відображення, здатного відображати щонайменше 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 мають базуватися на сітці 5х5. Полоси та руки хрестів повинні бути шириною 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%.)

Оцінка / Лазівки

Це кодегольф. Виграє найкоротший код у байтах.

Стандартні лазівки заборонені.

Ніякі вбудовані або бібліотечні функції для відображення прапорів не можна використовувати. Вихід повинен бути нетекстовим (і, зокрема, символи Unicode не повинні використовуватися для створення форми прапора.)

Приклад

JFK got
my VHS
PC
and XLR
web quiz

повинні створити наступне

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


Я не зовсім впевнений, що ви маєте на увазі під " Дисплей повинен бути достатньо великим, щоб відображати принаймні 8 прапорів по горизонталі та 6 прапорів вертикально ", особливо якщо врахувати, що ваш тестовий випадок має вихід, який становить лише 5 прапорців. Це лише те, що відповіді повинні обробляти повідомлення відповідно до цих розмірів, і не потрібно обробляти більші, або ви маєте намір вимагати, щоб усі рядки були заміщені щонайменше на 8 символів, а всі повідомлення - принаймні на 6 рядків?
Пітер Тейлор

1
@PeterTaylor Якщо ваша програма чи мова достатньо розумні, щоб змінити розмір дисплея відповідно до виводу, немає необхідності розміщувати дисплей до 8x6, якщо вихід менший. Вихід повинен мати сірий фон і бути прямокутним (усі лінії набиті принаймні довжиною найдовшої лінії.)
Рівень річки Св.

Відповіді:


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.

Зразок

Якщо це дійсно бажано, я можу спробувати десь вставити оригінальне джерело зображення ~ 3 Мб. Але ось результат, відкритий у GIMP та об'єднаний у PNG:

ABCDEFG
hijklmn
OPQRSTU
vwxyz z

flags_alphabet.png

Пояснення

Заголовок зображення, легко визначити у джерелі, складається з магічного числа, ширини, висоти та максимального значення каналу. Таким чином, вихід - 690 * 690 зображення (достатньо для 8 * 8 60px прапорців з 30px проміжку між ними) з кожним значенням 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) → color, прапори малюються як композиція з простих фігур. Але я хвилювався з приводу необхідності написати значну кількість коду візуалізації для кожної різної форми. Після великого розмірковування я зрозумів, що зможу їх відтворити всі, з деяким розумним перекриттям і перекриттям, лише з однією псевдо-формою: всі точки в межах визначеної відстані певної точки, де визначення "відстань" є змінним. Відстань шахової дошки дає квадрат, відстань Манхеттена дає діамант, а евклідова відстань дає коло. Це означало, що кожна форма мала однакові п’ять параметрів (колір, режим відстані, 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]);}}

Стиснута крапка містить 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.