Hintergrund
Ada ist eine Programmiersprache, die nicht gerade für ihre Knappheit bekannt ist.
Die Array-Literal-Syntax kann jedoch theoretisch ziemlich knappe Array-Spezifikationen ermöglichen. Hier ist eine einfache EBNF-Beschreibung der Array-Literal- Syntax (passierbar für 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'
Der Einfachheit halber beschränken wir uns auf eindimensionale Arrays von ganzen Zahlen. Dies bedeutet, dass wir nur Ganzzahlen für die Ausdruckswerte verwenden. Vielleicht könnten wir in einer zukünftigen Herausforderung etwas Fortgeschritteneres ausprobieren (wie das Deklarieren von Variablen und mehrdimensionalen Arrays). Sie müssen nicht die ganzzahligen Literale spielen .
Hier sind einige Beispiele für Ada-Array-Literale und eine pythonähnliche äquivalente Darstellung zur Verdeutlichung:
(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]
Herausforderung
Das Ziel dieser Herausforderung besteht darin, das Ada-Array-Literal mit der kürzesten Bytezahl für ein bestimmtes Eingabearray auszugeben. Beachten Sie, dass Ada-Arrays von jedem gewünschten Index aus starten können. Sie können also auswählen, wie der Startindex aussehen soll, solange jeder Wert sequentiell ist. In diesem Beispiel beginne ich mit 1, was für Ada idiomatisch ist. Sie können jedoch auch mit einer anderen Ganzzahl beginnen.
Eingang
Ihre Eingabe besteht aus einer Liste von Ganzzahlen, in welcher Form auch immer.
Ausgabe
Ihre Ausgabe ist eine Textzeichenfolge, die das kürzeste gültige Ada-Array-Literal darstellt, das die Liste der Eingabe-Ganzzahlen darstellt. Sie können einen beliebigen Startindex für dieses Array verwenden, aber Ihre Auswahl (was auch immer es ist) muss in Ihrer Antwort angegeben werden (der Startindex kann auch dynamisch sein).
Die ganzen Zahlen sind wie in den Beispielen als vorzeichenbehaftete Dezimalzahlen darzustellen. Diese Herausforderung umfasst nicht das Golfen von ganzzahligen Werten.
Beispiele
Hier sind einige Beispiele:
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)
Mindestanforderungen
Unterstützt mindestens 100 Nummern und Eingaben mit mindestens 256 Nummern.
Erstellen Sie für alle diese Eingaben das richtige Ergebnis
- Beinhaltet das Setzen von "anderen" am Ende
- Beinhaltet das Setzen eines Index für einzelne Elementarrays
Beenden Sie (vorzugsweise auf TIO) für jeden der oben genannten Eingänge in weniger als einer Minute.
Die kürzeste Lösung in Bytes gewinnt!
Referenzimplementierung
Diese Implementierung verwendet die Eingabe als Array, wobei jedes Zeichen eine Zahl ist. Großbuchstaben sind spezielle Konstanten für große Werte. Das Programmargument ist der zu verwendende 'Startindex'.
Der Abschnitt "Code" im TIO-Link ist eine korrekte Lösung für das Problem, während "Kopf-" und "Fußzeile" die Teststruktur implementieren.
106..110=>3,others=>2
wäre länger) Der letzte Fall muss einen Index haben, da die Grammatik keine Einzelelement-Positionsarrays zulässt ( positional_array ::= expression ',' expression (',' expression)*
)
(1|3=>1234567,2=>1)
eine weitere gültige Ausgabe für ist [1234567,1,1234567]
?
(-1)
?