Helfen Sie pannenkoek zählen A drückt

28

pannenkoek2012 zielt darauf ab, Super Mario 64 mit so wenig Drücken wie möglich der A-Taste zu beenden , was Mario zum Springen bringt. Jede "A-Presse" besteht aus drei Teilen:

  • Drücken Sie die Taste
  • Halten Sie es für eine beliebige Zeitdauer
  • Loslassen

Teile einer A-Presse, aus einem Video von Pannenkoek2012

In diesem Video (1:15 - 3:23) finden Sie eine gute Erklärung, die das obige Bild enthält. (Diese Herausforderung wird jedoch nicht die Halb-A-Presse-Terminologie verwenden und wird Hindernisse aufzeigen, die das Freigeben von A erfordern.)

Aufgabe:

Bei einer bestimmten Anzahl von Hindernissen, die das Drücken (P), Halten (H) oder Loslassen (R) der A-Taste erfordern, wird die kleinste Anzahl von Drücken ausgegeben, die erforderlich sind, um diese Hindernisse in der angegebenen Reihenfolge zu überwinden. Die A-Taste wird zunächst nicht gedrückt.

Formell ausgedrückt: PHRBetrachten Sie bei gegebener Zeichenfolge S (PH*R)*als Teilfolge Zeichenfolgen , die S enthalten, und geben Sie die kleinstmögliche Anzahl von Zeichen Pin einer solchen Zeichenfolge aus. Oder finden Sie alternativ die kleinste Anzahl von Stücken der Form P?H*R?, in die S aufgeteilt werden kann.

Beispiel

Schauen wir uns die Eingabe an RHRPHHHR. Die A-Taste wird nicht gedrückt gehalten. Um das ursprüngliche Hindernis zu überwinden, Rmuss die Taste gedrückt und dann losgelassen werden (Taste 1 drücken). Als nächstes müssen wir den Knopf Hgedrückt halten , was wiederum erfordert, dass er zuerst gedrückt wird (drücke # 2). Anschließend kann es wieder freigegeben werden, um das Nachher zu befriedigen R. Zum Schluss kann der verbleibende PHHHRTeil durch einmaliges Drücken (Drücken Sie # 3) und anschließendes Halten HHHund Loslassen befriedigt werden R. Die Ausgabezählung ist also 3.

Eine andere Möglichkeit, dies zu sehen, besteht darin, dass wir die Eingabezeichenfolge in drei Formularteile aufteilen können, in PHH..HHRdenen Buchstaben weggelassen werden können.

R
HR
PHHHR    

Eingabeformat

Die Eingabe ist eine Liste oder eine Folge von Elementen, die das Drücken, Halten und Loslassen wie folgt darstellen:

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

in der angegebenen Reihenfolge abgeglichen. Die Eingabe wird nicht leer sein.

Testfälle:

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

Bestenliste:

xnor
quelle
1
Was ist mit Hindernissen, bei denen die A-Taste nicht gedrückt werden darf? Es gibt vier Schaltflächenzustände in der Grafik (ich denke, dass diese möglicherweise auch im Spiel vorhanden sind)
Random832
3
In Wirklichkeit gibt es drei Zustände: Drücken, Halten und Nicht gehalten. Kein Staat erfordert eine A-Taste. Die Herausforderung ist im Vergleich zur Realität etwas falsch.
user202729
1
@ 11684 "In Bezug auf die Veröffentlichung gibt es derzeit keine Fälle, in denen dies nützlich oder wichtig ist. Machen Sie sich also keine Sorgen um diesen Teil." (1:48 - 1:52)
user202729
3
Möchte jemand dies in der MIPS-Assembly tun? (die Sprache, in der Super Mario 64 programmiert wurde)
user202729
1
@ user202729 Wow, das ist ein gründlicher Pfannkuchen. Vielen Dank!
11684

Antworten:

3

Pyth , 13 Bytes

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

Probieren Sie es hier aus! oder Überprüfen Sie alle Testfälle.

Beachten Sie, dass 1auch anstelle von funktioniert 3.

Wie es funktioniert?

tl: z P? H * R? 3 | Volles Programm. Übernimmt die Eingabe von STDIN und gibt sie an STDOUT aus.

  : z 3 | Teilen Sie die Eingabezeichenfolge bei Übereinstimmungen von ...
    "P? H * R?" | Der reguläre Ausdruck "P? H * R?".
 l | Holen Sie sich die Länge.
t | Dekrementierung (da die Aufteilung die leere Zeichenfolge enthält).

Mehr zum Regex:

P? | P - Das Literalzeichen P, Groß- und Kleinschreibung beachten.
       | ? - Quantifizierer. Entspricht entweder dem Ein- oder dem Null-fachen des vorherigen Zeichens.
  H * | H - Das Literalzeichen H, Groß- und Kleinschreibung beachten.
       | * - Quantifizierer. Entspricht einer beliebigen Anzahl von Vorkommen des vorherigen Zeichens.
    R? | R - Das Literalzeichen R, bei dem die Groß- und Kleinschreibung beachtet wird.
       | ? - Quantifizierer. Entspricht entweder dem Ein- oder dem Null-fachen des vorherigen Zeichens.
Mr. Xcoder
quelle
Ah, verdammt, du hast mich geschlagen!
Shaggy
nett! Die vorletzte Zeile in der regulären Ausdrucksbeschreibung sollte "Literalzeichen R" lauten, oder?
vidstige
@vidstige Ja, danke. Feste
Herr Xcoder
2

Gelee , 10 Bytes

o5ḄƝ%⁵>4S‘

Eine monadische Kette, die eine Liste (die P,H,R : 0,1,2Option) aufnimmt und eine Ganzzahl zurückgibt, die Anzahl.

Probieren Sie es online! oder sehen Sie sich die Testsuite an

Wie?

Effektiv wirkt durch alle benachbarten Paare dann jede Zählung , die nicht immer „Fortsetzungs pairs“ sind ( PR, PH, HR, oder HH) und eine Zugabe.

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

Vorherige 11-Byte-Lösung:

ḅ3Ɲạ3ḟ1,2L‘

Probieren Sie es online! oder sehen Sie sich die Testsuite an

Wie?

Funktioniert wie oben, aber ganz anders ...

ḅ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

und noch eine, nochmal ganz andere:

+19*Ɲ%13ḂS‘

(Addiere 19 zu jedem, dann führe für benachbarte Paare Exponentiation durch, modulo um 13, modulo um 2, summiere und addiere eins).

Jonathan Allan
quelle
New Jelly schnell!
user202729
2

Batch, 69 Bytes

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

Nimmt Eingaben als Liste mit 0-indizierten Befehlszeilenparametern entgegen, Sie können jedoch eine Liste mit Buchstaben p, h, rin Groß- oder Kleinbuchstaben verwenden, wenn Sie diese set /a p=0, h=1, r=2zuerst eingeben . Erläuterung: bBehält die letzte Eingabe (standardmäßig 2für freigegeben) und ndie Anzahl der Druckvorgänge bei. Jeder Eingang fügt eine Presse hinzu, wenn der letzte Eingang ein Release war oder der aktuelle Eingang eine Presse ist.

Neil
quelle
Oh, setkönnen mehrere Variablen gleichzeitig gesetzt werden? Gut zu wissen.
user202729
1
@ user202729 set /aist eine arithmetische Auswertung. Solange alle Variablen, die Sie festlegen möchten, numerisch sind, können Sie die Zuweisungsausdrücke einfach mit dem Komma-Operator verketten.
Neil
2

Python 2, 44 Bytes

Verwendet P-> 1 H-> 2 R-> 3

lambda a:sum(1/y|x/3for x,y in zip([3]+a,a))
Feersum
quelle
1

Schale , 6 5 Bytes

Lġo&ε

Probieren Sie es online! Die Eingabe erfolgt über eine Liste 0,1,2(der TIO-Link verwendet Buchstaben, um das Einfügen von Testfällen zu vereinfachen).

Erläuterung

Ich verwende die gleiche allgemeine Idee wie Jonathan Allans Jelly-Antwort : Aufteilen nach Vorkommen der "Diskontinuitätspaare" PP, HP, RH, RR und RP und Zählen der resultierenden Blöcke. In der 0,1,2-Codierung sind diese Paare genau diejenigen, deren linkes Element 2 ist oder deren rechtes Element 0 ist.

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.
Zgarb
quelle
1

Javascript (ES6), 30 Byte

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

Herman L
quelle
1

Gelee , 10 Bytes

Pn1></µƝS‘

Probieren Sie es online! oder Testsuite! ( Gestohlen von Jonathan ausgeliehen.)

Alternative:

P=1=</µƝS‘

Probieren Sie es online!

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.

Jelly , 11 Bytes

1 Byte mit Hilfe von Caird Coinheringaahing gespeichert.

ḅ3Ɲf⁽vḲD¤L‘

Probieren Sie es online!

Mr. Xcoder
quelle
Oh, ich habe die Chance verpasst, der Erste zu sein, der die Nachbarn schnell benutzt :(
caird coinheringaahing
Sie können die μaus dem dritten
caird coinheringaahing
1

Kotlin , 36 Bytes

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

Verschönert

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

Prüfung

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

jrtapsell
quelle
0

J , 18 - 17 Bytes

-1 Danke an @FrownyFrog

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

Nimmt Eingaben in Form von 0,1,2. Die Hilfsfunktion von TIO konvertiert die Testfälle in dieses Formular.

Probieren Sie es online!

Die Logik der Vergleiche mag immer noch golffähig sein. Ich verknote mein Gehirn und versuche, mir gleichwertige und kürzere Aussagen zu überlegen.

Erklärung (vorherige Lösung)

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

Der einzige Unterschied zwischen der aktuellen und der vorherigen Lösung besteht darin, wie die Vergleiche erstellt werden. Die aktuelle Lösung vergleicht explizit benachbarte Elemente, indem sie das Array versetzt, und die vorherige Lösung vergleicht benachbarte Elemente, indem sie die Infixe von 2 betrachtet.

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

Dies wäre viel sauberer, wenn zwei Laderäume nichts bewirken würden. Der Code nimmt Infixe von zwei und prüft, ob sie nicht aufsteigend sind und nicht zwei Griffe. Wenn dies der Fall ist, addieren wir eine zu unserer endgültigen Zählung. Wir müssen 1 zum Ende hinzufügen, da wir sonst um eins versetzt sind (oder Sie können einen _oder einen Wert voranstellen , der größer als 2 ist).

Die Art und Weise, wie überprüft wird, ob das Infix zwei Griffe enthält, besteht darin, die beiden Werte miteinander zu multiplizieren und festzustellen, ob es ein Wert ist (zwei Griffe sind es 1 1).

cole
quelle
1
1+1#.}:(<+:1=*)}.ist einer kürzer.
FrownyFrog
@FrownyFrog klug, ich werde das in bearbeiten.
Cole
1
14:1+1#.0=}.*2-}:
FrownyFrog
0

Vim + wc, 25 Bytes

:s/P\?H*R\?/a/g␊V!wc -c␊␘

ist die Eingabetaste und ist Ctrl+X

Probieren Sie es online!

Erläuterung

:s/P\?H*R\?/a/g␊    Replace all button presses with the character a
V!wc -c␊␘          Count the characters using the wc command
Herman L
quelle