Tìm kiếm chương trình Craptastic


8

Một công ty cáp nổi tiếng nào đó có tính năng 'Tìm kiếm chương trình' hơi vụng về, hoạt động thông qua điều khiển từ xa. Nó mất nhiều nút đẩy; Vì vậy, là một người ngưỡng mộ nền kinh tế của chuyển động, tôi nghĩ tôi sẽ tìm kiếm sự giúp đỡ của một lập trình viên để giảm thiểu số lượng chuyển động ngón tay mà tôi phải thực hiện.

Tính năng Tìm kiếm Craptastic có bố cục gồm các ô có thể chọn, 1 hàng 3 ô theo sau là 6 hàng 6 ô, trông giống như sau:

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

Có các ô cho mỗi chữ cái A-Zspađược sử dụng để thêm khoảng trắng vào chuỗi tìm kiếm. delđược cho là được sử dụng để xóa một ký tự; và savđược dùng để lưu chuỗi tìm kiếm. Chúng tôi sẽ bỏ qua các chức năng thực tế cho thách thức này; nhưng các tế bào vẫn có thể lựa chọn cho mục đích của chúng tôi.

Chúng tôi bắt đầu với một chuỗi tìm kiếm trống và Aô được chọn; và chúng tôi sử dụng các nút mũi tên trái, phải, lên và xuống để thay đổi ô đã chọn. Khi nhấn phím 'OK' trung tâm, ký tự trong ô đã chọn sẽ được thêm vào chuỗi tìm kiếm. Để thuận tiện, chúng tôi sẽ sử dụng <, >, ^, v_cho trái, phải, lên, xuống và OK, tương ứng.

Đối với các chữ cái và số, hành động của các nút định hướng rất đơn giản. Không có "bao quanh"; ví dụ, nếu ô hiện tại là G, thì <không có hiệu lực.

Vì vậy, để nhập chuỗi tìm kiếm BIG, chúng ta có thể sử dụng chuỗi

>_>v_<<_

(ban đầu >là bắt buộc để di chuyển chúng tôi từ ô bắt đầu mặc định Asang ô B). Ngoài ra, tất nhiên chúng ta có thể sử dụng >_v>_<<_; nhưng lưu ý không có chuỗi ngắn hơn 8 phím có thể thực hiện công việc.

Bây giờ vì hàng trên cùng chỉ có ba ô, hành động có một chút khác biệt và làm phức tạp mọi thứ một chút:

Đầu tiên, nếu ô được chọn nằm ở hàng chữ cái trên cùng A-F, ^phím sẽ di chuyển ô được chọn ngay phía trên; để A,Bđi đến del, C,Dđi spaE,Fđi đến sav.

Mặt khác, nếu ô được chọn là 'del', vphím sẽ di chuyển ô đã chọn sang A>phím tạo ra ô được chọn spa. vPhím tương tự di chuyển ô đã chọn từ spađến Csavsang E.

Điều này có nghĩa là, ví dụ, nếu bạn hiện đang ở Bô, trình tự ^vkhông đưa bạn trở lại Bô; thay vào đó nó đưa bạn đến phòng Agiam.

Và bắt đầu từ Aô, chuỗi v>>^di chuyển chúng ta đến Cô; trong khi trình tự ^>>vdi chuyển chúng ta đến Etế bào.

Các thách thức

Với một chương trình truyền hình hoặc tiêu đề phim s, bao gồm bằng các nhân vật trong A-Z, 0-9space, chương trình của bạn / chức năng nên một đầu ra của chuỗi bấm phím có độ dài tối thiểu để nhập snhư chuỗi tìm kiếm từ trạng thái bắt đầu từ năm Craptastic thời trang.

Đầu ra của bạn phải là một chuỗi hoặc một danh sách các giá trị riêng biệt đại diện cho một chuỗi lên, xuống, phải, trái và OK; do đó, bạn không bị giới hạn trong bộ ký tự <>^v_(ví dụ: udrl*hoặc một danh sách có các phần tử nguyên 0,1,2,3,4 sẽ là các lựa chọn thay thế chấp nhận được, miễn là bạn nói rõ lược đồ của bạn là gì).

Đây là ; những điều cấm kị thông thường được áp dụng. Có thể tỷ lệ cược là bao giờ có lợi cho bạn cho mỗi ngôn ngữ.

Các trường hợp thử nghiệm

Dưới đây là các đầu vào và một câu trả lời có thể chấp nhận được (các trình tự khác nhau khác cũng sẽ đúng, nhưng phải có độ dài tối đa của các ví dụ được cung cấp).

(Tôi đăng lại bàn phím ở đây để người ta có thể dễ dàng chơi hơn, nếu đó không phải là ...)

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
Chỉ FAkhông đi thẳng mà lên xuống
l4m2

1
delsavvô dụng ở đây?
l4m2


@ l4m2: delsavkhông có chức năng nếu 'OK' được sử dụng khi chúng được chọn; nhưng điều đó sẽ lãng phí một phím nhấn.
Chas Brown

2
@ l4m2 LA, RA, XA, 3A, 9A cũng làm như vậy
tsh

Câu trả lời:


4

JavaScript (ES6), 196 byte

Chơi mã này dưới 200 byte về cơ bản là một cơn ác mộng (nhưng nó rất vui). Tôi thực sự mong đợi một triển khai đơn giản và ngắn hơn.

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

Hãy thử trực tuyến!

Làm sao?

Biến

  • s là chuỗi đầu vào
  • i là một con trỏ tính bằng s , được khởi tạo thành 0
  • c là nhân vật mục tiêu tiếp theo (còn gọi là s [i] )
  • p là vị trí hiện tại trên bàn phím theo ánh xạ sau và được khởi tạo thành 6 (phím "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 là vị trí của ký tự đích c

  • x là cột của ký tự hiện tại ( p% 6 )
  • X là cột của ký tự đích ( P% 6 )

Di chuyển mã hóa

Có 7 động thái có thể. Chúng tôi mã hóa từng cái dưới dạng số nguyên 7 bit. 4 bit trọng số thấp nhất giữ giá trị chuyển V + 6 và 3 bit quan trọng nhất giữ biểu tượng 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

Căn chỉnh với các phím chức năng

Ở đầu mỗi lần lặp, chúng tôi thực thi đoạn mã sau để đảm bảo rằng p được căn chỉnh với phím chức năng hiện tại nếu chúng tôi nằm ở hàng đầu tiên:

p -= p & (p < 6)

Di chuyển logic

Việc di chuyển được chọn với một chuỗi các toán tử ternary (quá) dài được trình bày chi tiết dưới đây.

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

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

Hãy thử trực tuyến!


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>

Không chắc cách đánh gôn này ...

  • f: chuyển đổi 'A-Z0-9' thành 1-36, khoảng trắng thành "S"
  • g: nhận 4 anh chị em của khóa đã cho
  • h: tìm đường đi ngắn nhất từ ​​p đến q
  • F: câu trả lời
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.