tło
Ada to język programowania, który nie jest dokładnie znany ze swojej zwięzłości.
Jednak jego dosłowna składnia tablicowa może teoretycznie pozwolić na dość zwięzłe specyfikacje tablic. Oto prosty opis EBNF dosłownej składni tablicowej ( możliwy do przejścia do 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'
Dla uproszczenia ograniczymy się do jednowymiarowych tablic liczb całkowitych. Oznacza to, że do wartości wyrażeń użyjemy tylko liczb całkowitych. Być może w przyszłym wyzwaniu moglibyśmy wypróbować coś bardziej zaawansowanego (np. Deklarowanie zmiennych i tablic wielowymiarowych). Zdajesz nie muszą golfa literały całkowite .
Oto kilka przykładów literałów tablicowych Ada i równoważnej reprezentacji w Pythonie dla przejrzystości:
(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]
Wyzwanie
Celem tego wyzwania jest wygenerowanie najkrótszego literału tablicy Ada dla danej tablicy wejściowej. Zauważ, że tablice Ada mogą zaczynać się od dowolnego pożądanego indeksu, więc możesz wybrać, o ile ma być początkowy indeks, o ile każda wartość jest sekwencyjna. W tym przykładzie postanowiłem zacząć od 1, co jest idiomatyczne dla Ady, jednak możesz zacząć od dowolnej innej liczby całkowitej.
Wejście
Twój wkład będzie składał się z listy liczb całkowitych, w dowolnej dogodnej formie.
Wynik
Twój wynik będzie ciągiem tekstowym reprezentującym najkrótszy prawidłowy literał tablicy Ada, który reprezentuje listę liczb całkowitych wejściowych. Możesz użyć dowolnego początkowego indeksu na tej tablicy, ale twój wybór (cokolwiek to jest) musi zostać określony w odpowiedzi (indeks początkowy może być również dynamiczny).
Liczby całkowite należy przedstawić jako liczby dziesiętne ze znakiem, jak w przykładach. To wyzwanie nie obejmuje gry w golfa o wartościach całkowitych.
Przykłady
Oto kilka przykładów:
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)
Minimalne wymagania
Obsługuje co najmniej 100 liczb i dane wejściowe o długości co najmniej 256 cyfr.
Podaj poprawny wynik dla wszystkich takich danych wejściowych
- Obejmuje umieszczenie „innych” na końcu
- Obejmuje umieszczenie indeksu dla tablic pojedynczych elementów
Zakończ (najlepiej na TIO) dla każdego z powyższych wejść w niecałą minutę.
Najkrótsze rozwiązanie w bajtach wygrywa!
Wdrożenie referencyjne
Ta implementacja wykorzystuje dane wejściowe jako tablicę, przy czym każdy znak jest liczbą. Wielkie litery są specjalnymi stałymi dla dużych wartości. Argumentem programu jest „indeks początkowy”, którego należy użyć.
Sekcja „kod” w łączu TIO jest poprawnym rozwiązaniem problemu, a „nagłówek” i „stopka” implementują strukturę testową.
źródło
(-1)
?106..110=>3,others=>2
byłoby dłuższe) Ostatni przypadek musi mieć indeks, ponieważ gramatyka nie zezwala na tablice pozycyjne z pojedynczym elementem (positional_array ::= expression ',' expression (',' expression)*
)(1=>1,others=>1)
(1..100000000=>1)
(1|3=>1234567,2=>1)
jest to kolejne prawidłowe wyjście dla[1234567,1,1234567]
?Odpowiedzi:
JavaScript (ES6),
307304 bajtówZaoszczędzono 2 bajty dzięki @KevinCruijssen
To krępująco długie ...
Wypróbuj online!
źródło
'others=>'
.t
jest używany, zanim zostanie zdefiniowany; powodem, dla którego nie ulega awarii, jest to, że pierwsze 2 przypadki testowe w ogóle go nie używają; można to jednak łatwo naprawić bez żadnych kosztów.)'others'
dwa razy i próbowałem utworzyć dla niego zmienną bez zmiany wyniku. ;) Dzięki za wyjaśnienie i fajny golf przecinka za pomocą[,O]
. :)05AB1E ,
136134132 bajtówEDYCJA: Naprawiono teraz dla wszystkich przypadków testowych.
Wypróbuj online lub sprawdź wszystkie przypadki testowe (z wyjątkiem jednego „Ogromnego wejścia”, ponieważ jest zbyt duży).
Wyjaśnienie:
Zobacz moją wskazówkę 05AB1E (sekcja Jak kompresować ciągi znaków, które nie są częścią słownika? ), Aby zrozumieć, dlaczego tak
…ˆ†=>
jest"others=>"
.źródło