영화가 얼마나 실망 스럽습니까?


25

부모님에게는 홈 시어터 장치가 있습니다. 리모컨이 고장 나서 메뉴에서 오른쪽으로 탐색하기가 매우 어렵습니다. 대부분의 경우 작동하지 않지만 작동하면 엄청나게 빠르게 움직입니다.

이것은 분명히 실망 스럽지만 다음과 같은 키보드를 탐색 해야하는 영화 제목을 입력하려고 할 때 가장 실망 스럽습니다.

a b c d e f
g h i j k l
m n o p q r
s t u v w x
y z 1 2 3 4
5 6 7 8 9 0

당신의 임무는 영화 제목을 입력하고 그 영화 제목을 입력하는 것이 얼마나 "낙담"을 계산하는 것입니다. 특정 문자열의 답답한 숫자는 앞에있는 문자에서 바로 이동해야하는 문자의 수입니다. 우리는 그들이 얼마나 멀리 있는지 상관하지 않습니다. 우리가 오른쪽으로 움직이기 시작하면 우리는 거의 즉시 라인의 끝으로 가고, 쉽게 움직일 수 있기 때문에 위, 아래 또는 왼쪽으로 움직이는 것에 신경 쓰지 않기 때문입니다.

예를 들어

keyboard
  • 우리는 k무료로 시작 합니다.
  • e바로 위에 k있으므로 오른쪽으로 이동할 필요가 없습니다.
  • y 왼쪽 끝까지 이동하므로 오른쪽으로 이동할 필요가 없습니다.
  • b 그러나 다음 열은 오른쪽에 있으므로 오른쪽으로 이동해야합니다.
  • o 다음 열에 있으므로 오른쪽으로 이동해야합니다.
  • a 첫 번째 열로 돌아가서 왼쪽으로 이동하여
  • r 오른쪽으로 계속 이동하여 오른쪽으로 이동합니다.
  • dr의 열 왼쪽에 두 개의 열이 있습니다.

오른쪽으로 이동해야하는 문자는 bor이것이 좌절됨을 의미합니다 .3.

추가 규칙

이것은 도전이므로 적은 바이트로 더 나은 답변을 바이트로 채점합니다. 입력은 항상 영숫자로 구성되며 대문자 또는 소문자를 지원할 수 있으며 하나만 지원하면됩니다. 입력은 절대로 비어 있지 않습니다.

테스트 케이스

keyboard -> 3
2001aspaceodyssey -> 6
sorrytobotheryou -> 8
thinblueline -> 5
blast2 -> 3

3
제안 된 테스트 사례 : "blast2" -> 3(실제 영화는 아니지만 일부 답변에는 이러한 테스트 사례에 문제가 있음)
Arnauld

권장 테스트 사례 : 5-> 0과 같은 숫자로만 구성된 사례
lirtosiast

1
권장 테스트 사례 :90 -> 1
nwellnhof

입력 문자열이 비어 있지 않다고 가정 할 수 있습니까?
Chas Brown

@ChasBrown 질문에 포함되어 있습니다.
밀 마법사

답변:


8

자바 스크립트 (Node.js) , 61 55 54 바이트

@nwellnhof 덕분에 1 바이트 절약

문자 배열로 입력을받습니다.

s=>s.map(p=c=>r+=p>(p=(+c?~c:1-Buffer(c)[0])%6),r=0)|r

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

방법?

0 보다 큰 숫자를 제외한 모든 문자 에 대해 0 색인화 열 엑스 는 다음과 같이 지정됩니다.

엑스=(기음1)모드6

여기서 기음 는 문자의 ASCII 코드입니다.

양수 경우 대신 다음을 수행해야합니다.

엑스=(+1)모드6

예 :

"a" --> (97 - 1) mod 6 = 96 mod 6 = 0
"b" --> (98 - 1) mod 6 = 97 mod 6 = 1
"0" --> (48 - 1) mod 6 = 47 mod 6 = 5
"3" --> ( 3 + 1) mod 6 =  4 mod 6 = 4

댓글

s =>                       // s = input string (as array)
  s.map(p =                // initialize p to a non-numeric value
  c =>                     // for each character c in s:
    r +=                   //   update the result r:
      p > (                //   compare p with
        p = (              //   the new value of p defined as:
          +c ?             //     if c is a positive digit:
            ~c             //       -(int(c) + 1)
          :                //     else:
            1-Buffer(c)[0] //       -(ord(c) - 1)
        ) % 6              //     apply modulo 6
      ),                   //   yields 1 if the previous value is greater than the new one
    r = 0                  //   start with r = 0
  ) | r                    // end of map(); return r


1
@Shaggy 그것은하지 않습니다. 내 제안 된 테스트 사례를 참조하십시오 "blast2".
Arnauld

아 이 경우 : 53 바이트
Shaggy

1
@Shaggy 예를 들어, 비트 OR은 실패합니다 "234".
Arnauld

4
적은 위스키는 결코 답이 아닙니다!
얽히고 설킨

7

젤리 , 11 바이트

⁾04yO‘%6<ƝS

(대문자) 문자 목록을 허용하는 모나 딕 링크.

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

방법?

먼저 '0's를 '4's로 바꿉니다 (따라서 나머지 코드는 가장 오른쪽 열에있는 것으로 간주합니다). 그런 다음 서수로 캐스트하고 60을 기준으로 한 열 인덱스를 얻기 위해 모듈러스를 추가합니다 . 그런 다음 이웃을 비교하여 비교하고 결과를 합산합니다.

⁾04yO‘%6<ƝS - Link: list of characters         e.g. "BLAST20"
⁾04         - list of characters = ['0', '4']
   y        - translate                             "BLAST24"
    O       - ordinals                              [66,76,65,83,84,50,52]
     ‘      - increment                             [67,77,66,84,85,51,53]
       6    - literal six
      %     - modulo                                [ 1, 5, 0, 0, 1, 3, 5]
         Ɲ  - neighbourly:
        <   -   less than?                          [  1, 0, 0, 1, 1, 1  ]
          S - sum                                   4





1

apt -x , 14 바이트

®rT4 c Ä u6Ãä<

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

젤리 포트 . 문자를 대문자로하여 문자 배열로 입력을받습니다.

설명:

®rT4 c Ä u6Ãä<    :
®          Ã      :Map each character through:
 rT4              : Replace 0 with 4
     c            : Get the char-code
       Ä          : Increment it
         u6       : Modulo 6
            ä<    :Replace with 1 if you had to move right, 0 otherwise
                  :Implicitly sum and output

1

자바 (OpenJDK 8) , 73 바이트

Java에 대한 나쁜 해결책은 아닙니다! 오른쪽에있는 0은 몇 바이트가 들었습니다.

t->{int a=9,c=0;for(int d:t)c+=a<(a=(--d+(d/48==1?2:0))%6)?1:0;return c;}

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

설명

t -> {                          // Lambda taking a char array as input
    int a=9,                    // Initialise last column value
        c=0;                    // Initialise frustration count
    for(int d:t)                // Loop through all chars in title
        c+=                     // increment the frustration count if...
          a<                    // The last column is smaller than the current column
            (a=                 // Set last column to current column
              (--d+             // Decrement ascii value of char
                  (d/48==1      // If ascii decremented ascii value is between 48 and 95
                    ?2:0)       // increment by 2 (1 total) or 0 (-1 total)
                )%6)            // Mod 6 to retrieve column index
            ?1:0;               // Increment if to right hand side
    return c;                   // return calculated frustration count
}



0

레티 나 0.8.2 , 46 바이트

T`l1-90`1-61-61-61-61-61-6
.
;$&$*
&`;(1+);1\1

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명:

T`l1-90`1-61-61-61-61-61-6

OSK에서 알파벳과 숫자를 순서대로 나열하고 각각을 (1 인덱스) 열 번호에 매핑하십시오.

.
;$&$*

각 열 번호를 단항으로 변환하십시오.

&`;(1+);1\1

더 큰 (즉, 오른쪽) 열이 뒤 따르는 열 수를 계산하십시오. 는 &`중복으로 경기를 할 수 있습니다.



0

수학, 102 바이트

Differences[Last@@Join[Alphabet[],ToString/@Range@9,{"0"}]~Partition~6~Position~#&/@#]~Count~_?(#>0&)&

순수한 기능. 문자 목록을 입력으로 취하고 숫자를 출력으로 리턴합니다. 이것은 매우 순진한 솔루션이며 골프 제안을 환영합니다.



0

C (gcc) ,  82 79  77 바이트

o;c(i){i+=i<60&i>48?1:5;i%=6;}f(char*s){for(o=0;*++s;o+=c(*s)>c(s[-1]));o=o;}

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

이 기능은 소문자 입력 만 지원합니다


Ungolfed 및 댓글 :

o; //Used for output
c(i){             //Calculates the column of given character
     i+=          //Correct i to get the correct column
        i<60      //If i is a digit...
        & i>48   //... but not '0'
        ?1           //Then move it one column on the right
        :5;          //Else move it five columns on the right
     i%=6;        //Get the column number
}
f(char*s){                        // The actual "frustrating" function
          for(                    //Loop for each character
              o=0;                //reinitialize output
              *++s;               //move to next character / while this is not '\0'
              o+=c(*s)>c(s[-1])  //Increment if current character is on the right of the previous one
             );
           o=o;                   // Outputs result
}

내 함수가 넓은 문자열을 허용하면 다음과 같이 줄일 수 있습니다. 76 바이트 로 .

o;c(i){i+=i<60&i>48?1:5;i%=6;}f(int*s){for(o=0;*++s;o+=c(*s)>c(s[-1]));o=o;}

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

이 버전은 입력을 그대로 받아들입니다. int* 대신 입니다.char*


편집 :

  • 열 계산에서 3 바이트를 골프로 처리했습니다 (함수 c ).
  • ceilingcat 덕분에 골프 2 바이트

그리고 거기에, 77 바이트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.