À quel point mon film est-il frustrant?

25

Mes parents ont un appareil de cinéma maison. La télécommande est cassée, ce qui rend incroyablement difficile la navigation vers la droite dans un menu. La plupart du temps, cela ne fonctionne pas, mais quand il le fait, il se déplace incroyablement rapidement vers la droite.

C'est évidemment frustrant, mais c'est plus frustrant lorsque vous voulez entrer un titre de film qui nécessite de naviguer sur un clavier qui ressemble à ceci:

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

Votre tâche consiste à prendre en entrée un titre de film et à calculer à quel point il est "frustrant" de saisir ce titre de film. Le numéro de frustration d'une chaîne particulière est le nombre de lettres qui nécessitent de passer directement de la lettre qui les précède. Nous ne nous soucions pas de savoir à quelle distance ils sont à droite, car si nous commençons à nous déplacer vers la droite, nous allons presque instantanément à la fin de la ligne, et nous ne nous soucions pas du mouvement vers le haut, vers le bas ou vers la gauche parce qu'ils sont faciles.

Par exemple, si nous voulions saisir

keyboard
  • Nous commençons kgratuitement.
  • eest juste au-dessus, kdonc nous n'avons pas besoin de bouger à droite.
  • y est tout le chemin à gauche donc pas besoin de bouger à droite.
  • b est cependant sur la colonne suivante à droite, nous devons donc aller à droite pour y accéder.
  • o est sur la colonne suivante, nous devons donc aller vers la droite pour y accéder.
  • a est de retour dans la première colonne donc on se déplace vers la gauche pour y accéder.
  • r est tout le chemin à droite, donc nous allons à droite.
  • dest deux colonnes à gauche de rla colonne.

Les personnages qui doivent se déplacer vers la droite borsignifient que c'est de la frustration 3.

Règles supplémentaires

Il s'agit d'un défi de , donc vos réponses seront notées en octets avec moins d'octets mieux. L'entrée sera toujours composée de caractères alphanumériques, vous pouvez prendre en charge les majuscules ou les minuscules et vous n'avez besoin que d'une seule. L'entrée ne sera jamais vide.

Cas de test

keyboard -> 3
2001aspaceodyssey -> 6
sorrytobotheryou -> 8
thinblueline -> 5
blast2 -> 3
Assistant de blé
la source
3
Cas de test suggéré: "blast2" -> 3(pas un vrai film, mais certaines réponses ont des problèmes avec de tels cas de test)
Arnauld
Cas de test suggéré: un composé uniquement de chiffres, comme 5 -> 0
lirtosiast
1
Cas de test suggéré:90 -> 1
nwellnhof
Pouvons-nous supposer que la chaîne d'entrée ne sera pas vide?
Chas Brown
@ChasBrown C'est couvert dans la question.
Wheat Wizard

Réponses:

8

JavaScript (Node.js) , 61 55 54 octets

1 octet enregistré grâce à @nwellnhof

Prend l'entrée comme un tableau de caractères.

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

Essayez-le en ligne!

Comment?

Pour tous les caractères mais les chiffres supérieurs à 0 , la colonne x indexée 0 est donnée par:

x=(c1)mod6

où est le code ASCII du caractère.c

Pour les chiffres positifs , nous devons faire à la place:n

x=(n+1)mod6

Exemples:

"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

Commenté

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
la source
Il semble fonctionner sans le ternaire pendant 46 octets
Shaggy
1
@Shaggy Ce ne sera pas le cas. Voir mon cas de test suggéré "blast2".
Arnauld
Ah. Dans ce cas: 53 octets
Shaggy
1
@Shaggy Bitwise OU échouerait, disons, "234".
Arnauld
4
Moins de whisky n'est jamais la réponse!
Shaggy
7

Gelée , 11 octets

⁾04yO‘%6<ƝS

Un lien monadique acceptant une liste de caractères (majuscules).

Essayez-le en ligne!

Comment?

Remplace d'abord tout '0's par '4's (donc le reste du code les traite comme étant dans la colonne la plus à droite). Convertit ensuite en ordinaux, ajoute un et modulo par 6pour obtenir des indices de colonne basés sur 0. Compare ensuite les voisins avec is-less-than et additionne le résultat.

⁾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
la source
Oh mon Dieu, c'est de l'art.
Erik the Outgolfer
3

Perl 6 , 45 39 octets

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

Essayez-le en ligne!

Fonctionne avec des lettres majuscules. (2-ord(c))%46%6calcule la coordonnée x inversée.

nwellnhof
la source
1

Propre , 85 octets

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

Essayez-le en ligne!

Οurous
la source
1

Japt -x , 14 octets

®rT4 c Ä u6Ãä<

Essayez-le en ligne!

Port de cette réponse Jelly. Prend l'entrée comme un tableau de caractères, avec des lettres en majuscule.

Explication:

®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
la source
1

Java (OpenJDK 8) , 73 octets

Pas une mauvaise solution pour Java! Ce zéro étant sur le côté droit m'a coûté plusieurs octets.

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

Essayez-le en ligne!

Expliqué

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
la source
1

05AB1E , 12 11 octets

-1 octet grâce à @Kevin Cruijssen

¾4:Ç>6%¥1@O

Un autre port de la réponse Jelly de Jonathan Allan. Prend l'entrée en majuscules.

Explication:

¾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

Essayez-le en ligne!

Cowabunghole
la source
1
0'4peut être ¾4d'enregistrer un octet ( astuce 05AB1E pertinente ).
Kevin Cruijssen
0

Retina 0.8.2 , 46 octets

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

Essayez-le en ligne! Le lien inclut des cas de test. Explication:

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

Listez l'alphabet et les chiffres dans l'ordre sur l'OSK et mappez chacun sur un numéro de colonne (indexé 1).

.
;$&$*

Convertissez chaque numéro de colonne en unaire.

&`;(1+);1\1

Comptez le nombre de colonnes suivies d'une colonne plus grande (c'est-à-dire vers la droite). Le &`permet aux correspondances de se chevaucher.

Neil
la source
0

Mathematica, 102 octets

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

Fonction pure. Prend une liste de caractères en entrée et renvoie un nombre en sortie. Ceci est une solution assez naïve, les suggestions de golf sont les bienvenues.

LegionMammal978
la source
0

PHP, 74 81 77 octets

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

Exécuter en tant que pipe avec -nRou l' essayer en ligne .

Titus
la source
0

C (gcc) ,  82 79  77 octets

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

Essayez-le en ligne!

Cette fonction ne prend en charge que les entrées en minuscules


Non golfé et commenté:

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
}

Si ma fonction est autorisée à accepter des chaînes de caractères larges, elle peut être réduite à 76 octets avec:

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

Essayez-le en ligne!

Cette version accepte simplement l'entrée comme int*au lieu dechar*


Modifications:

  • Golfé 3 octets dans le calcul de la colonne (fonction c)
  • Golfé 2 octets grâce au plafond
Annyo
la source
Et là, 77 octets