Clause de non-responsabilité: bien que je sois sur ce site à des fins de divertissement depuis un moment, c’est ma première question, alors n’oubliez pas les erreurs mineures.
Contexte
Lorsqu’il nous donne des devoirs, mon professeur est vraiment énervant et écrit tous les problèmes que nous devons faire individuellement. En tant que tel, il me faut une éternité pour noter les problèmes que je dois résoudre. J'ai pensé que pour me simplifier la vie, je lui enverrais un programme qui permettrait de réduire la liste des problèmes.
Lors de la rédaction d'une liste de numéros de pages ou de problèmes, nous utilisons un tiret pour indiquer une plage. Par exemple, 19-21
devient 19, 20, 21
. S'il existe un espace entre les deux, deux plages séparées par des virgules sont utilisées: 19-21, 27-31
devient 19, 20, 21, 27, 28, 29, 30, 31
.
En ce moment, vous pensez probablement: "cela semble assez trivial". En fait, cela a déjà été répondu ici et ici .
Cependant, il y a un hic. Si nous avons une plage avec des chiffres égaux consécutifs, les chiffres répétés peuvent être omis. Par exemple: 15, 16, 17
devient 15-7
et 107, 108, 109
devient 107-9
. Pour un bonus, si le dernier chiffre égal consécutif est supérieur de 1 et si le dernier chiffre de la limite supérieure est inférieur ou égal à celui du chiffre inférieur, vous pouvez omettre les éléments suivants (désolé si cela vous a semblé déroutant; peut-être que quelques exemples le clarifieront) . 109-113
devient 109-3
, comme un dernier chiffre inférieur implique une augmentation de la place 10s.
Défi
Votre programme devrait prendre une liste d’entiers via l’entrée (tout ce qui est standard pour votre langue ou une fonction). Vous pouvez décider si cette liste est séparée par des virgules, par des espaces ou par une liste / un tableau réel.
Générez le chemin le plus court (en commençant par le nombre de plages, puis la somme des caractères inclus dans les plages) pour représenter cette liste à l'aide de cette notation. Chaque plage en pointillés doit être sur la même ligne, mais les plages peuvent être séparées par des virgules ou des nouvelles lignes (les lignes nouvelles ou les virgules sont autorisées). Ces plages doivent être en ordre.
Comme notre école a un réseau Wi-Fi terrible , je dois réduire au maximum le fichier pour le lui envoyer. Le code le plus court (en octets) gagne.
Bonus
Mon professeur est négligent, alors il y a quelques choses qui pourraient l'aider. Les bonus multiples se cumulent, par exemple un bonus de -10% (x 90%) et un bonus de -25% (x 75%) = 90% * 75% = x 67,5% (bonus de -32,5%).
- Parfois, il les met dans le mauvais ordre (ce n'est pas un professeur de mathématiques). Bénéficiez d'un bonus de -20% si votre programme peut accepter des entiers non triés du moins au plus élevé.
- Notre livre est bizarre et chaque section commence à compter les problèmes à -10. Si votre programme accepte les nombres négatifs, prenez -25%.
- S'il accepte le bonus d'un dernier chiffre inférieur augmentant la place de 10, par exemple en le
25-32
réduisant à25-2
, prenez un bonus de -50%.
Cas de test
In: 1, 2, 3, 4, 5
Out: 1-5
In: 3, 4, 5, 9, 10, 11, 12
Out: 3-5, 9-12
In: 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160
Out: 149-60
In: 1 2 3 4
Out: 1-4
For bonuses:
In: 109, 110, 111, 112, 113
Out: 109-3
In: 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
Out: 19-9
In: -3, -2, -1, 0, 1, 2
Out: -3-2
In: -3, -2, -1
Out: -3--1
Une réponse sera acceptée le samedi 19 décembre 2015.
GL HF!
1-4 9-2
-elle pas ?149 150 151 152 153 154 155 156 157 178 159 160
?19-9
pour19,20,...,29
et non19-29
comme le texte l'indique. Alors, lequel est correct?Réponses:
LabVIEW, 97 * 0.8 * 0.75 * 0.5 = 29.1 Primitives LabVIEW
cela fonctionne en comptant vers le haut si les élements successifs sont séparés de 1, puis crée une chaîne à partir du nombre et du nombre de modulo 10 et de certaines multiplications, les négatifs étant une chienne.
Le gif présente une entrée
8,9,10,11
et des sorties8-1
. Pour l'entrée-5,-4,-3,1,3,4,5
-5--3,1,3-5
sort.la source
C ++ 11, 451 * 80% * 75% * 50% = 135.3 octets
Sauvegardé 9 octets grâce à @ kirbyfan64sos.
19 octets sauvés grâce à @JosephMalle et @cat.
Sauvegardé 11 octets grâce à @ pinkfloydx33.
Cela se qualifie pour tous les bonus.
Exemple de test de paramètre et de résultat:
la source
int
au lieu deunsigned int
? Enregistre 9 octets.gcc
donné:a.cpp: In function ‘std::string f(std::vector<int>)’: a.cpp:8:83: error: ‘to_string’ was not declared in this scope
-std=c++11
; > = 5.0 est activé par défaut (en réalité, il est-std=gnu11
assez proche).Ruby,
120118 * 0,8 * 0,75 * 0,5 = 35,4 octetsPrend les arguments de ligne de commande en entrée (les virgules sont correctes); imprime une plage par ligne sur la sortie standard.
Avec des espaces / commentaires:
Cas de test
Caractéristiques non couvertes par les cas de test
Saisie non ordonnée et gammes à élément unique:
Les plages négatives (impossible d'abréger le plus grand nombre avec celles-ci):
Abréviation de nombres arbitraires de chiffres (extension bash ordinaire utilisée pour l'entrée ici):
la source
((n=c.shift-1)>m)
parm<n=c.shift-1
Javascript ES6, 229 * 80% * 75% * 50% = 68.7 octets
Test d'entrée
J'utilise les données de test suivantes:
Base: 229 octets
Cette version répond aux exigences de la question (a) avec tous les bonus (c, d, e), mais se bloque sur des pages simples. Il peut également gérer les doublons (f). Il traite les pages négatives jusqu'à -10 000, ce qui peut facilement être augmenté avec une perte de vitesse (importante).
(La sortie ci-dessus montre des espaces au lieu de nouvelles lignes pour des raisons de brièveté)
Pages simples: 233 octets
Cette version légèrement plus longue satisfait également (e) et affiche les pages simples sous forme de plage avec des limites inférieure et supérieure identiques.
la source
GAP , 355 octets * 0,8 * 0,75 * 0,5 = 106,5
Cela satisfait tous les bonus. Cela m'a coûté presque 100 octets supplémentaires pour que tout fonctionne correctement. Cette fonction n'omet que les premiers chiffres si l'intervalle ne dépasse pas celui des unités une fois. Par exemple des
9 10 11
sorties9-1
mais des9 10 11 12 .. 20 21
sorties9-21
.Si GAP était un peu moins bavard, j'aurais pu avoir ce très court (j'aurais aussi pu économiser beaucoup d'octets si je ne suivais pas la syntaxe exacte.) Je vais probablement essayer de jouer au golf un peu plus fort demain. Voir ci-dessous pour les cas de test.
ungolfed:
Notez que dans la syntaxe GAP,
[a..b]
est équivalent à[a,a+1,...,b]
. Je crois que ces cas de test démontrent que ce programme répond à toutes les exigences. Si quelque chose ne va pas, faites le moi savoir.la source
Lua, 322 * 80% * 75% * 50% = 96.6 Octets
Enfin terminé avec les 3 défis, scores inférieurs à 100 octets: D
Golfé
Ungolfed
Vous pouvez tester lua en ligne , pour voir comment il fonctionne par rapport aux cas de test, copiez-collez la fonction, suivie du code suivant:
la source
Java, 252 * 80% * 75% * 50% = 75.6 octets
J'ai décidé de choisir une méthode (c'est beaucoup plus petit en Java), voici la version jouée au golf:
Golfé
Et voici la version lisible:
Une fois testés, voici les résultats:
Sortie:
Mise à jour:
Il peut maintenant gérer les nombres négatifs aussi, en ajoutant au bonus.
la source
p=s=c=0;c--;
pourp=s=0;c=-1;
?c=~(p=s=0)
des points de style.Japt, 127 octets * 80% * 75% * 50% = 38,1
Wow, c'était un sacré défi d'inclure tous les bonus. Cela pourrait probablement être raccourci.
Essayez-le en ligne!
Comment ça marche
L'explication est très grossière. n'hésitez pas à poser toutes les questions que vous pourriez avoir.
la source
R, 167 octets x 80% x 75% x 50% -> 50,1
En retrait, avec de nouvelles lignes:
Cas de test:
Cela fonctionne pour le bonus de -50%:
Il accepte les entrées non triées:
Il accepte les nombres négatifs:
la source
sh, 135 * 0,8 * 0,75 * 0,5 = 40,5
script shell
script awk
où
s
est le début de la séquence en cours eto
est la valeur d'entrée précédente.la source
-31, -30, -29, -28
augmentations de la place des 10 de-3
à-2
et seront donc condensées-31-8
. Je vois aussi l’ambiguïté que cela crée, mais c’est ce qui est demandé.