pannenkoek가 A 프레스를 계산하는 데 도움


28

pannenkoek2012 는 A 버튼을 몇 번만 누르면 Super Mario 64 를 완성 하여 마리오가 점프 하는 것을 목표 로합니다. 각 "A 프레스"는 세 부분으로 구성됩니다.

  • 버튼을 누르면
  • 일정 시간 동안 유지
  • 그것을 풀어

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수 있습니다. 마지막으로, 나머지는 PHHHR하나의 프레스 (눌러 # 3)에 의해 만족 될 수있다 유지시킴으로써 HHH및 해제 R. 따라서 출력 카운트는 3입니다.

그것을 보는 또 다른 방법은 입력 문자열을 PHH..HHR글자를 생략 할 수있는 형태의 3 부분으로 나눌 수 있다는 것입니다.

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
실제로는 Press, Held 및 Not-held의 3 가지 상태가 있습니다. 어떤 상태도 A 버튼 릴리스가 필요하지 않습니다. 도전은 현실과 비교하여 약간 잘못되었습니다.
user202729

1
@ 11684 "릴리스는 현재 유용하거나 중요한 경우가 없으므로 그 부분에 대해 걱정하지 마십시오." (1:
48-1

3
MIPS 어셈블리에서이 작업을 수행하려는 사람이 있습니까? (Super Mario 64를 프로그래밍하는 데 사용되는 언어)
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는 대소 문자를 구분합니다.
       | ? – 수량 자. 이전 문자의 1 배 또는 0 배를 찾습니다.
  H * | H – 대소 문자를 구분하는 리터럴 문자 H
       | * – 수량 자. 이전 문자의 발생 횟수와 일치합니다.
    아르 자형? | R – 리터럴 문자 R (대소 문자 구분).
       | ? – 수량 자. 이전 문자의 1 배 또는 0 배를 찾습니다.

아, 펙, 넌 날 이겼어!
얽히고 설킨

좋은! 정규 표현식 설명의 두 번째 줄부터 "문자 R"이라고해야합니다.
vidstige

@vidstige 예, 감사합니다. 고정
Mr. Xcoder

2

젤리 , 10 바이트

o5ḄƝ%⁵>4S‘

리스트 ( 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, 합을 수행하고 하나를 더하십시오)를 수행하십시오.


새로운 젤리 빨리!
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

2

파이썬 2, 44 바이트

P-> 1 H-> 2 R-> 3 사용

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




1

껍질 , 6 5 바이트

Lġo&ε

온라인으로 사용해보십시오! 입력은 목록 위에 있습니다 0,1,2(TIO 링크는 테스트 사례를보다 쉽게 ​​복사하여 붙여 넣기 위해 문자를 사용합니다).

설명

나는 Jonathan Allan의 Jelly 답변 과 같은 일반적인 아이디어를 사용합니다 . "불연속 쌍"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

자바 스크립트 (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‘

온라인으로 사용해보십시오!


아, 나는 빠른 이웃을 먼저 사용 기회 :( 놓친
coinheringaahing 케어 드

당신은 μ세 번째에서 제거 할 수 있습니다
caird coinheringaahing

1

코 틀린 , 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

두 개의 홀드가 아무것도하지 않으면 이것은 훨씬 깨끗합니다. 코드는 2의 접두사를 사용하여 오름차순이 아니고 두 개의 보류가 아닌지 확인합니다. 이 경우 최종 카운트에 하나를 추가합니다. 우리는 다른 방법으로 하나 떨어져 있기 때문에 끝에 1을 추가해야합니다 (또는 _2 이상의 값을 앞에 추가 할 수 있습니다 ).

접두사가 두 홀드인지 확인하는 방법은 두 값을 곱하고 1인지 확인하는 것입니다 (두 홀드는 1 1).


1
1+1#.}:(<+:1=*)}.하나 더 짧습니다.
FrownyFrog

@FrownyFrog 영리한, 나는 그것을 편집합니다.
cole

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

0

Vim + wc, 25 바이트

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

리턴 키이며 입니다 Ctrl+X

온라인으로 사용해보십시오!

설명

:s/P\?H*R\?/a/g␊    Replace all button presses with the character a
V!wc -c␊␘          Count the characters using the wc command
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.