pannenkoekがAプレスをカウントするのを助ける


28

pannenkoek2012は、Aボタンをできるだけ押すだけでスーパーマリオ64を完成させ、マリオをジャンプさせます。各「A press」は3つの部分で構成されています。

  • ボタンを押す
  • いつでもそれを保持する
  • リリースする

Pannenkoek2012のビデオからのAプレスの一部

上記の画像を含む優れた説明については、このビデオ(1:15-3:23)を参照してください。(ただし、このチャレンジでは、半押しプレスの用語は使用されず、Aをリリースする必要がある障害が想定されます。)

仕事:

Aボタンを押す(P)、ホールドする(H)、または放す(R)必要がある一連の障害物がある場合、それらの障害物を指定された順序で克服するために必要な最小のプレス数を出力します。Aボタンは最初は保持されていません。

形式的に記述:文字の文字列Sが与えられた場合、サブシーケンスとしてSを含むPHR形式の文字列を考慮し、そのような文字列のの(PH*R)*最小数を出力しPます。または、P?H*R?Sを分割できる形式のチャンクの最小数を見つけます。

inputを見てみましょうRHRPHHHR。Aボタンは開始されないため、最初の障害を克服するにRは、ボタンを押してから離す必要があります(#1を押します)。次に、ボタンを保持する必要がありますH。この場合も、最初にボタンを押す必要があります(#2を押します)。その後、その後にリリースして、その後を満たすことができRます。最後に、PHHHR1回押す(#3を押す)に続いてを押しHHHて放すと、残りが満たされRます。したがって、出力カウントは3です。

もう1つの見方は、入力文字列を3つの部分に分割して、文字をPHH..HHR省略できることです。

R
HR
PHHHR    

入力形式

入力は、次の選択肢として長押し、解放を表す要素のリストまたは文字列になります。

  • P, H, R
  • p, h, r
  • 1, 2, 3
  • 0, 1, 2

指定された順序で一致します。入力は空になりません。

テストケース:

P 1
H 1
R 1
HP 2
RHP 3
HHR 1
PHRH 2
RHRPHHHR 3
HHHHHH 1
PPRRHHPP 6
HPPRHRPRHPPRHPPHRP 12
PRHRHPHHPRRRHPPRHHPPRRRHRHPRPHPRPRHHRPPPRHPRP 28

リーダーボード:


1
Aボタンが押されないようにする必要がある障害についてはどうですか?グラフには4つのボタンの状態があります(これらは実際にゲームにも存在する可能性があると思います)
-Random832

3
実際には、プレス、保留、および保留の3つの状態があります。Aボタンのリリースが必要な状態はありません。課題は現実と比較して少し間違っています。
user202729

1
@ 11684「リリースに関しては、現在のところ、それが有用または重要なケースはないので、その部分について心配しないでください。」(1時48分-午前1時52分)
user202729

3
誰もMIPSアセンブリでこれをしたいですか?(スーパーマリオ64のプログラミングに使用される言語)
-user202729

1
@ user202729うわー、それは1つの徹底的なパンケーキです。ありがとう!
11684

回答:



3

Pyth、13バイト

tl:z"P?H*R?"3

ここで試してみてください!またはすべてのテストケースを検証します。

1代わりにも機能することに注意してください3

使い方?

tl:z "P?H * R?" 3 | 完全なプログラム。STDINから入力を受け取り、STDOUTに出力します。

  :z 3 | 一致する入力文字列を分割します...
    「P?H * R?」| 正規表現「P?H * R?」。
 l | 長さを取得します。
t | デクリメント(分割には空の文字列が含まれるため)。

正規表現の詳細:

P?| P –大文字と小文字を区別するリテラル文字P。
       | ?–量指定子。前の文字の1回または0回の一致。
  H * | H –大文字と小文字を区別するリテラル文字H。
       | * –量指定子。前の文字の任意の数の出現に一致します。
    R?| R –大文字と小文字を区別するリテラル文字R。
       | ?–量指定子。前の文字の1回または0回の一致。

ああ、あなたは私にそれを打ち負かした!
シャギー

いいね!正規表現の説明の2行目から最後の行までは、「リテラル文字R」である必要があります。
-vidstige

@vidstigeはい、ありがとう。修正済み
Mr. Xcoder

2

ゼリー、10バイト

o5ḄƝ%⁵>4S‘

リスト(P,H,R : 0,1,2オプション)を受け取り、整数であるカウントを返す単項チェーン。

オンラインでお試しください!またはテストスイートを見る

どうやって?

効果的にし、「継続ペア」ではないといういずれかを数え、すべての隣接する対を取得することで動作します(PRPHHR、またはHH)と1つを追加します。

o5ḄƝ%⁵>4S‘ - Link: list of integers (in [0,1,2])  e.g.: [0,0,1,0,2,1,1,2,2,0] (representing PPHPRHHRRP)
o5         - logical OR with 5                          [5,5,1,5,2,1,1,2,2,5]
   Ɲ       - for all adjacent pairs:              i.e.: [5,5],[5,1],[1,5],[5,2],[2,1],[1,1],[1,2],[2,2],[2,5]
  Ḅ        -   convert from binary                      [ 15 ,  11 ,  7  ,  12 ,  5  ,  3  ,  4  ,  6  ,  9 ]
     ⁵     - literal ten
    %      - modulo                                     [  5 ,   1 ,  7  ,   2,   5  ,  3  ,  4  ,  6  ,  9 ]
      >4   - greater than four?                         [  1 ,   0 ,  1  ,   0,   1  ,  0  ,  0  ,  1  ,  1 ]
        S  - sum                                        5
         ‘ - increment                                  6

以前の11バイトソリューション:

ḅ3Ɲạ3ḟ1,2L‘

オンラインでお試しください!またはテストスイートを見る

どうやって?

上記のように動作しますが、まったく異なる方法で...

ḅ3Ɲạ3ḟ1,2L‘ - Link: list of integers (in [0,1,2])  e.g.: [0,0,1,0,2,1,1,2,2,0] (representing PPHPRHHRRP)
  Ɲ         - for all adjacent pairs:              i.e.: [0,0],[0,1],[1,0],[0,2],[2,1],[1,1],[1,2],[2,2],[2,0]
ḅ3          -   convert from base three                  [ 0  ,  1  ,  3  ,  2  ,  7  ,  4  ,  5  ,  8  ,  6 ]
   ạ3       - absolute difference with three             [ 3  ,  2  ,  0  ,  1  ,  4  ,  1  ,  2  ,  5  ,  3 ]
     ḟ1,2   - filter discard if in [1,2]                 [ 3        ,  0        ,  4              ,  5  ,  3 ]
         L  - length                                     5
          ‘ - increment                                  6

そしてまた別の、まったく異なる:

+19*Ɲ%13ḂS‘

(それぞれに19を追加し、隣接するペアに対して、13を法として2を法とする累乗を実行し、合計して1を加算します)。


新しいゼリークイック!
user202729

2

バッチ、69バイト

@set/ab=2,n=0
@for %%b in (%*)do @set/an+=b/2^|!%%b,b=%%b
@echo %n%

入力を0のインデックス付きコマンドラインパラメーターのリストとして受け取りますが、最初にp, h, r入力する場合は大文字または小文字の文字のリストを使用できますset /a p=0, h=1, r=2。説明:b最後の入力(デフォルト2はリリース済み)とnプレスのカウントを維持します。最後の入力がリリースであるか、現在の入力がプレスである場合、各入力はプレスを追加します。


ああ、set一度に複数の変数を設定できますか?知っておくと便利です。
user202729

1
@ user202729 set /aは算術評価であるため、設定する変数がすべて数値である限り、カンマ演算子を使用して割り当て式を連結することができます。
ニール





1

6 5バイト

Lġo&ε

オンラインでお試しください! 入力はリストです0,1,2(TIOリンクでは、テストケースのコピーアンドペーストを容易にするために文字が使用されます)。

説明

ジョナサンアランのジェリーの答えと同じ一般的な考え方を使用します。「不連続ペア」PP、HP、RH、RR、およびRPの発生で分割し、結果のブロックをカウントします。0,1,2エンコーディングでは、これらのペアは、左の要素が2であるか、右の要素が0であるものとまったく同じです。

Lġo&ε  Input is a list.
 ġ     Split between pairs that do not satisfy:
    ε  the left element is at most 1
  o&   and the right element is truthy.
L      Length.

1

Javascript(ES6)、30バイト

f=s=>s.match(/P?H*R?/g).length-1
<input id=i oninput="o.innerText=f(i.value)" value="PHHR"><pre id=o>l



1

ゼリー、10 バイト

Pn1></µƝS‘

オンラインでお試しください!またはテストスイート!盗まれたジョナサンから借りた。)

代替案:

P=1=</µƝS‘

オンラインでお試しください!

Pn1></µƝS‘ | Monadic chain.

      µƝ   | Map over each pair of "neighbours" (x, y) in the list.
P          | And check whether their product...
 n1        | ... 1 if it doesn't equal 1, 0 otherwise...
   >       | Is higher than?
    </     | The pair reduced by "Smaller than?". 1 if x < y, else 0.
        S  | Sum.
         ‘ | Add 1.

ゼリー、11バイト

caird coinheringaahingの助けを借りて1バイトを保存しました。

ḅ3Ɲf⁽vḲD¤L‘

オンラインでお試しください!


ああ、私はすぐに隣人を使用する最初の機会を逃しました:(
caird coinheringaahing

あなたμは3番目のものから削除することができます
ケアンズ・コイヘリンガー

1

Kotlin、36バイト

Regex("P?H*R?").findAll(i).count()-1

美化

Regex("P?H*R?").findAll(i).count()-1

テスト

fun f(i:String) =
Regex("P?H*R?").findAll(i).count()-1
data class Test(val input: String, val output: Int)

val TESTS = listOf(
        Test("P", 1),
        Test("H", 1),
        Test("R", 1),
        Test("HP", 2),
        Test("RHP", 3),
        Test("HHR", 1),
        Test("PHRH", 2),
        Test("RHRPHHHR", 3),
        Test("HHHHHH", 1),
        Test("PPRRHHPP", 6),
        Test("HPPRHRPRHPPRHPPHRP", 12),
        Test("PRHRHPHHPRRRHPPRHHPPRRRHRHPRPHPRPRHHRPPPRHPRP", 28)
)

fun main(args: Array<String>) {
    for ((input, expectded) in TESTS) {
        val actual = f(input)
        if (actual != expectded) {
            throw AssertionError("$input $expectded $actual")
        }
    }
}

TIO

TryItOnline


0

J18 17バイト

-1 @FrownyFrogに感謝

1+1#.}:(<+:1=*)}.

の形式で入力を受け取ります0,1,2。TIOのヘルパー関数は、テストケースをこの形式に変換します。

オンラインでお試しください!

比較のロジックはまだゴルフ可能です。私は、より均等で短い文を考えて、脳を結び目に変えています。

説明(以前の解決策)

1+1#.2(</+:1=*/)\]

現在のソリューションと以前のソリューションの唯一の違いは、比較の生成方法です。現在のソリューションは、配列をオフセットすることにより隣接要素を明示的に比較し、前のソリューションは、2の挿入記号を調べることにより隣接要素を比較します。

1 + 1 #. 2 (</ +: 1 = */)\ ]
         2               \ ]  On infixes of 2 on the input
                  1 = */        Is the infix 1 1 (two holds)?
            </                  Is the infix x y such that x < y?
               +:               These results NORed
    1 #.                       Add all of the results together (debase to base 1)
1 +                            Add one

2つのホールドが何もしなかった場合、これは非常にクリーンになります。コードは2つの中置記号を取り、それらが2つのホールドではなく昇順でないかどうかをチェックします。この場合、最終カウントに1を追加します。それ以外の場合は1つずつ空いているので、最後に1を追加する必要があります(または_、2以上の値を先頭に追加することもできます)。

インフィックスが2つのホールドであるかどうかを確認する方法は、2つの値を乗算し、1であるかどうかを確認することです(2つのホールドが1 1)。


1
1+1#.}:(<+:1=*)}.1つ短いです。
FrownyFrog

@FrownyFrog賢い、私はその中を編集します。
コール

1
14:1+1#.0=}.*2-}:
FrownyFrog

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.