Padatkan nomor halaman ini!

35

Penafian: sementara saya telah berada di situs ini untuk tujuan hiburan untuk sementara waktu sekarang, ini adalah pertanyaan pertama saya, jadi tolong maafkan kesalahan kecil apa pun.

Latar Belakang

Ketika menugaskan kami mengerjakan PR, guruku benar-benar menyebalkan dan menulis semua masalah yang harus kami lakukan secara individual. Karena itu, saya perlu selamanya menyalin masalah mana yang harus saya lakukan. Saya pikir untuk membuat hidup saya lebih mudah, saya akan mengirimnya sebuah program yang bisa membuat daftar masalah tidak memakan banyak ruang.

Saat menuliskan daftar nomor halaman atau masalah, kami menggunakan tanda hubung untuk menunjukkan rentang. Misalnya, 19-21menjadi 19, 20, 21. Jika ada celah di antaranya, dua rentang yang dipisahkan koma digunakan: 19-21, 27-31menjadi 19, 20, 21, 27, 28, 29, 30, 31.
Saat ini, Anda mungkin berpikir: "ini sepertinya cukup sepele". Sebenarnya, ini sudah dijawab di sini dan di sini .

Namun, ada yang menangkap. Jika kami memiliki rentang dengan digit berurutan yang sama, digit yang diulang dapat diabaikan. Misalnya: 15, 16, 17menjadi 15-7, dan 107, 108, 109menjadi107-9 . Untuk bonus, jika digit terakhir yang sama berturut-turut adalah 1 lebih besar dan digit terakhir batas atas kurang dari atau sama dengan yang lebih rendah, berikut ini dapat dihilangkan (maaf jika itu terdengar membingungkan; mungkin beberapa contoh akan menjernihkannya) . 109-113menjadi109-3 , karena angka terakhir yang lebih rendah menyiratkan peningkatan tempat 10-an.

Tantangan

Program Anda harus mengambil daftar bilangan bulat melalui input (apa pun standar untuk bahasa Anda, atau fungsi). Anda dapat memutuskan apakah daftar ini dipisahkan oleh koma, dipisahkan oleh ruang, atau sebagai daftar / larik yang sebenarnya.

Output cara terpendek (pertama diurutkan berdasarkan jumlah rentang, maka jumlah karakter termasuk dalam rentang) untuk mewakili bahwa daftar menggunakan notasi ini. Setiap rentang putus-putus harus di garis yang sama, tetapi rentang dapat dipisahkan dengan koma atau baris baru (trailing baris baru atau koma diizinkan). Rentang ini harus berurutan.

Karena sekolah kami, Wi-Fi sangat buruk , saya harus membuat file sekecil mungkin untuk mengirimkannya kepadanya. Kode terpendek (dalam byte) menang.

Bonus

Guru saya ceroboh, jadi ada beberapa hal yang akan membantunya. Beberapa bonus menumpuk melalui perkalian, misalnya bonus -10% (x 90%) dan bonus -25% (x 75%) = 90% * 75% = x 67,5% (-32,5% bonus).

  • Terkadang dia menempatkan mereka dalam urutan yang salah (dia bukan guru matematika). Ambil bonus -20% jika program Anda dapat menerima bilangan bulat yang tidak diurutkan paling tidak hingga terbesar.
  • Buku kami aneh, dan setiap bagian mulai menghitung masalah pada -10. Jika program Anda dapat menerima angka negatif, ambil -25%.
  • Jika ia menerima bonus dari digit terakhir yang lebih rendah yang meningkatkan tempat 10, misalnya 25-32mengurangi menjadi 25-2, ambil bonus -50%.

Uji Kasus

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

Jawaban akan diterima pada hari Sabtu, 19 Desember 2015.

GLHF!

Cyoce
sumber
Mengapa output pada test case ketiga tidak 1-4 9-2?
Alex A.
Apa yang seharusnya menjadi output untuk program yang (a) dilakukan dan (b) tidak mengambil bonus 50% 149 150 151 152 153 154 155 156 157 178 159 160?
lirtosiast
3
Saya bisa bersumpah ada pertanyaan lain seperti ini, tetapi saya tidak dapat menemukannya ...
mbomb007
5
Saya pikir ini adalah pertanyaan terkait yang dipikirkan semua orang. Yang mengubah rentang menjadi daftar sekalipun.
Dennis
1
Hal lain - teks mengatakan bahwa digit kedua dari belakang untuk halaman akhir rentang harus dipotong jika lebih rendah dari pada halaman awal, tetapi test case mengatakan 19-9untuk 19,20,...,29dan bukan 19-29seperti yang tersirat dalam teks. Jadi mana yang benar?
zocky

Jawaban:

5

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

ini bekerja dengan menghitung ke atas jika suksesi elemts adalah 1 terpisah dan kemudian membuat string dari nomor dan jumlah - menghitung modulo 10 dan beberapa multiplikasi menyebabkan negatif adalah menyebalkan.

Gif menampilkan input 8,9,10,11dan output 8-1. Untuk input -5,-4,-3,1,3,4,5 -5--3,1,3-5keluar.

Eumel
sumber
1
Sungguh, menghitung masing-masing untuk loop / while loop / jika / apa pun 1 primitif tidak adil karena dalam bahasa seperti JS, mereka menghitung lebih dari 1 byte ...
ev3commander
@ ev3commander sesuatu yang adil jika dilengkapi dengan diagram animasi yang keren!
Cyoce
itu sebabnya yang di primitif bukan byte. Juga ada banyak kabel yang terjadi sehingga loop actaully setidaknya 2 atau 3 dan juga 3 per shift register + inisialisasi.
Eumel
1
menurut aturan golf standar, Anda bisa melakukannya, hanya membosankan
Eumel
2
@ ev3commander Sebenarnya, jika bahasa lebih baru daripada tantangan, Anda tidak diizinkan menggunakannya karena alasan kompetitif.
Adnan
14

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

Disimpan 9 byte berkat @ kirbyfan64sos.

Disimpan 19 byte berkat @JosephMalle dan @cat.

Disimpan 11 byte berkat @ 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;}

Ini memenuhi syarat untuk semua bonus.

Pengujian dan hasil parameter sampel:

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
Cangkir Kopi
sumber
Mengapa tidak menggunakan intbukan unsigned int? Menghemat 9 byte.
kirbyfan64sos
@ kirbyfan64sos Terima kasih, tidak memperhatikan itu.
TheCoffeeCup
+1 selalu suka melihat C ++. Saya tidak dapat menguji ini, tetapi saya tidak berpikir Anda perlu iostream
sudo rm -rf slash
Saya tidak berpikir Anda perlu iostream juga, tetapi gccmemberi:a.cpp: In function ‘std::string f(std::vector<int>)’: a.cpp:8:83: error: ‘to_string’ was not declared in this scope
cat
@ kucing Pastikan sudah cukup diperbarui sehingga mendukung standar C ++ 11. 4.3-ish harus baik-std=c++11 ; > = 5.0 mengaktifkannya secara default (sebenarnya itu -std=gnu11, tetapi cukup dekat).
Mego
8

Ruby, 120 118 * 0.8 * 0.75 * 0.5 = 35.4 bytes

Mengambil argumen baris perintah sebagai input (koma tidak masalah); mencetak satu rentang per baris ke output standar.

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}

Dengan spasi / komentar:

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
}

Uji kasus

$ 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

Fitur yang tidak dicakup oleh kasus uji

Input & rentang elemen tunggal tidak berurutan:

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

Rentang negatif (tidak mungkin untuk menyingkat angka yang lebih besar dengan ini):

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

Singkatan dari angka angka yang berubah-ubah (ekspansi bash biasa digunakan untuk input di sini):

$ ruby homework.rb {1234567..1235467} 2345999 2346000 2346001
1234567-467
2345999-1
ezrast
sumber
Saya yakin Anda bisa menggantinya ((n=c.shift-1)>m)denganm<n=c.shift-1
Cyoce
5

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

Input Uji

Saya menggunakan data tes berikut:

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

Dasar: 229 byte

Versi ini memenuhi persyaratan pertanyaan (a) dengan semua bonus (c, d, e), tetapi tergantung pada satu halaman. Itu juga dapat menangani duplikat (f). Ini menangani halaman negatif hingga -10.000, yang dapat dengan mudah ditingkatkan dengan kehilangan kecepatan (besar).

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

(Output di atas menunjukkan spasi alih-alih baris baru aktual untuk singkatnya)

Halaman tunggal: 233 byte

Versi yang sedikit lebih panjang ini memenuhi (e) dan menampilkan satu halaman sebagai rentang dengan batas bawah dan atas yang sama

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
zocky
sumber
@Cyoce - Apakah Anda menggunakan mesin javascript yang diaktifkan ES6?
zocky
Oh, hmm, saya punya bug, itu tidak benar-benar menangani 36-47 dengan benar. Apa prosedur yang tepat? Apakah saya menghapus dan memperbaikinya, atau hanya mencoba memperbaikinya (saya mungkin tidak punya waktu sekarang), atau apa?
zocky
Hmm, itu hanya berfungsi di Chrome saya. Apa yang menyebabkannya?
zocky
Dan zocky, perbaiki kalau bisa. Itu tidak akan dianggap valid sampai diperbaiki, dan karena itu tidak dapat diterima sampai saat itu (dengan asumsi Anda adalah byte paling sedikit).
Cyoce
3

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

Ini memuaskan semua bonus. Harganya hampir 100 byte ekstra untuk membuat semuanya bekerja dengan baik. Fungsi ini hanya menghilangkan digit terdepan jika celah tidak meluap satu kali. Misalnya 9 10 11output 9-1tetapi 9 10 11 12 .. 20 21output9-21 .

Jika GAP sedikit kurang bertele-tele, saya bisa mendapatkan ini cukup pendek (juga bisa menyelamatkan banyak byte jika saya tidak mengikuti sintaks yang tepat.) Saya mungkin akan mencoba bermain golf ini sedikit lebih keras besok. Lihat di bawah untuk kasus uji.

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;

Perhatikan bahwa dalam sintaks GAP, [a..b]setara dengan [a,a+1,...,b]. Saya percaya bahwa test case ini menunjukkan bahwa program ini memenuhi semua persyaratan. Jika ada sesuatu yang salah, beri tahu saya.

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  
Liam
sumber
3

Lua, 322 * 80% * 75% * 50% = 96,6 Bytes

Akhirnya dilakukan dengan 3 tantangan, Skor di bawah 100 byte: 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

Tidak disatukan

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

Anda dapat menguji lua online , untuk melihat kinerjanya terhadap kasus uji, salin tempel fungsi, diikuti oleh kode ini:

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))
Katenkyo
sumber
Tampaknya gagal jika {9..21} dimasukkan. Output 9-1.
Liam
@ICanHazHats Tetap, terima kasih sudah menunjukkannya :)
Katenkyo
2

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

Saya telah memutuskan untuk menggunakan metode (jauh lebih kecil di Jawa), ini adalah versi golfnya:

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

Dan ini adalah versi yang dapat dibaca:

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

Ketika diuji ini hasilnya:

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

Keluaran:

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

Memperbarui:

Sekarang dapat menangani angka negatif juga, menambah bonus.

Roy van Rijn
sumber
Saya bukan pakar Java, tetapi bisakah Anda mempersingkat dengan mengubahnya p=s=c=0;c--;menjadi p=s=0;c=-1;?
Cyoce
Saya bukan ahli Java, tetapi bisakah Anda mempersingkatnya dengan mengubah return c> = 0? "bla": "" mengembalikan c <0? "": "bla"?
Stephan Schinkel
Anda bahkan dapat melakukannya c=~(p=s=0)untuk poin gaya.
Cyoce
2

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

Wow, itu salah satu tantangan untuk memasukkan semua bonus. Mungkin bisa dibuat lebih pendek.

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

Cobalah online!

Bagaimana itu bekerja

Penjelasannya sangat kasar; jangan ragu untuk mengajukan pertanyaan yang mungkin Anda miliki.

/*    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.
Produksi ETH
sumber
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=", ")

Diindentasi, dengan baris baru:

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

Kasus uji:

> 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

Ini bekerja untuk bonus -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

Ia menerima input yang tidak disortir:

> 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

Ini menerima angka negatif:

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

skrip shell

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

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

di mana sawal dari urutan saat ini dan omerupakan nilai input sebelumnya.

Rainer P.
sumber
Saya suka, tetapi saat ini tidak mendapatkan bonus -25%. substr () memotong tanda minus dan angka signifikan.
ezrast,
@ezrast ini sebenarnya perilaku yang benar dalam hal -50% bonus: -31, -30, -29, -28kenaikan tempat 10 ini dari -3ke -2dan oleh karena itu harus kental untuk -31-8. Saya juga melihat ambiguitas yang diciptakannya, tetapi itulah yang diminta.
Rainer P.