Фон
Ада - мова програмування, яка точно не відома своєю строгістю.
Однак його буквальний синтаксис масиву теоретично може передбачати досить стислі специфікації масиву. Ось простий 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-esque для наочності:
(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 - це правильне рішення проблеми, тоді як «заголовок» та «колонтитул» реалізують структуру тесту.
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]?
(-1)?