¡Condense estos números de página!


35

Descargo de responsabilidad: aunque he estado en este sitio con fines de entretenimiento por un tiempo, esta es mi primera pregunta, así que perdone cualquier error menor.

Fondo

Cuando nos asigna tarea, mi maestro es realmente molesto y escribe todos los problemas que tenemos que hacer individualmente. Como tal, me lleva una eternidad copiar los problemas que tengo que resolver. Pensé en hacerme la vida más fácil, le enviaría un programa que podría hacer que la lista de problemas ocupara menos espacio.

Mientras escribimos una lista de números de página o problema, usamos un guión para denotar un rango. Por ejemplo, se 19-21convierte 19, 20, 21. Si hay un espacio intermedio, se utilizan dos rangos separados por comas: se 19-21, 27-31convierte en 19, 20, 21, 27, 28, 29, 30, 31.
Ahora mismo, probablemente estés pensando: "esto parece bastante trivial". De hecho, esto ya ha sido respondido aquí y aquí .

Sin embargo, hay una trampa. Si tenemos un rango con dígitos consecutivos iguales, los dígitos repetidos pueden omitirse. Por ejemplo: se 15, 16, 17convierte 15-7y se 107, 108, 109vuelve 107-9. Para obtener una bonificación, si el último dígito igual consecutivo es 1 mayor y el último dígito del límite superior es menor o igual que el inferior, se puede omitir lo siguiente (perdón si eso sonó confuso; quizás algunos ejemplos lo aclaren) . 109-113se convierte 109-3, ya que un último dígito más bajo implica aumentar el lugar de 10 segundos.

Reto

Su programa debe tomar una lista de enteros por entrada (lo que sea estándar para su idioma o una función). Puede decidir si esta lista está separada por comas, por espacios o como una lista / matriz real.

Salida de la manera más corta (primero ordenada por número de rangos, luego la suma de los caracteres incluidos en los rangos) para representar esa lista usando esta notación. Cada rango discontinuo debe estar en la misma línea, pero los rangos pueden estar separados por comas o líneas nuevas (se permiten líneas o comas finales). Estos rangos deben estar en orden.

Como el wifi de nuestra escuela es terrible , tengo que hacer que el archivo sea lo más pequeño posible para enviárselo. El código más corto (en bytes) gana.

Bonos

Mi maestro es descuidado, así que hay algunas cosas que podrían ayudarlo. Las bonificaciones múltiples se acumulan mediante la multiplicación, por ejemplo, una bonificación de -10% (x 90%) y una bonificación de -25% (x 75%) = 90% * 75% = x 67.5% (bonificación de -32.5%).

  • A veces los pone en el orden incorrecto (no es un profesor de matemáticas). Obtenga un bono de -20% si su programa puede aceptar enteros que no están ordenados de menor a mayor.
  • Nuestro libro es extraño, y cada sección comienza a contar los problemas en -10. Si su programa puede aceptar números negativos, tome un -25%.
  • Si acepta la bonificación de un último dígito inferior que aumenta el lugar de 10, por ejemplo, 25-32reduciendo a 25-2, tome una bonificación de -50%.

Casos de prueba

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

Se aceptará una respuesta el sábado 19 de diciembre de 2015.

GLHF!


¿Por qué no es la salida en el tercer caso de prueba 1-4 9-2?
Alex A.

¿Cuál debería ser la salida para un programa que (a) toma y (b) no toma la bonificación del 50% 149 150 151 152 153 154 155 156 157 178 159 160?
lirtosiast el

3
Podría haber jurado que es otra pregunta al igual que este, pero yo no lo encuentro ...
mbomb007

55
Creo que esta es la pregunta relacionada en la que todos están pensando. Sin embargo, ese convierte los rangos en listas.
Dennis

1
Otra cosa: el texto dice que el penúltimo dígito para la página final del rango debe cortarse si es más bajo que el de la página de inicio, pero el caso de prueba dice 19-9para 19,20,...,29y no 19-29como lo implica el texto. Entonces, ¿cuál es correcto?
zocky

Respuestas:


5

LabVIEW, 97 * 0.8 * 0.75 * 0.5 = 29.1 Primitivas de LabVIEW

esto funciona contando hacia arriba si los elementos sucesivos están separados por 1 y luego crea una cadena a partir del número y el módulo de conteo de números 10 y algunas multiplicaciones causan que los negativos sean una perra.

El gif muestra una entrada 8,9,10,11y salidas 8-1. Para la entrada -5,-4,-3,1,3,4,5 -5--3,1,3-5sale.


1
Realmente, contarlo como cada uno para loop / while loop / if / whatever es 1 primitivo no es justo porque en idiomas como JS, cuentan como más de 1 byte ...
ev3commander

@ ev3commander cualquier cosa es justa si viene con un diagrama animado genial!
Cyoce

Es por eso que está en primitivas no bytes. También hay una gran cantidad de cableado, por lo que los bucles en realidad son 2 o 3 al menos y también otros 3 por registro de desplazamiento + inicialización.
Eumel

1
según las reglas estándar de golf, puedes hacer eso, es aburrido
Eumel

2
@ ev3commander En realidad, si el idioma es más nuevo que el desafío, no puede usarlo por razones competitivas.
Adnan

14

C ++ 11, 451 * 80% * 75% * 50% = 135.3 bytes

Guardado 9 bytes gracias a @ kirbyfan64sos.

Ahorró 19 bytes gracias a @JosephMalle y @cat.

Guardado 11 bytes gracias 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;}

Esto califica para todos los bonos.

Prueba de parámetro de muestra y resultado:

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

¿Por qué no usar en intlugar de unsigned int? Ahorra 9 bytes.
kirbyfan64sos

@ kirbyfan64sos Gracias, no me di cuenta de eso.
TheCoffeeCup

A +1 siempre le gusta ver C ++. No puedo probar esto, pero no creo que necesites iostream
sudo rm -rf slash

No creo que necesites iostream tampoco, pero gccdi:a.cpp: In function ‘std::string f(std::vector<int>)’: a.cpp:8:83: error: ‘to_string’ was not declared in this scope
gato

@cat Asegúrese de que esté lo suficientemente actualizado como para que sea compatible con el estándar C ++ 11. 4.3-ish debería ser bueno con -std=c++11; > = 5.0 lo tiene activado por defecto (en realidad es -std=gnu11, pero lo suficientemente cerca).
Mego

8

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

Toma argumentos de línea de comandos como entrada (las comas están bien); imprime un rango por línea a la salida estándar.

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 espacios en blanco / comentarios:

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
}

Casos de prueba

$ 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

Características no cubiertas por casos de prueba

Entrada desordenada y rangos de un solo elemento:

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

Rangos negativos (no es posible abreviar el número mayor con estos):

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

Abreviatura de números arbitrarios de dígitos (expansión de bash ordinaria utilizada para la entrada aquí):

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

Creo que puedes reemplazar ((n=c.shift-1)>m)conm<n=c.shift-1
Cyoce

5

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

Prueba de entrada

Estoy usando los siguientes datos de prueba:

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

Básico: 229 bytes

Esta versión satisface los requisitos de la pregunta (a) con todos los bonos (c, d, e), pero se cuelga en páginas individuales. También puede manejar duplicados (f). Maneja páginas negativas hasta -10,000, que se pueden aumentar fácilmente con una pérdida de velocidad (grande).

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 salida anterior muestra espacios en lugar de nuevas líneas reales por brevedad)

Páginas individuales: 233 bytes

Esta versión un poco más larga satisface adicionalmente (e) y muestra páginas individuales como un rango con los mismos límites inferior y superior

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: ¿está utilizando un motor javascript habilitado para ES6?
zocky

Oh, hmm, tengo un error, en realidad no maneja 36-47 correctamente. ¿Cuál es el procedimiento adecuado? ¿Lo elimino y lo reparo, o solo trato de arreglarlo (es posible que no tenga el tiempo en este momento), o qué?
zocky

Hmm, simplemente funciona en mi Chrome. ¿Lo que da?
zocky

Y zocky, arréglalo cuando puedas. Simplemente no contará como válido hasta que se solucione, y como tal no se puede aceptar hasta entonces (suponiendo que el suyo sea el menor número de bytes).
Cyoce


3

GAP , 355 Bytes * 0.8 * 0.75 * 0.5 = 106.5

Esto satisface todos los bonos. Me costó casi 100 bytes adicionales hacer que todo funcione bien. Esta función solo omite los dígitos iniciales si el espacio no desborda los que se colocan una vez. Por ejemplo 9 10 11salidas 9-1pero9 10 11 12 .. 20 21 salidas 9-21.

Si GAP fuera un poco menos detallado, podría haberlo hecho bastante corto (también podría haber ahorrado muchos bytes si no hubiera seguido la sintaxis exacta). Probablemente intentaré jugar al golf un poco más difícil mañana. Vea a continuación los casos de prueba.

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; 

sin golf:

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;

Tenga en cuenta que en la sintaxis GAP, [a..b]es equivalente a [a,a+1,...,b]. Creo que estos casos de prueba demuestran que este programa cumple con todos los requisitos. Si algo está mal, hágamelo saber.

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 Bytes

Finalmente hecho con los 3 desafíos, Puntajes de menos de 100 bytes: 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

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

Puede probar lua en línea , para ver cómo funciona en los casos de prueba, copie y pegue la función, seguido de este código:

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

Parece fallar si se ingresa {9..21}. Salidas 9-1.
Liam

@ICanHazHats Corregido, gracias por señalarlo :)
Katenkyo

2

Java, 252 * 80% * 75% * 50% = 75.6 bytes

He decidido optar por un método (es mucho más pequeño en Java), aquí está la versión de 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()):"";}

Y aquí está la versión legible:

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

Cuando se prueban estos son los resultados:

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

Salida:

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

Actualizar:

Ahora también puede manejar números negativos, lo que se suma al bono.


No soy un experto en Java, pero ¿podría acortarlo cambiando p=s=c=0;c--;a p=s=0;c=-1;?
Cyoce

No soy un experto en Java, pero ¿podría acortarlo cambiando return c> = 0? "bla": "" para devolver c <0? "": "bla"?
Stephan Schinkel

incluso podrías hacerlo c=~(p=s=0)por puntos de estilo.
Cyoce

2

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

Wow, ese fue un gran desafío para incluir todas las bonificaciones. Probablemente podría hacerse más corto.

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

Pruébalo en línea!

Cómo funciona

La explicación es muy tosca; no dude en hacer cualquier pregunta que pueda tener.

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

Sangrado, con nuevas líneas:

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

Casos de prueba:

> 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

Funciona para la bonificación 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

Acepta entradas sin clasificar:

> 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

Acepta números negativos:

> 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 de shell

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

guión 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}'

donde ses el comienzo de la secuencia actual y oes el valor de entrada anterior.


Me gusta, pero actualmente no recibe el bono de -25%. substr () está cortando signos menos y dígitos significativos.
ezrast

@ezrast This is actually correct behaviour in terms of the -50% bonus: -31, -30, -29, -28 increases in the 10's place from -3 to -2 and shall therefore be condensed to -31-8. I also see the ambiguity it creates, but that's what is asked for.
Rainer P.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.