Condensa questi numeri di pagina!


35

Disclaimer: mentre sono stato su questo sito per scopi di intrattenimento per un po 'di tempo, questa è la mia prima domanda, quindi ti prego di perdonare eventuali errori minori.

sfondo

Quando ci assegna i compiti, il mio insegnante è davvero fastidioso e scrive tutti i problemi che dobbiamo fare individualmente. Come tale, mi ci vuole un'eternità a copiare quali problemi devo fare. Ho pensato di semplificarmi la vita, gli avrei inviato un programma che avrebbe potuto rendere la lista dei problemi occupare meno spazio.

Durante la stesura di un elenco di numeri di pagina o di problemi, utilizziamo un trattino per indicare un intervallo. Ad esempio, 19-21diventa 19, 20, 21. Se c'è uno spazio tra, vengono utilizzati due intervalli separati da virgola: 19-21, 27-31diventa 19, 20, 21, 27, 28, 29, 30, 31.
In questo momento, probabilmente stai pensando: "sembra piuttosto banale". In effetti, questo è già stato risposto qui e qui .

Tuttavia, c'è un problema. Se abbiamo un intervallo con cifre consecutive uguali, le cifre ripetute possono essere escluse. Ad esempio: 15, 16, 17diventa 15-7e 107, 108, 109diventa 107-9. Per un bonus, se l'ultima cifra uguale consecutiva è 1 maggiore e l'ultima cifra del limite superiore è inferiore o uguale a quella del valore inferiore, è possibile omettere quanto segue (scusate se suonava confuso; forse alcuni esempi lo chiariranno) . 109-113diventa 109-3, poiché un'ultima cifra più bassa implica aumentare il 10s posto.

Sfida

Il tuo programma dovrebbe prendere un elenco di numeri interi tramite input (qualunque sia lo standard per la tua lingua o una funzione). È possibile decidere se questo elenco è separato da virgole, separato da spazi o come un elenco / array effettivo.

Stampa il modo più breve (prima ordinato per numero di intervalli, quindi la somma dei caratteri inclusi negli intervalli) per rappresentare quell'elenco usando questa notazione. Ogni intervallo tratteggiato deve trovarsi sulla stessa riga, ma gli intervalli possono essere separati da virgole o nuove righe (sono consentite nuove righe o virgole finali). Questi intervalli devono essere in ordine.

Dato che il nostro Wi-Fi nella nostra scuola è terribile , devo renderlo il più piccolo possibile per inviarlo a lui. Vince il codice più breve (in byte).

bonus

Il mio insegnante è sciatto, quindi ci sono alcune cose che potrebbero aiutarlo. I bonus multipli si accumulano attraverso la moltiplicazione, ad esempio un bonus del -10% (x 90%) e un bonus del -25% (x 75%) = 90% * 75% = x 67,5% (bonus del -32,5%).

  • A volte li mette nell'ordine sbagliato (non è un insegnante di matematica). Prendi un bonus del -20% se il tuo programma può accettare numeri interi non ordinati dal minimo al massimo.
  • Il nostro libro è strano e ogni sezione inizia a contare i problemi a -10. Se il tuo programma può accettare numeri negativi, prendi un -25%.
  • Se accetta il bonus di un'ultima cifra inferiore aumentando il posto di 10, ad esempio 25-32riducendo a 25-2, prendi un bonus del -50%.

Casi 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

Una risposta sarà accettata sabato 19 dicembre 2015.

GLHF!


Perché l'output nel terzo caso di test non lo è 1-4 9-2?
Alex A.

Cosa dovrebbe essere prodotto per un programma che (a) fa e (b) non riceve il bonus del 50%, per 149 150 151 152 153 154 155 156 157 178 159 160?
lirtosiast,

3
Avrei potuto giurare che c'è un'altra domanda come questa, ma non riesco a trovarla ...
mbomb007,

5
Penso che questa sia la domanda correlata a cui tutti pensano. Quello però trasforma gli intervalli in liste.
Dennis,

1
Un'altra cosa - il testo dice che la cifra penultima per la pagina finale dell'intervallo di dovrebbe essere tagliata se è inferiore a quello della pagina iniziale, ma il banco di prova dice 19-9per 19,20,...,29e non 19-29come il testo comporta. Quindi qual è corretto?
zocky,

Risposte:


5

LabVIEW, 97 * 0.8 * 0.75 * 0.5 = 29.1 LabVIEW Primitives

questo funziona contando verso l'alto se gli elementi successivi sono 1 a parte e quindi crea una stringa dal numero e dal numero - conta il modulo 10 e alcune moltiplicazioni causano una negazione.

La gif mostra un input 8,9,10,11e un output 8-1. Per input -5,-4,-3,1,3,4,5 -5--3,1,3-5esce.


1
In realtà, contarlo come ciascuno per loop / while loop / if / qualunque sia 1 primitiva non è giusto perché in linguaggi come JS, contano come più di 1 byte ...
ev3commander

@ ev3commander qualsiasi cosa sia giusta se si tratta di un fantastico diagramma animato!
Cyoce,

ecco perché è in primitivi non byte. Inoltre c'è un sacco di cablaggio in corso in modo che i loop siano almeno 2 o 3 e anche altri 3 per registro a scorrimento + inizializzazione.
Eumel,

1
con le regole del golf standard puoi farlo, è solo noioso
Eumel

2
@ ev3commander In realtà, se la lingua è più recente della sfida, non è consentito utilizzarla per motivi competitivi.
Adnan,

14

C ++ 11, 451 * 80% * 75% * 50% = 135,3 byte

Salvataggio di 9 byte grazie a @ kirbyfan64sos.

Risparmiato 19 byte grazie a @JosephMalle e @cat.

Salvato 11 byte grazie a @ 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;}

Questo si qualifica per tutti i bonus.

Test dei parametri di esempio e risultato:

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

Perché non usare intinvece di unsigned int? Salva 9 byte.
Kirbyfan64sos,

@ kirbyfan64sos Grazie, non me ne sono accorto.
TheCoffeeCup il

+1 piace sempre vedere C ++. Non posso provarlo, ma non credo che tu abbia bisogno di iostream
sudo rm -rf slash

Non penso nemmeno che tu abbia bisogno di iostream, ma ha gccdato:a.cpp: In function ‘std::string f(std::vector<int>)’: a.cpp:8:83: error: ‘to_string’ was not declared in this scope
gatto

@cat Assicurarsi che sia abbastanza aggiornato da supportare lo standard C ++ 11. 4.3-ish dovrebbe essere buono con -std=c++11; > = 5.0 è attivo per impostazione predefinita (in realtà è -std=gnu11, ma abbastanza vicino).
Mego

8

Rubino, 120 118 * 0,8 * 0,75 * 0,5 = 35,4 byte

Accetta gli argomenti della riga di comando come input (le virgole vanno bene); stampa un intervallo per riga sull'output 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}

Con spazi bianchi / commenti:

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
}

Casi 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

Funzionalità non coperte da casi di test

Input non ordinati e intervalli di elementi singoli:

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

Intervalli negativi (non è possibile abbreviare il numero più grande con questi):

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

Abbreviazione di numeri arbitrari di cifre (espansione di bash ordinaria utilizzata per l'input qui):

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

Credo che tu possa sostituire ((n=c.shift-1)>m)conm<n=c.shift-1
Cyoce il

5

Javascript ES6, 229 * 80% * 75% * 50% = 68,7 byte

Test input

Sto usando i seguenti dati di test:

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
];

Di base: 229 byte

Questa versione soddisfa i requisiti della domanda (a) con tutti i bonus (c, d, e), ma si blocca su singole pagine. Può anche gestire duplicati (f). Gestisce pagine negative fino a -10.000, che possono essere facilmente aumentate con (grande) perdita di velocità.

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

(L'output sopra mostra gli spazi anziché le nuove righe effettive per brevità)

Pagine singole: 233 byte

Questa versione leggermente più lunga soddisfa inoltre (e) e visualizza le singole pagine come un intervallo con uguali limiti inferiore e superiore

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 - Stai utilizzando un motore javascript abilitato a ES6?
zocky

Oh, hmm, ho un bug, in realtà non gestisce correttamente 36-47. Qual è la procedura corretta? Lo elimino e lo risolvo, o semplicemente provo a risolverlo (potrei non avere il tempo in questo momento), o cosa?
zocky

Hmm, funziona solo nel mio Chrome. Cosa dà?
zocky

E zocky, aggiustalo quando puoi. Semplicemente non verrà considerato valido fino a quando non verrà risolto e come tale non potrà essere accettato fino ad allora (supponendo che il tuo sia il minor numero di byte).
Cyoce,


3

GAP , 355 byte * 0,8 * 0,75 * 0,5 = 106,5

Questo soddisfa tutti i bonus. Mi è costato quasi 100 byte extra per far funzionare tutto bene. Questa funzione omette le cifre iniziali solo se lo spazio vuoto non supera le posizioni una volta. Ad esempio 9 10 11uscite 9-1ma 9 10 11 12 .. 20 21uscite 9-21.

Se GAP fosse un po 'meno prolisso, avrei potuto ottenere questo piuttosto corto (avrei anche potuto risparmiare molti byte se non avessi seguito la sintassi esatta.) Probabilmente domani proverò a giocare un po' più difficile. Vedi sotto per i casi di 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;

Si noti che nella sintassi GAP [a..b]è equivalente a [a,a+1,...,b]. Credo che questi casi di prova dimostrino che questo programma soddisfa tutti i requisiti. Se qualcosa non va, fammi sapere.

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 byte

Finalmente fatto con le 3 sfide, punteggi sotto i 100 byte: D

golfed

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

Puoi testare lua online , per vedere come funziona rispetto ai casi di test, copia incolla la funzione, seguita da questo codice:

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

Sembra non riuscire se viene inserito {9..21}. Uscite 9-1.
Liam,

@ICanHazHats Risolto, grazie per averlo segnalato :)
Katenkyo,

2

Java, 252 * 80% * 75% * 50% = 75,6 byte

Ho deciso di optare per un metodo (è molto più piccolo in Java), ecco la versione golf:

golfed

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()):"";}

Ed ecco la versione leggibile:

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()) : "";
}

Quando testati questi sono i risultati:

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()):"";}
}

Produzione:

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

Aggiornare:

Ora può gestire anche numeri negativi, aggiungendo al bonus.


Non sono un esperto Java, ma potresti accorciarlo cambiando p=s=c=0;c--;in p=s=0;c=-1;?
Cyoce,

Non sono un esperto Java, ma potresti accorciarlo cambiando return c> = 0? "bla": "" per restituire c <0? "": "bla"?
Stephan Schinkel,

potresti persino fare c=~(p=s=0)per i punti di stile.
Cyoce,

2

Japt, 127 byte * 80% * 75% * 50% = 38.1

Caspita, quella era una sfida per includere tutti i bonus. Probabilmente potrebbe essere ridotto.

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

Provalo online!

Come funziona

La spiegazione è molto approssimativa; non esitare a porre qualsiasi domanda tu possa avere.

/*    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 byte 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=", ")

Rientrato, con nuove linee:

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=", ")

Casi 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

Funziona con il bonus del -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

Accetta input non ordinati:

> 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

Accetta numeri negativi:

> 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 * .8 * .75 * .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 di 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}'

dove sè l'inizio della sequenza corrente ed oè il valore di input precedente.


Mi piace, ma al momento non ottiene il bonus del -25%. substr () sta tagliando segni meno e cifre significative.
ezrast,

@ezrast Questo è in realtà corretto comportamento in termini di bonus -50%: -31, -30, -29, -28aumenta al posto della 10 S da -3a -2ed è quindi condensato a -31-8. Vedo anche l'ambiguità che crea, ma è quello che viene richiesto.
Rainer P.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.