Giúp pannenkoek đếm A ấn


28

pannenkoek2012 đặt mục tiêu hoàn thành Super Mario 64 với càng ít lần nhấn nút A càng tốt, khiến Mario nhảy lên. Mỗi "Một ấn" bao gồm ba phần:

  • Nhấn nút
  • Giữ nó trong bất kỳ khoảng thời gian nào
  • Phát hành nó

Các bộ phận của báo chí A, từ video của Pannenkoek2012

Xem video này (1:15 - 3:23) để được giải thích tuyệt vời bao gồm hình ảnh trên. (Tuy nhiên, thách thức này sẽ không sử dụng thuật ngữ báo chí nửa A và sẽ đặt ra những trở ngại đòi hỏi phải giải phóng A.)

Bài tập:

Đưa ra một chuỗi các chướng ngại vật cần nhấn (P), giữ (H) hoặc nhả (R) nút A, xuất ra số lần nhấn nhỏ nhất cần thiết để vượt qua chúng theo thứ tự đã cho. Nút A ban đầu không được giữ.

Được nêu chính thức: đưa ra một chuỗi ký tự S PHR, xem xét các chuỗi có dạng (PH*R)*S là một chuỗi con và xuất ra số lượng nhỏ nhất có thể có Ptrong một chuỗi như vậy. Hoặc, thay vào đó, tìm số lượng nhỏ nhất của biểu mẫu P?H*R?mà S có thể được chia thành.

Thí dụ

Hãy nhìn vào đầu vào RHRPHHHR. Nút A bắt đầu không được giữ, do đó, vượt qua chướng ngại vật ban đầu Rđòi hỏi phải nhấn nút và sau đó nhả ra (nhấn # 1). Tiếp theo, chúng tôi được yêu cầu giữ nút H, một lần nữa yêu cầu nhấn nút đầu tiên (nhấn # 2). Sau đó, nó có thể được phát hành sau đó để đáp ứng Rsau đó. Cuối cùng, phần còn lại PHHHRcó thể được thỏa mãn chỉ bằng một lần nhấn (nhấn # 3) sau đó giữ HHHvà phát hành R. Vì vậy, số lượng đầu ra là 3.

Một cách khác để xem nó, là chúng ta có thể chia chuỗi đầu vào thành 3 phần của biểu mẫu PHH..HHRnơi các chữ cái có thể bị bỏ qua.

R
HR
PHHHR    

định dạng đầu vào

Đầu vào sẽ là một danh sách hoặc chuỗi các yếu tố đại diện cho báo chí, giữ và phát hành theo lựa chọn của bạn:

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

phù hợp theo thứ tự cho trước. Đầu vào sẽ không trống.

Các trường hợp thử nghiệm:

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

Bảng xếp hạng:


1
Điều gì về những trở ngại đòi hỏi nút A không được tổ chức? Có bốn trạng thái nút trong biểu đồ (Tôi nghĩ rằng chúng cũng có thể tồn tại trong trò chơi)
Random832

3
Trong thực tế, có 3 trạng thái: Báo chí, Tổ chức và Không tổ chức. Không có tiểu bang yêu cầu phát hành nút A. Thử thách hơi sai so với thực tế.
dùng202729

1
@ 11684 "đối với bản phát hành, tốt, hiện tại không có trường hợp nào hữu ích hoặc quan trọng vì vậy đừng lo lắng về phần đó." (1:48 - 1:52)
dùng202729

3
Bất cứ ai cũng muốn làm điều này trong lắp ráp MIPS? (ngôn ngữ được sử dụng để lập trình Super Mario 64)
user202729

1
@ user202729 Wow, đó là một chiếc bánh kếp kỹ lưỡng. Cảm ơn!
11684

Câu trả lời:



3

Bình thường , 13 byte

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

Hãy thử nó ở đây! hoặc Xác minh tất cả các trường hợp thử nghiệm.

Lưu ý rằng 1cũng hoạt động thay thế 3.

Làm thế nào nó hoạt động?

tl: z "P? H * R?" 3 | Chương trình đầy đủ. Lấy đầu vào từ STDIN, đầu ra thành STDOUT.

  : z 3 | Tách chuỗi đầu vào trên các kết quả của ...
    "P? H * R?" | Biểu thức chính quy "P? H * R?".
 l | Lấy chiều dài.
t | Giảm (vì tách bao gồm chuỗi rỗng).

Thông tin thêm về regex:

P? | P - Ký tự chữ P, chữ hoa chữ thường.
       | ? - Định lượng. Khớp với một hoặc không lần nhân vật trước.
  H * | H - Ký tự chữ H, trường hợp nhạy cảm.
       | * - Bộ định lượng. Phù hợp với bất kỳ số lần xuất hiện của nhân vật trước.
    R? | R - Ký tự chữ R, chữ hoa chữ thường.
       | ? - Định lượng. Khớp với một hoặc không lần nhân vật trước.

Ah, feck, bạn đánh tôi với nó!
Xù xì

tốt đẹp! Dòng thứ hai đến dòng cuối cùng trong mô tả regrec nên nói "ký tự chữ R", phải không?
vidstige

@vidstige Vâng, cảm ơn. Đã sửa lỗi
Ông Xcoder

2

Thạch , 10 byte

o5ḄƝ%⁵>4S‘

Một chuỗi đơn âm lấy một danh sách ( P,H,R : 0,1,2tùy chọn) và trả về một số nguyên, số đếm.

Hãy thử trực tuyến! hoặc xem bộ thử nghiệm

Làm sao?

Hiệu quả hoạt động bằng cách nhận được tất cả các cặp liền kề sau đó đếm bất kỳ mà không phải là "cặp tiếp tục" ( PR, PH, HR, hoặc HH) và thêm một.

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

Giải pháp 11 byte trước đó:

ḅ3Ɲạ3ḟ1,2L‘

Hãy thử trực tuyến! hoặc xem bộ thử nghiệm

Làm sao?

Hoạt động như trên, nhưng theo một cách hoàn toàn khác ...

ḅ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

và một điều nữa, một lần nữa khá khác biệt:

+19*Ɲ%13ḂS‘

(thêm 19 cho mỗi cặp, sau đó cho các cặp liền kề thực hiện lũy thừa, modulo bằng 13, modulo bằng 2, tổng và thêm một).


Thạch mới nhanh!
dùng202729

2

Mẻ, 69 byte

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

Lấy đầu vào dưới dạng danh sách các tham số dòng lệnh được lập chỉ mục 0, nhưng bạn có thể sử dụng danh sách các chữ cái p, h, rtrong cả chữ hoa hoặc chữ thường nếu bạn nhập set /a p=0, h=1, r=2trước. Giải thích: bduy trì đầu vào cuối cùng (mặc định là để 2phát hành) và nsố lần nhấn. Mỗi đầu vào thêm một lần nhấn nếu đầu vào cuối cùng là một bản phát hành hoặc đầu vào hiện tại là một lần nhấn.


Oh, setcó thể đặt nhiều biến cùng một lúc? Hữu ích để biết.
dùng202729

1
@ user202729 set /alà đánh giá số học, miễn là tất cả các biến bạn muốn đặt là số, bạn chỉ cần sử dụng toán tử dấu phẩy để ghép các biểu thức gán.
Neil

2

Python 2, 44 byte

Sử dụng P-> 1 H-> 2 R-> 3

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




1

Husk , 6 5 byte

Lġo&ε

Hãy thử trực tuyến! Đầu vào là một danh sách trên 0,1,2(liên kết TIO sử dụng các chữ cái để sao chép dễ dàng hơn các trường hợp kiểm tra).

Giải trình

Tôi sử dụng cùng một ý tưởng chung như câu trả lời Jelly của Jonathan Allan : chia ra khi xuất hiện các "cặp không liên tục" PP, HP, RH, RR và RP, và đếm các khối kết quả. Trong mã hóa 0,1,2, các cặp này chính xác là những cặp có phần tử bên trái là 2 hoặc phần tử bên phải là 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

Thạch , 10 byte

Pn1></µƝS‘

Hãy thử trực tuyến! hoặc bộ thử nghiệm! ( Bị đánh cắp mượn từ Jonathan.)

Thay thế:

P=1=</µƝS‘

Hãy thử trực tuyến!

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.

Thạch , 11 byte

Đã lưu 1 byte với sự trợ giúp từ caird coinheringaahing.

ḅ3Ɲf⁽vḲD¤L‘

Hãy thử trực tuyến!


À, tôi đã bỏ lỡ cơ hội trở thành người đầu tiên sử dụng hàng xóm nhanh chóng :(
caird coinheringaahing

Bạn có thể xóa cái μthứ ba
caird coinheringaahing

1

Kotlin , 36 byte

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

Làm đẹp

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

Kiểm tra

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

Dùng thử


0

J , 18 17 byte

-1 Cảm ơn @FrownyFrog

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

Đưa đầu vào ở dạng 0,1,2. Hàm trợ giúp trên TIO chuyển đổi các trường hợp thử nghiệm thành dạng này.

Hãy thử trực tuyến!

Logic của các so sánh vẫn có thể chơi được. Tôi đang vặn não mình thành những nút thắt cố gắng nghĩ ra những câu tương đương và ngắn hơn.

Giải thích (giải pháp trước)

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

Sự khác biệt duy nhất giữa giải pháp hiện tại và giải pháp trước đó là cách so sánh được tạo ra. Giải pháp hiện tại so sánh rõ ràng các phần tử liền kề bằng cách bù đắp mảng và giải pháp trước đó so sánh các phần tử liền kề bằng cách xem xét các phần tử của 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

Điều này sẽ sạch hơn rất nhiều nếu hai tổ chức không làm gì cả. Mã này có các phần tử của hai và kiểm tra nếu chúng không tăng và không giữ hai. Nếu đây là trường hợp, sau đó chúng tôi thêm một vào số cuối cùng của chúng tôi. Chúng tôi phải thêm 1 vào cuối vì chúng tôi sẽ tắt bằng cách khác (hoặc bạn có thể trả trước một _hoặc bất kỳ giá trị nào lớn hơn 2).

Cách nó kiểm tra xem infix có hai lần giữ hay không bằng cách nhân hai giá trị với nhau và xem nó có phải là một (hai lần giữ không 1 1).


1
1+1#.}:(<+:1=*)}.là một ngắn hơn.
FrownyFrog

@FrownyFrog thông minh, tôi sẽ chỉnh sửa nó trong.
cole

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

0

Vim + wc, 25 byte

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

là khóa trả về và Ctrl+X

Hãy thử trực tuyến!

Giải trình

:s/P\?H*R\?/a/g␊    Replace all button presses with the character a
V!wc -c␊␘          Count the characters using the wc command
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.