Pannenkoek a presleri saymak yardımcı


28

pannenkoek2012 , Super Mario 64'ü Mario düğmesinin atlamasını sağlayan A düğmesinin mümkün olduğunca az presiyle tamamlamayı hedefliyor . Her "A press" üç bölümden oluşur:

  • Düğmesine basarak
  • İstediğiniz süre basılı tutunuz
  • Onu serbest bırakmak

A'dan bir basının parçaları, Pannenkoek2012 tarafından video

Yukarıdaki resmi içeren harika bir açıklama için bu videoya bakın (1:15 - 3:23) . (Bununla birlikte, bu zorluk, yarım A-pres terminolojisini kullanmayacak ve A'yı serbest bırakmayı gerektiren engeller ortaya çıkaracaktır.)

Görev:

Basılması (P), tutma (H) veya A düğmesini serbest bırakma (R) gerektiren bir dizi engel göz önüne alındığında, verilen sırayla üstesinden gelmek için gereken en az sayıda baskı yapın. A düğmesi başlangıçta tutulmaz.

Resmi olarak belirtilmiş: bir karakter dizisi S verildiğinde, S dizisini içeren bir dizgi dizisi olarak PHRdüşünün (PH*R)*ve mümkün olan en küçük sayıyı Pbu dizgede yaz. Veya, alternatif olarak, P?H*R?S'nin bölünebileceği en az sayıda parçayı bulun .

Örnek

Girdiye bakalım RHRPHHHR. A düğmesi basılı tutulmaz, bu nedenle ilk engelin üstesinden gelmek R, düğmeye basılmasını ve sonra serbest bırakılmasını gerektirir (# 1). Ardından düğmeyi basılı tutmamız gerekir; bu tuşa Htekrar basılması gerekir (# 2'ye basın). Sonra, daha sonra tatmin etmek için daha sonra serbest bırakılabilir R. Son olarak kalanlar PHHHR, tek bir basışla (basın # 3) ardından tutup HHHbırakarak sağlanabilir R. Yani, çıkış sayısı 3'tür.

Bunu görmenin başka bir yolu da girdi dizesini PHH..HHRharflerin ihmal edilebileceği 3 bölüme ayırabiliriz .

R
HR
PHHHR    

Giriş formatı

Giriş, seçiminizi yapmak için basmayı, bekletmeyi ve bırakmayı temsil eden bir liste veya öğe dizisi olacaktır:

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

verilen sırayla eşleşti. Giriş boş olmayacak.

Test durumları:

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

Liderler Sıralaması:


1
A düğmesinin tutulmamasını gerektiren engeller nelerdir? Grafikte dört düğme durumu vardır ( sanırım bunların oyunda da var olabileceğini düşünüyorum )
Random832

3
Gerçekte 3 devlet vardır: Basın, Tutuldu ve Tutulmadı. Hiçbir durum A düğmesine basmayı gerektirmez. Sorun, gerçeklikle kıyaslandığında biraz yanlıştır.
user202729

1
@ 11684 "Serbest bırakılma ile ilgili olarak, şu anda bunun yararlı veya önemli olduğu durumlar yoktur, bu yüzden bu kısım için endişelenmeyin." (1:48 - 1:52)
user202729

3
MIPS montajında ​​bunu yapmak isteyen var mı? (Süper Mario 64'ü programlamak için kullanılan dil)
user202729

1
@ user202729 Vay, bu kapsamlı bir krep. Teşekkürler!
11684

Yanıtlar:



3

Pyth , 13 bayt

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

Burada dene! veya Tüm test durumlarını doğrulayın.

Bunun 1yerine çalıştığını da unutmayın 3.

Nasıl çalışır?

tl: z "P? H * R?" 3 | Tam program STDIN'den giriş alır, STDOUT çıkışına çıkar.

  : z 3 | Girdiyi dizgilerde eşleştir ...
    "P? H *, R?" | Normal ifade "P? H * R?".
 l | Uzunluğu al.
t | Düşüş (bölme boş dizeyi içerdiğinden).

Regex hakkında daha fazlası:

P? | P - değişmez karakter P, büyük / küçük harf duyarlı.
       | ? - Miktar belirleyici. Önceki karakterin bir veya sıfır katı ile eşleşir.
  H * | H - Değişmez karakter H, büyük / küçük harf duyarlı.
       | * - Miktar belirleyici. Önceki karakterin herhangi bir sayıdaki oluşumuyla eşleşir.
    R? | R - Değişmez karakter R, büyük / küçük harfe duyarlı.
       | ? - Miktar belirleyici. Önceki karakterin bir veya sıfır katı ile eşleşir.

Ah, feck, beni yendin!
Shaggy

Güzel! Regexp açıklamasında sondan ikinci satırda "Literal karakter R" yazmalı, değil mi?
vidstige

@vidstige Evet, teşekkürler. Sabit
Bay Xcoder

2

Jöle , 10 bayt

o5ḄƝ%⁵>4S‘

Bir listeyi ( P,H,R : 0,1,2seçenek) alarak ve bir tamsayı döndüren bir tek zincir .

Çevrimiçi deneyin! veya test odasına bakın

Nasıl?

Etkili sonra "devam çifti" olmayan herhangi bir sayma tüm bitişik çiftleri elde etmektedir ( PR, PH, HRya da HH) ve bir ilave edilmesi.

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

Önceki 11 bayt çözüm:

ḅ3Ɲạ3ḟ1,2L‘

Çevrimiçi deneyin! veya test odasına bakın

Nasıl?

Yukarıdaki gibi çalışır, ama tamamen farklı bir şekilde ...

ḅ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

ve başka, yine oldukça farklı:

+19*Ɲ%13ḂS‘

(her birine 19 ekleyin, sonra bitişik çiftler için üst üste binme, 13 ile modulo, 2 ile modulo, toplamı yapın ve bir tane ekleyin).


Yeni Jelly hızlı!
user202729

2

Toplu, 69 bayt

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

Girdiyi 0 indeksli komut satırı parametrelerinin bir listesi olarak alır, ancak önce yazarsanız p, h, rbüyük veya küçük harflerden oluşan bir harf listesi kullanabilirsiniz set /a p=0, h=1, r=2. Açıklama: bSon girişi (varsayılan olarak 2serbest bırakılmış) ve nbaskı sayısını korur . Her giriş bir son giriş serbest bırakılmışsa veya geçerli giriş bir basışsa, bir giriş ekler.


Oh, setaynı anda birden fazla değişken ayarlayabilir miyim? Bilmek yararlı.
user202729

1
@ user202729 set /a, aritmetik bir değerlendirmedir, bu nedenle, ayarlamak istediğiniz tüm değişkenler sayısal olduğu sürece, atama ifadelerini birleştirmek için virgül operatörünü kullanabilirsiniz.
Neil

2

Python 2,44 bayt

P-> 1 H-> 2 R-> 3 kullanır

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




1

Kabuğu , 6 5 bayt

Lġo&ε

Çevrimiçi deneyin! Giriş bir listedir 0,1,2(TIO bağlantısı, test durumlarının daha kolay kopyalanması için harfler kullanır).

açıklama

Jonathan Allan'ın Jelly cevabı ile aynı genel fikri kullanıyorum : "süreksizlik çiftleri" PP, HP, RH, RR ve RP oluşumlarına bölün ve ortaya çıkan blokları sayın. 0,1,2 kodlamasında, bu çiftler tam olarak sol elemanı 2 veya sağ elemanı 0 olanlardır.

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 bayt

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

Jöle , 10 bayt

Pn1></µƝS‘

Çevrimiçi deneyin! veya Test takımı! ( Jonathan'dan Çalınan Çalıntı .)

Alternatif:

P=1=</µƝS‘

Çevrimiçi deneyin!

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.

Jöle , 11 bayt

Caird coinheringaahing yardımı ile 1 bayt kurtarıldı.

ḅ3Ɲf⁽vḲD¤L‘

Çevrimiçi deneyin!


Aww, ben komşuları hızlı kullanan ilk olma şansını kaçırdım :(
caird coinheringaahing 7:30 '

μÜçüncü
olandan

1

Kotlin , 36 bayt

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

Beautified

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

Ölçek

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

J , 18 17 bayt

-1 @ FrownyFrog sayesinde

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

Şeklinde girdi alır 0,1,2. TIO'daki yardımcı işlev, test durumlarını bu forma dönüştürür.

Çevrimiçi deneyin!

Karşılaştırmaların mantığı hala golf edilebilir olabilir. Daha eşdeğer ve daha kısa ifadeler düşünmeye çalışırken beynimi düğümlere çeviriyorum.

Açıklama (önceki çözüm)

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

Mevcut çözüm ile önceki çözüm arasındaki tek fark, karşılaştırmaların nasıl üretildiğidir. Mevcut çözüm, diziyi uzaklaştırarak bitişik elemanları açıkça karşılaştırır ve önceki çözüm, 2'nin eklerine bakarak bitişik elemanları karşılaştırır.

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

İki bekçi hiçbir şey yapmazsa bu daha temiz olurdu. Kod ikilik ekleri alır ve yükselip yükselmediklerini ve iki tutma yapılmadığını kontrol eder. Bu durumda, son sayımıza bir tane ekleriz. Aksi halde kapalı olduğumuz için sonuna 1 eklemek zorundayız (ya _da 2'den büyük bir değer hazırlayabilirsiniz ).

Ekin iki bekletme olup olmadığını denetleme şekli, iki değeri bir araya getirerek ve bir (iki bekletme 1 1) olup olmadığını görmektir .


1
1+1#.}:(<+:1=*)}.bir daha kısa.
FrownyFrog

@ FrownyFrog zeki, ben bunu düzenleyeceğim.
cole

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

0

Vim + wc, 25 bayt

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

Dönüş anahtar ve bir Ctrl+X

Çevrimiçi deneyin!

açıklama

:s/P\?H*R\?/a/g␊    Replace all button presses with the character a
V!wc -c␊␘          Count the characters using the wc command
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.