กราฟที่เพิ่มมากขึ้น


23

พิจารณาลำดับของตัวเลขหนึ่งมิติภายในช่วงที่กำหนดเช่น

[1, 2, 4, 6, 8, 0, 2, 7, 3] in range [0, 10⟩

กราฟที่เพิ่มมากขึ้น * ** เป็นเส้นที่เชื่อมจุดทั้งหมดในลำดับนี้จากซ้ายไปขวาและขึ้นไปเรื่อย ๆ หรืออยู่ในระดับ หากจำเป็นบรรทัดนั้นจะพันจากบนลงล่างและขึ้นไปเรื่อย ๆ จากจุดนั้นไปยังจุดถัดไป

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

[1, 2, 4, 6, 8, 10]
[-2, 0, 2, 7, 13]
[-3, 3]

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

หมายเหตุ

  • ช่วงจะมีศูนย์เสมอเป็นขอบเขตด้านซ้าย (รวม) และขอบเขตด้านขวาจะเป็นจำนวนเต็ม N
  • ลำดับจะไม่ประกอบด้วยค่าที่ไม่อยู่ในช่วง
  • การเรียงลำดับแรกไม่มีจุดเพิ่มเติมที่จุดเริ่มต้น
  • การเรียงลำดับสุดท้ายไม่มีจุดเพิ่มเติมในตอนท้าย
  • ไม่จำเป็นต้องระบุดัชนีเริ่มต้นที่จะต้องมีการวางแผนองค์ประกอบ

กรณีทดสอบ

Input: [0, 2, 4, 6, 1, 3, 5, 0], 7
Output: [0, 2, 4, 6, 8], [-1, 1, 3, 5, 7], [-2, 0]
Input: [1, 1, 2, 3, 5, 8, 3, 1], 10
Output: [1, 1, 2, 3, 5, 8, 13],[-2, 3, 11],[-7, 1]
Input: [5, 4, 3, 2, 1], 10
Output: [5, 14],[-5, 4, 13],[-6, 3, 12],[-7, 2, 11],[-8, 1]
Input: [0, 1, 4, 9, 16, 15, 0], 17
Output: [0, 1, 4, 9, 16, 32], [-1, 15, 17], [-2, 0]

เกณฑ์การให้คะแนน

นี่คือโค้ดกอล์ฟซึ่งเป็นรหัสที่สั้นที่สุดในหน่วยไบต์

* ไม่ใช่ศัพท์แสงที่เกิดขึ้นจริง ** จริงๆแล้วควรเรียกกราฟที่ไม่มีการลดลงตามที่ @ngm ชี้ให้เห็น แต่ฟังดูน่าประทับใจน้อยกว่า


7
ยินดีต้อนรับสู่ PPCG! ความท้าทายแรกที่ดี!
AdmBorkBork

1
ดูเหมือนว่าฉันเข้าใจผิดบางส่วนของความท้าทาย ฉันคิดว่านี่ควรเป็นสิ่งที่คุณตั้งใจไว้
user202729

1
คุณสามารถขยายแกน y ในกราฟตัวอย่างของคุณต่ำกว่า 0 และสูงกว่า 10 เพื่อทำให้การท้าทายเข้าใจง่ายขึ้นหรือไม่
JayCe

@ JayCe ใช่ข้อเสนอแนะที่ดี
RvdV

2
กรณีทดสอบที่สองแนะนำว่าคุณต้องการให้ลำดับไม่ลดลงเมื่อเทียบกับการเพิ่มหรือไม่ กล่าวอีกนัยหนึ่งค่าซ้ำในอินพุตไม่หยุดการเรียงลำดับปัจจุบันและถ้าสองค่าสุดท้ายในการเรียงลำดับมีค่าเท่ากับ "มุม" เพื่อเริ่มต้นการเรียงถัดไปคือ 0 (ดังนั้นมันจะเริ่มด้วยค่าซ้ำ เช่นกัน)?
ngm

คำตอบ:



8

R , 179 158 151 bytes

function(s,m){p=1;t=c(which(diff(s)<0),length(s));for(i in t){d=c(s[p]-m,s[(p+1):i],s[i+1]+m);if(p==1)d[1]=s[1];if(p==t[-1])d=head(d,-1);print(d);p=i}}

ลองออนไลน์!

แก้ไข:ตอนนี้โค้ดเป็นฟังก์ชั่นและรับอินพุต (ขอบคุณ Giuseppe, user202729 และ JayCe สำหรับการชี้อย่างใจเย็น)
แก้ไข: -21 ไบต์แนะนำโดย Giuseppe
แก้ไข: -7 d=NULL;ไบต์โดยการเอา


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

เพียงเพื่อจะชัดเจนในสิ่งที่จะเป็นส่งที่ถูกต้อง: นี้จะเป็น ยินดีต้อนรับและสนุกไปกับเวลาของคุณที่นี่ :)
JayCe

ฉันคิดว่าs[p+1]-((m+s[p+1])-s[p])ลดความซับซ้อนลงs[p]-mและคุณมีd=c(c(...))ที่d=c(...)จำเป็นเท่านั้น ฉันสงสัยอย่างยิ่งว่าจะมีวิธีเล่นกอล์ฟ แต่นี่ก็ยังเป็นคำตอบที่ดี
Giuseppe

1
@PA dจำเป็นต้องเริ่มต้นด้วยซ้ำหรือไม่
JayCe

1
@PA ยินดีที่จะช่วย! ฉันเพิ่งเปิดห้องแชท R golfingอีกครั้งดังนั้นอย่าลังเลที่จะติดต่อกับฉันและนักกอล์ฟ R คนอื่น ๆ สำหรับคำถามเฉพาะที่คุณอาจมี :-)
Giuseppe

6

Python 2 , 60 ไบต์

อินพุตคือ N ตามด้วยคะแนนทั้งหมดเป็นอาร์กิวเมนต์แต่ละตัว subsequences 0.5ในการส่งออกจะถูกคั่นด้วย

f=lambda N,k,*l:(k,)+(l and(l[0]+N,.5,k-N)*(l[0]<k)+f(N,*l))

ลองออนไลน์!


Python 2 , 92 77 68 ไบต์

subsequences [...]จะถูกคั่นด้วย

l,N=input();r=[];k=0
for a in l:r+=[a+N,r,k-N]*(a<k)+[a];k=a
print r

ลองออนไลน์!


1
ดี anwser! ฉันชอบการใช้ตัวแปร k เพื่อเลือกรายการต่อท้ายเรียนรู้สิ่งใหม่ที่นี่!
RvdV



4

Haskell, 82 81 80 ไบต์

นี่คือพอร์ตของคำตอบที่สะอาดของฉัน

r!n|let f x(r@(a:_):s)|x>a=[x,n+a]:(x-n:r):s|y<-x:r=y:s=foldr f[[last r]]$init r

ลองออนไลน์!

-1, -1 ต้องขอบคุณLaikoni


@Laikoni เป็นเรื่องที่น่าเสียดายที่เราไม่สามารถกำหนดได้fโดยไม่ต้องใช้วงเล็บใน:รูปแบบดังที่let x<r@(a:_):s|...กล่าวมา

3

ทำความสะอาด , 92 ไบต์

import StdEnv
@r n=foldr(\x[r=:[a:_]:s]|x>a=[[x,n+a]:[x-n:r]:s]=[[x:r]:s])[[last r]](init r)

ลองออนไลน์!

อาร์กิวเมนต์ตัวดำเนินการfoldrเป็นแลมบ์ดาที่มียาม; มันแยกเป็น:

\x [r=:[a:_]:s]
    | x > a     = [[x,n+a]:[x-n:r]:s]
    | otherwise = [[x:run]:s]

ฉันรังเพลิงนี้จะ Haskell




1

JavaScript (Node.js)ขนาด 98 ไบต์

a=>m=>(r=[],b=[],a.map((e,i)=>e<a[--i]?(b[p](m+e),r[p](b),b=[a[i]-m,e]):b[p='push'](e)),r[p](b),r)

ลองออนไลน์! นี่ค่อนข้างยาวกว่าคำตอบ JS อื่น ๆ เล็กน้อย แต่ใช้วิธีการอื่น

คำอธิบายที่ไม่สวยงามและง่ายขึ้น

g=(a,m)=>{
    // r is the final array of arrays to return.
    // b is the current subset of only ascending numbers.
    r=[],b=[];

    a.map((e,i)=>{
        if(e<a[i-1]){
            // if the current value is less than the previous one,
            // then we're descending, so start a new array b.
            // add the proper value to b to match slopes with the next
            b.push(m+e);
            // add r to b, and restart b with the starter value and the current value in a
            r.push(b);
            b=[a[i-1]-m,e];
        } else{
            // otherwise, we're ascending, so just addd to to b.
            b.push(e);
        }
    });
    r.push(b); // add the final b to r, and return r
    return r;
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.