Quanto è frustrante il mio film?


25

I miei genitori hanno un dispositivo home theater. Il telecomando è rotto, rendendo incredibilmente difficile navigare a destra in un menu. Il più delle volte non funziona, ma quando lo fa si muove in modo incredibilmente rapido verso destra.

Questo è ovviamente frustrante, ma è molto frustrante quando si desidera inserire un titolo di film che richiede la navigazione di una tastiera simile a questa:

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

Il tuo compito è prendere come input il titolo di un film e calcolare quanto sia "frustrante" digitare quel titolo del film. Il numero di frustrazione di una particolare stringa è il numero di lettere che richiedono di spostarsi direttamente dalla lettera prima di esse. Non ci interessa quanto siano a destra, dato che se iniziamo a muoverci a destra, arriviamo all'istante alla fine della linea e non ci preoccupiamo dei movimenti su, giù o verso sinistra perché sono facili.

Ad esempio, se volessimo digitare

keyboard
  • Iniziamo kgratuitamente.
  • eè appena sopra, kquindi non abbiamo bisogno di spostarci a destra.
  • y è completamente a sinistra, quindi non è necessario spostarsi a destra.
  • b tuttavia è sulla colonna successiva a destra, quindi dobbiamo spostarci a destra per arrivarci.
  • o si trova nella colonna successiva, quindi dobbiamo spostarci verso destra per arrivarci.
  • a è tornato nella prima colonna, quindi ci spostiamo a sinistra per arrivarci.
  • r è completamente a destra, quindi ci spostiamo a destra.
  • dè due colonne a sinistra della rcolonna.

I personaggi che devono spostarsi a destra borsignificano che questa è frustrazione 3.

Regole aggiuntive

Questa è una sfida di , quindi le tue risposte saranno classificate in byte con meno byte migliori. L'input consisterà sempre di caratteri alfanumerici, puoi supportare lettere maiuscole o minuscole e devi solo supportarne una. L'input non sarà mai vuoto.

Casi test

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

3
Caso di prova suggerito: "blast2" -> 3(non un film reale, ma alcune risposte hanno problemi con tali casi di prova)
Arnauld

Caso di prova suggerito: uno composto da sole cifre, come 5 -> 0
lirtosiast

1
Caso di prova suggerito:90 -> 1
nwellnhof

Possiamo supporre che la stringa di input non sia vuota?
Chas Brown,

@ChasBrown Questo è coperto dalla domanda.
Wheat Wizard

Risposte:


8

JavaScript (Node.js) , 61 55 54 byte

Salvato 1 byte grazie a @nwellnhof

Accetta input come una matrice di caratteri.

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

Provalo online!

Come?

Per tutti i caratteri ma le cifre maggiori di , la colonna indicizzata 0 è data da:0x

x=(c1)mod6

dove è il codice ASCII del carattere.c

Per cifre positive , dobbiamo invece fare:n

x=(n+1)mod6

Esempi:

"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

Commentate

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

Sembra funzionare senza il ternario per 46 byte
Shaggy,

1
@Shaggy Non lo farà. Vedi il mio caso di prova suggerito "blast2".
Arnauld,

Ah. In quel caso: 53 byte
Shaggy

1
@Shaggy Un OR bit a bit fallirebbe per, diciamo, "234".
Arnauld,

4
Meno whisky non è mai la risposta!
Shaggy,

7

Gelatina , 11 byte

⁾04yO‘%6<ƝS

Un collegamento monadico che accetta un elenco di caratteri (maiuscoli).

Provalo online!

Come?

Sostituisce innanzitutto qualsiasi '0's con '4's (quindi il resto del codice li considera nella colonna più a destra). Quindi esegue il cast agli ordinali, aggiunge uno e il modulo 6per ottenere indici di colonna basati su 0. Quindi confronta i vicini con is-less-than e somma il risultato.

⁾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

Rubino , 56 byte

->s{w=9;s.count{|c|w<w=[*?a..?z,*?1..?9,?0].index(c)%6}}

Provalo online!

Versione ingenua preliminare, verrà giocata a golf.


1

Japt -x , 14 byte

®rT4 c Ä u6Ãä<

Provalo online!

Porto di questa risposta di gelatina. Accetta input come una matrice di caratteri, con lettere maiuscole.

Spiegazione:

®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

Non è una cattiva soluzione per Java! Lo zero sul lato destro mi è costato diversi 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;}

Provalo online!

spiegato

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 byte

-1 byte grazie a @Kevin Cruijssen

¾4:Ç>6%¥1@O

Un altro porto della risposta Jelly di Jonathan Allan. Prende l'input in maiuscolo.

Spiegazione:

¾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

Provalo online!


1
0'4può essere ¾4quello di salvare un byte ( relativo suggerimento 05AB1E ).
Kevin Cruijssen,


0

Retina 0.8.2 , 46 byte

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

Provalo online! Il link include casi di test. Spiegazione:

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

Elenca l'alfabeto e le cifre nell'ordine sull'OSK e associa ognuna a un numero di colonna (1 indicizzato).

.
;$&$*

Converti ogni numero di colonna in unario.

&`;(1+);1\1

Contare il numero di colonne che sono seguite da una colonna più grande (cioè verso destra). Ciò &`consente alle partite di sovrapporsi.



0

Mathematica, 102 byte

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

Funzione pura. Prende un elenco di caratteri come input e restituisce un numero come output. Questa è una soluzione abbastanza ingenua, benvenuti i suggerimenti per il golf.


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;

Esegui come pipe -nRo provalo online .


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

Provalo online!

Questa funzione supporterà solo input minuscoli


Ungolf e commentato:

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 la mia funzione è autorizzata ad accettare stringhe di caratteri estese, può essere ridotta a 76 byte con:

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

Provalo online!

Questa versione accetta solo input come int*anzichéchar*


modifiche:

  • Golfati 3 byte nel calcolo della colonna (funzione c)
  • Golfato 2 byte grazie a ceilingcat

E lì, 77 byte
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.