Ваша цель - написать кодировщик семафоров флагов , который преобразует данное предложение в соответствующие символы семафоров флагов в соответствии с системой семафоров, описанной в Википедии .
Предположим, что вход представляет собой одно предложение, предоставленное через стандартный ввод (или эквивалентный). Ваш вывод должен быть последовательностью символов семафора, каждая строка представляет одно слово из предложения. Вам нужно иметь дело только с алфавитом (AZ) и игнорировать все другие непробельные символы, но вы должны уметь обрабатывать как прописные, так и строчные буквы. Ваш вывод может содержать лишние пробелы.
Символы семафора должны отображаться в виде квадрата 3x3 с O
серединой и позициями флагов, представленных символами | - / \
. Каждый символ семафора должен быть отделен от соседних символов пробелом, а каждая строка должна быть отделена пустой строкой. Не беспокойтесь о переносе слов, которые могут быть слишком длинными для вашего дисплея - представьте, что ваши строки имеют бесконечную длину.
Пример ввода:
abcdefg hijklmn opqrstu vwxyz
Пример вывода:
\ | /
O -O O O O O- O
/| | | | | | |\
\ | | /
-O O O- O O O- O
/ / / / / / \
\ | / \| \ /
-O -O -O -O- -O O O
\
| / / \
O O- O O- O-
\ \ \
Пример ввода:
This is Code Golf.
Пример вывода:
\| \
O -O O -O
/ / \
\
O -O
/ \
\ \ | /
O -O O O
| | |
\ /
O -O O O-
|\ / |
Поскольку это код-гольф , выигрывает самое короткое решение.
and each row must be separated by a blank line
=> каждое слово подразумевается, не так ли?Ответы:
Perl,
282264251247245243241240236233229227220218216214 символовС некоторыми претенциозными переносами строк:
Мне потребовалось некоторое время, чтобы заставить это работать (моя первая попытка ответа Perl). Это основано на идее, подобной многим другим ответам. Каждый флаг может быть в одной из 8 позиций, есть два флага, и эти два флага никогда не могут быть в одной и той же позиции. Это означает, что я могу кодировать положение обоих флагов в один байт - что также означает, что я могу переводить непосредственно из символа в его кодировку, используя
y///
функцию Perl (оператор?). Так:-Следовательно:
Я избежал изрядного числа символов, которые находятся за пределами обычного используемого диапазона, чтобы упростить копирование и вставку программы - но я вполне уверен, что мог бы написать программу, заменяющую escape-коды самими символами, спасающими меня примерно 30 символов.
источник
Питон,
244238233232Это использует мой любимый трюк: однотрековое кодирование. Я пометил биты семафора (биты)
получить следующую диаграмму, какие биты встречаются для какой буквы:
каждая буква встречается на диаграмме ровно дважды, так как у сигнальщика есть две руки. Затем я рассматриваю это как график букв az с ребрами между буквами, разделяющими sbit, с ребрами, помеченными в соответствии с общим sbit. В идеале я бы нашел путь Гамильтона через этот граф, чтобы последующие ребра не имели одинаковую метку. Таких путей не существует ... поэтому вы заметите, что переменная
e
содержит буквуb
дважды.На моем почти гамильтоновом пути
e
яd
создаю массив меток sbit, используемых при обходеe
. Затем, чтобы выяснить, куда положить руки, связисту нужно только найти нужную букву в следующей удобной таблице.откуда ее руки переходят в положение непосредственно под, а под и справа от буквы.
источник
to_lower()
наlower()
. Кроме того, он выдал ошибку, когда я попытался дать не алфавитный ввод.Скала, 272 персонажа
Ungolfed (ну, меньше в гольф):
источник
Рубин, 287 символов
Ввод должен быть дан на STDIN.
источник
Scala
494 без перевода строки520 с переводом строки:ungolfed:
Объяснение:
Я наблюдал схему часов, но не с 12 часами, а с 8. И время начала равно 0, где 6 часов, а a, b, c - первые коды с первым (одним) флагом на юге.
Поскольку флаги 1 и 2 неразличимы, мы можем сначала отсортировать все комбинации с меньшим числом по первому флагу. К сожалению, порядок с самого начала нарушается, когда j не следует за i, но k, l, m, и позже это становится беспорядком.
Поэтому я переставляю свои ключи для сопоставления:
Если мы вычтем 'a' из каждого символа, мы получим числа от (0 до 7 + 6 + 5 + ... + 1). Мы можем сопоставить номера персонажа-сетки
Пара из двух чисел может отображать два флага, где первое число является индексом от 0 до 6 для первого флага, а второй флаг не является числом от 1 до 7 для второго флага, но для расстояния от с первого на второй флаг. (2,2) означало бы, что первый флаг - WEST, а второй - два шага по часовой стрелке оттуда к СЕВЕРУ.
источник
object Main extends Application
блок, но этого оказалось недостаточно.readLine
в последней строке,"readLine"
он должен работать (код совместим с 2.8).Haskell
331357339 символовGolfed:
Ungolfed:
Кодирование - это
[hour, minute]
когда часы имеют 8 часов и 8 минут. Минуты движутся быстрее, чем часы. Если часы показывают, где час и минута равны, добавьте 1 к часу и 2 к минуте (см. Пример второго тика выше). Это единственный способ увеличить часы. Часы НЕ увеличиваются, когда минута достигает некоторой произвольной минуты. Только когда минуты равняются часам. В коде ungolfedclock
превращает буквы в часы, которые представляют семафор. Большинство часов построены на основе тиканья из предыдущих. Остальные жестко запрограммированы. В коде нет ничего особенного.источник
Perl,
356, 275 символовБольшое количество символов было сохранено путем замены «если еще» на «? :' строительство.
источник
<>
вместо,$ARGV[0]
вы можете взять ввод из stdin и использоватьlc
для преобразования всех символов в нижний регистр. Это дает вам дополнительное преимущество: вы экономите 4 символа. Он также не обрабатывает не алфавитные символы, но, возможноYou only need to deal with the alphabet (A-Z) and should ignore all other non-space characters
, не очень ясно, что с ними делать ...PowerShell ,
198192191188 байтПопробуйте онлайн!
Выход содержит одну пустую хвостовую строку.
Меньше гольфа:
источник
Древесный уголь , 70 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Разделите ввод в нижнем регистре на пробелы и зациклите каждое слово.
Зацикливайтесь на каждом персонаже.
Разбить сжатую строку
fjmrwyz gnsvxz abcdefg ahiklmn bhopqrs ciotuy djkptv elquwx
на пробелы и выполнить цикл по каждой группе букв.Если группа содержит текущую букву, нарисуйте линию в текущем направлении.
Поверните на 45 ° по часовой стрелке.
Выведите центр
o
и переместитесь в положение следующей буквы.Перейти к началу следующего слова.
источник