背景
Ada是一种编程语言,其简洁性并不十分出名。
但是,其数组文字语法在理论上可以允许相当简洁的数组规范。这是数组文字 语法的简单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惯用的,但是您可以选择从任何其他整数开始。
输入值
您的输入将包含整数列表,以任何方便的形式。
输出量
您的输出将是一个字符串,该字符串表示表示输入整数列表的最短有效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|3=>1234567,2=>1)
是另一个有效输出[1234567,1,1234567]
?
(-1)
吗?