これらのページ番号を圧縮してください!


35

免責事項:私はこのサイトを娯楽目的で今しばらく使用していますが、これは私の最初の質問ですので、小さなエラーはご容赦ください。

バックグラウンド

宿題を割り当てるとき、私の先生は本当に迷惑で、私たちが個々にしなければならないすべての問題を書きます。そのため、私がしなければならない問題をコピーするには永遠に時間がかかります。私は自分の人生をもっと楽にしたいと思ったので、問題のリストがより少ないスペースを占めるようにするプログラムを彼に送るでしょう。

ページ番号または問題番号のリストを書き留めながら、ダッシュを使用して範囲を示します。たとえば、に19-21なり19, 20, 21ます。間にギャップがある場合、2カンマで区切られた範囲が使用される:19-21, 27-31なります19, 20, 21, 27, 28, 29, 30, 31
今、あなたはおそらく「これはかなり些細なことだ」と考えているでしょう。実際、これはすでにここここで回答さています

ただし、キャッチがあります。連続する数字が等しい範囲がある場合、繰り返される数字は省略できます。例:に15, 16, 17なり15-7、に107, 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日土曜日に受け付けられます。

GL HF!


3番目のテストケースの出力がなぜそうではないの1-4 9-2ですか?
アレックスA.

(a)するプログラムと(b)50%のボーナスを受け取らないプログラムの出力は何149 150 151 152 153 154 155 156 157 178 159 160ですか?
リルトシアスト

3
...私はちょうどこのような別の質問があります宣誓ていたかもしれないが、私はそれを見つけることができません
mbomb007

5
私が思うに、これは誰もがすることを考えている関連する質問です。ただし、範囲はリストに変わります。
デニス

1
別のこと-テキストは、範囲の終了ページの最後から2番目の数字が開始ページのそれよりも低い場合は切り取られるべきであると述べ19-9ていますが、テストケースはテキストが示すようにで19,20,...,29はなく、と言い19-29ます。どちらが正しいのですか?
ゾッキー

回答:


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 / whateverが1プリミティブであるとカウントするのは公平ではありません。なぜなら、JSのような言語では、1バイト以上とカウントされるからです...
ev3commander

@ ev3commanderそれはクールなアニメーション図が付属していれば何でもいいです!
チョイス

それがバイトではなくプリミティブである理由です。また、多くの配線が行われているため、ループは実際には少なくとも2または3であり、シフトレジスタ+初期化ごとにさらに3です。
ユーメル

1
標準的なゴルフルールでは、それを行うことができます。退屈です
Eumel

2
@ ev3commander実際には、言語がチャレンジよりも新しい場合、競争上の理由で使用することはできません。
アドナン

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

@ kirbyfan64sosありがとう、気づかなかった。
TheCoffeeCup

+1は常にC ++を見るのが好きです。これをテストすることはできませんが、iostreamが必要だとは思わない
sudo rm -rf slash

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が、十分に近い)。
メゴ

8

ルビー、 120 118 * 0.8 * 0.75 * 0.5 = 35.4バイト

入力としてコマンドライン引数を使用します(カンマでも構いません)。1行につき1つの範囲を標準出力に出力します。

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

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バイト

このバージョンは、質問(a)の要件をすべてのボーナス(c、d、e)で満たしていますが、単一ページでハングします。また、duplicates(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エンジンを使用していますか?
ゾッキー

ああ、うーん、バグがあります。実際には36〜47を正しく処理しません。適切な手順は何ですか?削除して修正しますか、それとも修正しようとしますか(今は時間がありません)、または何ですか?
ゾッキー

うーん、それは私のChromeで動作します。何が得られますか?
ゾッキー

そして、できる限り修正します。修正されるまで有効とはみなされず、それまでは受け入れられません(あなたのバイトが最小バイトであると仮定します)。
チョイス


3

ギャップ、355バイト* 0.8 * 0.75 * 0.5 = 106.5

これはすべてのボーナスを満たします。すべてをうまく機能させるには、100バイト近く余分にコストがかかりました。この関数は、ギャップが1桁をオーバーフローしない場合にのみ、先行桁を省略します。9 10 11出力の例です9-1が、9 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。
リアム

@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;か?
チョイス

私はJavaの専門家ではありませんが、return c> = 0を変更して短縮できますか?"bla": ""はc <0を返しますか?"": "bla"?
ステファンシンケル

c=~(p=s=0)スタイルポイントに対してもできます。
チョイス

2

Japt、127バイト* 80%* 75%* 50%= 38.1

うわー、それはすべてのボーナスを含めるための挑戦の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から、10の代わりに増加-3する-2ため、に凝縮されなければなりません-31-8。また、あいまいさが生じることもわかりますが、それが求められています。
Rainer P.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.