Jak frustrujący jest mój film?

25

Moi rodzice mają urządzenie kina domowego. Pilot jest zepsuty, co utrudnia poruszanie się po menu w prawo. Przez większość czasu nie działa, ale kiedy to robi, porusza się niezwykle szybko w prawo.

Jest to oczywiście frustrujące, ale najbardziej frustrujące, gdy chcesz wprowadzić tytuł filmu, który wymaga nawigacji na klawiaturze, która wygląda następująco:

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

Twoim zadaniem jest wziąć za wejście tytuł filmu i obliczyć, jak „frustrujące” jest wpisanie tego tytułu filmu. Liczba frustracyjna określonego ciągu to liczba liter, które wymagają przeniesienia bezpośrednio od litery przed nimi. Nie dbamy o to, jak daleko mają rację, ponieważ jeśli zaczniemy jechać w prawo, niemal natychmiast dojdziemy do końca linii i nie dbamy o ruch w górę, w dół lub w lewo, ponieważ są łatwe.

Na przykład, jeśli chcemy wpisać

keyboard
  • Zaczynamy od kza darmo.
  • ejest tuż powyżej, kwięc nie musimy się poruszać w prawo.
  • y jest całkowicie w lewo, więc nie trzeba się poruszać w prawo.
  • b znajduje się jednak w następnej kolumnie, więc musimy przejść w prawo, aby się do niej dostać.
  • o znajduje się w następnej kolumnie, więc musimy przejść w prawo, aby się do niego dostać.
  • a jest z powrotem w pierwszej kolumnie, więc przechodzimy w lewo, aby się do niego dostać.
  • r znajduje się po prawej stronie, więc przechodzimy do tego.
  • dto dwie kolumny po lewej stronie rkolumny.

Znaki, które muszą przejść w prawo, boroznaczają, że jest to frustracja 3.

Dodatkowe zasady

Jest to wyzwanie polegające na grze w więc twoje odpowiedzi będą liczone w bajtach, a mniej bajtów będzie lepszych. Dane wejściowe zawsze będą się składać ze znaków alfanumerycznych, możesz obsługiwać duże lub małe litery i wystarczy, że wprowadzisz tylko jedną. Dane wejściowe nigdy nie będą puste.

Przypadki testowe

keyboard -> 3
2001aspaceodyssey -> 6
sorrytobotheryou -> 8
thinblueline -> 5
blast2 -> 3
Kreator pszenicy
źródło
3
Sugerowany przypadek testowy: "blast2" -> 3(nie jest to prawdziwy film, ale niektóre odpowiedzi mają problemy z takimi przypadkami testowymi)
Arnauld
Sugerowany przypadek testowy: jeden składający się tylko z cyfr, np. 5 -> 0
lirtosiast
1
Sugerowany przypadek testowy:90 -> 1
nwellnhof
Czy możemy założyć, że ciąg wejściowy nie będzie pusty?
Chas Brown
@ChasBrown To jest objęte pytaniem.
Wheat Wizard

Odpowiedzi:

8

JavaScript (Node.js) , 61 55 54 bajtów

Zaoszczędzono 1 bajt dzięki @nwellnhof

Pobiera dane wejściowe jako tablicę znaków.

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

Wypróbuj online!

W jaki sposób?

Dla wszystkich znaków oprócz cyfr większych od 0 kolumna x indeksie 0 jest podawana przez:

x=(do-1)mod6

gdzie do jest kodem ASCII znaku.

Dla cyfr dodatnich n musimy zamiast tego zrobić:

x=(n+1)mod6

Przykłady:

"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

Skomentował

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
Arnauld
źródło
Wydaje się, że działa bez trójskładnika dla 46 bajtów
Shaggy
1
@Shaggy To nie będzie. Zobacz mój sugerowany przypadek testowy "blast2".
Arnauld
Ach W takim przypadku: 53 bajty
Kudłaty
1
@Shaggy bitowym OR zawiedzie, powiedzmy, "234".
Arnauld
4
Mniej whisky nigdy nie jest odpowiedzią!
Kudłaty
7

Galaretka , 11 bajtów

⁾04yO‘%6<ƝS

Monadyczny link akceptujący listę (wielkich liter) znaków.

Wypróbuj online!

W jaki sposób?

Najpierw zamienia dowolne '0's na '4's (więc reszta kodu traktuje je jako znajdujące się w skrajnej prawej kolumnie). Następnie rzutuje do rzędnych, dodaje jeden i modulo przez, 6aby uzyskać indeksy kolumn oparte na 0. Następnie porównuje sąsiadów z is-less-than i sumuje wynik.

⁾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
Jonathan Allan
źródło
O rany, to jest sztuka.
Erik the Outgolfer
3

Perl 6 , 45 39 bajtów

{sum .[1..*]Z<$_}o{(2 X-.ords)X%46 X%6}

Wypróbuj online!

Działa z dużymi literami. (2-ord(c))%46%6oblicza odwróconą współrzędną x.

nwellnhof
źródło
1

Czysty , 85 bajtów

import StdEnv
(\s=sum[1\\a<-s&b<-tl s|b>a])o map(\e=(toInt e+if(e-'1'>'/')1 -1)rem 6)

Wypróbuj online!

Obrzydliwe
źródło
1

Japt -x , 14 bajtów

®rT4 c Ä u6Ãä<

Wypróbuj online!

Port tej odpowiedzi galaretki. Pobiera dane wejściowe jako tablicę znaków, z dużymi literami.

Wyjaśnienie:

®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
Kamil Drakari
źródło
1

Java (OpenJDK 8) , 73 bajty

Niezłe rozwiązanie dla Javy! To zero po prawej stronie kosztowało mnie kilka bajtów.

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

Wypróbuj online!

Wyjaśnił

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
}
Luke Stevens
źródło
1

05AB1E , 12 11 bajtów

-1 bajt dzięki @Kevin Cruijssen

¾4:Ç>6%¥1@O

Kolejny port galaretki Jonathana Allana. Pobiera dane pisane wielkimi literami.

Wyjaśnienie:

¾4:Ç>6%¥1@O   //full program
¾4:           //replace all '0's with '4's
   Ç          //get ASCII code points
    >         //increment
     6%       //modulo 6
       ¥      //get deltas
        1@    //is >= 1
          O   //sum

Wypróbuj online!

Cowabunghole
źródło
1
0'4można ¾4zapisać bajt ( odpowiednia wskazówka 05AB1E ).
Kevin Cruijssen
0

Retina 0.8.2 , 46 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

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

Wymień alfabet i cyfry w kolejności w OSK i zamapuj każdy z nich na (1-indeksowany) numer kolumny.

.
;$&$*

Konwertuj każdy numer kolumny na unary.

&`;(1+);1\1

Policz liczbę kolumn, po których następuje większa (tj. Prawa) kolumna. &`Pozwala mecze do nakładania.

Neil
źródło
0

Mathematica, 102 bajty

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

Czysta funkcja. Pobiera listę znaków jako dane wejściowe i zwraca liczbę jako dane wyjściowe. To dość naiwne rozwiązanie, mile widziane sugestie dotyczące gry w golfa.

LegionMammal978
źródło
0

PHP, 74 81 77 bajtów

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

Uruchom jako potok z -nRlub spróbuj online .

Tytus
źródło
0

C (gcc) ,  82 79  77 bajtów

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

Wypróbuj online!

Ta funkcja obsługuje tylko małe litery


Nie golfił i skomentował:

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
}

Jeśli moja funkcja może akceptować szerokie ciągi znaków, można ją zmniejszyć do 76 bajtów za pomocą:

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

Wypróbuj online!

Ta wersja akceptuje tylko dane wejściowe jako int*zamiastchar*


Edycje:

  • Rozegrano 3 bajty w obliczeniu kolumny (funkcja c)
  • Grał w golfa 2 bajty dzięki pułapce cat
Annyo
źródło
A tam 77 bajtów