Étant donné une liste non triée d'entiers positifs uniques, affichez la liste la plus courte des plages d'entiers séquentiels les plus longues possibles.
CONTRIBUTION
- Une liste non triée d'entiers positifs uniques
- par exemple
9 13 3 11 8 4 10 15
- par exemple
- L'entrée peut provenir de l'un des éléments suivants:
stdin
- arguments de ligne de commande
- arguments de fonction
PRODUCTION
- Une liste ordonnée de plages ou de valeurs individuelles imprimées sur une ligne vers la sortie standard ou la sortie similaire la plus proche de votre langue.
- Si deux ou plusieurs entiers séquentiels (séquentiels par valeur, et non par emplacement dans la liste) sont présents, ils seront désignés comme une plage inclusive en utilisant -, par exemple
8-11
- Tous les autres entiers sont simplement imprimés sans autre notation
- Un seul espace délimitera la sortie
- Si deux ou plusieurs entiers séquentiels (séquentiels par valeur, et non par emplacement dans la liste) sont présents, ils seront désignés comme une plage inclusive en utilisant -, par exemple
- Les nombres non présents dans l'entrée ne doivent pas être dans la sortie, par exemple
3 5 6
ne peuvent pas être raccourcis3-6
car4
absents
EXEMPLES
Réussi:
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
Faux:
IN> 9 13 3 11 8 4 10 15
OUT> 3-15
La plage contient des valeurs absentes de l'entrée
IN> 9 13 3 11 8 4 10 15
OUT> 3 4 8 9 10 11 13 15
Toutes les valeurs séquentielles doivent être représentées par une plage
IN> 9 13 3 11 8 4 10 15
OUT> 3-4 8-9 10-11 13 15
Plage divisée, 8-9
et 10-11
doit être8-11
IN> 9 13 3 11 8 4 10 15
OUT> 8-9 13 10-11 3-4 15
Sortie non ordonnée correctement
RÈGLES
- Les failles standard sont interdites
- Si votre langue a une fonction pour ce faire, ce n'est pas autorisé
- Vous pouvez écrire un programme complet ou une fonction
- l'espace blanc arrière n'a pas d'importance
NOTATION
- Le moins d'octets gagne
Réponses:
Python 2,
123120 octetsSi l'entrée peut être une liste comme argument de fonction, alors (merci mbomb007 et xnor pour les conditions)
939081 octets(77 octets si le premier espace est acceptable - supprimez la finale
[1:]
)la source
str(n)
pour`n`
économiser quelques octets, si vous passez à Python 2.raw_input()
, et vous pouvez passer'-'+`n`
à`-n`
. Et puisque vous utilisez maintenant Python 2, vous pouvez supprimer les parenthèses après leprint
.def f(N):print''.join([' '+`n`,`-n`*(n+1 not in N)][n-1 in N]for n in sorted(N))[1:]
(qui peut être joué plus loin).set(N)
au lieu desorted(N)
; cela itérera correctement du plus petit au plus bas lors de l'utilisation de cPython, mais il n'est pas garanti qu'il fonctionne pour toutes les implémentations.JavaScript (ES6):
171154140137octetsMerci edc65 et vihan1086 pour les conseils!
mais cela ne fonctionne pas dans ces cas en raison des nombres à plusieurs chiffres.[...n]
est très agréableVariante ES5,
198184183174 octetsAfficher l'extrait de code
la source
[...n]
c'est mieuxRubis,
8684 octetsIl s'agit d'une version légèrement golfée d'un exemple dans la documentation de slice_when .
la source
CJam, 35 octets
Essayez-le en ligne dans l' interpréteur CJam .
Comment ça fonctionne
la source
Ruby, 70 octets
Des problèmes comme ceux-ci ont tendance à me faire vérifier l'API Ruby pour les méthodes appropriées, et aujourd'hui j'en ai découvert une nouvelle:
Array#slice_when
nouvellement introduite dans Ruby v2.2 et apparemment destinée à cette situation exacte :)Après avoir trié et découpé le tableau de manière appropriée, il prend chaque sous-tableau et crée une chaîne à partir de l'élément le plus élevé et le plus bas, puis joint l'ensemble de ce tableau en une chaîne.
Exemple:
f.call [9,13,3,11,8,4,10,15,6]
impressions3-4 6 8-11 13 15
la source
SWI-Prolog,
165162159 octetsAssez mauvais mais encore une fois Prolog est une langue de golf terrible
Exemple:
a([9,13,3,11,8,4,10,15,6]).
sorties3-4 6 8-11 13 15
la source
CJam,
3833 octetsNouvelle version, utilisant des idées et des fragments de code suggérés par @Dennis:
Essayez-le en ligne
Le format d'entrée est un tableau CJam entre crochets.
L'idée de base ici est que je soustrais d'abord une séquence monotone de la séquence d'entrée triée:
Dans cette différence, les valeurs qui font partie du même intervalle ont la même valeur. L'application de l'opérateur CJam RLE à cette différence énumère directement les intervalles.
Les valeurs séquentielles soustraites doivent être rajoutées lors de la sortie. Je ne suis pas entièrement satisfait de la façon dont cela se fait dans mon code. Je soupçonne que je pourrais économiser quelques octets avec une manière plus élégante de gérer cela.
Pour générer la sortie des intervalles, cela utilise l'idée de Dennis de générer un nombre négatif pour la valeur finale, qui prend soin de produire un
-
, et simplifie également la logique car une seule valeur doit être ajoutée / omise en fonction de la taille de l'intervalle .Explication:
la source
l~$_,,.-e`{~T+\_T+:T;,f+(\W>Wf*S}/
-
dans la sortie sans qu'il apparaisse dans le code, et sans condition. Maintenant je comprends: cela vient de la transformation de la valeur finale en nombre négatif! Je ne serais jamais venu avec ça, donc je me sentirais mal de le copier. J'essaierai d'en tirer des leçons pour la prochaine fois! :)l~$_,,.-e
{~ T + _T +: T; (_ 2 $ + W * Q? S} / `cependant? Cela ressemble beaucoup plus à votre propre code et ne pèse que 33 octets.CoffeeScript,
178161 octetsTout comme ma réponse JavaScript. J'ai besoin de comprendre si l'utilisation de compréhensions se traduira par un code plus court.
Original:
la source
Python 2,
126122121 121 octetsJe sais que cela peut devenir plus court, je ne sais pas où .. Nécessite une entrée sous forme
[#, #, #, #, ..., #]
.la source
exec
assez souvent.while x<len(l)
parwhile l[x:]
pour économiser quelques octets.Java, 191 octets
Vérifie les plages et les imprime en conséquence. Malheureusement, j'ai dû faire un cas spécial pour le dernier élément du tableau car le programme se terminerait sans imprimer le dernier numéro ou la dernière plage.
la source
Java,
171162 octetsPrend l'entrée sous forme de tableau int, renvoie la sortie sous forme de liste de chaînes séparées par des espaces
la source