Filmim ne kadar sinir bozucu?


25

Ailemin ev sinema sistemi var. Uzaktan kumanda bir menüde sağa doğru gezinmeyi zorlaştıracak şekilde bozuldu. Çoğu zaman işe yaramaz, ancak çalıştığında inanılmaz hızlı bir şekilde sağa doğru hareket eder.

Bu açıkça sinir bozucu ama en çok bunun gibi görünen bir klavyede gezinmeyi gerektiren bir film başlığı girmek istediğinizde sinir bozucu:

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

Göreviniz bir film başlığı olarak girip o film başlığını yazmanın ne kadar "sinir bozucu" olduğunu hesaplamak. Belirli bir dizgenin hayal kırıklığı sayısı, hemen önündeki harften hareket etmeyi gerektiren harflerin sayısıdır. Ne kadar doğru oldukları umurumda değil, çünkü doğru hareket etmeye başlarsak hemen hemen çizginin sonuna gidiyoruz ve yukarı, aşağı veya sola doğru hareketi umursamıyoruz çünkü kolay.

Mesela yazmak istiyorsak

keyboard
  • kÜcretsiz olarak başlıyoruz .
  • esadece yukarıda kolduğundan, doğru hareket etmemize gerek yok.
  • y geriye kalan her şey bu yüzden sağa gitmenize gerek yok.
  • b ancak bir sonraki sütunda doğru olduğundan, onu almak için doğru yere gitmemiz gerekiyor.
  • o Bir sonraki sütunda, bu yüzden onu almak için sağa doğru hareket etmeliyiz.
  • a geri döndüğümüz için ilk sütuna geri dönelim.
  • r sağdaki tüm yol bu yüzden ona doğru ilerliyoruz.
  • drsütununun solundaki iki sütun.

Sağa doğru hareket etmesi gereken karakterler bunun borhayal kırıklığı olduğu anlamına gelir 3.

Ek kurallar

Bu bir mücadelesidir, bu nedenle cevaplarınız daha az byte ile daha iyi olacak şekilde byte olarak puanlanacaktır. Girdi her zaman alfasayısal karakterlerden oluşacak, büyük veya küçük harfleri destekleyebilir ve yalnızca birini desteklemeniz gerekir. Giriş asla boş bırakılmaz.

testcases

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

3
Önerilen sınama durumu: "blast2" -> 3(gerçek bir film değil, ancak bazı cevapların bu sınama durumları ile ilgili sorunları var)
Arnauld

Önerilen test durumu: 5 -> 0
lirtosiast gibi

1
Önerilen test davası:90 -> 1
nwellnhof 24:18

Giriş dizesinin boş olmadığını varsayabilir miyiz?
Chas Brown

@ChasBrown Bu soruda ele alınmaktadır.
Buğday Sihirbazı

Yanıtlar:


8

JavaScript (Node.js) , 61 55 54 bayt

@Nwellnhof sayesinde 1 bayt kaydedildi

Girdiyi karakter dizisi olarak alır.

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

Çevrimiçi deneyin!

Nasıl?

Tüm karakterlerde ancak 0 büyük rakamlarda , 0 indeksli sütun x tarafından verilir:

x=(c1)mod6

nerede c karakterinin ASCII kodudur.

Olumlu rakamlar için n , yapmamız gerekenler:

x=(n+1)mod6

Örnekler:

"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

Yorumlananlar

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


1
@Shaggy Olmaz. Önerilen test durumuma bakın "blast2".
Arnauld

Ah. Bu durumda: 53 bayt
Shaggy

1
@Shaggy Bitsel bir OR VEYA, başarısız olur "234".
Arnauld

4
Daha az viski asla cevap değil!
Shaggy

7

Jöle , 11 bayt

⁾04yO‘%6<ƝS

(Büyük harf) karakterlerin bir listesini kabul eden bir monadik Bağlantı.

Çevrimiçi deneyin!

Nasıl?

İlk önce herhangi bir '0's ile değiştirir'4' (kodun geri kalanı onları en sağdaki sütunda olduğu gibi değerlendirir). Sonra sıralar atar, 60 tabanlı sütun endeksleri elde etmek için bir ve modül ekler . Daha sonra komşulardan daha küçük olanları karşılaştırır ve sonucu toplar.

⁾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

Japt -x , 14 bayt

®rT4 c Ä u6Ãä<

Çevrimiçi deneyin!

Port bu Jelly cevabının . Harfleri büyük harflerle, karakter dizisi olarak alır.

Açıklama:

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

Java için fena bir çözüm değil! Sağ taraftaki o sıfır bana birkaç byte'a mal oldu.

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

Çevrimiçi deneyin!

Açıklaması

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 bayt

@Kevin Cruijssen sayesinde -1 bayt

¾4:Ç>6%¥1@O

Jonathan Allan'ın Jelly'in bir başka limanı da cevap veriyor. Büyük harfle giriş yapar.

Açıklama:

¾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

Çevrimiçi deneyin!


1
0'4¾4Bir bayt ( ilgili 05AB1E ucu ) kaydetmek için olabilir .
Kevin Cruijssen


0

Retina 0.8.2 , 46 bayt

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Açıklama:

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

Alfabeyi ve rakamları OSK'daki sıraya göre sıralayın ve her birini (1 indeksli) sütun numarasına eşleyin.

.
;$&$*

Her sütun numarasını birliğe dönüştürün.

&`;(1+);1\1

Daha büyük (yani sağa doğru) bir sütun izleyen sütun sayısını sayın. &`Örtüşme eşleşmeleri verir.



0

Mathematica, 102 bayt

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

Saf işlevi. Girdi olarak bir karakter listesi alır ve çıktı olarak bir sayı döndürür. Bu oldukça naif bir çözüm, golf önerileri hoş geldiniz.


0

PHP, 74 81 77 bayt

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

Pipe ile çalıştırın -nRveya çevrimiçi deneyin .


0

C (gcc) ,  82 79  77 bayt

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

Çevrimiçi deneyin!

Bu işlev yalnızca küçük harf girişlerini destekleyecektir


Ungolfed ve yorumladı:

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
}

Fonksiyonumun geniş karakterli dizeleri kabul etmesine izin verilirse, birlikte 76 bayta :

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

Çevrimiçi deneyin!

Bu sürüm sadece giriş olarak kabul eder. int* yerinechar*


Düzenlemeler:

  • Sütunun hesaplanmasında Golf 3 bayt (işlev c )
  • Ceilingcat sayesinde 2 baytlık golf sahası

Ve orada, 77 bayt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.