ช่วย pannenkoek ให้นับ A กด


28

pannenkoek2012ตั้งเป้าหมายที่จะทำSuper Mario 64ให้เสร็จสมบูรณ์ด้วยการกดเพียงไม่กี่ปุ่มเท่าที่จะเป็นไปได้ซึ่งทำให้ Mario Jump แต่ละ "A press" ประกอบด้วยสามส่วน:

  • กดปุ่ม
  • ถือมันสำหรับระยะเวลาใด ๆ
  • ปล่อยมัน

บางส่วนของสื่อ A จากวิดีโอโดย Pannenkoek2012

ดูวิดีโอนี้ (1:15 - 3:23)สำหรับคำอธิบายที่ดีซึ่งรวมถึงภาพด้านบน (อย่างไรก็ตามความท้าทายนี้จะไม่ใช้คำศัพท์ half-A-press และจะวางสิ่งกีดขวางที่ต้องมีการปล่อย A. )

งาน:

เมื่อได้รับลำดับของสิ่งกีดขวางที่ต้องกด (P), กดปุ่ม (H) หรือปล่อย (R) ปุ่ม A จะทำการส่งออกจำนวนการกดที่เล็กที่สุดเพื่อเอาชนะพวกเขาตามลำดับที่กำหนด ตอนแรกปุ่ม A ไม่ได้ถูกเก็บไว้

ระบุอย่างเป็นทางการ: กำหนดสตริง S ของตัวละครPHRพิจารณาสตริงของรูปแบบ(PH*R)*ที่มี S เป็นลำดับและเอาท์พุทจำนวนที่น้อยที่สุดที่เป็นไปได้Pในสตริงดังกล่าว หรือมิฉะนั้นให้หาจำนวนชิ้นที่น้อยที่สุดของแบบฟอร์มP?H*R?ที่ S สามารถแบ่งออกเป็น

ตัวอย่าง

ดู Let 's RHRPHHHRในการป้อนข้อมูล ปุ่ม A เริ่มไม่ทำงานดังนั้นการเอาชนะสิ่งกีดขวางเริ่มต้นRจำเป็นต้องกดปุ่มแล้วปล่อย (กด # 1) ต่อไปเราจะต้องกดปุ่มค้างไว้Hซึ่งต้องกดอีกครั้งก่อน (กด # 2) จากนั้นจะสามารถปล่อยหลังจากนั้นเพื่อตอบสนองRหลังจากนั้น สุดท้ายที่เหลือPHHHRสามารถนำความพึงพอใจโดยกดเพียงครั้งเดียว (กด # 3) ตามด้วยการถือครองและปล่อยHHH Rดังนั้นจำนวนผลลัพธ์คือ 3

อีกวิธีในการดูคือเราสามารถแยกสตริงอินพุตออกเป็น 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 ในการไม่ถือ? มีปุ่มสถานะสี่ปุ่มในกราฟ (ฉันคิดว่าสิ่งเหล่านี้อาจมีอยู่จริงในเกมด้วย)
Random832

3
ในความเป็นจริงมี 3 สถานะ: กดจัดขึ้นและไม่ถือ ไม่ต้องใช้ปุ่มปล่อย A ความท้าทายนั้นผิดเล็กน้อยเมื่อเทียบกับความเป็นจริง
user202729

1
@ 11684 "สำหรับการเปิดตัวตอนนี้ไม่มีกรณีที่มีประโยชน์หรือสำคัญดังนั้นอย่ากังวลเกี่ยวกับส่วนนั้น" (1:48 - 1:52)
user202729

3
ใครต้องการที่จะทำเช่นนี้ในการชุมนุม MIPS? (ภาษาที่ใช้ในการเขียนโปรแกรม Super Mario 64)
user202729

1
@ user202729 ว้าวนั่นเป็นแพนเค้กที่ละเอียด ขอบคุณ!
11684

คำตอบ:



3

Pyth , 13 ไบต์

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

ลองที่นี่! หรือตรวจสอบกรณีทดสอบทั้งหมด

โปรดทราบว่ายังทำงานในสถานที่ของ13

มันทำงานอย่างไร?

tl: z "P? H * R?" 3 | โปรแกรมเต็มรูปแบบ รับอินพุตจาก STDIN เอาต์พุตไปยัง STDOUT

  : z 3 | แยกสตริงอินพุตตามการจับคู่ของ ...
    "P? H * R?" | นิพจน์ทั่วไป "P? H * R?"
 l | รับความยาว
t | Decrement (เนื่องจากการแยกรวมถึงสตริงว่าง)

เพิ่มเติมเกี่ยวกับ regex:

P? | P - ตัวอักษร P ตัวพิมพ์เล็กและใหญ่
       | ? - ปริมาณ จับคู่หนึ่งหรือศูนย์คูณอักขระก่อนหน้า
  H * | H - ตัวอักษรตัวอักษร H, กรณีที่สำคัญ
       | * - ปริมาณ ตรงกับจำนวนที่เกิดขึ้นของตัวละครก่อนหน้าใด ๆ
    R? | R - ตัวอักษร R, กรณีที่สำคัญ
       | ? - ปริมาณ จับคู่หนึ่งหรือศูนย์คูณอักขระก่อนหน้า

อืมคุณอดชั้นให้ฉันสิ!
Shaggy

ดี! บรรทัดที่สองถึงบรรทัดสุดท้ายในคำอธิบาย regexp ควรพูดว่า "ตัวอักษร R" ใช่ไหม
vidstige

@ vidstige ใช่ขอบคุณ คงที่
Mr. Xcoder

2

เยลลี่ 10 ไบต์

o5ḄƝ%⁵>4S‘

chain monadic ที่รับรายการ ( P,H,R : 0,1,2ตัวเลือก) และส่งคืนจำนวนเต็มที่มีการนับ

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร?

ได้อย่างมีประสิทธิภาพการทำงานโดยได้รับคู่ที่อยู่ติดกันทั้งหมดแล้วนับใด ๆ ที่ไม่ได้เป็น "คู่ความต่อเนื่อง" ( PR, PH, HRหรือHH) และการเพิ่มหนึ่ง

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 รวมและเพิ่มอีกหนึ่งอัน)


ใหม่ Jelly ด่วน!
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เป็นการประเมินทางคณิตศาสตร์ดังนั้นตราบใดที่ตัวแปรทั้งหมดที่คุณต้องการตั้งค่าเป็นตัวเลขคุณสามารถใช้ตัวดำเนินการคอมม่าเพื่อเชื่อมนิพจน์การมอบหมาย
Neil





1

Husk , 6 5 ไบต์

Lġo&ε

ลองออนไลน์! อินพุตเป็นรายการผ่าน0,1,2(ลิงก์ TIO ใช้ตัวอักษรเพื่อให้ง่ายต่อการคัดลอกของกรณีทดสอบ)

คำอธิบาย

ฉันใช้ความคิดทั่วไปเดียวกับคำตอบ Jelly ของ Jonathan Allan : แยกการเกิด "คู่ความไม่ต่อเนื่อง" 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

เยลลี่ 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 ไบต์

บันทึก 1 ไบต์ด้วยความช่วยเหลือจาก caird coinheringaahing

ḅ3Ɲf⁽vḲD¤L‘

ลองออนไลน์!


อ้าวฉันพลาดโอกาสที่จะได้เป็นคนแรกที่ใช้เพื่อนบ้านอย่างรวดเร็ว :(
caird coinheringaahing

คุณสามารถลบμจากหนึ่งในสาม
caird coinheringaahing

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

J , 18 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

นี่จะสะอาดกว่านี้ถ้าคนสองคนไม่ทำอะไรเลย รหัสใช้จำนวนของสองและตรวจสอบว่าพวกเขาจะไม่ขึ้นและไม่ถือสอง หากเป็นกรณีนี้เราจะทำการเพิ่มเข้าไปในการนับครั้งสุดท้ายของเรา เราต้องเพิ่ม 1 ไปยังจุดสิ้นสุดเนื่องจากเราปิดตัวเองเป็นอย่างอื่น (หรือคุณอาจจะเติมคำ_หรือค่าใด ๆ ที่มากกว่า 2)

วิธีการตรวจสอบว่ามัดสองถือเป็นโดยการคูณสองค่าร่วมกันและดูว่ามันเป็นหนึ่ง (สองถือเป็น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.