Ngưng tụ những số trang này!


35

Tuyên bố miễn trừ trách nhiệm: trong khi tôi đã ở trên trang này cho mục đích giải trí trong một thời gian ngắn, đây là câu hỏi đầu tiên của tôi, vì vậy xin vui lòng tha thứ cho bất kỳ lỗi nhỏ nào.

Lý lịch

Khi giao cho chúng tôi bài tập về nhà, giáo viên của tôi thực sự khó chịu và viết ra tất cả các vấn đề chúng tôi phải làm riêng. Như vậy, tôi phải mất mãi mãi để sao chép những vấn đề tôi phải làm. Tôi nghĩ để làm cho cuộc sống của tôi dễ dàng hơn, tôi sẽ gửi cho anh ấy một chương trình có thể làm cho danh sách các vấn đề chiếm ít không gian hơn.

Trong khi viết ra một danh sách các số trang hoặc số vấn đề, chúng tôi sử dụng dấu gạch ngang để biểu thị một phạm vi. Ví dụ, 19-21trở thành 19, 20, 21. Nếu có một khoảng cách ở giữa, hai phạm vi được phân tách bằng dấu phẩy được sử dụng: 19-21, 27-31trở thành 19, 20, 21, 27, 28, 29, 30, 31.
Ngay lúc này, có lẽ bạn đang nghĩ: "điều này có vẻ khá tầm thường". Trong thực tế, điều này đã được trả lời ở đâyở đây .

Tuy nhiên, có một nhược điểm. Nếu chúng ta có một phạm vi với các chữ số liên tiếp bằng nhau, các chữ số lặp lại có thể bị bỏ lại. Ví dụ: 15, 16, 17trở thành 15-7, và 107, 108, 109trở thành 107-9. Đối với phần thưởng, nếu chữ số bằng nhau liên tiếp cuối cùng lớn hơn 1 và chữ số cuối của giới hạn trên nhỏ hơn hoặc bằng chữ số dưới, thì có thể bỏ qua phần sau (xin lỗi nếu điều đó nghe có vẻ khó hiểu; có lẽ một số ví dụ sẽ xóa nó) . 109-113trở thành109-3 , như một chữ số cuối cùng thấp hơn ngụ ý tăng vị trí 10 giây.

Thử thách

Chương trình của bạn nên lấy danh sách các số nguyên thông qua đầu vào (bất cứ điều gì là tiêu chuẩn cho ngôn ngữ của bạn hoặc chức năng). Bạn có thể quyết định xem danh sách này được phân tách bằng dấu phẩy, phân tách bằng dấu cách hoặc dưới dạng danh sách / mảng thực tế.

Xuất ra con đường ngắn nhất (đầu tiên được sắp xếp theo số lượng phạm vi, sau đó tổng các ký tự có trong phạm vi) để thể hiện danh sách đó bằng cách sử dụng ký hiệu này. Mỗi phạm vi nét đứt phải nằm trên cùng một dòng, nhưng các phạm vi có thể được phân tách bằng dấu phẩy hoặc dòng mới (cho phép dòng mới hoặc dấu phẩy được phép). Các phạm vi này phải theo thứ tự.

Vì Wi-Fi của trường chúng tôi rất tệ , tôi phải làm cho tệp nhỏ nhất có thể để gửi cho anh ấy. Mã ngắn nhất (tính bằng byte) sẽ thắng.

Tiền thưởng

Giáo viên của tôi là người cẩu thả, vì vậy có một vài điều sẽ giúp anh ta ra. Nhiều phần thưởng xếp chồng lên nhau thông qua phép nhân, ví dụ phần thưởng -10% (x 90%) và phần thưởng -25% (x 75%) = 90% * 75% = x 67,5% (phần thưởng -32,5%).

  • Đôi khi anh ta đặt chúng theo thứ tự sai (anh ta không phải là giáo viên toán). Nhận phần thưởng -20% nếu chương trình của bạn có thể chấp nhận các số nguyên không được sắp xếp từ nhỏ nhất đến lớn nhất.
  • Cuốn sách của chúng tôi rất kỳ lạ và mỗi phần bắt đầu đếm các vấn đề ở mức -10. Nếu chương trình của bạn có thể chấp nhận số âm, hãy lấy -25%.
  • Nếu nó chấp nhận phần thưởng của chữ số cuối thấp hơn tăng vị trí 10, ví dụ như 25-32giảm xuống 25-2, hãy nhận phần thưởng -50%.

Các trường hợp thử nghiệm

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

Một câu trả lời sẽ được chấp nhận vào thứ Bảy, ngày 19 tháng 12 năm 2015.

GLHF!


Tại sao đầu ra trong trường hợp thử nghiệm thứ ba không 1-4 9-2?
Alex A.

Điều gì sẽ là đầu ra cho một chương trình mà (a) làm và (b) không nhận phần thưởng 50%, cho 149 150 151 152 153 154 155 156 157 178 159 160?
lirtosiast

3
Tôi có thể đã thề có một câu hỏi khác giống như thế này, nhưng tôi không thể tìm thấy nó ...
mbomb007

5
Tôi nghĩ rằng đây là câu hỏi liên quan mà mọi người đang nghĩ đến. Điều đó biến phạm vi thành danh sách mặc dù.
Dennis

1
Một điều - văn bản nói rằng chữ số áp chót cho trang kết thúc của dãy núi này nên cắt nếu nó thấp hơn so với các trang bắt đầu, nhưng trường hợp thử nghiệm nói 19-9cho 19,20,...,29và không 19-29như các văn bản ngụ ý. Vậy cái nào đúng?
zocky

Câu trả lời:


5

LabVIEW, 97 * 0.8 * 0.75 * 0.5 = 29.1 LabVIEW Nguyên thủy

điều này hoạt động bằng cách đếm lên trên nếu các elemive thành công cách nhau 1 và sau đó tạo một chuỗi từ số và modulo đếm số 10 và một số phép nhân gây ra âm tính là một con chó cái.

Các gif hiển thị một đầu vào 8,9,10,11và đầu ra 8-1. Đối với đầu vào -5,-4,-3,1,3,4,5 -5--3,1,3-5đi ra.


1
Thực sự, việc tính từng vòng lặp cho vòng lặp / vòng lặp / if / bất cứ điều gì là 1 nguyên thủy là không công bằng bởi vì trong các ngôn ngữ như JS, chúng được tính là nhiều hơn 1 byte ...
ev3commander

@ ev3commander bất cứ điều gì công bằng nếu nó đi kèm với một sơ đồ hoạt hình thú vị!
Cyoce

đó là lý do tại sao nó không phải là byte. Ngoài ra có rất nhiều hệ thống dây điện đang diễn ra để các vòng lặp hoạt động ít nhất là 2 hoặc 3 và cũng là 3 điểm khác cho mỗi lần đăng ký thay đổi + khởi tạo.
Eumel

1
theo quy tắc golf tiêu chuẩn, bạn có thể làm điều đó, thật nhàm chán
Eumel

2
@ ev3commander Trên thực tế, nếu ngôn ngữ mới hơn thách thức bạn không được phép sử dụng vì lý do cạnh tranh.
Ad Nam

14

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

Đã lưu 9 byte nhờ @ kirbyfan64sos.

Đã lưu 19 byte nhờ @JosephMalle và @cat.

Đã lưu 11 byte nhờ @ 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;}

Điều này đủ điều kiện cho tất cả các tiền thưởng.

Kiểm tra tham số mẫu và kết quả:

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

Tại sao không sử dụng intthay thế unsigned int? Lưu 9 byte.
kirbyfan64sos

@ kirbyfan64sos Cảm ơn, đã không nhận thấy điều đó.
TheCoffeeCup

+1 luôn muốn xem C ++. Tôi không thể kiểm tra điều này, nhưng tôi không nghĩ bạn cần iostream
sudo rm -rf slash

Tôi cũng không nghĩ bạn cần iostream, nhưng gccđã cho:a.cpp: In function ‘std::string f(std::vector<int>)’: a.cpp:8:83: error: ‘to_string’ was not declared in this scope
con mèo

@cat Hãy chắc chắn rằng nó đã cập nhật đủ để nó hỗ trợ chuẩn C ++ 11. 4.3-ish nên tốt với -std=c++11; > = 5.0 có mặc định (thực ra là vậy -std=gnu11, nhưng đủ gần).
Mego

8

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

Lấy các đối số dòng lệnh làm đầu vào (dấu phẩy là ổn); in một phạm vi trên mỗi dòng để đầu ra tiêu chuẩn.

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}

Với khoảng trắng / bình luận:

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
}

Các trường hợp thử nghiệ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

Các tính năng không được bao gồm trong các trường hợp thử nghiệm

Phạm vi đầu vào và phần tử đơn không được sắp xếp:

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

Phạm vi phủ định (không thể viết tắt số lớn hơn bằng các số này):

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

Viết tắt các số chữ số tùy ý (mở rộng bash thông thường được sử dụng cho đầu vào ở đây):

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

Tôi tin rằng bạn có thể thay thế ((n=c.shift-1)>m)bằngm<n=c.shift-1
Cyoce

5

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

Kiểm tra đầu vào

Tôi đang sử dụng dữ liệu thử nghiệm sau:

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

Cơ bản: 229 byte

Phiên bản này đáp ứng các yêu cầu của câu hỏi (a) với tất cả các phần thưởng (c, d, e), nhưng treo trên các trang đơn. Nó cũng có thể xử lý các bản sao (f). Nó xử lý các trang âm xuống tới -10.000, có thể dễ dàng tăng lên khi mất (lớn) tốc độ.

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

(Đầu ra ở trên hiển thị khoảng trắng thay vì dòng mới thực sự cho ngắn gọn)

Trang đơn: 233 byte

Phiên bản dài hơn một chút này cũng thỏa mãn (e) và hiển thị các trang đơn dưới dạng một phạm vi có giới hạn trên và dưới bằng nhau

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 - Bạn có đang sử dụng công cụ javascript hỗ trợ ES6 không?
zocky

Ồ, hmm, tôi có một lỗi, nó không thực sự xử lý 36-47 chính xác. Thủ tục thích hợp là gì? Tôi có xóa nó và sửa nó không, hay chỉ cố sửa nó (tôi có thể không có thời gian ngay bây giờ), hay sao?
zocky

Hmm, nó chỉ hoạt động trong Chrome của tôi. Đưa cái gì?
zocky

Và zocky, sửa chữa nó khi bạn có thể. Nó sẽ không được tính là hợp lệ cho đến khi nó được sửa chữa và vì thế không thể được chấp nhận cho đến lúc đó (giả sử của bạn là ít byte nhất).
Cyoce


3

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

Điều này đáp ứng tất cả các tiền thưởng. Tôi mất gần 100 byte để làm cho mọi thứ hoạt động tốt. Hàm này chỉ bỏ qua các chữ số hàng đầu nếu khoảng cách không tràn vào vị trí một lần. Ví dụ 9 10 11đầu ra 9-1nhưng 9 10 11 12 .. 20 21đầu ra 9-21.

Nếu GAP ít dài dòng hơn một chút, tôi có thể đã rút ngắn được điều này (cũng có thể đã lưu nhiều byte nếu tôi không tuân theo cú pháp chính xác.) Tôi có thể sẽ thử chơi golf khó hơn một chút vào ngày mai. Xem dưới đây cho các trường hợp thử nghiệm.

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; 

vô dụng:

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;

Lưu ý rằng trong cú pháp GAP, [a..b]tương đương với [a,a+1,...,b]. Tôi tin rằng những trường hợp thử nghiệm này chứng minh rằng chương trình này đáp ứng tất cả các yêu cầu. Nếu có gì sai, hãy cho tôi biết.

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

Cuối cùng thực hiện với 3 thử thách, Điểm dưới 100 byte: D

Chơi gôn

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

Ung dung

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

Bạn có thể kiểm tra lua trực tuyến , để xem cách nó thực hiện đối với các trường hợp kiểm tra, sao chép dán chức năng, theo sau là mã này:

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

Có vẻ thất bại nếu {9..21} được nhập. Đầu ra 9-1.
Liam

@ICanHazHats Đã sửa, cảm ơn vì đã chỉ ra :)
Katenkyo

2

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

Tôi đã quyết định thực hiện một phương thức (nhỏ hơn nhiều trong Java), đây là phiên bản chơi gôn:

Chơi gôn

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

Và đây là phiên bản dễ đọc:

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

Khi kiểm tra đây là những kết quả:

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

Đầu ra:

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

Cập nhật:

Bây giờ nó cũng có thể xử lý số âm, thêm vào phần thưởng.


Tôi không phải là chuyên gia Java, nhưng bạn có thể rút ngắn nó bằng cách thay đổi p=s=c=0;c--;thành p=s=0;c=-1;?
Cyoce

Tôi không phải là chuyên gia Java, nhưng bạn có thể rút ngắn nó bằng cách thay đổi return c> = 0 không? "Bla": "" để trả về c <0? "": "Bla"?
Stephan Schinkel

bạn thậm chí có thể làm c=~(p=s=0)cho điểm phong cách.
Cyoce

2

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

Wow, đó là một thử thách bao gồm tất cả các phần thưởng. Nó có thể được thực hiện ngắn hơn.

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Lời giải thích rất thô bạo; đừng ngần ngại hỏi bất kỳ câu hỏi mà bạn có thể có.

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

Được thụt lề, với các dòng mới:

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

Các trường hợp thử nghiệm:

> 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

Nó hoạt động với phần thưởng -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

Nó chấp nhận đầu vào chưa được sắp xếp:

> 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

Nó chấp nhận số âm:

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

kịch bản shell

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

kịch bả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}'

nơi sbắt đầu của chuỗi hiện tại và olà giá trị đầu vào trước đó.


Tôi thích nó, nhưng hiện tại nó không nhận được phần thưởng -25%. chất nền () đang cắt bỏ các dấu trừ và chữ số có nghĩa.
ezrast

@ezrast Đây thực sự là hành vi đúng về mặt tiền thưởng -50%: -31, -30, -29, -28tăng ở vị trí 10 từ -3đến -2và do đó sẽ được cô đọng lại -31-8. Tôi cũng thấy sự mơ hồ mà nó tạo ra, nhưng đó là những gì được yêu cầu.
Rainer P.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.