压缩这些页码!


35

免责声明:虽然我现在已经出于娱乐目的而在此网站上停留了一段时间,但这是我的第一个问题,因此请原谅任何小错误。

背景

当给我们分配作业时,我的老师确实很烦人,并写出了我们必须单独处理的所有问题。因此,我花了很长时间来抄写我必须做的问题。我想让我的生活更轻松,我会给他发送一个程序,该程序可以使问题列表占用更少的空间。

写下页面或问题编号的列表时,我们用破折号表示范围。例如,19-21变为19, 20, 21。如果两者之间有间隔,则使用两个逗号分隔的范围:19-21, 27-31变为19, 20, 21, 27, 28, 29, 30, 31
现在,您可能正在思考:“这似乎很琐碎”。实际上,这已经在这里这里得到了解答。

但是,有一个陷阱。如果我们有一个相等的连续数字范围,则可以省去重复的数字。例如:15, 16, 17成为15-7107, 108, 109成为107-9。作为奖励,如果最后一个连续的相等数字大1,并且上限的最后一个数字小于或等于下限,则可以省略以下内容(对不起,这听起来令人困惑;也许有些示例可以清除它) 。109-113变为109-3,因为最后一位低表示增加10位。

挑战

您的程序应通过输入获取整数列表(无论您的语言是标准语言还是函数)。您可以决定此列表是逗号分隔,空格分隔还是实际的列表/数组。

输出最短的方法(首先按范围数排序,然后按范围内的字符总和排序)以使用此表示法表示该列表。每个虚线范围必须在同一行上,但是范围可以用逗号或换行符分隔(允许使用尾随的换行符或逗号)。这些范围必须是有序的。

由于我们学校的Wi-Fi非常糟糕,我必须将文件制作得尽可能小才能发送给他。最短的代码(以字节为单位)获胜。

奖金

我的老师草率,所以有一些事情可以帮助他。多个奖金通过乘法叠加,例如-10%奖金(x 90%)和-25%(x 75%)奖金= 90%* 75%= x 67.5%(-32.5%奖金)。

  • 有时他把它们放在错误的顺序(他不是数学老师)。如果您的程序可以接受未按最小到最大排序的整数,则收取-20%的奖金。
  • 我们的书很奇怪,每一节都从-10开始计算问题。如果您的程序可以接受负数,则取-25%。
  • 如果它接受较低的最后一位数字的奖金,该奖金增加10位,例如25-32减少到25-2,则获得-50%的奖金。

测试用例

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

答案将于2015年12月19日(星期六)接受。

GLHF!


为什么在第三个测试用例中没有输出1-4 9-2
Alex A.

对于(a)和(b)没有收取50%奖金的程序,应该输出什么149 150 151 152 153 154 155 156 157 178 159 160
lirtosiast,2015年

3
我可能发誓像这样还有另一个问题,但是我找不到它……
mbomb007

5
我认为是每个人都在思考的相关问题。那将范围变成列表。
丹尼斯

1
另一件事-文本说,如果范围的结束页面的倒数第二个数字低于起始页面的倒数第二个数字,则该文本应该被删减,但是测试用例表示19-919,20,...,29不是19-29该文本所暗示的。那么哪个正确呢?
zocky 2015年

Answers:


5

LabVIEW,97 * 0.8 * 0.75 * 0.5 = 29.1 LabVIEW原语

如果成功的元素之间相隔1,则通过向上计数来工作,然后根据数字和数字创建一个字符串-计数模10,某些乘法导致负数。

gif展示了输入8,9,10,11和输出8-1。对于输入-5,-4,-3,1,3,4,5 -5--3,1,3-5出来。


1
确实,将其计为每个for循环/ while循环/ if /无论什么都是1原语是不公平的,因为在JS之类的语言中,它们的计数超过1个字节...
ev3commander

@ ev3commander如果附带一个很酷的动画图,那么一切都是公平的!
Cyoce

多数民众赞成为什么它的原语不是字节。此外,还有大量的布线正在进行,因此实际循环至少为2或3,每个移位寄存器+初始化又为3。
Eumel 2015年

1
按照标准的高尔夫规则,您可以做到,这很无聊
Eumel 2015年

2
@ ev3commander实际上,如果语言比挑战性新,则出于竞争原因,不允许使用该语言。
阿德南(Adnan)2015年

14

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

感谢@ kirbyfan64sos,节省了9个字节。

由于@JosephMalle和@cat,节省了19个字节。

@ pinkfloydx33,节省了11个字节。

#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;}

这有资格获得所有奖金。

样本参数测试和结果:

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

为什么不使用int代替unsigned int?节省9个字节。
kirbyfan64sos 2015年

@ kirbyfan64sos谢谢,没有注意到。
TheCoffeeCup 2015年

+1总是喜欢看C ++。我无法对此进行测试,但我认为您不需要iostream
sudo rm -rf斜杠

我也不认为您也需要iostream,但是gcc给了:a.cpp: In function ‘std::string f(std::vector<int>)’: a.cpp:8:83: error: ‘to_string’ was not declared in this scope
cat

@cat确保已对其进行足够的更新以支持C ++ 11标准。4.3-ish应该很好-std=c++11;> = 5.0默认情况下启用(实际上是-std=gnu11,但足够接近)。
Mego

8

红宝石,120 118 * 0.8 * 0.75 * 0.5 = 35.4字节

将命令行参数作为输入(逗号可以);每行将一个范围打印到标准输出。

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}

带空格/注释:

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
}

测试用例

$ 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

测试用例未涵盖的功能

无序输入和单元素范围:

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

负范围(不能用这些缩写大数字):

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

任意数字的缩写(此处用于输入的普通bash扩展):

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

我相信您可以替换((n=c.shift-1)>m)m<n=c.shift-1
Cyoce '16

5

Javascript ES6,229 * 80%* 75%* 50%= 68.7字节

测试输入

我正在使用以下测试数据:

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

基本:229字节

此版本以所有奖金(c,d,e)满足问题(a)的要求,但挂在一页上。它还可以处理重复项(f)。它处理的负页面数低至-10,000,可以很容易地增加(大)速度损失。

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

(为简洁起见,上面的输出显示空格而不是实际的换行符)

单页:233个字节

此稍长的版本还满足(e)要求,并以上下限相等的范围显示单个页面

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-您使用的是支持ES6的JavaScript引擎吗?
zocky 2015年

哦,嗯,​​我有一个错误,它实际上无法正确处理36-47。正确的程序是什么?我要删除并修复它,还是只是尝试修复它(我现在可能没有时间),还是什么?
zocky 2015年

嗯,它只适用于我的Chrome。是什么赋予了?
zocky 2015年

而且zocky,请尽可能修复它。它只有在修复后才算作有效,因此直到那时才被接受(假设您的字节最少)。
Cyoce 2015年


3

GAP,355字节* 0.8 * 0.75 * 0.5 = 106.5

这满足了所有奖金。为了使一切正常工作,我花了将近100个额外的字节。如果间隙一次都不会溢出该位,则此功能仅省略前导数字。例如9 10 11输出9-19 10 11 12 .. 20 21输出9-21

如果GAP不太冗长,我可能会变得很短(如果我不遵循确切的语法,还可以节省很多字节。)明天我可能会尝试打高尔夫球。有关测试案例,请参见下文。

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; 

松散:

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;

请注意,在GAP语法中,[a..b]等效于[a,a+1,...,b]。我相信这些测试案例证明该程序可以满足所有要求。如果有问题,请通知我。

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字节

最后完成了3个挑战,分数低于100字节:D

打高尔夫球

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

不打高尔夫球

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

您可以在线测试lua ,查看它在测试用例中的表现,复制粘贴该函数,然后输入以下代码:

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

如果输入{9..21},似乎失败。输出9-1。
利亚姆(Liam)2015年

@ICanHazHats已修复,感谢您指出:)
Katenkyo

2

Java,252 * 80%* 75%* 50%= 75.6字节

我决定采用一种方法(在Java中要小得多),这是高尔夫球版:

打高尔夫球

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

这是可读版本:

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

经过测试后,结果如下:

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

输出:

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

更新:

现在,它还可以处理负数,从而增加了奖金。


我不是Java专家,但是您可以通过更改p=s=c=0;c--;为来缩短它p=s=0;c=-1;吗?
Cyoce

我不是Java专家,但是可以通过更改return c> = 0来缩短它吗?“ bla”:“”返回c <0?“”:“ bla”?
Stephan Schinkel

您甚至可以c=~(p=s=0)为样式点做。
Cyoce

2

Japt 127字节* 80%* 75%* 50%= 38.1

哇,要将所有奖金都包括在内是一项艰巨的挑战。它可能会缩短。

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

在线尝试!

怎么运行的

解释很粗略。不要犹豫,问您可能有任何疑问。

/*    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个字节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=", ")

缩进,换行:

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

测试用例:

> 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

它适用于-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

它接受未排序的输入:

> 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

它接受负数:

> 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}'

外壳脚本

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

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}'

其中s是当前序列的开始,o是前一个输入值。


我喜欢它,但目前无法获得-25%的奖金。substr()删除负号和有效数字。
ezrast

@ezrast就-50%奖金而言,这实际上是正确的行为:-31, -30, -29, -28-3到10的位置增加,-2因此应浓缩为-31-8。我也看到它造成的歧义,但这就是所要的。
Rainer P.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.