Digits ขุด Dungeon


10

แก้ไข:ฉันจะมอบรางวัล100 ชื่อเสียงให้แก่นักแก้ปัญหาตัวแรกของปริศนาโบนัสเมื่อสิ้นสุดคำถาม!

ฉันจะเพิ่มเงินรางวัลให้กับคำถามก็ต่อเมื่อคำตอบปรากฏขึ้นเนื่องจากเงินรางวัลนี้ไม่มีกำหนดเวลา

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

███  ███  A dungeon with 5 blocks removed and a depth of 3.
███  ███
███ ████
████████

ก่อนที่จะเริ่มการขุดพื้นเป็นระดับ

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

ตัวเลขใช้กลยุทธ์ต่อไปนี้สำหรับการขุด:

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

ตัวอย่างเช่นตัวเลขที่1 1 1 2 3 3จะขุดดันเจี้ยนต่อไปนี้ (การสร้างภาพข้อมูลทีละขั้นตอนด้วยตัวเลขที่ทำเครื่องหมายชนิดของตัวเลขที่ขุดออกจากตำแหน่งนั้น):

███1████    ███11███    ███11███    ███11███    ███11███    ███11███
████████    ████████    ███1████    ███1████    ███1████    ███13███
████████    ████████    ████████    ███2████    ███2████    ███2████
████████    ████████    ████████    ████████    ███3████    ███3████
████████    ████████    ████████    ████████    ████████    ████████

คำอธิบายสำหรับตัวอย่าง:

  • อันที่สอง1ไม่สามารถปีนออกจากคอลัมน์ที่มีอยู่ได้หากมันจะทำให้ลึกลงไปถึง2-deep ดังนั้นมันจึงขุดลงไปทางขวา
  • ที่สาม1สามารถขุดในคอลัมน์ซ้ายสุดสร้างคอลัมน์2-deep ตามที่สามารถย้ายออกไปยัง1คอลัมน์ -deep แล้วไปที่ระดับพื้นดิน
  • ถัดไป2และ3ทั้งคู่สามารถขุดในคอลัมน์ซ้ายสุด
  • คนสุดท้าย3ไม่สามารถขุดในคอลัมน์ซ้ายสุด แต่ทำได้ในคอลัมน์ถัดไป

อินพุต

  • รายการที่ไม่ลดลงของจำนวนเต็มหนึ่งหลักบวกที่มีองค์ประกอบอย่างน้อยหนึ่ง

เอาท์พุต

  • จำนวนเต็มบวกเดียวคือความลึกของดันเจี้ยนที่สร้าง

ตัวอย่าง

อินพุต => เอาต์พุต (ด้วยความลึกของคอลัมน์ของดันเจี้ยนจากซ้ายไปขวาตามคำอธิบายที่ไม่ได้เป็นส่วนหนึ่งของเอาต์พุต)

[3]  =>  1
(column depths are [1])

[1, 1, 1, 2, 3, 3]  =>  4
(column depths are [4, 2])

[1, 1, 1, 1, 1, 1, 1, 1]  =>  3
(column depths are [3, 2, 2, 1])

[1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5]  =>  11
(column depths are [11, 6, 2])

[1, 1, 1, 1, 1, 2, 2, 9, 9, 9]  =>  7
(column depths are [7, 2, 1])

[2, 2, 2, 2, 2, 5, 5, 5, 7, 7, 9]  =>  9
(column depths are [9, 2])

[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]  =>  10
(column depths are [10, 5])

[1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 7, 7, 9]  =>  13
(column depths are [13, 5])

[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]  =>  13
(column depths are [13, 5])

[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9]  =>  21
(column depths are [21, 12, 3])

นี่คือรหัสกอล์ฟเพื่อให้รายการที่สั้นที่สุดชนะ

ปริศนาโบนัส

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

คำตอบ:


5

Pyth, 21 ไบต์

huXf>+H@GhT@GT0G1Qm0Q

ลองใช้ออนไลน์: การสาธิตเดี่ยวหรือชุดทดสอบ

คำอธิบาย:

                  m0Q   generate a list of zeros of length len(input)
                        This will simulate the current depths
 u               Qm0Q   reduce G, starting with G=[0,...,0], for H in input():
   f          0             find the first number T >= 0, which satisfies:
    >+H@GhT@GT                  H + G[T+1] > G[T]
  X            G1           increase the depth at this position by one
                            update G with this result
h                       print the first element in this list

2

Java, 199

import java.util.*;a->{List<Integer>l=new ArrayList();l.add(0);int x,y,z=0;s:for(int i:a){for(x=0;x<z;x++)if((y=l.get(x))-l.get(x+1)<i){l.set(x,l.get(x)+1);continue s;}l.add(z++,1);}return l.get(0);}

เวอร์ชันที่ขยายและรันได้

import java.util.*;
class DIGits {
    public static void main(String[] args) {
        java.util.function.Function<int[], Integer> f =
                a->{
                    List<Integer> l = new ArrayList();
                    l.add(0);
                    int x, y, z = 0;
                    s:
                    for (int i : a) {
                        for (x = 0; x < z; x++) {
                            if ((y = l.get(x)) - l.get(x + 1) < i) {
                                l.set(x, l.get(x) + 1);
                                continue s;
                            }
                        }
                        l.add(z++, 1);
                    }
                    return l.get(0);
                };
        System.out.println(f.apply(new int[]{1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 7, 7, 9}));
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.