Condensez ces numéros de page!


35

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-21devient 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-31devient 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, 17devient 15-7et 107, 108, 109devient 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-113devient 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-32ré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!


Pourquoi la sortie dans le troisième cas de test n'est 1-4 9-2-elle pas ?
Alex A.

Quel devrait être le résultat pour un programme qui (a) le fait et (b) ne prend pas le bonus de 50%, pour 149 150 151 152 153 154 155 156 157 178 159 160?
lirtosiast

3
J'aurais pu jurer qu'il y avait une autre question comme celle-ci, mais je ne la trouve pas ...
mbomb007

5
Je pense que c'est la question que tout le monde est lié pense. Celui-là transforme les gammes en listes cependant.
Dennis

1
Une autre chose - le texte indique que l'avant-dernier chiffre de la page de fin de la plage doit être coupé s'il est inférieur à celui de la page de départ, mais le scénario de test indique 19-9pour 19,20,...,29et non 19-29comme le texte l'indique. Alors, lequel est correct?
Zocky

Réponses:


5

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,11et des sorties 8-1. Pour l'entrée -5,-4,-3,1,3,4,5 -5--3,1,3-5sort.


1
Vraiment, compter comme une boucle primitive / while boucle / si / quel que soit 1 primitive n'est pas juste car dans des langages comme JS, ils comptent pour plus d'un octet ...
ev3commander

@ ev3commander n'importe quoi est juste si elle vient avec un diagramme animé cool!
Cyoce

C’est pourquoi ses primitives ne sont pas des octets. Il y a également beaucoup de câblage en cours, de sorte que les boucles sont en réalité de 2 ou 3 au moins, ainsi que 3 autres registres par décalage + initialisation.
Eumel

1
Selon les règles habituelles du golf, vous pouvez le faire, c'est tout simplement ennuyeux
Eumel

2
@ ev3commander En fait, si la langue est plus récente que le défi, vous n'êtes pas autorisé à l'utiliser pour des raisons de concurrence.
Adnan

14

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.

#include<vector>
#include<cmath>
#include<algorithm>
#include<string>
#define T string
#define P append
using namespace std;T f(vector<int>v){sort(v.begin(),v.end());T r=to_T(v[0]);int b=1;int m=v[0];for(int i=1;i<=v.size();i++){if(i!=v.size()&&v[i]==v[i-1]+1){if(!b){m=v[i-1];}b=1;}else{if(b){T s=to_T(v[i-1]);r.P("-").P(s.substr(s.size()-(v[i-1]-m==1?1:log10(v[i-1]-m)),s.size()));}if(i!=v.size()){r.P(", ").P(to_T(v[i]));}b=0;}}return r;}

Cela se qualifie pour tous les bonus.

Exemple de test de paramètre et de résultat:

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

In:  [109, 110, 111, 112, 113]
Out: 109-3

In:  [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
Out: 19-9

Pourquoi ne pas utiliser intau lieu de unsigned int? Enregistre 9 octets.
kirbyfan64sos

@ kirbyfan64sos Merci, je ne l'ai pas remarqué.
TheCoffeeCup

+1 aime toujours voir C ++. Je ne peux pas tester cela, mais je ne pense pas que vous ayez besoin de iostream
sudo rm -rf slash

Je ne pense pas que vous ayez besoin de iostream non plus, mais j'ai gccdonné:a.cpp: In function ‘std::string f(std::vector<int>)’: a.cpp:8:83: error: ‘to_string’ was not declared in this scope
chat

@cat Assurez-vous qu'il est suffisamment mis à jour pour prendre en charge le standard C ++ 11. 4.3-ish devrait être bon avec -std=c++11; > = 5.0 est activé par défaut (en réalité, il est -std=gnu11assez proche).
Mego

8

Ruby, 120 118 * 0,8 * 0,75 * 0,5 = 35,4 octets

Prend les arguments de ligne de commande en entrée (les virgules sont correctes); imprime une plage par ligne sur la sortie standard.

c=(b=(a=$*.map(&:to_i).sort).map &:succ)-a
puts (a-b).map{|m|(m<n=c.shift-1)?"#{m}-#{m<0?n:n%10**"#{n-m-1}".size}":m}

Avec des espaces / commentaires:

c=(
  b=(
    # a is the sorted input
    a=$*.map(&:to_i).sort
  # b is the set of successors of elements of a
  ).map &:succ
# c=b-a is the set of not-quite-least upper bounds of our ranges
)-a

# a-b is the set of greatest lower bounds of our ranges
puts (a-b).map {|m|
  # for each range [m,n], if there are multiple elements
  (m < n = c.shift-1) ?
    # yield the range, abbreviating n appropriately if positive
    "#{m}-#{m<0 ? n : n % 10 ** "#{n-m-1}".size}" :
    # in the one-element case, just yield that
    m
}

Cas de test

$ ruby homework.rb 1, 2, 3, 4, 5
1-5

$ ruby homework.rb 3, 4, 5, 9, 10, 11, 12
3-5
9-2

$ ruby homework.rb 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160
149-60

$ ruby homework.rb 1 2 3 4
1-4

$ ruby homework.rb 109, 110, 111, 112, 113
109-3

$ ruby homework.rb 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
19-9

Caractéristiques non couvertes par les cas de test

Saisie non ordonnée et gammes à élément unique:

$ ruby homework.rb 2 17 19 22 0 1 8 20 18
0-2
8
17-0
22

Les plages négatives (impossible d'abréger le plus grand nombre avec celles-ci):

$ ruby homework.rb -17 -18 -19 -20 -21
-21--17

Abréviation de nombres arbitraires de chiffres (extension bash ordinaire utilisée pour l'entrée ici):

$ ruby homework.rb {1234567..1235467} 2345999 2346000 2346001
1234567-467
2345999-1

Je crois que vous pouvez remplacer ((n=c.shift-1)>m)parm<n=c.shift-1
Cyoce

5

Javascript ES6, 229 * 80% * 75% * 50% = 68.7 octets

Test d'entrée

J'utilise les données de test suivantes:

var A1=[
  5,6,7,            // => 5-7     # (a) group pages 
  2,3,              // => 2-3,5-7 # (b) must be properly sorted
  -9,-8,-7,         // => -10--8  # (c) allow negative numbers
  29,30,31,32,      // => 29-2    # (d) lower last digit implies increasing the 10s place
  9,10,11,12,       // => 9-11    # NOT 9-2
  36,37,38,39,40,41,42,43,44,45,46,47, 
                    // => 36-47   # NOT 36-7
  99,100,101,102,   // => 99-102  # NOT 99-2
  109,110,111,112,  // => 109-2   # NOT 109-12
],
// more tests, not specified in the question
A2=[
  120,124,       // => 120,124 # (e) handle single pages
],
A3=[
  135,136,135    // => 135-6   # (f) handle duplicates
];

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).

F=(a)=>{var R=[],i=NaN,l,u;a.map(x=>R[1e4+x]=x);R.concat('').map(x=>(i!=i&&(l=x,u=l-1),i=0,u=(x+="")-u-1?l=console.log(l+'-'+(u>0?(l.length-u.length||(z=>{for(;l[i]==u[i];i++);})(),u.length-i-2||u-l>9||i++,u.slice(i)):u))||x:x))}
F(A1.concat(A3)) --> -9--7 2-3 5-7 9-12 29-2 36-47 99-102 109-2 135-136

(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.

G=(a)=>{var R=[],i=NaN,l,u;a.map(x=>R[1e4+x]=x);R.concat('').map(x=>(i!=i&&(l=x,u=l-1),i=0,u=(x+="")-u-1?l=console.log(l+'-'+(u-l&u>0?(l.length-u.length||(z=>{for(;l[i]==u[i];i++);})(),u.length-i-2||u-l>9||i++,u.slice(i)):u))||x:x))}
G(A1.concat(A2,A3)) --> -9--7 2-3 5-7 9-12 29-2 36-47 99-102 109-2 120-120 124-124

@Cyoce - Utilisez-vous un moteur javascript compatible ES6?
Zocky

Oh, hmm, j'ai un bug, il ne gère pas correctement 36-47. Quelle est la procédure appropriée? Est-ce que je le supprime et le répare, ou simplement essayer de le réparer (je n'ai peut-être pas le temps maintenant), ou quoi?
Zocky

Hmm, ça marche dans mon Chrome. Ce qui donne?
zocky

Et zocky, corrige-le quand tu peux. Cela ne comptera tout simplement pas comme valable tant que ce ne sera pas corrigé, et ne pourra donc pas être accepté jusqu'à ce moment-là (en supposant que votre nombre d'octets est le moins élevé).
Cyoce


3

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 11sorties 9-1mais des 9 10 11 12 .. 20 21sorties 9-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.

g:=function(l)local n;if not l=[] then Sort(l);n:=1;while not l=[] do;if not IsSubset(l,[l[1]..l[1]+n]) then if not n=1 then if n-1>10-l[1] mod 10 and n-1<11 then Print(l[1],"-",(l[1]+n-1) mod 10);else Print(l[1],"-",l[1]+n-1);fi;else Print(l[1]);fi;Print(", ");SubtractSet(l,[l[1]..l[1]+n-1]);g(l);fi;n:=n+1;od;fi;Print("\b\b  ");end; 

ungolfed:

g:=function(l)
    local n;
    if not l=[] then
        Sort(l);
        n:=1;
        while not l=[] do;
            if not IsSubset(l,[l[1]..l[1]+n]) then
                if not n=1 then
                    if n-1>10-l[1] mod 10 and n-1<11 then
                        Print(l[1],"-",(l[1]+n-1) mod 10);
                    else
                        Print(l[1],"-",l[1]+n-1);
                    fi;
                else
                    Print(l[1]);
                fi;
                Print(", ");
                SubtractSet(l,[l[1]..l[1]+n-1]);
                g(l);
            fi;
            n:=n+1;
        od; 
    fi;
    Print("\b\b  ");
end;

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.

gap> h([1..5]);
1-5  
gap> h([3,4,5,9,10,11,12]);
3-5, 9-2  
gap> h([149..160]);
149-160  
gap> h([109..113]);
109-3  
gap> h([19..29]);
19-9  

gap> h([-1,-2,-3,-7,-20000,9,10,110101,110102]);
-20000, -7, -3--1, 9-10, 110101-110102  

gap> h([10101,10102,10103,10,11,12,13,14,15,16,234,999,1000,1001,1002]);
10-16, 234, 999-2, 10101-10103  

3

Lua, 322 * 80% * 75% * 50% = 96.6 Octets

Enfin terminé avec les 3 défis, scores inférieurs à 100 octets: D

Golfé

function f(l)table.sort(l)l[#l+1]=-13 a=l[1]t,s=a,"" for _,v in next,l do if v-t>1 or t-v>1 then s,p,r=s..a.."-",""..t,""..a r:gsub("%d",function(c)p=r:find(c)~=r:len()and p:gsub("^(-?)"..c,"%1")or p r=r:gsub("^"..c,"")end)p=t-a<10 and t%10<a%10 and p:gsub("^(%d)","")or p s,a,t=s..p..",",v,v else t=v end end return s end

Ungolfed

function f(l)
    table.sort(l)
    l[#l+1]=-13 
    a=l[1] 
    t,s=a,"" 
    for _,v in next,l 
    do
        if v-t>1 or t-v>1
        then
            s,p,r=s..a.."-",""..t,""..a
            r:gsub("%d",function(c)
                p=r:find(c)~=#r and p:gsub("^(-?)"..c,"%1")or p
                r=r:gsub("^"..c,"")
            end)
            p=t-a<10 and t%10<a%10 and p:gsub("^(%d)","")or p
            s=s..p..","
            a,t=v,v
        else
            t=v
        end
    end
return s
end

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:

a={1,2,3,4,5}
b={3,4,5,9,10,11,12,13,14,15,16,17,18,19,20,21}
c={149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160}
d={-7,8,5,-6,-5,6,7}
print(f(a))
print(f(b))
print(f(c))
print(f(d))

Semble échouer si {9..21} est entré. Sorties 9-1.
Liam

@ICanHazHats Fixe, merci de le signaler :)
Katenkyo

2

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é

int p,c,s;String m(int[]a){p=s=c=0;c--;String o="";Arrays.sort(a);for(int n:a){if(s==0)o+=s=n;else if(n-p==1)c++;else{o+=t()+", "+(s=n);c=-1;}p=n;}return o+t();}String t(){return c>=0?"-"+(""+p).substring((""+Math.abs(p)).length()-(""+c).length()):"";}

Et voici la version lisible:

int p, c, s;

String m(int[] a) {
    p = s = c = 0;
    c--;
    String o = "";
    Arrays.sort(a);
    for (int n : a) {
        if (s == 0)
            o += s = n;
        else if (n - p == 1)
            c++;
        else {
            o += t() + ", " + (s = n);
            c = -1;
        }
        p = n;
    }
    return o + t();
}

String t() {
    return c >= 0 ? "-" + ("" + p).substring(("" + Math.abs(p)).length() - ("" + c).length()) : "";
}

Une fois testés, voici les résultats:

import java.util.Arrays;
public class A {
    public static void main(String...s) {
        A a = new A();
        System.out.println(a.m(new int[] {1, 2, 3, 4, 5}));
        System.out.println(a.m(new int[] {3, 4, 5, 9, 10, 11, 12}));
        System.out.println(a.m(new int[] {149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160}));
        System.out.println(a.m(new int[] {109, 110, 111, 112, 113}));
        System.out.println(a.m(new int[] {19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}));
        System.out.println(a.m(new int[] {1,10,11,16}));
        System.out.println(a.m(new int[] {-3,-2,-1,0,1,2,3}));
        System.out.println(a.m(new int[] {-3,-2,-1}));
    }

    int p,c,s;String m(int[]a){p=s=c=0;c--;String o="";Arrays.sort(a);for(int n:a){if(s==0)o+=s=n;else if(n-p==1)c++;else{o+=t()+", "+(s=n);c=-1;}p=n;}return o+t();}String t(){return c>=0?"-"+(""+p).substring((""+Math.abs(p)).length()-(""+c).length()):"";}
}

Sortie:

1-5
3-5, 9-2
149-60
109-3
19-9
1, 10-1, 16
-3-3
-3--1

Mise à jour:

Il peut maintenant gérer les nombres négatifs aussi, en ajoutant au bonus.


Je ne suis pas un expert en Java, mais pourriez-vous le raccourcir en changeant p=s=c=0;c--;pour p=s=0;c=-1;?
Cyoce

Je ne suis pas un expert en Java, mais pourriez-vous le raccourcir en modifiant le retour c> = 0? "bla": "" pour retourner c <0? "": "bla"?
Stephan Schinkel

vous pouvez même faire c=~(p=s=0)des points de style.
Cyoce

2

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.

D=[]N=Nn-;DpNr@Y-1¥Xg1 ?[Xg Y]:DpX ©[YY]}D;Ds1 £[BC]=Xms;B¥C?B:B+'-+CsBg ¦'-©Cl ¥Bl ©C¬r@B¯Z ¥C¯Z ªC-B§ApCl -Z ©ÂBsX <ÂCsX ?Z:X

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.

/*    Setting up basic variables    */
                      // Implicit: A = 10, N = list of input numbers.
D=[],N=Nn-;           // D = empty array, N = N sorted by subtraction.

/*    Finding ranges of page numbers    */    
Dp                    // Push into D the result of
NrXYZ{                // reducing each previous value X and item Y in N by this function,
}[];                  // starting with an empty array:
 Y-1==Xg1 ?           //  If Y is 1 more than the second item of X,
 [Xg Y]:              //   return [X[0], Y].
 DpX &&[YY]           //  Otherwise, push X into D and return [Y, Y].

/*    Formatting result    */
Ds1 mXYZ{             // Take the first item off of D and map each item X by this function:
 [BC]=Xms;            //  Set B and C to the first to items in X as strings.
 B==C?B               //  If B is the same as C, return B.
 :B+'-+Cs             //  Otherwise, return B + a hyphen + C.slice(
  Bg !='-&&           //   If B[0] is not a hyphen (B is not negative), AND
  Cl ==Bl &&          //   B and C are the same length,

  /*    Cutting off unnecessary digits    */
  Cq r                //    then C split into digits, reduced with
  rXYZ{               //    each previous value X, item Y, and index Z mapped by this function:
   Bs0,Z ==Cs0,Z ||   //     If B.slice(0,Z) equals C.slice(0,Z), OR
   C-B<=ApCl -Z       //     C - B <= 10 to the power of (C.length - Z);
   &&~~BsX <~~CsX     //     AND B.slice(X) is a smaller number than C.slice(X),
   ?Z:X               //     then Z; otherwise, X.
                      //   Otherwise, 0.

1

R, 167 octets x 80% x 75% x 50% -> 50,1

s=sort(scan(se=","));r=c();while(length(s)){w=s==1:length(s)+s[1]-1;x=s[w];s=s[!w];z=tail(x,1);r=c(r,paste0(x[1],"-",ifelse(z-x[1]<=10,z%%10,z%%100)))};cat(r,sep=", ")

En retrait, avec de nouvelles lignes:

s=sort(scan(se=","))
r=c()
while(length(s)){
w=s==1:length(s)+s[1]-1
x=s[w]
s=s[!w]
z=tail(x,1)
r=c(r, paste0(x[1],"-", ifelse(z-x[1]<=10, 
                               z%%10,
                               z%%100)))}
cat(r,sep=", ")

Cas de test:

> s=sort(scan(se=","));r=c();while(length(s)){w=s==1:length(s)+s[1]-1;x=s[w];s=s[!w];r=c(r,paste0(x[1],"-",ifelse(tail(x,1)-x[1]<=10,tail(x,1)%%10,tail(x,1)%%100)))};cat(r,sep=", ")
1: 3, 4, 5, 9, 10, 11, 12
8: 
Read 7 items
3-5, 9-2
> s=sort(scan(se=","));r=c();while(length(s)){w=s==1:length(s)+s[1]-1;x=s[w];s=s[!w];r=c(r,paste0(x[1],"-",ifelse(tail(x,1)-x[1]<=10,tail(x,1)%%10,tail(x,1)%%100)))};cat(r,sep=", ")
1: 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160
13: 
Read 12 items
149-60

Cela fonctionne pour le bonus de -50%:

> s=sort(scan(se=","));r=c();while(length(s)){w=s==1:length(s)+s[1]-1;x=s[w];s=s[!w];r=c(r,paste0(x[1],"-",ifelse(tail(x,1)-x[1]<=10,tail(x,1)%%10,tail(x,1)%%100)))};cat(r,sep=", ")
1: 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
12: 
Read 11 items
19-9
> s=sort(scan(se=","));r=c();while(length(s)){w=s==1:length(s)+s[1]-1;x=s[w];s=s[!w];r=c(r,paste0(x[1],"-",ifelse(tail(x,1)-x[1]<=10,tail(x,1)%%10,tail(x,1)%%100)))};cat(r,sep=", ")
1: 109, 110, 111, 112, 113
6: 
Read 5 items
109-3

Il accepte les entrées non triées:

> s=sort(scan(se=","));r=c();while(length(s)){w=s==1:length(s)+s[1]-1;x=s[w];s=s[!w];r=c(r,paste0(x[1],"-",ifelse(tail(x,1)-x[1]<=10,tail(x,1)%%10,tail(x,1)%%100)))};cat(r,sep=", ")
1: 114, 109, 110, 111, 112, 113
7: 
Read 6 items
109-4

Il accepte les nombres négatifs:

> s=sort(scan(se=","));r=c();while(length(s)){w=s==1:length(s)+s[1]-1;x=s[w];s=s[!w];r=c(r,paste0(x[1],"-",ifelse(tail(x,1)-x[1]<=10,tail(x,1)%%10,tail(x,1)%%100)))};cat(r,sep=", ")
1: -1,0,1,2
4: 
Read 3 items
-1-2

0

sh, 135 * 0,8 * 0,75 * 0,5 = 40,5

tr , \\n|sort -n|awk -vORS="" '$1-o>1||!c{print p c$1;s=$1}{o=$1;c=", ";p=""}o>s{p="-"substr(o,length(o)-length(o-s-1)+1)}END{print p}'

script shell

tr , \\n|           # comma separated -> newline separated
sort -n|            # sort
awk -vORS=""        # suppress automatic newlines in output

script awk

# on step > 1 or first run, end the current sequence and start a new one.
# on first run, p and c are empty strings.
$1-o>1||!c
    {print p c$1;s=$1}

# old = current, c = ", " except for first run, clear end string.
    {o=$1;c=", ";p=""}

# if the sequence is not a single number, its end is denoted by "-o".
# print only the last n digits of o.
o>s
    {p="-"substr(o,length(o)-length(o-s-1)+1)}

# end the current sequence without starting a new one.
END
    {print p}'

sest le début de la séquence en cours et oest la valeur d'entrée précédente.


J'aime ça, mais il n'obtient pas le bonus de -25% pour le moment. substr () est en train de couper les signes moins et les chiffres significatifs.
ezrast

@ezrast C'est en fait un comportement correct en termes de -50% de bonus: les -31, -30, -29, -28augmentations de la place des 10 de -3à -2et seront donc condensées -31-8. Je vois aussi l’ambiguïté que cela crée, mais c’est ce qui est demandé.
Rainer P.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.