Làm thế nào bực bội là bộ phim của tôi?


25

Bố mẹ tôi có một thiết bị rạp hát tại nhà. Điều khiển từ xa bị hỏng khiến việc điều hướng ngay trong menu trở nên vô cùng khó khăn. Hầu hết thời gian nó không hoạt động nhưng khi nó di chuyển rất nhanh.

Điều này rõ ràng là bực bội nhưng khó chịu nhất khi bạn muốn nhập một tiêu đề phim yêu cầu điều hướng một bàn phím trông như thế này:

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

Nhiệm vụ của bạn là nhận đầu vào một tiêu đề phim và tính toán mức độ "bực bội" của việc nhập tiêu đề phim đó. Số thất vọng của một chuỗi cụ thể là số lượng chữ cái yêu cầu di chuyển ngay từ chữ cái trước chúng. Chúng tôi không quan tâm họ ở bên phải bao xa, vì nếu chúng tôi bắt đầu di chuyển sang phải, chúng tôi gần như ngay lập tức đi đến cuối dòng và chúng tôi không quan tâm đến việc di chuyển lên, xuống hoặc sang trái bởi vì chúng dễ dàng.

Ví dụ: nếu chúng tôi muốn gõ

keyboard
  • Chúng tôi bắt đầu kmiễn phí.
  • echỉ ở trên knên chúng ta không cần phải di chuyển đúng.
  • y là tất cả các cách bên trái để không cần phải di chuyển sang phải.
  • b tuy nhiên là trên cột tiếp theo bên phải, vì vậy chúng ta cần di chuyển sang phải để đến được nó.
  • o nằm trên cột tiếp theo nên chúng ta phải di chuyển sang phải để đến đó.
  • a đã trở lại trong cột đầu tiên để chúng tôi di chuyển sang trái để đến đó.
  • r là tất cả các cách bên phải để chúng tôi di chuyển ngay đến nó.
  • dlà hai cột bên trái rcột.

Các nhân vật cần di chuyển sang phải có bornghĩa là đây là sự thất vọng 3.

Quy tắc bổ sung

Đây là một thử thách vì vậy câu trả lời của bạn sẽ được ghi bằng byte với ít byte hơn. Đầu vào sẽ luôn bao gồm các ký tự chữ và số, bạn có thể hỗ trợ chữ in hoa hoặc chữ thường và bạn chỉ cần hỗ trợ một ký tự. Đầu vào sẽ không bao giờ trống.

Tủ thử

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

3
Trường hợp thử nghiệm được đề xuất: "blast2" -> 3(không phải là một bộ phim thực sự, nhưng một số câu trả lời có vấn đề với các trường hợp thử nghiệm như vậy)
Arnauld

Trường hợp thử nghiệm được đề xuất: một chỉ bao gồm các chữ số, chẳng hạn như 5 -> 0
lirtosiast

1
Trường hợp thử nghiệm được đề xuất:90 -> 1
nwellnhof

Chúng ta có thể giả sử chuỗi đầu vào sẽ không trống?
Chas Brown

@ChasBrown Điều đó được đề cập trong câu hỏi.
Thuật sĩ lúa mì

Câu trả lời:


8

JavaScript (Node.js) , 61 55 54 byte

Đã lưu 1 byte nhờ @nwellnhof

Đưa đầu vào như một mảng các ký tự.

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

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

Làm sao?

Đối với tất cả các ký tự nhưng chữ số lớn hơn 0 , cột x được lập chỉ mục 0 được cho bởi:

x=(c1)mod6

Ở đâu c là mã ASCII của ký tự.

Đối với chữ số dương n , chúng ta cần phải làm thay thế:

x=(n+1)mod6

Ví dụ:

"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

Đã bình luận

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

Nó dường như hoạt động mà không có ternary cho 46 byte
Shaggy

1
@Shaggy Nó sẽ không. Xem trường hợp thử nghiệm đề nghị của tôi "blast2".
Arnauld

À. Trong trường hợp đó: 53 byte
Shaggy

1
@Shaggy Một chút HOẶC sẽ thất bại cho, nói , "234".
Arnauld

4
Ít whisky không bao giờ là câu trả lời!
Xù xì

7

Thạch , 11 byte

⁾04yO‘%6<ƝS

Liên kết đơn âm chấp nhận danh sách các ký tự (chữ hoa).

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

Làm sao?

Đầu tiên thay thế bất kỳ '0's bằng '4's (vì vậy phần còn lại của mã coi chúng là ở cột ngoài cùng bên phải). Sau đó, chuyển sang thứ tự, thêm một và modulo 6để có được các chỉ số cột dựa trên 0. Sau đó so sánh hàng xóm với ít hơn và tính tổng kết quả.

⁾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

Japt -x , 14 byte

®rT4 c Ä u6Ãä<

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

Cổng của câu trả lời Jelly này . Đưa đầu vào dưới dạng một mảng các ký tự, với chữ hoa.

Giải trình:

®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

Java (OpenJDK 8) , 73 byte

Một giải pháp không tồi cho Java! Số không ở phía bên tay phải khiến tôi mất vài byte.

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

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

Giải thích

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

Võng mạc 0.8.2 , 46 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

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

Liệt kê bảng chữ cái và chữ số theo thứ tự trên OSK và ánh xạ mỗi thứ thành một số cột (1 chỉ mục).

.
;$&$*

Chuyển đổi từng số cột thành đơn nguyên.

&`;(1+);1\1

Đếm số lượng cột được theo sau bởi một cột lớn hơn (tức là phải). Việc &`cho phép các trận đấu trùng nhau.



0

Toán học, 102 byte

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

Chức năng thuần túy. Lấy danh sách các ký tự làm đầu vào và trả về một số làm đầu ra. Đây là một giải pháp khá ngây thơ, đề nghị chơi golf chào đón.


0

PHP, 74 81 77 byte

for(;$o=ord($argn[$i]);$i++&&$f+=$p<$x,$p=$x)$x=(--$o/48^1?$o:$o+2)%6;echo$f;

Chạy như ống với -nRhoặc thử trực tuyến .


0

C (gcc) ,  82 79  77 byte

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;}

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

Chức năng này sẽ chỉ hỗ trợ đầu vào chữ thường


Ungolfed và bình luận:

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
}

Nếu chức năng của tôi được phép chấp nhận chuỗi ký tự rộng, nó có thể giảm xuống còn 76 byte với:

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;}

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

Phiên bản này chỉ chấp nhận đầu vào int*thay vìchar*


Chỉnh sửa:

  • Đã đánh 3 byte trong tính toán của cột (hàm c)
  • Chơi gôn 2 byte nhờ trần

Và ở đó, 77 byte
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.