Когда я пишу документацию, комментарии и т. Д., Я люблю создавать таблицы ASCII. Обычно они выглядят довольно неплохо, но я всегда чувствую, что они могут выглядеть еще лучше, особенно с учетом того, что UTF-8 / Unicode содержит символы рисования прямоугольников . Однако эти символы очень обременительны в использовании, для их вставки требуется несколько нажатий клавиш. Твое задание? Напишите программу или функцию, которая может автоматически преобразовывать таблицы ASCII в эквивалент UTF-8 / Unicode.
Этот вызов был изолирован .
Вызов
Напишите программу, в которой в качестве входной строки задана таблица ASCII, и таблица будет перерисована с использованием символов рисования блока Unicode / UTF-8. В частности, символы, которые являются частью таблицы, должны быть переведены следующим образом:
(Unicode, 3 bytes each in UTF-8)
- to ─ (\u2500)
| to │ (\u2502)
= to ═ (\u2550)
and + to one of:
┌ (\u250C), ┐ (\u2510), └ (\u2514), ┘ (\u2518),
├ (\u251C), ┤ (\u2524), ┬ (\u252C), ┴ (\u2534),
┼ (\u253C)
or, if '=' on either side:
╒ (\u2552), ╕ (\u2555), ╘ (\u2558), ╛ (\u255D),
╞ (\u255E), ╡ (\u2561), ╤ (\u2564), ╧ (\u2567),
╪ (\u256A)
Детали
I / O:
- Ввод / вывод по умолчанию разрешен
- Вы можете принимать данные в любом приемлемом формате, включая таблицу в виде строки или путь к файлу, содержащему таблицу.
- Вы можете вывести в файл и принять имя файла в качестве дополнительного аргумента.
- Однако вы не можете изменять входной файл . (Следует сохранить для удобства редактирования в будущем)
Входные данные:
- Вы можете предположить, что каждая строка ввода дополнена до одинаковой длины
.
- Вы не можете предполагать, что первый символ после новой строки является частью границ таблицы (так как это может быть пробел).
- Ввод считается действительной таблицей, если все символы (которые являются частью таблицы)
-=|
связаны ровно с двумя символами и+
связаны как минимум с одним символом как по горизонтали, так и по вертикали. - Ваша программа может не выдавать ошибок с допустимыми данными.
- Если ввод недопустим, поведение не определено, и вы можете произвести любой вывод.
- Входные данные могут содержать любые символы UTF-8, включая символы рисования блоков.
Выход:
- Любой из символов
-=|+
, которые не являются частью таблицы, должен быть оставлен как есть. - Точно так же любые другие символы должны быть оставлены как есть.
- Разрешается использовать только один начальный и / или завершающий символ новой строки.
Другой:
- Стандартные лазейки запрещены, как обычно.
- Если у вашего предпочтительного языка есть встроенный модуль, который решает эту проблему, вы не можете его использовать.
- Это означает, программы, функции, подпрограммы или инструкции, которые были бы действительными представлениями для этой задачи без дополнений.
- Каждый из символов, необходимых в этой задаче, имеет длину три байта, когда они закодированы в UTF-8.
Связанные персонажи :
Персонаж связан с другим, если:
- Это
|
и есть прямо над или под+
или|
; - Это
-
и есть непосредственно до или после+
или-
; - Это
=
и есть непосредственно до или после+
или=
; - Он находится
+
и находится непосредственно над или под|
или+
, или непосредственно перед, или после-
,=
или+
.
Символ считается частью таблицы, если он связан с любым символом, который является частью таблицы. По определению, первая +
во входных данных является частью таблицы.
Примеры
Примеры доступны здесь в виде копируемой версии.
Input: Output:
+------------------+ ┌──────────────────┐
| Hello+World! | │ Hello+World! │
+==================+ ╞══════════════════╡
| This is+my first | -> │ This is+my first │
|+-+ code|golf +-+| │+-+ code|golf +-+│
|+-+chall|enge! +-+| │+-+chall|enge! +-+│
+------------------+ └──────────────────┘
+===+===+===+ ╒═══╤═══╤═══╕
| 1 | 2 | 3 | │ 1 │ 2 │ 3 │
+---+===+===+===+ ┌───╪═══╪═══╪═══╡
| 1 | 1 | 2 | 3 | │ 1 │ 1 │ 2 │ 3 │
+---+---+---+---+ -> ├───┼───┼───┼───┤
| 2 | 2 | 4 | 6 | │ 2 │ 2 │ 4 │ 6 │
+---+---+---+---+ ├───┼───┼───┼───┤
|-3 |-3 |-6 |-9 | │-3 │-3 │-6 │-9 │
+===+---+---+---+ ╘═══╧───┴───┴───┘
+-----+ -> <Undefined>
+-----+ -> ┌─────┐
+-----+ └─────┘
+-----------------+
| Hello, World! |
| This is invalid | -> <Undefined>
| input |
-----------------+
++++ ┌┬┬┐
++++ -> ├┼┼┤
++++ └┴┴┘
+--+
++++ -> <Undefined>
+--+
В заключение...
Это код-гольф , поэтому выигрывает наименьшее количество байтов. Удачного игры в гольф!
+-+
выдержки не считаются связанными таблицами?Hello World
таблицу, внутренние таблицы не считаются образующими таблицу, потому что текст внутри таблицы должен оставаться неизменным, и они не считаются частью границ внешней таблицы, поскольку они не связаны с ними должным образом.+----+
пример, это будет потому, что направление углов будет неоднозначным.Ответы:
Python 3,
392281 байтПроигрывает это намного больше и преобразуется в рекурсивное решение вместо итеративного:
Принимает строку строк одинаковой длины, разделенных символами новой строки, и возвращает строку в том же формате. Может выдать исключение при неверном вводе.
Предыдущее решение:
Безголовая версия:
источник
Python 3 ,
914898827823594587569540469 байтРедактировать: значительно изменила стратегию, теперь создавая битовое поле соседей (похоже на ответ мертвого опоссума). Я оставил более раннюю версию ниже.
Попробуйте онлайн!
Ввод осуществляется в виде списка списков символов, который изменяется по месту. Рекурсы из первого +, который он находит.
Попробуйте онлайн!
Вот самая близкая вещь, которую я имею к неопрятной версии:
источник
JavaScript,
311307 байтПоказать фрагмент кода
объяснение
Начиная с первого найденного
+
перекрестка, программа пытается найти пути к другим перекресткам в каждом направлении, выполняя замены по мере необходимости. Он сохраняет найденные направления и «двойное» состояние в растровом изображении, которое затем определяет соответствующий символ соединения.источник
Python 3 , 599 байт
Я не очень хорош в гольфе в Python 3, но (к моему стыду) я не смог получить нормальный вывод символов UTF-8 в Python 2. Итак, мы здесь.
Я думаю, что единственный интересный трюк здесь - это решение о
+
трансформации.Я закодировал все возможные варианты с 4-битными адресами. Каждый бит адреса напоминает связь с соседней ячейкой. Итак, 0 - нет связи и 1 - нет связи.
1111
is┼
0011
is┐
etc
Некоторые конфигурации соединений недопустимы и заменены фиктивными значениями:
'012┐45┌┬8┘0┤└┴├┼'
Если в любой соседней ячейке содержится
=
, второй список будет использоваться с удвоенными строками.Адрес комбинируется здесь.
r
содержит длину строки 8, где каждые два символа равны 1/0, а фактический символ соседнего символа.Например:
1+0y1-1|
.Это используется для выбора списка замен, как показано ранее. А затем заключили договор на адрес:
int(r[0::2],2)
Эта лямбда-выражение использовалось для проверки правильности координат ячейки, а символ ячейки равен «+ - | =»
Эта лямбда раньше получала символ из клетки. Возвращает,
' '
если координаты неверны. (определенно можно играть в гольф)Условия для рекурсии. Может быть, в гольф тоже.
Попробуйте онлайн!
источник