fundo
Ada é uma linguagem de programação que não é exatamente conhecida por sua concisão.
No entanto, sua sintaxe literal de matriz pode, em teoria, permitir especificações de matriz bastante concisas. Aqui está uma descrição EBNF simples da sintaxe literal da matriz (passável a 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'
Vamos nos limitar a matrizes unidimensionais de números inteiros para simplificar. Isso significa que usaremos apenas números inteiros para os valores da expressão. Talvez em um desafio futuro possamos tentar algo mais avançado (como declarar variáveis e matrizes multidimensionais). Você não precisa jogar golfe com literais inteiros .
Aqui estão alguns exemplos de literais de matriz Ada e uma representação equivalente em estilo python para maior clareza:
(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]
Desafio
O objetivo desse desafio é gerar o literal da matriz Ada com menor número de bytes para uma determinada matriz de entrada. Observe que as matrizes Ada podem iniciar a partir de qualquer índice desejado, para que você possa escolher o que deseja que o índice inicial contenha, desde que cada valor seja seqüencial. Neste exemplo, escolho iniciar em 1, o que é idiomático para Ada, no entanto, você pode optar por iniciar em qualquer outro número inteiro.
Entrada
Sua entrada consistirá em uma lista de números inteiros, em qualquer forma que seja conveniente.
Resultado
Sua saída será uma sequência de texto que representa o literal da matriz Ada válido mais curto que representa a lista de números inteiros de entrada. Você pode usar qualquer índice inicial que desejar nesta matriz, mas sua escolha (seja ela qual for) deve ser especificada em sua resposta (o índice inicial também pode ser dinâmico).
Os números inteiros devem ser representados como números decimais assinados, como nos exemplos. Esse desafio não cobre o golfe de valores inteiros.
Exemplos
aqui estão alguns exemplos:
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)
Requerimentos mínimos
Ofereça suporte a pelo menos 100 números e entradas de pelo menos 256 números.
Produza o resultado correto para todas essas entradas
- Inclui colocar 'outros' no final
- Inclui a colocação de um índice para matrizes de item único
Termine (de preferência no TIO) para cada uma das entradas acima em menos de um minuto.
Menor solução em bytes ganha!
Implementação de referência
Essa implementação usa a entrada como sua matriz, com cada caractere sendo um número. Letras maiúsculas são constantes especiais para valores grandes. O argumento do programa é o 'índice inicial' a ser usado.
A seção "código" no link TIO é uma solução correta para o problema, enquanto o "cabeçalho" e o "rodapé" implementam a estrutura de teste.
106..110=>3,others=>2
seria mais longo) O último caso precisa ter um índice, pois a gramática não permite matrizes posicionais de elemento único ( positional_array ::= expression ',' expression (',' expression)*
)
(1|3=>1234567,2=>1)
há outra saída válida para [1234567,1,1234567]
?
(-1)
?