Antecedentes
Ada es un lenguaje de programación que no es exactamente conocido por su brevedad.
Sin embargo, su sintaxis literal de matriz puede, en teoría, permitir especificaciones de matriz bastante concisas. Aquí hay una descripción simple EBNF de la sintaxis literal de la matriz (pasable 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'
Nos limitaremos a conjuntos de enteros unidimensionales por simplicidad. Esto significa que solo usaremos enteros para los valores de expresión. Quizás en un desafío futuro podríamos intentar algo más avanzado (como declarar variables y matrices multidimensionales). Usted no tiene que campo de los literales enteros .
Estos son algunos ejemplos de literales de matriz Ada y una representación equivalente a Python esque para mayor claridad:
(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]
Desafío
El objetivo de este desafío es generar el literal de matriz Ada de recuento de bytes más corto para una matriz de entrada dada. Tenga en cuenta que las matrices Ada pueden comenzar desde el índice que desee, por lo que puede elegir cuál desea que sea el índice inicial siempre que cada valor sea secuencial. En este ejemplo, elijo comenzar en 1, lo cual es idiomático para Ada, sin embargo, puede elegir comenzar en cualquier otro número entero.
Entrada
Su entrada consistirá en una lista de enteros, en cualquier forma que sea conveniente.
Salida
Su salida será una cadena de texto que representa el literal de matriz de Ada válido más corto que representa la lista de enteros de entrada. Puede usar cualquier índice inicial que desee en esta matriz, pero su elección (sea cual sea) debe especificarse en su respuesta (el índice inicial también puede ser dinámico).
Los enteros deben representarse como números decimales con signo, como en los ejemplos. Este desafío no cubre el golf de valores enteros.
Ejemplos
Aquí hay unos ejemplos:
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)
Requerimientos mínimos
Admite al menos 100 números e entradas de al menos 256 números de longitud.
Produzca el resultado correcto para todas esas entradas
- Incluye poner 'otros' al final
- Incluye poner un índice para conjuntos de elementos individuales
Termine (preferiblemente en TIO) para cada una de las entradas anteriores en menos de un minuto.
¡La solución más corta en bytes gana!
Implementación de referencia
Esta implementación utiliza la entrada como su matriz, con cada carácter como un número. Las letras mayúsculas son constantes especiales para valores grandes. El argumento del programa es el 'índice de inicio' a usar.
La sección "código" en el enlace TIO es una solución correcta al problema, mientras que el "encabezado" y el "pie de página" implementan la estructura de prueba.
fuente
(-1)
?106..110=>3,others=>2
sería más largo) El último caso debe tener un índice, ya que la gramática no permite matrices posicionales de un solo elemento (positional_array ::= expression ',' expression (',' expression)*
)(1=>1,others=>1)
(1..100000000=>1)
(1|3=>1234567,2=>1)
es otra salida válida para[1234567,1,1234567]
?Respuestas:
JavaScript (ES6),
307304 bytesGuardado 2 bytes gracias a @KevinCruijssen
Esto es vergonzosamente largo ...
Pruébalo en línea!
fuente
'others=>'
.t
se usa antes de que se defina; la razón por la que no falla es que los primeros 2 casos de prueba no lo usan en absoluto; sin embargo, eso se puede solucionar fácilmente sin costo alguno).'others'
dos veces e intenté crearle una variable sin cambiar la salida. ;) Gracias por explicarlo, y buen golf de la coma usando[,O]
. :)05AB1E ,
136134132 bytesEDITAR: Corregido para todos los casos de prueba ahora.
Pruébelo en línea o verifique todos los casos de prueba (excepto el 'Entrada enorme', ya que es demasiado grande).
Explicación:
Ver este consejo 05AB1E mío (sección Cómo comprimir cadenas que no forman parte del diccionario? ) Para entender por qué
…ˆ†=>
es"others=>"
.fuente