Bir zindan kazma basamak


10

Düzenleme: Sorunun sonunda bonus bulmacanın ilk çözücüsü için 100 itibar ödülü vereceğim !

Soruya sadece bu ödülün son tarihi olmadığı için cevap göründüğünde soruya ekleyeceğim.

Bir basamaklı pozitif tamsayıların azalmayan bir listesi verildiğinde, basamakların ne kadar derin zindan kazacağını belirlemelisiniz.

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

Kazmaya başlamadan önce zemin düz.

Her hane tam olarak bir toprak bloğunu altından kaldırabilir, ancak zindanın dışından bu konuma ulaşmalı ve kaldırıldıktan sonra blok zindandan ayrılmalıdır. Bunu yaparken , herhangi bir yatay adımda bir rakam sayısal değerinden daha fazla inemez veya yükselemez .

Rakamlar kazmak için aşağıdaki stratejiyi kullanır:

  • En küçük değere sahip basamak ilkleri kazar ve bundan sonra bir sonraki kazıcı her zaman basamakların geri kalanından sonraki en küçük değerdir.
  • İlk hane herhangi bir konumda kazabilir. (Bütün zemin aynı.)
  • Aşağıdaki rakamlar her zaman en soldan başlatılmış sütunda kazıp çıkabilecekleri yerde kazmaktadır. Böyle bir sütun yoksa, en sağdaki sütunun sağ tarafında yeni bir sütun kazmaya başlarlar.

Örneğin, rakamlar 1 1 1 2 3 3aşağıdaki zindanı kazar (bu pozisyonu hangi rakamın kazdığını belirten sayılarla adım adım görselleştirme):

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

Örnek için açıklama:

  • İkincisi 1, eğer onu derinlemesine derinlemesine derinlemesine 2incelerse , sadece mevcut sütundan çıkamazdı.
  • Üçüncüsü 1, en 2derin sütunda 1kazabilir ve -deep sütununa, sonra da zemin seviyesine hareket edebildiğinden bir -deep sütun oluşturabilir .
  • Bir sonraki 2ve 3her ikisi de en soldaki sütunda kazabilir.
  • Sonuncusu 3en soldaki sütunda kazamaz ancak bir sonraki sütunda olabilir.

Giriş

  • En az bir elemanı olan pozitif tek basamaklı tam sayıların azalmayan listesi.

Çıktı

  • Tek bir pozitif tam sayı, inşa edilen zindanın derinliği.

Örnekler

Girdi => Çıktı (çıktının bir parçası olmayan açıklama olarak zindan sütunlarının derinliklerini soldan sağa doğru)

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

Bu kod golf bu yüzden en kısa giriş kazanır.

Bonus bulmaca

"Rakamlar kazmak için aşağıdaki stratejiyi kullanır" bölümünde açıklanan stratejinin her zaman verilen rakamlar için mümkün olan en derin zindanı verdiğini kanıtlayabilir (veya çürütebilir) ?

Yanıtlar:


5

Pyth, 21 bayt

huXf>+H@GhT@GT0G1Qm0Q

Çevrimiçi deneyin: Tekli Gösteri veya Test Paketi

Açıklama:

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

Genişletilmiş, çalıştırılabilir sürüm

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}));
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.