บล็อกซ้อน


15

เมื่อได้รับอินพุตของรายการบล็อกที่จะดรอป ณ จุดใดจุดหนึ่งให้ส่งออกความสูงของ "หอคอย" ที่เกิดขึ้น

วิธีที่ดีที่สุดในการอธิบายความท้าทายนี้เป็นตัวอย่าง การป้อนข้อมูลจะมีรายการของ2nจำนวนเต็มตัวแทนnบล็อก จำนวนเต็มแรกคือตำแหน่ง x ของบล็อก 0 ดัชนีและที่สองคือความกว้างของบล็อก ตัวอย่างเช่นอินพุตของ2 4แสดงถึงบล็อก (ที่มีพิกัด x ติดป้ายด้านล่าง):

  ####
0123456789

2 4 4 6ตอนนี้ขอบอกว่าใส่เป็น นั่นคือหนึ่งบล็อกที่ x = 2 ที่มีความกว้าง 4 และอีกหนึ่งที่ x = 4 ที่มีความกว้าง 6:

    ######
  ####

โปรดทราบว่า a.) บล็อก "ปล่อย" เสมอจากด้านบนสุดของหอคอยและ b.) บล็อกจะไม่ "ล้ม" (เช่นพวกเขาจะรักษาสมดุลเสมอ) ดังนั้นอินพุตของ 2 4 4 6 12 1แทน:

    ######
  ####      #

โปรดทราบว่าบล็อกสุดท้ายได้ลดลงไปจนถึง "พื้นดิน"

ผลลัพธ์สุดท้ายของคุณควรเป็นความสูงสูงสุดของหอคอยในแต่ละค่า x ถึงสูงสุด ดังนั้นอินพุต2 4 4 6 12 1ควรให้ผลลัพธ์ 0011222222001:

    ######
  ####      #
0011222222001

อินพุตอาจถูกกำหนดให้เป็นสตริง whitespace- / คั่นด้วยเครื่องหมายจุลภาคอาร์เรย์ของจำนวนเต็มหรืออาร์กิวเมนต์บรรทัดฟังก์ชัน / คำสั่ง ตำแหน่งบล็อก (ค่า x) จะเป็นจำนวนเต็ม 0 หรือมากกว่าความกว้างจะเป็นจำนวนเต็ม 1 หรือมากกว่าเสมอและจะมีอย่างน้อยหนึ่งบล็อก

เอาต์พุตอาจถูกกำหนดเป็นสตริงเดี่ยวโดยคั่นด้วยอักขระที่ไม่ใช่ตัวเลข (เช่น"0, 0, 1, ..."), สตริงเดียวที่แสดงรายการตัวเลขทั้งหมด (เช่น "001..."- ความสูงสูงสุดรับประกันได้ว่าจะเป็น 9 หรือน้อยกว่า) หรืออาร์เรย์ของจำนวนเต็ม

เนื่องจากนี่คือรหัสที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ

กรณีทดสอบ:

In                                   Out
---------------------------------------------------------
2 4 4 6 12 1                         0011222222001
0 5 9 1 6 4 2 5                      1133333222
0 5 9 1 2 5 6 4                      1122223333
0 5 2 5 6 4 9 1                      1122223334
20 1 20 1 20 1                       00000000000000000003
5 5                                  000011111
0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 4  123456789999

เราสามารถรับอินพุตเป็นอาร์เรย์ 2-tuples ได้ไหม
lirtosiast

@ThomasKwa ไม่อินพุตต้องเป็นอาร์เรย์ 1 มิติ
Doorknob

คำตอบ:


2

CJam, 34 30 ไบต์

Lq~2/{eeWf%e~_2$:).*:e>f*.e>}/

อินพุตเป็นอาร์เรย์สไตล์ CJam เอาต์พุตเป็นสตริงของตัวเลข

เรียกใช้กรณีทดสอบทั้งหมด

ต่อไปนี้เป็นแนวคิดสองแบบของแนวคิดอื่น แต่ปัจจุบันมีความยาว 2 ไบต์

Lq~2/{_:\3$><0+:e>)aeez.*e_.e>}/
LQ~2/{_:\3$><0+:e>)aeez.+e~.e>}/

6

Python 3, 89

def f(a):
 h=[]
 while a:x,w,*a=a;h[:x+w]=(h+[0]*x)[:x]+[max(h[x:x+w]+[0])+1]*w
 return h

ลองมันออนไลน์

ฟังก์ชันรับและส่งคืนรายการจำนวนเต็ม

def f(a):                       # input as list of integers
  h=[]                          # list of heights
  while a:                      # while there's input left
    x,w,*a=a;                   # pop first 2 integers as x and w

    h[:x+w]=                    # change the heights between 0 and x+w
      (h+[0]*x)[:x]+            # left of x -> unchanged but padded with zeros
      [max(h[x:x+w]+[0])+1]*w   # between x and x+w -> set to the previous max + 1

  return h                      # return the list of heights

2

ทับทิม, 88 87 ไบต์

f=->i{o=[]
(s,l,*i=i
r=s...s+l
o[r]=[([*o[r]]+[0]).max+1]*l
o.map! &:to_i)while i[0]
o}

ลองออนไลน์

แรงบันดาลใจจากคำตอบของ grc แต่ในภาษาอื่นและสั้นกว่าเล็กน้อย

คำอธิบาย:

f=->i                        # lambda with parameter i, expects array of ints
{
    o=[]                     # output
    (
        s,l,*i=i             # pop start and length
        r = s...s+l          # range is used twice, so shorten it to 1 char
        o[r] =
            [(
                    [*o[r]]  # o[r] returns nil if out of bounds, so splat it into another array
                    +[0]     # max doesn't like an empty array, so give it at least a 0
            ).max+1]*l       # repeat max+1 to fill length
        o.map! &:to_i        # replace nil values with 0
    ) while i[0]             # i[0] returns nil when i is empty, which is falsy
    o                        # return o
}

1

APL, 79 ไบต์

{⊃{o←(z←(≢⍵)⌈a←+/⍺)↑⍵⋄e←(z↑(-a)↑⍺[1]⍴1)⋄o+0⌈o-⍨e×e⌈.+e×o}/⌽(⊂⍬),↓(⌽2,0.5×≢⍵)⍴⍵}

อินพุตเป็น APL Array เอาต์พุตเป็นอาร์เรย์ของตัวเลข APL


{⊃{o←⍵↑⍨z←(≢⍵)⌈a←+/⍺⋄e←z↑(-a)↑⍺[1]⍴1⋄o+0⌈o-⍨e×e⌈.+e×o}/⌽(⊂⍬),↓⍵⍴⍨⌽2,.5×≢⍵}(พระเจ้าของฉันเรียนรู้ที่จะใช้อย่างถูกต้อง)
Zacharý

โปรดระวังด้วยคำพูดของคุณ ... คุณดูเหมือนจะไม่ทราบความแตกต่างระหว่างและ1↑และเนื่องจากสิ่งนี้คุณจึงให้คำแนะนำที่ทำให้โปรแกรมที่อัปเดตให้ผลลัพธ์ที่ผิด แต่ฉันไม่สนับสนุนคุณ
lstefano

ใช่ฉันเป็นแบบนั้นบางครั้งเมื่อฉันเห็นสิ่งต่าง ๆ ที่สามารถเล่นกอล์ฟได้ แต่สนามกอล์ฟอื่น ๆ ก็ยังควรใช้
Zacharý

พวกเขาทั้งหมดทำ และฉันได้รวมคำแนะนำของคุณไว้ด้วยหวังว่าจะได้รับเครดิตที่เหมาะสม
lstefano

- - ใช่มั้ย - -0.5
Zacharý

0

Java 1.8, 351 329 ไบต์

ไม่ตื่นเต้นกับความพยายามครั้งแรกนี้ - ฉันแน่ใจว่าการวนซ้ำสองครั้งและ Integer.valueOf ทั้งหมดนั้นสามารถเล่นกอล์ฟได้มากกว่านี้

interface B{static void main(String[]x){Byte b=1;int i=0,s,c,m=0,h,a=x.length,t[];for(;i<a;){s=b.valueOf(x[i++]);c=b.valueOf(x[i++]);m=m>s+c?m:s+c;}t=new int[m];for(i=0;i<a;){h=0;s=b.valueOf(x[i++]);c=b.valueOf(x[i++]);for(m=s;m<s+c;m++)if(t[m]>=h)h=t[m]+1;for(m=s;m<s+c;)t[m++]=h;}for(i=0;i<t.length;)System.out.print(t[i++]);}}

Ungolfed

interface B {
static void main(String[]x){
    int start, count, maxWidth=0, height, args=x.length, totals[];
    Byte b=1;
    for (int i=0; i<args;){
        start = b.valueOf(x[i++]);
        count = b.valueOf(x[i++]);
        maxWidth = maxWidth>start+count ? maxWidth : start+count; 
    }
    totals=new int[maxWidth];
    for (int i=0; i<args;){
        height=0;
        start = b.valueOf(x[i++]);
        count = b.valueOf(x[i++]);
        for (int j = start; j<start+count; j++) {
            if (totals[j]>=height) {
                height=totals[j]+1;
            }
        }
        for (int j = start; j<start+count; j++) {
            totals[j] = height;
        }
    }
    for (int i=0;i<totals.length; i++){
        System.out.print(totals[i]);
    }
}
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.