Craptastic Program Search


8

ある有名なケーブル会社には、リモコンを介して機能するやや不器用な「プログラムの検索」機能があります。ボタンを押すのにかなりの時間がかかります。ですから、私は動きの経済を賞賛しているので、指の動きを最小限に抑えるためにプログラマーの助けを求めたいと思いました。

Craptastic Search機能は、選択可能なセルのレイアウトを特徴としており、次のように、3つのセルの1行と6つのセルの6行が続きます。

del spa sav
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 0 1 2 3
4 5 6 7 8 9

各文字A-Zにはセルがありspa、検索文字列にスペースを追加するために使用されます。del文字を削除するために使用されることになっています。そして、sav検索文字列を保存するために使用されることを意味しています。この課題では、これらの実際の機能は無視します。ただし、セルは目的に応じて選択可能です。

空の検索文字列とA選択したセルから始めます。左、右、上、下の矢印ボタンを使用して、選択したセルを変更します。中央の「OK」キーを押すと、選択したセルの文字が検索文字列に追加されます。便宜上、我々は使います<、>、^、vと_左用、右、上、下とOK、それぞれ。

文字と数字の場合、方向ボタンの操作は簡単です。「ラップアラウンド」はありません。例えば、現在のセルがある場合Gは、<効果がありません。

したがって、検索文字列を入力BIGするには、シーケンスを使用できます

>_>v_<<_

(初期値>は、デフォルトの開始セルAからセルに移動するために必要ですB)。あるいは、もちろん代わりにを使用することもできます>_v>_<<_。ただし、この作業を実行できる8つのキーよりも短いシーケンスはありません。

一番上の行には3つのセルしかないので、アクションは少し異なり、少し複雑になります。

まず、選択したセルが一番上の文字行にあるA-F場合、^キーを押すと、選択したセルが真上に移動します。にA,B行ってdel、にC,D行ってspaにE,F行ってくださいsav。

一方、選択したセルが「del」の場合、vキーを押すと選択したセルがに移動しA、>キーを押すと選択したセルになりspaます。同様にv、キーが移動から選択されたセルspaへC、及びsavへE。

つまり、たとえば現在Bセルにいる場合、シーケンス^vはセルに戻りませんB。代わりに、Aセルに移動します。

そしてA、シーケンスはセルから始まり、セルにv>>^移動しCます。シーケンス^>>vがEセルに移動する間。

チャレンジ

テレビ番組や映画のタイトルを考えるsに文字のみからなる、A-Z、0-9とspace入力し、あなたのプログラム/機能、最小限の長さのキー押下のシーケンスのはず出力1 sCraptasticファッションに開始状態から検索文字列として。

出力は、文字列、または上、下、右、左、およびOKのシーケンスを表す個別の値のリストである必要があります。そのため、文字セットに制限されません<>^v_(udrl*または、スキーマが明確に示されている限り、整数要素0、1、2、3、4のリストも許容可能な代替となります)。

これはです。通常の抜け穴のタブーが適用されます。オッズが各言語であなたに有利になるように。

テストケース

以下は、入力と受け入れ可能な回答の例です(他の異なるシーケンスも正しくなりますが、提供されている例の長さ以下でなければなりません)。

(私はここにキーパッドを再投稿します。そうしないと、視覚的に簡単にプレイできるようになります...)

del spa sav
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 0 1 2 3
4 5 6 7 8 9

BIG         >_>v_<<_
THE OFFICE  >vvv_^^_>>>^_^<_vvv_>>>^^__<<<v_^_>>_
FARGO       ^>>v>_^<<v_^>>v>vv_<<<<<^_>>v_
BUFFY       >_>vvv_>>>^^^__^<<vvvvv_
DALLAS      >>>_<<<_^>>v>v__^^<<v_vvv_
THX1138     >vvv_^^_>>>>vv_<<v__>>_<v_
ON DEMAND   >>vv_<_^^^>_v>_>_<<<<vv_^^_>vv_>>^^_
NEWS RADIO  >vv_>>>^^_vvv_<<<<_^^^^>_>vvv>_^^^<<v_>>>_<v_v_
ROOM 909    ^>>v>vv_<<<__<<_^^^>_>vvvvvv>_<<<^_>>>v_

2
FA直進しないだけで、上下に移動します
— l4m2 '10

1
であるdelとsav、ここで役に立ちませんか?
— l4m2


@ l4m2:delそしてsavそれらが選択されたときに「OK」が使用されている場合は機能がありません。しかし、それはキープレスを浪費するでしょう。
— Chas Brown

2
@ l4m2 LA、RA、XA、3A、9Aも同じ
— tsh

回答:


4

JavaScript(ES6)、196バイト

このコードを200バイト未満でゴルフすることは、基本的に悪夢でした(ただし、楽しかったです)。私は本当にシンプルで短い実装を楽しみにしています。

f=(s,p=(i=0,6),x=(p-=p&(p<6))%6,X=(P=(parseInt(c=s[i],36)+26)%36+6||2)%6)=>c?'^<>v_'[(d=p-P?p<6?x<(X&6)?40:X-1&&x^X&6?20:60:P<6+(x>4)|p==11&!X?0:x<X?39:x>X?21:p<P&&60:++i&&70)>>4]+f(s,p+d%16-6):''

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

どうやって?

変数

  • sは入力文字列です
  • iはsのポインターで、0に初期化されます
  • cは次のターゲット文字です(別名s [i])
  • pは、次のマッピングに従ってキーパッド上の現在の位置であり、6(「A」キー)に初期化されます

    del spa sav      00 -- 02 -- 04 --
    A B C D E F      06 07 08 09 10 11
    G H I J K L      12 13 14 15 16 17
    M N O P Q R  ->  18 19 20 21 22 23
    S T U V W X      24 25 26 27 28 29
    Y Z 0 1 2 3      30 31 32 33 34 35
    4 5 6 7 8 9      36 37 38 39 40 41
    
  • Pはターゲット文字cの位置です。

  • xは現在の文字の列です(p%6)
  • Xはターゲット文字の列です(P%6)

エンコーディングを移動

7つの可能な動きがあります。それぞれを7ビット整数としてエンコードします。最下位4ビットは変位値V + 6を保持し、最上位3ビットはシンボルID Sを保持します。

move                       | symbol | S |  V | V + 6 | S << 4 | (V + 6)
---------------------------+--------+---+----+-------+-----------------
one position to the left   |   <    | 1 | -1 |   5   |       21
two positions to the left  |   <    | 1 | -2 |   4   |       20
one position to the right  |   >    | 2 |  1 |   7   |       39
two positions to the right |   >    | 2 |  2 |   8   |       40
upwards                    |   ^    | 0 | -6 |   0   |        0
downwards                  |   v    | 3 |  6 |  12   |       60
don't move (press the key) |   _    | 4 |  0 |   6   |       70

ファンクションキーとの調整

各反復の開始時に、次のコードを実行して、最初の行にいる場合にpが現在の関数キーと整列していることを確認します。

p -= p & (p < 6)

ロジックを移動

移動は、以下に詳述する(長すぎる)三項演算子のチェーンで選択されます。

p - P ?               // if we're not yet located over the target character:
  p < 6 ?             //   if we're currently located in the first row:
    x < (X & 6) ?     //     if x is less than the column of the function key holding the target character:
      40              //       move 2 positions to the right
    :                 //     else:
      X - 1 &&        //       if the target character is not located in the 2nd column
      x ^ X & 6 ?     //       and x is not equal to the column of the function key holding the target character:
        20            //         move two positions to the left
      :               //       else:
        60            //         move downwards
  :                   //   else:
    P < 6             //     if the target key is space (P is either greater than 5 or equal to 2)
          + (x > 4) | //     or the target key is A and we're currently in the rightmost column
    p == 11 & !X ?    //     or we're currently over F and the target key is in the leftmost column:
      0               //       move upwards
    :                 //     else, this is a standard move:
      x < X ?         //       if x is less than X:
        39            //         move one position to the right
      :               //       else:
        x > X ?       //         if x is greater than X:
          21          //           move one position to the left
        :             //         else:
          p < P && 60 //           move either upwards or downwards
:                     // else:
  ++i && 70           //   don't move and advance the pointer in s

3

パイソン2、294の 293 289バイト

r='';l=[(ord(c)-59)%43-14*(c<'0')for c in input()]
for a,b in zip([6]+l,l):x,y,X,Y=a%6,a/6,b%6,b/6;A=(a<6)*(X!=1);x=[x,X/2*2][A];r+='< >'[X/2]*A+('^'*y+['<<'+'v'*Y,'> <'[x/2]][b<6]if(b,x)in[(6,5),(2,x)]or(a,X)==(11,0)else('^v'[Y>y]*abs(y-Y)+'<>'[X>x]*abs(x-X)))+'_'
print r.replace(' ','')

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


1

JavaScript、311バイト

f=n=>(parseInt(n,36)+26)%36+1||'S'
g=n=>(t=+n)?[t-(t%6!=1),t%6?t+1:t,t>30?t:t+6,t<7?' DDSSVV'[t]:t-6]:{D:'DS1',S:'DV3',V:'SV5'}[n]||[]
h=(p,q,t={[p]:''})=>([...g(p)].map((n,i)=>n in t&&t[n].length<t[p].length+1||h(n,q,t,t[n]=t[p]+'<>v^'[i])),t[q])
F=s=>[...s].map(f).map((c,i,a)=>h(a[i-1]||1,c)+'_').join``
<input id=i oninput=o.value=F(i.value)><br><output id=o>

これをゴルフする方法がわからない...

  • f: 'A-Z0-9'を1-36に、スペースを "S"に変換
  • g:指定されたキーの4つの兄弟を取得
  • h:pからqへの最短経路を見つける
  • F: 答え
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.