Bei einer unsortierten Liste eindeutiger, positiver Ganzzahlen geben Sie die kürzeste Liste der längsten Bereiche sequentieller Ganzzahlen aus.
EINGANG
- Eine unsortierte Liste eindeutiger positiver Ganzzahlen
- z.B
9 13 3 11 8 4 10 15
- z.B
- Die Eingabe kann aus einer der folgenden Quellen erfolgen:
stdin
- Kommandozeilenargumente
- Funktionsargumente
AUSGABE
- Eine geordnete Liste von Bereichen oder einzelnen Werten, die in einer Zeile auf stdout oder die ähnlichste Ausgabe Ihrer Sprache gedruckt sind.
- Wenn zwei oder mehr sequentielle Ganzzahlen (sequentiell nach Wert, nicht nach Ort in der Liste) vorhanden sind, werden sie mit - als einschließender Bereich bezeichnet, z
8-11
- Alle anderen Ganzzahlen werden einfach ohne andere Notation gedruckt
- Ein einzelnes Leerzeichen begrenzt die Ausgabe
- Wenn zwei oder mehr sequentielle Ganzzahlen (sequentiell nach Wert, nicht nach Ort in der Liste) vorhanden sind, werden sie mit - als einschließender Bereich bezeichnet, z
- Zahlen, die nicht in der Eingabe vorhanden sind, sollten nicht in der Ausgabe enthalten sein, z. B.
3 5 6
können sie nicht auf abgekürzt werden,3-6
da sie4
nicht vorhanden sind
Beispiele
Erfolgreich:
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
Falsch:
IN> 9 13 3 11 8 4 10 15
OUT> 3-15
Bereich enthält Werte, die nicht in der Eingabe enthalten sind
IN> 9 13 3 11 8 4 10 15
OUT> 3 4 8 9 10 11 13 15
Alle sequentiellen Werte sollten als Bereich dargestellt werden
IN> 9 13 3 11 8 4 10 15
OUT> 3-4 8-9 10-11 13 15
Geteilter Bereich, 8-9
und 10-11
sollte sein8-11
IN> 9 13 3 11 8 4 10 15
OUT> 8-9 13 10-11 3-4 15
Ausgabe nicht korrekt bestellt
REGELN
- Standardlücken sind nicht zulässig
- Wenn Ihre Sprache eine Funktion hat, ist dies nicht zulässig
- Sie können ein vollständiges Programm oder eine Funktion schreiben
- Das nachgestellte Leerzeichen spielt keine Rolle
WERTUNG
- Wenigste Bytes gewinnt
Antworten:
Python 2,
123120 BytesWenn die Eingabe eine Liste als Funktionsargument sein kann, dann (danke mbomb007 und xnor für die Bedingungen)
939081 Bytes(77 Bytes, wenn führende Leerzeichen akzeptabel sind - lassen Sie das Finale fallen
[1:]
)quelle
str(n)
,`n`
um ein paar Bytes zu sparen, wenn Sie zu Python 2 wechseln.raw_input()
, und Sie können ändern'-'+`n`
zu`-n`
. Und da Sie jetzt Python 2 verwenden, können Sie die Klammern nach dem entfernenprint
.def f(N):print''.join([' '+`n`,`-n`*(n+1 not in N)][n-1 in N]for n in sorted(N))[1:]
(die weiter vertieft werden können) auszuführen.set(N)
anstelle von verwendensorted(N)
; Dies wird bei Verwendung von cPython korrekt von kleinstem zu kleinstem iterieren, funktioniert jedoch nicht für alle Implementierungen, sodass sich die Frage stellt, ob dies gültig ist oder nicht.JavaScript (ES6):
171154140137ByteDanke edc65 und vihan1086 für die Tipps!
, funktioniert aber in diesen Fällen aufgrund von mehrstelligen Zahlen nicht.[...n]
ist sehr schönES5-Variante,
198184183174 BytesCode-Snippet anzeigen
quelle
[...n]
ist besserRuby,
8684 BytesDies ist eine leicht golfene Version aus einem Beispiel in den Dokumenten für slice_when .
quelle
CJam, 35 Bytes
Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
Ruby, 70 Bytes
Probleme wie diese veranlassen mich, die Ruby-API auf geeignete Methoden zu überprüfen. Heute habe ich eine neue entdeckt
Array#slice_when
:, die in Ruby v2.2 neu eingeführt wurde und anscheinend genau für diese Situation gedacht ist :)Nach dem Sortieren und geeigneten Aufteilen des Arrays nimmt es jedes Unterarray, erstellt eine Zeichenfolge aus dem höchsten und dem niedrigsten Element und fügt dann das gesamte Array zu einer Zeichenfolge zusammen.
Beispiel:
f.call [9,13,3,11,8,4,10,15,6]
druckt3-4 6 8-11 13 15
quelle
SWI-Prolog,
165162159 BytesZiemlich schlecht, aber andererseits ist Prolog eine schreckliche Golfsprache
Beispiel:
a([9,13,3,11,8,4,10,15,6]).
Ausgänge3-4 6 8-11 13 15
quelle
CJam,
3833 BytesNeue Version mit Ideen und Codefragmenten von @Dennis:
Probieren Sie es online aus
Das Eingabeformat ist ein CJam-Array in eckigen Klammern.
Die Grundidee hier ist, dass ich zuerst eine monotone Sequenz von der sortierten Eingabesequenz subtrahiere:
In diesem Unterschied haben Werte, die Teil desselben Intervalls sind, denselben Wert. Durch Anwenden des CJam-RLE-Operators auf diesen Unterschied werden die Intervalle direkt aufgelistet.
Die subtrahierten sequentiellen Werte müssen während der Ausgabe zurückaddiert werden. Ich bin nicht ganz zufrieden damit, wie das in meinem Code gemacht wird. Ich vermute, ich könnte ein paar Bytes sparen, wenn ich das eleganter handhaben würde.
Zur Generierung der Ausgabe der Intervalle wird Dennis 'Idee verwendet, eine negative Zahl für den Endwert zu generieren, die sich um die Generierung von a kümmert
-
wird. Außerdem wird die Logik vereinfacht, da abhängig von der Intervallgröße nur ein Wert hinzugefügt / weggelassen werden muss .Erläuterung:
quelle
l~$_,,.-e`{~T+\_T+:T;,f+(\W>Wf*S}/
-
in die Ausgabe bekommen haben, ohne dass sie im Code angezeigt wird und ohne dass eine Bedingung vorliegt. Jetzt verstehe ich es: Es kommt davon, den Endwert in eine negative Zahl umzuwandeln! Ich hätte mir das nie ausgedacht, deshalb würde ich mich schlecht fühlen, wenn ich es kopiere. Ich werde versuchen, für das nächste Mal daraus zu lernen! :)l~$_,,.-e
{~ T + _T +: T; (_ 2 $ + W * Q? S} / `? Das ist Ihrem eigenen Code viel ähnlicher und wiegt nur 33 Bytes.CoffeeScript,
178161 BytesGenau wie meine JavaScript-Antwort. Ich muss herausfinden, ob die Verwendung von Verständnis zu kürzerem Code führt.
Original:
quelle
Python 2,
126122121 BytesIch weiß, dass dies kürzer werden kann, weiß nur nicht, wo. Erfordert Eingaben in Form
[#, #, #, #, ..., #]
.quelle
exec
ziemlich oft Lösungen zu finden .while x<len(l)
mitwhile l[x:]
zu speichern wenigen Bytes.Java, 191 Bytes
Prüft auf Bereiche und druckt sie entsprechend aus. Leider musste ich für das letzte Element im Array einen Sonderfall machen, da das Programm beendet wurde, ohne die letzte Zahl oder den letzten Bereich auszudrucken.
quelle
Java,
171162 BytesÜbernimmt die Eingabe als int-Array und gibt die Ausgabe als durch Leerzeichen getrennte String-Liste zurück
quelle