Gõ hiệu quả vào Game Boy


26

Nhiều game Game Boy cũ thường yêu cầu nhập chuỗi từ người dùng. Tuy nhiên, không có bàn phím. Điều này đã được xử lý bằng cách hiển thị cho người dùng một "màn hình bàn phím" như vậy:

Bàn phím Pokemon Ruby

Các 'con trỏ nhân vật' sẽ bắt đầu vào chữ A. Người dùng sẽ hướng đến từng nhân vật mong muốn với D-Pad của bốn nút ( UP, DOWN, LEFTRIGHT), sau đó nhấn BUTTON Ađể thêm nó vào chuỗi thức.

Xin lưu ý:

  • Lưới bao quanh , vì vậy nhấnUPtrong khi chữ A sẽ đưa bạn đến T.
  • 'Con trỏ ký tự' được đặt sau khi thêm một chữ cái

Các thách thức

Bàn phím trên có các tùy chọn để thay đổi vỏ và có hình dạng không đều. Vì vậy, để đơn giản, trong thử thách này, chúng tôi sẽ sử dụng bàn phím sau (phía dưới bên phải là ASCII char 32, một khoảng trắng):

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 .

Nhập vào bàn phím như thế này là cực kỳ chậm - vì vậy, để dễ dàng hơn, nhiệm vụ của bạn là viết chương trình cho người dùng biết cách nhanh nhất có thể để nhập một chuỗi nhất định. Nếu có nhiều cách nhanh nhất, bạn chỉ cần hiển thị một cách.

Khóa đầu ra phải là:

  • > cho RIGHT
  • < cho LEFT
  • ^ cho UP
  • v cho DOWN
  • .cho BUTTON A(nối chữ hiện tại vào chuỗi)

Ví dụ, khi được cung cấp chuỗi DENNIS, giải pháp sẽ như thế này:

>>>.>.>>v..>>.>>>v.

Quy tắc / Chi tiết

  • Xin nhớ, lưới bao quanh!
  • Bạn có thể gửi một chương trình đầy đủ hoặc một hàm, miễn là nó lấy chuỗi ban đầu và tạo ra một chuỗi giải pháp. Dòng mới khoảng trắng / dấu là không liên quan miễn là đầu ra là chính xác.
  • Bạn có thể giả sử đầu vào sẽ chỉ bao gồm các ký tự có thể gõ được trên bàn phím đã chỉ định, nhưng nó có thể trống.
  • Đây là , vì vậy đoạn mã ngắn nhất sẽ thắng. Tiêu chuẩn mã lỗ golf áp dụng.

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

Thường có nhiều giải pháp có cùng độ dài. Đối với mỗi trường hợp thử nghiệm, tôi đã bao gồm độ dài tối ưu và một ví dụ. Bạn không cần phải in độ dài trong câu trả lời của mình, chỉ là giải pháp.

FLP.TKC  ->  25 steps:  <<.<v.<<<v.<<<v.^.<<^.<^.
MOYLEX   ->  23 steps:  <<v.>>v.>>>v.>^^.^.<<^.
FEERSUM  ->  18 steps:  <<.<..<vv.>.>>.<^.
MEGO     ->  14 steps:  <<v.<^.>>.>vv.

A CAT    ->  17 steps:  .<^.>>>v.<<.<<vv.
BOB      ->  10 steps:  >.<vv.>^^.

(space)  ->  3 steps:   <^.
(empty)  ->  0 steps:   (empty)

Bạn có thể xem trình tạo testcase của tôi trên repl.it - vui lòng thông báo cho tôi nếu có bất kỳ lỗi nào.

Cảm ơn tất cả mọi người đã gửi! Người dùng ngn hiện là người chiến thắng với 61 byte, nhưng nếu bất cứ ai có thể tìm ra giải pháp ngắn hơn, thì có thể di chuyển dấu tích nhỏ màu xanh lá cây;)


Lưu ý rằng điều này đã thông qua hộp cát và một thách thức tương tự đã được tìm thấy, nhưng thảo luận trong trò chuyện và hộp cát đã dẫn đến kết luận rằng đó không phải là một bản sao, chỉ liên quan chặt chẽ :)
FlipTack

Tôi nghĩ nó có vẻ rất quen thuộc, nhưng nó cũng không phải là bản sao của cái này .

Câu trả lời:


4

APL Dyalog , 61 byte

4 7∘{∊'.',⍨⍉↑b⍴¨¨'^v' '<>'⌷¨⍨⊂¨a>b←a⌊⍺-a←⍺|↓2-/0,⍺⊤⍵⍳⍨⎕a,'.'}

giả định ⎕IO←0

⎕a,'.' bảng chữ cái theo sau là một điểm dừng đầy đủ

⍵⍳⍨tìm ký tự của đối số ở đó dưới dạng chỉ số 0..26 ( ' 'và tất cả các số khác sẽ là 27)

⍺⊤mã hóa trong cơ sở 7 (lưu ý đối số bên trái bị ràng buộc 4 7), lấy ma trận 2 × n

0, nhập số không ở bên trái

2-/ sự khác biệt giữa các cột liền kề

chia ma trận thành một cặp vectơ

a←⍺| lấy chúng modulo 4 và 7 tương ứng, gán cho a

b←a⌊⍺-alàm cho bnhỏ hơn avà nghịch đảo mô-đun của nó

'^v' '<>'⌷¨⍨⊂¨a>bchọn ^hoặc vcho vectơ đầu tiên và <hoặc >cho vectơ thứ hai, dựa trên nơi akhác vớib

b⍴¨¨lặp lại mỗi blần

⍉↑ trộn hai vectơ thành một ma trận đơn và hoán vị nó, lấy ma trận n × 2

'.',⍨chắp thêm .bên phải

làm phẳng


6

JavaScript (ES6), 147 byte

s=>s.replace(/./g,c=>(q=p,p="AHOVBIPWCJQXDKRYELSZFMY.GNU ".indexOf(c),"<<<>>>".substring(3,((p>>2)+10-(q>>2))%7)+["","v","vv","^"][p-q&3]+"."),p=0)

Một hành vi thú vị của substringnó là trao đổi các đối số nếu cái thứ hai ít hơn cái thứ nhất. Điều này có nghĩa là nếu tôi tính số lần nhấn trái / phải tối ưu là một số trong khoảng từ 3 đến 3, tôi có thể thêm 3 và lấy chuỗi con <<<>>>bắt đầu từ 3 và tôi sẽ nhận được số mũi tên chính xác. Trong khi đó, các lần nhấn xuống / lên được xử lý đơn giản bằng cách tra cứu một mảng bằng cách sử dụng bitwise và sự khác biệt trong các hàng với 3; cách này ngắn hơn một chút vì có ít thành phần mảng hơn.


4

Ruby, 107 byte

->s{c=0
s.tr(". ","[\\").bytes{|b|b-=65
print ["","^","^^","v"][c/7-b/7],(d=(c-c=b)%7)>3??>*(7-d):?<*d,?.}}

Ungolfed trong chương trình thử nghiệm

f=->s{                                 #Input in s.
  c=0                                  #Set current position of pointer to 0.
  s.tr(". ","[\\").                    #Change . and space to the characters after Z [\
  bytes{|b|                            #For each byte b,
    b-=65                              #subtract 65 so A->0 B->1 etc.
    print ["","^","^^","v"][c/7-b/7],  #Print the necessary string to move vertically.
    (d=(c-c=b)%7)>3?                   #Calculate the horizontal difference c-b (mod 7) and set c to b ready for next byte.
       ?>*(7-d):?<*d,                  #If d>3 print an appropriate number of >, else an appropriate number of <.
    ?.                                 #Print . to finish the processing of this byte.
  }
}

#call like this and print a newline after each testcase
f["FLP.TKC"];puts  
f["MOYLEX"];puts   
f["FEERSUM"];puts  
f["MEGO"];puts     
f["A CAT"];puts    
f["BOB"];puts      

1

Toán học, 193 byte

Golf

StringJoin@@(StringTake[">>><<<",Mod[#〚2〛,7,-3]]<>StringTake["vv^",Mod[#〚1〛,4,-1]]<>"."&/@Differences[FirstPosition[Partition[ToUpperCase@Alphabet[]~Join~{"."," "},7],#]&/@Characters["A"<>#]])&

Có thể đọc được

In[1]:= characters = ToUpperCase@Alphabet[]~Join~{".", " "}

Out[1]= {"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", ".", " "}

In[2]:= keyboard = Partition[characters, 7]

Out[2]= {{"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", ".", " "}}

In[3]:= characterPosition[char_] := FirstPosition[keyboard, char]

In[4]:= xToString[x_] := StringTake[">>><<<", Mod[x, 7, -3]]

In[5]:= yToString[y_] := StringTake["vv^", Mod[y, 4, -1]]

In[6]:= xyToString[{y_, x_}] := xToString[x] <> yToString[y] <> "."

In[7]:= instructionsList[input_] := xyToString /@ Differences[characterPosition /@ Characters["A" <> input]]

In[8]:= instructions[input_] := StringJoin @@ instructionsList[input]

In[9]:= instructions["DENNIS"]

Out[9]= ">>>.>.>>v..>>.>>>v."

1

Python 2, 298 byte

Cái này dài hơn nó nên, nhưng ...

def l(c):i="ABCDEFGHIJKLMNOPQRSTUVWXYZ. ".index(c);return[i%7,i/7]
def d(f,t,a=abs):
 v,h=l(t)[1]-l(f)[1],l(t)[0]-l(f)[0]
 if a(h)>3:h=h-7*h/a(h)
 if a(v)>2:v=v-4*v/a(v)
 return'^v'[v>0]*a(v)+'<>'[h>0]*a(h)
s="A"+input()
print''.join([d(p[0],p[1])+'.'for p in[s[n:n+2]for n in range(len(s))][:-1]])

Mọi sự trợ giúp sẽ rất được trân trọng!

Đưa đầu vào trong dấu ngoặc kép.

l trả về vị trí của một ký tự trong bàn phím.

Hai ifcâu lệnh ở giữa dlà để kiểm tra xem nó có phải là tối ưu để 'bọc' xung quanh bàn phím hay không.

Đầu vào, sđã được đặt "A"trước bởi vì vị trí ban đầu của con trỏ làA .

Chúng tôi lặp qua chuỗi theo cặp, loại bỏ cái cuối cùng (không phải là một cặp [:-1]:), tìm khoảng cách tối thiểu giữa hai nửa của cặp.

Cảm ơn Flp.Tkc đã nói với tôi rằng tôi có thể làm a=absthay vì nói absmỗi lần!


0

Java 8, 1045 byte

Golf

staticchar[][]a={{'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','.',''}};staticintm=Integer.MAX_VALUE;staticStringn="";staticboolean[][]c(boolean[][]a){boolean[][]r=newboolean[4][];for(inti=0;i<4;i)r[i]=a[i].clone();returnr;}staticvoidg(inti,intj,boolean[][]v,chard,Stringp){v[i][j]=true;if(a[i][j]==d&&p.length()<m){m=p.length();n=p;}if(i-1<0){if(!v[3][j])g(3,j,c(v),d,p"^");}elseif(!v[i-1][j])g(i-1,j,c(v),d,p"^");if(i1>3){if(!v[0][j])g(0,j,c(v),d,p"v");}elseif(!v[i1][j])g(i1,j,c(v),d,p"v");if(j-1<0){if(!v[i][6])g(i,6,c(v),d,p"<");}elseif(!v[i][j-1])g(i,j-1,c(v),d,p"<");if(j1>6){if(!v[i][0])g(i,0,c(v),d,p">");}elseif(!v[i][j1])g(i,j1,c(v),d,p">");}publicstaticvoidmain(String[]args){boolean[][]v=newboolean[4][7];Scannerx=newScanner(System.in);Strings=x.next();Stringpath="";intp=0;intq=0;for(inti=0;i<s.length();i){chart=s.charAt(i);g(p,q,c(v),t,"");path=n".";n="";m=Integer.MAX_VALUE;for(intj=0;j<4;j){for(intk=0;k<7;k){if(a[j][k]==t){p=j;q=k;}}}}System.out.println(path);}

Có thể đọc được

static char[][] a = {
        {'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','.',' '}
};
static int m = Integer.MAX_VALUE;
static String n="";


static boolean[][] c(boolean[][] a){
    boolean [][] r = new boolean[4][];
    for(int i = 0; i < 4; i++)
        r[i] = a[i].clone();
    return r;
}

static void g(int i, int j,boolean[][] v,char d,String p) {

    v[i][j] = true;
    if (a[i][j]==d && p.length()<m){
        m=p.length();
        n=p;
    }

    if (i-1<0) {
        if(!v[3][j])
            g(3, j, c(v), d, p + "^");
    }
    else if (!v[i-1][j])
        g(i-1, j, c(v), d, p + "^");


    if (i+1>3) {
        if(!v[0][j])
            g(0, j, c(v), d, p + "v");
    }
    else if(!v[i+1][j])
        g(i+1, j, c(v), d, p + "v");


    if (j-1<0) {
        if(!v[i][6])
            g(i, 6, c(v), d, p + "<");
    }
    else if (!v[i][j-1])
        g(i, j-1, c(v), d, p + "<");


    if (j+1>6) {
        if (!v[i][0])
            g(i, 0, c(v), d, p + ">");
    }
    else if (!v[i][j+1])
        g(i, j+1, c(v), d, p + ">");

}

public static void main(String[] args) {
    boolean[][] v = new boolean[4][7];
    Scanner x = new Scanner(System.in);
    String s = x.next();
    String path="";
    int p=0;
    int q=0;
    for(int i=0;i<s.length();i++){
        char t=s.charAt(i);
        g(p,q,c(v),t,"");
        path+=n+".";
        n="";
        m=Integer.MAX_VALUE;
        for(int j=0;j<4;j++){
            for(int k=0;k<7;k++){
                if(a[j][k]==t) {
                    p=j;
                    q=k;
                }
            }
        }

    }
    System.out.println(path);
}

Giải trình

Giải pháp là một cách tiếp cận trực tiếp: lực lượng vũ phu tối ưu hóa kém. Phương pháp g(...)này là một tìm kiếm chuyên sâu đầu tiên đi qua từng hoán vị (lên, xuống, trái, phải). Với một số sửa đổi nhỏ trong việc đặt hàng cho các trường hợp thử nghiệm, tôi nhận được đầu ra:

<<.v<.v<<<.v<<<.^.^<<.^<.
v<<.v>>.v>>>.^^>.^.^<<.
<<.<..^^<.>.>>.^<.
v<<.^<.>>.^^>.
.^<.v>>>.<<.^^<<.
>.^^<.^^>.
^<.
// new line for the last
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.