Фон
Ада - это язык программирования, который не совсем известен своей краткостью.
Тем не менее, его синтаксис литерала массива теоретически может допускать довольно краткие спецификации массивов. Вот простое EBNF-описание литерального синтаксиса массива ( передаваемого в bottlecaps.de :
array ::= positional_array | named_array
positional_array ::= expression ',' expression (',' expression)*
| expression (',' expression)* ',' 'others' '=>' expression
named_array ::= component_association (',' component_association)*
component_association ::= discrete_choice_list '=>' expression
discrete_choice_list ::= discrete_choice ('|' discrete_choice)*
discrete_choice ::= expression ('..' expression)? | 'others'
Для простоты мы ограничимся одномерными массивами целых чисел. Это означает, что мы будем использовать только целые числа для значений выражения. Возможно, в будущем мы могли бы попробовать что-то более продвинутое (например, объявление переменных и многомерных массивов). Вы не должны играть в гольф целочисленные литералы .
Вот несколько примеров литералов массива Ada и эквивалентного представления на языке Python для ясности:
(1, 2, 3) = [1, 2, 3]
(1, others => 2) = [1, 2, 2, ..., 2]
(others => 1) = [1, 1, ..., 1]
(1 => 1, 2 => 3) = [1, 3]
(1|2 => 1, 3 => 2) = [1, 1, 2]
(1 => 1, 3 => 2, others => 3) = [1, 3, 2, 3, 3, ..., 3]
Вызов
Цель этой задачи - вывести кратчайший литерал массива Ada с количеством байтов для заданного входного массива. Обратите внимание, что массивы Ada могут начинаться с любого желаемого индекса, поэтому вы можете выбрать желаемый начальный индекс, если каждое значение является последовательным. В этом примере я выбираю начинать с 1, что является идиоматическим для Ады, однако вы можете начать с любого другого целого числа.
вход
Ваш ввод будет состоять из списка целых чисел в любой удобной форме.
Вывод
В результате вы получите строку текста, представляющую кратчайший действительный литерал массива Ada, представляющий список входных целых чисел. Вы можете использовать любой начальный индекс, который вы хотите для этого массива, но ваш выбор (каким бы он ни был) должен быть указан в вашем ответе (начальный индекс также может быть динамическим).
Целые числа должны быть представлены в виде десятичных чисел со знаком, как в примерах. Эта задача не охватывает гольф целых значений.
Примеры
Вот некоторые примеры:
Simple: [1, 2, 3] -> (1,2,3)
Range: [1, 1, 1, 1, 1, 1, 1,] -> (1..7=>1)
Others: [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1] -> (6=>2,others=>1)
Multiple Ranges: [1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1] -> (6..10|16..20=>2,others=>1)
Tiny Ranges: [1,1,2,2,1,1,1,1,1] -> (3|4=>2,others=>1)
Far Range: [[1]*5, [2]*100, [3]*5] -> (1..5=>1,6..105=>2,others=>3)
Alternation: [1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2] -> (1|3|5|7|9|11|13|15|17=>1,others=>2)
Big Number: [1234567890,1,1234567890] -> (2=>1,1|3=>1234567890)
Big-ish Number: [1234567,1,1234567] -> (1234567,1,1234567)
Solo: [-1] -> (1=>-1)
Huge Input: [[0],[1]*1000000000] -> (0,others=>1)
Positional Others: [1, 2, 3, 3, 3, 3, 3, 3] -> (1,2,others=>3)
Range and Choice, no Others: [1,1,1,12,12,3,3,3,3,3,3,3,3,3,3,4] -> (1..3=>1,4|5=>12,6..15=>3,16=>4)
Минимальные требования
Поддержка не менее 100 номеров и входов не менее 256 номеров в длину.
Произведите правильный результат для всех таких входов
- Включает в себя «другие» в конце
- Включает в себя размещение индекса для отдельных элементов массива
Завершите (предпочтительно на TIO) для каждого из указанных выше входов менее чем за минуту.
Самое короткое решение в байтах побеждает!
Реализация эталона
Эта реализация использует входные данные в качестве массива, где каждый символ является числом. Заглавные буквы - это специальные константы для больших значений. Аргумент программы - это «начальный индекс» для использования.
Раздел «код» в ссылке TIO является правильным решением проблемы, в то время как «верхний и нижний колонтитулы» реализуют структуру теста.
источник
(-1)
?106..110=>3,others=>2
будет длиннее) В последнем случае должен быть индекс, так как грамматика не допускает позиционные массивы из одного элемента (positional_array ::= expression ',' expression (',' expression)*
)(1=>1,others=>1)
(1..100000000=>1)
(1|3=>1234567,2=>1)
это еще один действительный выход для[1234567,1,1234567]
?Ответы:
JavaScript (ES6),
307304 байтаСохранено 2 байта благодаря @KevinCruijssen
Это смущающе долго ...
Попробуйте онлайн!
источник
'others=>'
.t
используется до того, как он будет определен; причина, по которой он не падает, заключается в том, что первые 2 тестовых примера не используют его вообще; тем не менее, это можно легко исправить бесплатно).'others'
два раза, и попытался создать переменную для него, не меняя вывод. ;) Спасибо за объяснение этого, и хороший гольф запятой с помощью[,O]
. :)05AB1E ,
136134132 байтаРЕДАКТИРОВАТЬ: Исправлено для всех тестовых случаев сейчас.
Попробуйте онлайн или проверьте все контрольные примеры (кроме «Огромного ввода», так как он слишком большой).
Объяснение:
Посмотрите эту подсказку 05AB1E (раздел Как сжимать строки, не являющуюся частью словаря? ), Чтобы понять, почему
…ˆ†=>
это так"others=>"
.источник