ย่อหมายเลขหน้าเหล่านี้!


35

ข้อจำกัดความรับผิดชอบ: แม้ว่าฉันจะอยู่บนไซต์นี้เพื่อความบันเทิงสักครู่ แต่ตอนนี้เป็นคำถามแรกของฉันดังนั้นโปรดให้อภัยข้อผิดพลาดเล็กน้อย

พื้นหลัง

เมื่อทำการบ้านกับเราอาจารย์ของฉันน่ารำคาญจริง ๆ และเขียนปัญหาทั้งหมดที่เราต้องทำแยกกัน เช่นนี้ฉันต้องใช้เวลาตลอดไปในการคัดลอกปัญหาที่ฉันต้องทำ ฉันคิดว่าจะทำให้ชีวิตของฉันง่ายขึ้นฉันจะส่งโปรแกรมที่ทำให้รายการปัญหาใช้พื้นที่น้อยลง

ขณะที่เขียนรายการหน้าหรือหมายเลขปัญหาเราใช้เส้นประเพื่อแสดงช่วง ยกตัวอย่างเช่นจะกลายเป็น19-21 19, 20, 21ถ้ามีช่องว่างในระหว่างสองช่วงคั่นด้วยเครื่องหมายจุลภาคมีการใช้จะกลายเป็น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เป็นเป็นตัวเลขสุดท้ายที่ต่ำกว่าหมายถึงการเพิ่มสถานที่ 10s

ท้าทาย

โปรแกรมของคุณควรบันทึกรายการจำนวนเต็มผ่านอินพุต (อะไรก็ได้ที่เป็นมาตรฐานสำหรับภาษาของคุณหรือฟังก์ชั่น) คุณสามารถตัดสินใจได้ว่ารายการนี้คั่นด้วยเครื่องหมายจุลภาคคั่นด้วยช่องว่างหรือเป็นรายการ / อาร์เรย์จริง

เอาท์พุทวิธีที่สั้นที่สุด (เรียงลำดับแรกตามจำนวนของช่วงจากนั้นผลรวมของตัวละครรวมอยู่ในช่วง) เพื่อเป็นตัวแทนของรายการที่ใช้สัญกรณ์นี้ แต่ละช่วงประต้องอยู่ในบรรทัดเดียวกัน แต่สามารถคั่นช่วงด้วยเครื่องหมายจุลภาคหรือบรรทัดใหม่ (อนุญาตให้ขึ้นบรรทัดใหม่หรือเครื่องหมายจุลภาคต่อท้าย) ช่วงเหล่านี้จะต้องอยู่ในลำดับ

เนื่องจากโรงเรียน 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

คำตอบจะได้รับการยอมรับในวันเสาร์ที่ 19 ธันวาคม 2558

GLHF!


ทำไมเอาต์พุตในกรณีทดสอบครั้งที่สามถึงไม่1-4 9-2?
Alex A.

สิ่งที่ควรส่งออกสำหรับโปรแกรมที่ (a) ทำและ (b) ไม่ได้รับโบนัส 50% สำหรับ149 150 151 152 153 154 155 156 157 178 159 160?
lirtosiast

3
ฉันสาบานได้แล้วว่ามีคำถามอื่นเช่นนี้ แต่ฉันหามันไม่ได้ ...
mbomb007

5
ฉันคิดว่านี่เป็นคำถามที่เกี่ยวข้องที่ทุกคนกำลังคิด ที่หนึ่งเปลี่ยนช่วงเป็นรายการแม้ว่า
เดนนิส

1
สิ่งอื่น - ข้อความที่บอกว่าหลักสุดท้ายสำหรับหน้าสิ้นสุดของช่วงที่ควรจะตัดถ้ามันต่ำกว่าที่หน้าเริ่มต้น แต่กรณีทดสอบกล่าวว่า19-9สำหรับการ19,20,...,29และไม่ได้19-29เป็นข้อความที่แสดงถึง ดังนั้นสิ่งที่ถูกต้อง?
zocky

คำตอบ:


5

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

สิ่งนี้จะทำงานโดยการนับขึ้นไปหาก elemts ที่พอเพียงเป็น 1 ส่วนแล้วสร้างสตริงจากจำนวนและโมดูโลนับ - จำนวนและการคูณทำให้เกิดการเชิงลบบางอย่างจะเลว

Gif ให้โชว์ผลงานการป้อนข้อมูลของและเอาท์พุท8,9,10,11 8-1สำหรับอินพุต-5,-4,-3,1,3,4,5 -5--3,1,3-5ออกมา


1
จริง ๆ แล้วการนับว่าเป็นลูป / ในขณะที่ลูป / ถ้า / อะไรก็ตามที่เป็น 1 ดั้งเดิมไม่ยุติธรรมเพราะในภาษาเช่น JS พวกเขานับมากกว่า 1 ไบต์ ...
ev3commander

@ ev3commander เป็นอะไรที่ยุติธรรมถ้ามันมาพร้อมกับไดอะแกรมภาพเคลื่อนไหวที่ยอดเยี่ยม!
Cyoce

นั่นเป็นเหตุผลว่าทำไมมันถึงอยู่ในพื้นฐานไม่ใช่ไบต์ นอกจากนี้ยังมีสายไฟจำนวนมากที่เกิดขึ้นดังนั้นลูป actaully เป็นอย่างน้อย 2 หรือ 3 และอย่างน้อย 3 ต่อการลงทะเบียนกะ + เริ่มต้น
Eumel

1
ตามกฎกอล์ฟมาตรฐานที่คุณสามารถทำได้มันน่าเบื่อเพียง
Eumel

2
@ ev3commander จริง ๆ แล้วถ้าภาษานั้นใหม่กว่าความท้าทายที่คุณไม่ได้รับอนุญาตให้ใช้เพื่อเหตุผลในการแข่งขัน
Adnan

14

C ++ 11, 451 * 80% * 75% * 50% = 135.3 ไบต์

บันทึกแล้ว 9 ไบต์ขอบคุณ @ kirbyfan64sos

บันทึกแล้ว 19 ไบต์ขอบคุณ @JosephMalle และ @cat

บันทึกแล้ว 11 ไบต์ขอบคุณ @ 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;}

สิ่งนี้มีคุณสมบัติสำหรับโบนัสทั้งหมด

ตัวอย่างการทดสอบพารามิเตอร์และผลลัพธ์:

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แต่ใกล้พอ)
Mego

8

Ruby, 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

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) แต่แขวนในหน้าเดียว นอกจากนี้ยังสามารถจัดการรายการซ้ำ (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 อยู่หรือไม่?
zocky

โอ้หืมมมฉันมีบั๊กมันไม่ได้จัดการ 36-47 อย่างถูกต้อง ขั้นตอนที่เหมาะสมคืออะไร? ฉันจะลบและแก้ไขหรือลองแก้ไข (ฉันอาจไม่มีเวลา) หรืออะไร
zocky

อืมมันใช้ได้กับ Chrome ของฉันเท่านั้น สิ่งที่ช่วยให้?
zocky

และจ๊อคกี้แก้ไขเมื่อคุณสามารถ มันจะไม่นับว่าถูกต้องจนกว่าจะได้รับการแก้ไขและเป็นเช่นนั้นไม่สามารถยอมรับได้จนกว่าจะถึงตอนนั้น (สมมติว่าคุณเป็นไบต์ที่น้อยที่สุด)
Cyoce

ขอให้เรายังคงอภิปรายนี้ในการแชท
Cyoce

3

GAP , 355 ไบต์ * 0.8 * 0.75 * 0.5 = 106.5

สิ่งนี้เป็นไปตามโบนัสทั้งหมด ฉันต้องเสียค่าใช้จ่ายเพิ่มขึ้นเกือบ 100 ไบต์เพื่อให้ทุกอย่างทำงานได้ดี ฟังก์ชั่นนี้จะไม่ใส่ตัวเลขนำหน้าหากช่องว่างไม่ล้นที่หนึ่งครั้ง ตัวอย่างเช่น9 10 11เอาท์พุท9-1แต่9 10 11 12 .. 20 21เอาท์พุท9-21เอาท์พุท

ถ้า GAP น้อยกว่า verbose ฉันจะได้รับข้อความสั้น ๆ นี้ (เช่นอาจบันทึกหลายไบต์ถ้าฉันไม่ทำตามไวยากรณ์ที่แน่นอน) ฉันอาจลองเล่นกอล์ฟนี้ยากขึ้นในวันพรุ่งนี้ ดูกรณีทดสอบด้านล่าง

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;

ทราบว่าในไวยากรณ์ 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

Ungolfed

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) นี่คือเวอร์ชัน 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()):"";}

และนี่คือเวอร์ชันที่อ่านได้:

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 script

# 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.