Seberapa frustasi film saya?

25

Orang tua saya punya perangkat home theatre. Remote rusak sehingga sangat sulit untuk menavigasi ke kanan dalam menu. Sebagian besar waktu itu tidak bekerja tetapi ketika itu bergerak ke kanan sangat cepat.

Ini jelas membuat frustasi tetapi yang paling membuat frustrasi ketika Anda ingin memasukkan judul film yang mengharuskan Anda menavigasi keyboard yang terlihat seperti ini:

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

Tugas Anda adalah memasukkan judul film dan menghitung seberapa "frustasi" mengetikkan judul film itu. Jumlah frustasi dari string tertentu adalah jumlah huruf yang perlu dipindahkan tepat dari huruf sebelum mereka. Kami tidak peduli seberapa jauh mereka, karena jika kami mulai bergerak ke kanan, kami akan langsung menuju ke ujung garis, dan kami tidak peduli dengan gerakan naik, turun atau ke kiri karena mudah.

Misalnya jika kita ingin mengetik

keyboard
  • Kita mulai dari k secara gratis.
  • e tepat di atas k sehingga kita tidak perlu bergerak ke kanan.
  • y semua jalan kiri sehingga tidak perlu bergerak ke kanan.
  • b Namun ada di kolom berikutnya ke kanan sehingga kita perlu bergerak ke kanan untuk sampai ke sana.
  • o ada di kolom berikutnya sehingga kita harus bergerak ke kanan untuk mendapatkannya.
  • a kembali di kolom pertama sehingga kami bergerak ke kiri untuk sampai ke sana.
  • r adalah semua jalan di kanan jadi kami bergerak ke kanan ke sana.
  • dadalah dua kolom di sebelah kiri rkolom.

Karakter yang perlu bergerak ke kanan borberarti bahwa ini adalah frustrasi 3.

Aturan tambahan

Ini adalah tantangan sehingga jawaban Anda akan dinilai dalam byte dengan lebih sedikit byte yang lebih baik. Input akan selalu terdiri dari karakter alfanumerik, Anda dapat mendukung huruf besar atau kecil dan Anda hanya perlu mendukungnya. Masukan tidak akan pernah kosong.

Testcases

keyboard -> 3
2001aspaceodyssey -> 6
sorrytobotheryou -> 8
thinblueline -> 5
blast2 -> 3
Wisaya Gandum
sumber
3
Test case yang disarankan: "blast2" -> 3(bukan film sungguhan, tetapi beberapa jawaban memiliki masalah dengan test case seperti itu)
Arnauld
Kasing uji yang disarankan: satu terdiri dari hanya digit, seperti 5 -> 0
lirtosiast
1
90 -> 1
Case
Bisakah kita menganggap string input tidak kosong?
Chas Brown
@ ChasBrown Itu tercakup dalam pertanyaan.
Wheat Wizard

Jawaban:

8

JavaScript (Node.js) , 61 55 54 byte

Disimpan 1 byte berkat @nwellnhof

Mengambil input sebagai array karakter.

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

Cobalah online!

Bagaimana?

Untuk semua karakter tetapi digit lebih besar dari 0 , kolom 0-diindeks x diberikan oleh:

x=(c-1)mod6

di mana adalah kode ASCII dari karakter.c

Untuk digit positif , kita perlu melakukan sebaliknya:n

x=(n+1)mod6

Contoh:

"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

Berkomentar

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
sumber
Tampaknya berfungsi tanpa terner selama 46 byte
Shaggy
1
@ Shaggy Tidak akan. Lihat test case yang saya sarankan "blast2".
Arnauld
Ah. Dalam hal ini: 53 byte
Shaggy
1
@Shaggy Sedikit demi sedikit ATAU akan gagal untuk, katakanlah "234",.
Arnauld
4
Kurang wiski tidak pernah jawabannya!
Shaggy
7

Jelly , 11 byte

⁾04yO‘%6<ƝS

Tautan monadik yang menerima daftar karakter (huruf besar).

Cobalah online!

Bagaimana?

Pertama, ganti any '0'dengan '4's (jadi sisa kode memperlakukannya sebagai yang ada di kolom paling kanan). Kemudian dilemparkan ke ordinal, menambahkan satu dan modulo dengan 6untuk mendapatkan indeks kolom berbasis 0. Kemudian membandingkan tetangga dengan is-less-than dan menjumlahkan hasilnya.

⁾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
sumber
Ya ampun, ini seni.
Erik the Outgolfer
3

Perl 6 , 45 39 byte

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

Cobalah online!

Bekerja dengan huruf besar. (2-ord(c))%46%6menghitung koordinat x terbalik.

nwellnhof
sumber
1

Bersih , 85 byte

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

Cobalah online!

Suram
sumber
1

Ruby , 56 byte

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

Cobalah online!

Versi naif awal, akan golf.

GB
sumber
1

Japt -x , 14 byte

®rT4 c Ä u6Ãä<

Cobalah online!

Port jawaban Jelly ini . Mengambil input sebagai array karakter, dengan huruf besar.

Penjelasan:

®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
sumber
1

Java (OpenJDK 8) , 73 byte

Bukan solusi buruk untuk Jawa! Nol itu berada di sisi kanan saya biaya beberapa 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;}

Cobalah online!

Dijelaskan

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
sumber
1

05AB1E , 12 11 byte

-1 byte terima kasih kepada @Kevin Cruijssen

¾4:Ç>6%¥1@O

Port lain dari jawaban Jelly Jonathan Allan. Mengambil input dalam huruf besar.

Penjelasan:

¾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

Cobalah online!

Cowabunghole
sumber
1
0'4dapat ¾4menyimpan byte ( tip 05AB1E relevan ).
Kevin Cruijssen
0

Retina 0.8.2 , 46 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

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

Tuliskan alfabet dan digit dalam urutan pada OSK dan petakan masing-masing ke nomor kolom (diindeks).

.
;$&$*

Ubah setiap nomor kolom menjadi unary.

&`;(1+);1\1

Hitung jumlah kolom yang diikuti oleh kolom yang lebih besar (yaitu ke kanan). The &`memungkinkan pertandingan untuk tumpang tindih.

Neil
sumber
0

Mathematica, 102 byte

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

Fungsi murni. Mengambil daftar karakter sebagai input dan mengembalikan nomor sebagai output. Ini adalah solusi yang cukup naif, saran golf menyambut.

LegionMammal978
sumber
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;

Jalankan sebagai pipa dengan -nRatau coba online .

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

Cobalah online!

Fungsi ini hanya akan mendukung input huruf kecil


Tidak dikumpulkan dan berkomentar:

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
}

Jika fungsi saya diizinkan untuk menerima string karakter lebar, itu dapat dikurangi menjadi 76 byte dengan:

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

Cobalah online!

Versi ini hanya menerima input sebagai int*gantinyachar*


Suntingan:

  • Golf 3 byte dalam perhitungan kolom (fungsi c)
  • Golf 2 byte berkat ceilingcat
Annyo
sumber
Dan di sana, 77 byte