Искусство украдено у какого размера цифра?
7-сегментные цифры могут быть представлены в ASCII с использованием _|
символов. Вот цифры 0-9
:
_ _ _ _ _ _ _ _
| | | _| _| |_| |_ |_ | |_| |_|
|_| | |_ _| | _| |_| | |_| _|
Ваша работа состоит в том, чтобы разобрать искусство в нормальные числа.
Примечания по номерам
- Каждая цифра имеет разную ширину.
1
имеет ширину1
3
и7
в2
ширину245689
и0
все3
широко
Также между каждой цифрой есть один символ заполнения. Вот полный набор символов:
// <- должен быть один пробел, но SE форматирование испортило | | ------------- _ _ | | _ ------------- _ _ | _ | ------------- | _ | | ------------- _ | _ _ | ------------- _ | _ | _ | ------------- _ | | ------------- _ | _ | | _ | ------------- _ | _ | _ | ------------- _ | | | _ |
вход
Ввод может быть либо из консоли, либо в виде строкового аргумента функции.
Выход
Вывод либо выводится на консоль, либо возвращается из функции.
Примеры:
_ _ _
| | | |_
| | | |_|
1776
_ _ _
_| | | | |_
|_ |_| | |_|
2016
_ _
| |_| |_| |_
| _| | _|
1945
_ _ _ _ _ _
| | | | | | | | | | | | |
| |_| |_| |_| |_| |_| |_|
1000000
_ _ _ _ _ _ _ _
| | | _| _| |_| |_ |_ | |_| |_|
|_| | |_ _| | _| |_| | |_| _|
0123456789
Это код-гольф, поэтому выигрывает самое короткое число байтов!
Ответы:
Pyth,
3330 байтВот идея: как только мы транспонируем ввод и разбиваем на цифры, мы можем сортировать строки отдельных цифр и назначать их значениям.
Попробуй это здесь .
источник
Рубин, 184 байта
объяснение
Это мой первый код-гольф. Спасибо за веселье!
источник
Pyth, 39 байт
Это похоже на работу? Попробуйте онлайн .
источник
Japt, 119 байт
Try it here!
О боже, этот действительно длинный. Я не думаю, что я закончил играть в гольф.
объяснение
подготовка
Мы берем входные данные и конвертируем любые
|_
в1
. Затем мы транспонируем, удаляем конечные пробелы и разбиваем вдоль двойных строк.Перевод
Мы отображаем полученный массив и находим индекс, где форма появляется в ссылочном массиве. Вот диаграмма, чтобы помочь:
После этого мы объединяем массив чисел и выводим!
ПРИМЕЧАНИЕ . Возможно, вам интересно, почему мы должны поменять каждого художественного персонажа на серию из 1. Это потому, что, кажется, есть ошибка (или что-то в этом роде), которая не позволяет мне хранить символы как есть
|_
.источник
_
ошибку, но я не знаю, что ее вызвало."\n\n"
можно заменить наR²
и"\\||_"
с"%||_"
. Я думаю , вы можете также сохранить некоторые байты , кодирующие длинную строку в базе 4 (изменение каждого из 4 disinctive символов на0
,1
,2
, или3
, набивка на длину кратную 4, то работаетr"...."_n4 d}
над этим), но по какой - то причине Я не получил это работать еще.Python2,
299261244 байтаМне очень понравился этот вызов, хорошая работа!
объяснение
Функция
s
принимает три строки в качестве входных данных, она пытается найти разделение цифр (все символы - пробелы). Когда такое разделение обнаружено, оно вызываетs
остальные три строки и добавляет значение, возвращаемое вызовом, к трем строкам, которые составляют цифру. Если нет разделения, это означает, что есть только одна цифра.Функция
p
является точкой входа, поэтому она принимает строку, представляющую цифры. Цифры хранятся в виде «хеша», вычисляемогоsum(ord(c)**i for i,c in enumerate("".join(n)))%108
для экономии места (благодаря другим ответам!).Exemple
Другие версии
261 байт (py3):
249 байт, этот транспонирует строки (py2):
источник
JavaScript (ES6), 169 байт
Начнем с того, что разделим на три строки, переназначим каждый столбец в значение, а затем создадим уникальный идентификатор для каждого столбца из этих значений. Затем он разделяется на
0
(идентификатор пространства между столбцами) и, наконец, сопоставляет каждую идентичность с ее числовыми значениями, которые он объединяет и выводит.источник
join
в строку, чтобы разделить ее. Я полагаю, вы могли бы сделать это и на Python?Python 3,
281254 байтаредактировать
Я просто посмотрел код для другого ответа Python и заметил, что большая часть кода похожа. Это было достигнуто независимо.
(новые строки добавлены для «читабельности»)
Ungolfed:
тесты:
Как это устроено
(Примечание: здесь я объясняю некоголфированную программу, поскольку она более читабельна и имеет точно такой же код, за исключением того, что
digit
функция встроена в лямбду)Основная функция есть
parse
. Сначала он разбивает входные данные на строки и создаетnumbers
массив.Это моя любимая часть (так как это заняло так много времени). Здесь мы
zip
линии, так что мы можем в основном вертикально пройти ввод. Когда в строке есть символы, мы добавляем ее к последнему числу вnumbers
массиве. Если на нем нет символов, мы добавляем новый номер в массив.Действительно простой,
numbers
отображается с помощьюdigit
функции и преобразуется в строку.Это (довольно) просто.
fingerprint
является строковым представлением цифр, созданных выше, минус первые 2 символа (это был самый маленький отпечаток, который я мог найти). Мы возвращаем индекс первого матча.источник
Haskell,
270207 байтНе будь слишком жестким, это моя первая в истории программа на Haskell;) Я почти уверен, что это может быть продолжено, но я не знаю, как, учитывая мои ограниченные знания языка.
Ungolfed:
Большое спасибо @nimi за советы!
источник
import Data.List
в свой счетчик байтов. Хорошие новости: а) если выData.Lists
установили, вы можете импортировать его и заменитьa
наsplitOn
:...map c$splitOn[" "]$transpose...
и...f<-splitOn",""|_...
. б)intercalate "" n
естьconcat n
илиid=<<n
. в) заменитьres
одним именем буквы. г) использование модели охранники вместо того , чтобыlet ... in
:c n|e<-drop 2$id=<<n,Just r<-elemIndex ... ]=(show r)!!0
.=<<
делает? Ни документы Google, ни тип подписи не очень полезны для меня.=<<
в контексте списка естьconcatMap
, то есть он отображает данную функцию над списком и объединяет результаты в один список.>>=
делает то же самое, но с переброшенными аргументами.id =<< n
(илиn >>= id
) отображает функцию идентичности над списком (списков), то есть ничего не делает с подсписками и объединяет их. Так что это так же, какconcat
.