ダンジョンを掘る数字


10

編集:質問の最後に、ボーナスパズルの最初のソルバーに100の評判の賞金を授与します!

この賞金には期限がないため、回答が表示されたときにのみ、賞金を質問に追加します。

1桁の正の整数の減少しないリストが与えられた場合、桁を掘るダンジョンの深さを決定する必要があります。

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

掘り始める前に地面は水平です。

すべての指は下から土のブロックを1つだけ削除できますが、ダンジョンの外側からその位置に到達する必要があり、ブロックを削除した後、ブロックはダンジョンを離れる必要があります。そうしている間、数字水平ステップでその数値を超えて下降または上昇することはできません

数字は掘るために次の戦略を使用します:

  • 最小の値を持つ数字が最初に掘り、その後、次のディガーは常に残りの数字の次に小さい値になります。
  • 最初の桁はどの位置でも掘ることができます。(すべての地面は同じです。)
  • 次の数字は、常に開始された列の一番左にあり、そこから出たり入ったりすることができます。そのような列が存在しない場合、右端の列の右側にある新しい列を掘り始めます。

たとえば、数字1 1 1 2 3 3は次のダンジョンを掘ります(どの種類の数字がその位置を掘り起こすかを示す数字で段階的に視覚化します)。

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

例の説明:

  • 2番目の1列は、それを2-deepに深くして右に掘る場合、利用可能な唯一の列から登ることができませんでした。
  • 3番目1は、左端の列を掘って2-deepカラムを作成し、-deepカラムに移動して1から地面レベルに移動できます。
  • 23両方とも左端の列を掘ることができます。
  • 最後3は左端の列を掘ることはできませんが、次の列は掘ることができます。

入力

  • 少なくとも1つの要素を持つ正の1桁の整数の減少しないリスト。

出力

  • 構築されたダンジョンの深さである単一の正の整数。

入力=>出力(説明として、ダンジョンの列の深さを左から右に、これは出力の一部ではありません)

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