Quão frustrante é o meu filme?


25

Meus pais têm um dispositivo de home theater. O controle remoto está quebrado, tornando incrivelmente difícil navegar para a direita em um menu. Na maioria das vezes, ele não funciona, mas quando funciona, move-se para a direita incrivelmente rápido.

Isso é obviamente frustrante, mas é mais frustrante quando você deseja inserir um título de filme que exija a navegação em um teclado com a seguinte aparência:

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

Sua tarefa é tomar como entrada um título de filme e calcular o quão "frustrante" é digitar esse título de filme. O número de frustração de uma sequência específica é o número de letras que requerem mover-se diretamente da letra anterior a elas. Não nos importamos com o quão certo eles estão, pois se começamos a nos movermos para a direita, quase instantaneamente chegamos ao final da linha e não nos importamos com movimentos para cima, para baixo ou para a esquerda porque são fáceis.

Por exemplo, se quisermos digitar

keyboard
  • Começamos kde graça.
  • eestá logo acima, kentão não precisamos seguir em frente.
  • y está todo o caminho para a esquerda, portanto não há necessidade de se mover para a direita.
  • b no entanto, está na próxima coluna à direita, por isso precisamos avançar para a direita.
  • o está na próxima coluna, então precisamos mover para a direita para chegar a ela.
  • a está de volta na primeira coluna, então movemos para a esquerda para chegar a ela.
  • r está todo o caminho certo, então vamos direto para ele.
  • dsão duas colunas à esquerda da rcoluna.

Os caracteres que precisam se mover para a direita borsignificam que isso é frustração 3.

Regras adicionais

Este é um desafio de , para que suas respostas sejam pontuadas em bytes, com menos bytes sendo melhores. A entrada sempre consistirá em caracteres alfanuméricos, você poderá suportar letras maiúsculas ou minúsculas e precisará apenas de uma. A entrada nunca estará vazia.

Casos de teste

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

3
Caso sugeriu teste: "blast2" -> 3(não é um filme real, mas algumas respostas têm problemas com esses casos de teste)
Arnauld

Caso de teste sugerido: um composto apenas por dígitos, como 5 -> 0
dez

1
Caso de teste sugerido:90 -> 1
nwellnhof 24/11

Podemos assumir que a string de entrada não estará vazia?
quer

@ChasBrown Isso é abordado na pergunta.
Assistente de trigo

Respostas:


8

JavaScript (Node.js) , 61 55 54 bytes

Guardado 1 byte graças a @nwellnhof

Recebe a entrada como uma matriz de caracteres.

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

Experimente online!

Quão?

Para todos os caracteres, mas dígitos maiores que 0 , a coluna x indexada a 0 é fornecida por:

x=(c1)mod6

onde é o código ASCII do caractere.c

Para dígitos positivos , precisamos fazer:n

x=(n+1)mod6

Exemplos:

"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

Comentado

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

Parece-obra sem o ternário para 46 bytes
Shaggy

1
@ Shagy Não vai. Veja meu caso de teste sugerido "blast2".
precisa

Ah Nesse caso: 53 bytes
Shaggy

1
@ Shaggy Um OR bit a bit falharia em, digamos "234",.
Arnauld

4
Menos uísque nunca é a resposta!
Shaggy

7

Gelatina , 11 bytes

⁾04yO‘%6<ƝS

Um link monádico que aceita uma lista de caracteres (maiúsculos).

Experimente online!

Quão?

Primeiro substitui qualquer '0's por '4's (para que o restante do código os trate como estando na coluna mais à direita). Em seguida, lança para ordinais, adiciona um e módulo 6para obter índices de coluna baseados em 0. Em seguida, compara os vizinhos com is-less-than e soma o resultado.

⁾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

Japonês -x , 14 bytes

®rT4 c Ä u6Ãä<

Experimente online!

Porta desta resposta Jelly. Recebe a entrada como uma matriz de caracteres, com letras maiúsculas.

Explicação:

®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 bytes

Não é uma solução ruim para Java! Esse zero no lado direito me custou vários bytes.

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

Experimente online!

Explicado

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
}

1

05AB1E , 12 11 bytes

-1 byte graças a @Kevin Cruijssen

¾4:Ç>6%¥1@O

Outro porto da resposta de Jonathan Allan Jelly. Leva a entrada em maiúsculas.

Explicação:

¾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

Experimente online!


1
0'4pode ser ¾4para salvar um byte ( dica 05AB1E relevante ).
Kevin Cruijssen


0

Retina 0.8.2 , 46 bytes

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

Experimente online! O link inclui casos de teste. Explicação:

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

Liste o alfabeto e os dígitos na ordem na OSK e mapeie cada um para um número de coluna (indexado 1).

.
;$&$*

Converta cada número de coluna em unário.

&`;(1+);1\1

Conte o número de colunas que são seguidas por uma coluna maior (ou seja, à direita). O &`permite que as correspondências se sobreponham.



0

Mathematica, 102 bytes

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

Função pura. Pega uma lista de caracteres como entrada e retorna um número como saída. Esta é uma solução bastante ingênua, sugestões de golfe são bem-vindas.


0

PHP, 74 81 77 bytes

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

Execute como pipe -nRou experimente online .


0

C (gcc) ,  82 79  77 bytes

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

Experimente online!

Esta função suporta apenas entradas em minúsculas


Ungolfed e comentou:

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
}

Se minha função tiver permissão para aceitar grandes cadeias de caracteres, ela poderá ser reduzida para 76 bytes com:

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

Experimente online!

Esta versão aceita apenas entrada, em int*vez dechar*


Edições:

  • Golfou 3 bytes no cálculo da coluna (função c)
  • Golfed 2 bytes graças ao ceilingcat

E lá, 77 bytes
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.