Pencarian Program Craptastic

8

Perusahaan kabel tertentu yang terkenal memiliki fitur 'Cari Program' yang agak canggung yang bekerja melalui remote. Dibutuhkan banyak tombol untuk mendorong; jadi, sebagai pengagum ekonomi gerak, saya pikir saya akan mencari bantuan programmer untuk meminimalkan jumlah gerakan jari yang harus saya buat.

Fitur Pencarian Craptastic menampilkan tata letak sel yang dapat dipilih, 1 baris 3 sel diikuti oleh 6 baris 6 sel, yang terlihat seperti ini:

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

Ada sel untuk masing-masing huruf A-Z, dan spayang digunakan untuk menambahkan spasi ke string pencarian. delseharusnya digunakan untuk menghapus karakter; dan savdimaksudkan untuk digunakan untuk menyimpan string pencarian. Kami akan mengabaikan fungsi aktual ini untuk tantangan ini; tetapi sel-sel itu masih dapat dipilih untuk tujuan kita.

Kami mulai dengan string pencarian kosong dan Asel dipilih; dan kami menggunakan tombol panah kiri, kanan, atas dan bawah untuk mengubah sel yang dipilih. Ketika tombol 'OK' pusat ditekan, karakter di sel yang dipilih ditambahkan ke string pencarian. Untuk kenyamanan, kita akan menggunakan <, >, ^, vdan _untuk kiri, kanan, atas, bawah dan OK, masing-masing.

Untuk huruf dan angka, aksi tombol arah sangat mudah. Tidak ada 'bungkus'; misalnya, jika sel saat ini G, maka <tidak berpengaruh.

Jadi untuk memasukkan string pencarian BIG, kita bisa menggunakan urutan

>_>v_<<_

(awal >diperlukan untuk memindahkan kami dari sel awal default Ake sel B). Atau, tentu saja kita bisa menggunakan >_v>_<<_; tetapi perhatikan tidak ada urutan yang lebih pendek dari 8 kunci yang dapat melakukan pekerjaan.

Sekarang karena baris paling atas hanya memiliki tiga sel, aksi di sana sedikit berbeda dan sedikit mempersulit:

Pertama, jika sel yang dipilih berada di baris huruf atas A-F, ^kunci itu memindahkan sel yang dipilih tepat di atas; jadi A,Bpergi ke del, C,Dpergi ke spadan E,Fpergi ke sav.

Sebaliknya, jika sel yang dipilih adalah 'del', vkunci tersebut memindahkan sel yang dipilih A, dan >kunci membuat sel yang dipilih spa. Demikian pula vkunci memindahkan sel yang dipilih dari spake C, dan savke E.

Ini berarti bahwa misalnya, jika Anda saat ini berada di Bsel, urutannya ^vtidak mengembalikan Anda ke Bsel; alih-alih itu membawa Anda ke Asel.

Dan mulai dari Asel, urutan v>>^memindahkan kita ke Csel; sementara urutan ^>>vmemindahkan kita ke Esel.

Tantangan

Diberikan acara TV atau judul film s, yang hanya terdiri dari karakter dalam A-Z, 0-9dan space, program / fungsi Anda harus menampilkan salah satu urutan penekanan tombol dengan panjang minimal untuk dimasukkan ssebagai string pencarian dari keadaan awal dengan mode Craptastic.

Output Anda harus berupa string atau daftar nilai berbeda yang mewakili urutan atas, bawah, kanan, kiri, dan OK; jadi Anda tidak terbatas pada rangkaian karakter <>^v_(misalnya, udrl*atau daftar dengan elemen bilangan bulat 0,1,2,3,4 akan menjadi alternatif yang dapat diterima, asalkan Anda mengartikulasikan apa skema Anda).

Ini adalah ; tabu celah biasa berlaku. Semoga peluang selalu menguntungkan Anda untuk setiap bahasa.

Uji Kasus

Di bawah ini adalah input dan contoh jawaban yang dapat diterima (urutan berbeda lainnya akan benar juga, tetapi harus paling banyak dari panjang contoh yang diberikan).

(Saya memposting ulang tombol di sini sehingga orang dapat lebih mudah bermain bersama secara visual, jika itu adalah salah satu ...)

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_
Chas Brown
sumber
2
Tidak hanya FAlurus tetapi naik-turun
14m2
1
Apakah deldan savtidak berguna di sini?
14m2
Berhubungan erat .
FryAmTheEggman
@ l4m2: deldan savtidak memiliki fungsi jika 'OK' digunakan ketika mereka dipilih; tapi itu akan membuang penekanan tombol.
Chas Brown
2
@ l4m2 LA, RA, XA, 3A, 9A melakukan hal yang sama
tsh

Jawaban:

4

JavaScript (ES6), 196 byte

Golf kode ini di bawah 200 byte pada dasarnya adalah mimpi buruk (tapi itu menyenangkan). Saya benar-benar menantikan implementasi yang lebih sederhana dan lebih pendek.

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):''

Cobalah online!

Bagaimana?

Variabel

  • s adalah string input
  • i adalah pointer di s , diinisialisasi ke 0
  • c adalah karakter target selanjutnya (alias s [i] )
  • p adalah posisi saat ini pada keypad sesuai dengan pemetaan berikut dan diinisialisasi ke 6 (tombol "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 adalah posisi karakter target c

  • x adalah kolom karakter saat ini ( p% 6 )
  • X adalah kolom karakter target ( P% 6 )

Pindahkan pengodean

Ada 7 kemungkinan gerakan. Kami menyandikan masing-masing sebagai bilangan bulat 7-bit. 4 bit paling signifikan memegang nilai perpindahan V + 6 dan 3 bit paling signifikan memegang simbol 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

Penjajaran dengan tombol fungsi

Di awal setiap iterasi, kami mengeksekusi kode berikut untuk memastikan bahwa p disejajarkan dengan tombol fungsi saat ini jika kami berada di baris pertama:

p -= p & (p < 6)

Pindahkan logika

Langkah ini dipilih dengan rantai panjang (terlalu) operator ternary yang dirinci di bawah ini.

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
Arnauld
sumber
3

Python 2 , 294 293 289 byte

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(' ','')

Cobalah online!

TFeld
sumber
1

JavaScript, 311 byte

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>

Tidak yakin bagaimana cara bermain golf ini ...

  • f: konversi 'A-Z0-9' ke 1-36, spasi menjadi "S"
  • g: dapatkan 4 saudara kunci yang diberikan
  • h: temukan jalur terpendek dari p ke q
  • F: jawabannya
tsh
sumber