Вызов:
Вам будет дано ASCII-изображение кучи весов в качестве входных данных, и вы должны вывести общий вес кучи.
Формат:
Есть 5 различных весов, весом 1, 2, 5, 10, 20 Passerees (или некоторая другая произвольная единица).
Вес выглядит следующим образом, в порядке возрастания:
1: __
|__|
2: ______
|______|
5: ______
| |
|______|
10: ______________
| |
|______________|
20: ____________________
| |
|____________________|
Весы будут размещены симметрично (как в примере изображения), не обязательно в отсортированном порядке. Весы будут разделять границы, где это применимо:
Тестовые случаи:
Вы также можете использовать все веса в качестве тестовых случаев.
__
_|__|_
|______|
| |
|______|
1 + 2 + 5 = 8
____________________
| |
|____________________|
| |
|______________|
_|__|_
|______|
| |
|______|
20 + 10 + 1 + 2 + 5 = 38
______
|______|
|______|
|______|
|______|
2 + 2 + 2 + 2 = 8
Дополнительные правила:
- Вы не можете брать дополнительные пробелы. Наибольший вес будет полностью слева.
- Вы можете использовать конечные пробелы и переводы строк.
- Вы можете предположить, что будет максимум 10 весов
- Вы можете взять ввод в необязательном формате, но вы не можете заменить символы, используемые чем-то другим
Это код-гольф, поэтому выигрывает самый короткий код в байтах для каждого языка. Пояснения приветствуются как всегда.
Ответы:
Желе ,
2423 байтаПопробуйте онлайн!
Как?
Вес может быть идентифицирован по их ширине и высоте. Ширина может быть измерена, глядя на расстояние между
|
символами линии . Если мы сначала удалим все пробелы, то эти веса высоты два будут давать такую линию с измеренной шириной один.Разные веса имеют ширину
3, 7, 7, 15, 21
(для весов1, 2, 5, 10, 20
соответственно). Добавляя трейлинг1
для тех, кто имеет высоту два, мы находим[3],[7],[7,1],[15,1],[21,1]
преобразование из двоичного3,7,15,31,43
числа в целочисленное деление на три1,2,5,10,14
, которое дает нам вес, за исключением случаев, когда14
необходимо заменить на20
.В качестве альтернативы заменить измеренные ширины
21
с30
до преобразования с помощью“ßœ‘y
:источник
Python 2 , 77 байт
Попробуйте онлайн!
[i/21, i%21, ' _'[i<50] for i in [23,48,69,224,440]]
создаст следующие триплеты,[1, 2, '_'], [2, 6, '_'], [3, 6, ' '], [10, 14, ' '], [20, 20, ' ']
которые представляют вес, длину и символ в основе каждого веса, которые будут использоваться для создания уникального однострочного представления каждого веса.Так как 3-й вес будет перекрываться со 2-м, я заменяю его основание его телом (
_
->) и уменьшаю значение до
3
(оно будет считать базу как2
и тело как3
, в результате5
)источник
Сетчатка 0.8.2 , 60 байт
Попробуйте онлайн! Пояснение:
|
s заменяются на!
s для простоты сопоставления, затем веса преобразуются в одинарные и суммируются. Единственная интересная часть состоит в том, что5
вес считается суммой a2
и3
веса, в то время как веса10
и20
вес - это всего лишь две строки от половины веса.источник
JavaScript (Node.js) , 73 байта
Попробуйте онлайн!
источник
Python 3 , 76 байт
Попробуйте онлайн!
Как?
источник
Я уверен, что некоторые улучшения должны быть сделаны, но это то, что у меня есть на данный момент:
Groovy, 131 байт
def f(s){s.split('\n').sum{n=0;[2:1,6:2,14:5,20:10].each{k,v->if(it==~".*\\|[ _]{$k}\\|.*"){n=v+(!it.contains('_')&&k==6?1:0)}};n}}
Преобразует входные данные
String
в a,Collection<String>
а затем суммирует результаты для каждой строки, чтобы получить итог. ИспользуетсяMap
где ключ - это количество пробелов или подчеркиваний между символами канала, а значение - соответствующее количество Passerees. Ключ вставляется в регулярное выражение, чтобы определить, соответствует ли линия значимому шаблону. Единственное предостережение - троичное, которое нужно добавить 1 в случае, когда длина подстроки между трубами равна 6 и состоит из пробелов (в отличие от подчеркивания). Если шаблон не соответствует, строка имеет значение 0.источник
Perl 6 , 57 байт
Попробуйте онлайн!
источник