私の映画はどれほどイライラしますか?


25

両親はホームシアターデバイスを持っています。リモートが壊れているため、メニュー内を右にナビゲートするのが非常に難しくなります。ほとんどの場合は動作しませんが、動作すると非常に速く右に移動します。

これは明らかにイライラしますが、次のようなキーボードの操作が必要な映画のタイトルを入力する場合は、最もイライラします。

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

あなたの仕事は、入力として映画のタイトルを取得し、その映画のタイトルを入力することの「イライラ」を計算することです。特定の文字列のフラストレーション数は、その前の文字から右に移動する必要がある文字の数です。それらがどれだけ正しいかは気にしません。なぜなら、右に移動し始めるとすぐに行の終わりに移動するからです。また、上、下、左への移動は簡単なので気にしません。

たとえば、入力したい場合

keyboard
  • k無料で始めます。
  • e上にあるkので、正しく移動する必要はありません。
  • y ずっと左にあるので、右に移動する必要はありません。
  • b ただし、右の次の列にあるので、それに到達するには右に移動する必要があります。
  • o 次の列にありますので、右に移動しなければなりません。
  • a 最初の列に戻ったので、左に移動します。
  • r 右側にあるので、すぐに移動します。
  • dの列の左側に2列ありrます。

右に移動する必要があるキャラクターはbor、これがフラストレーション3であることを意味しています。

追加のルール

これはチャレンジであるため、回答はバイト単位でスコアリングされ、バイト数は少ない方が良いでしょう。入力は常に英数字で構成され、大文字または小文字のいずれかをサポートでき、サポートする必要があるのは1文字のみです。入力が空になることはありません。

テストケース

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

3
推奨されるテストケース:("blast2" -> 3実際の映画ではありませんが、一部の回答にはそのようなテストケースに問題があります)
アーナウルド

推奨されるテストケース:5-> 0
lirtosiast

1
推奨されるテストケース:90 -> 1
nwellnhof

入力文字列が空でないと仮定できますか?
チャスブラウン

@ChasBrownそれは質問でカバーされています。
小麦ウィザード

回答:


8

JavaScript(Node.js)61 55 54バイト

@nwellnhofのおかげで1バイト節約

入力を文字の配列として受け取ります。

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

オンラインでお試しください!

どうやって?

より大きい数字以外のすべての文字について、0でインデックス付けされた列は次のように与えられます。0x

x=(c1)mod6

どこ文字のASCIIコードです。c

正の数字、代わりに行う必要があります。n

x=(n+1)mod6

例:

"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

コメント済み

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それはしません。私の提案したテストケースを参照してください"blast2"
アーナウルド

あ。その場合:53バイト
Shaggy

1
@ShaggyビットごとのORは、たとえば、失敗し"234"ます。
アーナルド

4
ウイスキーが少ないと答えになることはありません!
シャギー

7

ゼリー、11バイト

⁾04yO‘%6<ƝS

(大文字の)文字のリストを受け入れる単項リンク。

オンラインでお試しください!

どうやって?

最初に、すべて'0'のsを'4'sに置き換えます(したがって、残りのコードは、それらを右端の列にあるものとして扱います)。次に、序数にキャストし、1とモジュロを加算6して0 から始まる列インデックスを取得します。次に、ネイバーをis-less-thanと比較し、結果を合計します。

⁾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バイト

®rT4 c Ä u6Ãä<

オンラインでお試しください!

このゼリーの回答のポート。入力を文字の配列として、大文字を使用します。

説明:

®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バイト

Javaの悪い解決策ではありません!その右側にあるゼロは数バイトかかりました。

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

オンラインでお試しください!

説明した

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

05AB1E12 11バイト

@Kevin Cruijssenのおかげで-1バイト

¾4:Ç>6%¥1@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

オンラインでお試しください!


1
0'4¾4バイトを保存することができます(関連する05AB1Eのヒント)。
ケビンクルーッセン


0

Retina 0.8.2、46バイト

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

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

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

OSKでアルファベットと数字を順番にリストし、それぞれを(1から始まる)列番号にマッピングします。

.
;$&$*

各列番号を単項に変換します。

&`;(1+);1\1

大きい(つまり右向きの)列が続く列の数を数えます。これ&`により、一致を重複させることができます。



0

Mathematica、102バイト

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

純粋な機能。入力として文字のリストを取り、出力として数値を返します。これはかなり素朴な解決策です。ゴルフの提案を歓迎します。



0

C(gcc) 82 79  77バイト

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

オンラインでお試しください!

この関数は小文字の入力のみをサポートします


非ゴルフとコメント:

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
}

私の関数はワイド文字列を受け入れることを許可されている場合は、それがに低減することができ、76のバイトと:

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

オンラインでお試しください!

このバージョンでは、同じように、入力を受け入れるint*代わりに、char*


編集:

  • 列の計算で3バイトのゴルフ(関数c
  • ceilingcatのおかげで2バイトのゴルフ

そこに、77バイト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.