Biorąc pod uwagę nieposortowaną listę unikatowych, dodatnich liczb całkowitych, wypisz najkrótszą listę z najdłuższych możliwych zakresów liczb całkowitych sekwencyjnych.
WEJŚCIE
- Nieposortowana lista unikalnych, dodatnich liczb całkowitych
- na przykład
9 13 3 11 8 4 10 15
- na przykład
- Dane wejściowe można pobrać z jednego z poniższych:
stdin
- argumenty wiersza poleceń
- argumenty funkcji
WYNIK
- Uporządkowana lista zakresów lub poszczególnych wartości drukowana w jednym wierszu na standardowe wyjście lub najbliższy podobny wynik w twoim języku.
- Jeśli obecne są dwie lub więcej kolejnych liczb całkowitych (sekwencyjnych według wartości, a nie według lokalizacji na liście), zostaną one oznaczone jako zakres obejmujący za pomocą -, np.
8-11
- Wszystkie inne liczby całkowite są po prostu drukowane bez żadnej innej notacji
- Pojedyncza spacja ograniczy wynik
- Jeśli obecne są dwie lub więcej kolejnych liczb całkowitych (sekwencyjnych według wartości, a nie według lokalizacji na liście), zostaną one oznaczone jako zakres obejmujący za pomocą -, np.
- Liczby nieobecne na wejściu nie powinny znajdować się na wyjściu, np.
3 5 6
Nie można ich skrócić,3-6
ponieważ4
nie jest obecny
PRZYKŁADY
Odnoszący sukcesy:
IN> 9 13 3 11 8 4 10 15 6
OUT> 3-4 6 8-11 13 15
IN> 11 10 6 9 13 8 3 4 15
OUT> 3-4 6 8-11 13 15
IN> 5 8 3 2 6 4 7 1
OUT> 1-8
IN> 5 3 7 1 9
OUT> 1 3 5 7 9
Źle:
IN> 9 13 3 11 8 4 10 15
OUT> 3-15
Zakres zawiera wartości, których nie ma na wejściu
IN> 9 13 3 11 8 4 10 15
OUT> 3 4 8 9 10 11 13 15
Wszystkie kolejne wartości powinny być reprezentowane jako zakres
IN> 9 13 3 11 8 4 10 15
OUT> 3-4 8-9 10-11 13 15
Podzielony zakres 8-9
i 10-11
powinien być8-11
IN> 9 13 3 11 8 4 10 15
OUT> 8-9 13 10-11 3-4 15
Wyjście nie zostało poprawnie zamówione
ZASADY
- Standardowe luki są niedozwolone
- Jeśli Twój język ma taką funkcję, jest to niedozwolone
- Możesz napisać pełny program lub funkcję
- końcowe białe znaki nie mają znaczenia
PUNKTACJA
- Najmniej bajtów wygrywa
Odpowiedzi:
Python 2,
123120 bajtówJeśli dane wejściowe mogą być listą jako argumentem funkcji, to (dzięki mbomb007 i xnor za instrukcje warunkowe)
939081 bajtów(77 bajtów, jeśli dopuszczalne są wiodące białe znaki - upuść końcowy
[1:]
)źródło
str(n)
aby`n`
zapisać kilka bajtów, jeśli przełączysz się na Python 2.raw_input()
, i możesz zmienić'-'+`n`
na`-n`
. A ponieważ używasz teraz języka Python 2, możesz usunąć nawiasy poprint
.def f(N):print''.join([' '+`n`,`-n`*(n+1 not in N)][n-1 in N]for n in sorted(N))[1:]
(Które można dalej grać w golfa).set(N)
zamiastsorted(N)
; spowoduje to poprawną iterację od najmniejszej do najniższej przy użyciu cPython, ale nie gwarantuje się, że będzie działać dla wszystkich implementacji, więc jest pewne pytanie, czy jest to poprawne.JavaScript (ES6):
171154140137bajtówDzięki edc65 i vihan1086 za wskazówki!
ale nie działa w takich przypadkach ze względu na liczby wielocyfrowe.[...n]
jest bardzo fajny,Wariant ES5,
198184183174 bajtówPokaż fragment kodu
źródło
[...n]
jest lepiejRubin,
8684 bajtówJest to lekko golfowa wersja z przykładu w dokumentacji dla slice_when .
źródło
CJam, 35 bajtów
Wypróbuj online w interpretatorze CJam .
Jak to działa
źródło
Rubinowy, 70 bajtów
Problemy takie jak te powodują, że sprawdzam API Ruby pod kątem odpowiednich metod, a dziś odkryłem nowy:
Array#slice_when
nowo wprowadzony w Ruby v2.2 i najwyraźniej przeznaczony do tej dokładnej sytuacji :)Po posortowaniu i odpowiednim pocięciu tablicy, pobiera ona każdą pod-tablicę i tworzy ciąg z najwyższego i najniższego elementu, a następnie łączy całą tablicę w ciąg.
Przykład:
f.call [9,13,3,11,8,4,10,15,6]
odbitki3-4 6 8-11 13 15
źródło
SWI-Prolog,
165162159 bajtówCałkiem źle, ale z drugiej strony Prolog to straszny język golfa
Przykład:
a([9,13,3,11,8,4,10,15,6]).
wyjścia3-4 6 8-11 13 15
źródło
CJam,
38 lat33 bajtówNowa wersja, wykorzystująca pomysły i fragmenty kodu sugerowane przez @Dennis:
Wypróbuj online
Format wejściowy to tablica CJam w nawiasach kwadratowych.
Podstawową ideą jest to, że najpierw odejmuję sekwencję monotoniczną od posortowanej sekwencji wejściowej:
W tej różnicy wartości, które są częścią tego samego przedziału, mają tę samą wartość. Zastosowanie operatora RLE CJam do tej różnicy bezpośrednio wylicza interwały.
Odejmowane wartości sekwencyjne należy dodać z powrotem podczas generowania. Nie jestem do końca zadowolony z tego, jak to się dzieje w moim kodzie. Podejrzewam, że mógłbym zaoszczędzić kilka bajtów w bardziej elegancki sposób.
Do generowania danych wyjściowych przedziałów wykorzystuje pomysł Dennisa, aby wygenerować liczbę ujemną dla wartości końcowej, która zajmuje się wytworzeniem
-
, a także upraszcza logikę, ponieważ tylko jedna wartość musi być dodana / pominięta w zależności od wielkości przedziału .Wyjaśnienie:
źródło
l~$_,,.-e`{~T+\_T+:T;,f+(\W>Wf*S}/
-
do wyjścia bez pokazania go w kodzie i bez warunku. Teraz rozumiem: Pochodzi z zamiany wartości końcowej na liczbę ujemną! Nigdy bym tego nie wymyślił, więc źle byłoby mi go skopiować. Spróbuję się od tego uczyć następnym razem! :)l~$_,,.-e
{~ T + _T +: T; (_ 2 $ + W * Q? S} / `chociaż? Jest to o wiele bardziej podobne do twojego kodu i waży tylko 33 bajty.CoffeeScript,
178161 bajtówTak jak moja odpowiedź JavaScript. Muszę dowiedzieć się, czy użycie wyrażeń spowoduje skrócenie kodu.
Oryginalny:
źródło
Python 2,
126122121 bajtówWiem, że to może być krótsze, po prostu nie wiem, gdzie .. Wymaga wprowadzenia formularza
[#, #, #, #, ..., #]
.źródło
exec
że często znajdziesz rozwiązania .while x<len(l)
zwhile l[x:]
zaoszczędzić kilka bajtów.Java, 191 bajtów
Sprawdza zakresy i odpowiednio je drukuje. Niestety musiałem zrobić specjalny przypadek dla ostatniego elementu w tablicy, ponieważ program zakończyłby się bez drukowania ostatniej liczby lub zakresu.
źródło
Java,
171162 bajtówPobiera dane wejściowe jako tablicę int, zwraca dane wyjściowe jako rozdzieloną spacjami listę ciągów
źródło