Nhập tên của bạn thông qua một D-pad


32

Câu đố:

Xem xét một trò chơi cầm tay / trò chơi cầm tay với một d-pad nơi bạn được yêu cầu nhập tên của các loại. Điều này xuất hiện trong nhiều trò chơi cũ trước khi việc sử dụng QWERTY được phổ biến trong các bảng điều khiển (ví dụ: tôi tin rằng Wii sử dụng bố cục bàn phím QWERTY cho đầu vào). Thông thường, bàn phím trên màn hình trông giống như hiệu ứng của *:

Mặc định:

0 1 2 3 4 5 6 7 8 9
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 _ + ^ =

Với trường hợp được chuyển đổi:

0 1 2 3 4 5 6 7 8 9
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 - + ^ =

Đó là, tất cả các phím chữ và số và sau đây:

_: Một khoảng
-trắng
+: Dấu gạch nối : Chỉ chuyển đổi trường hợp cho chữ cái tiếp theo
^: Chuyển đổi khóa mũ (nghĩa là chuyển đổi trường hợp của tất cả các chữ cái)
=: Nhập, hoàn tất

* Rõ ràng là tôi đã thay thế các khóa như "BKSP" và "ENTER" bằng các phiên bản ngắn hơn

Và sau đó là phần cứng sẽ bao gồm một d-pad (hoặc một số hình thức kiểm soát, nơi bạn có thể đi up, down, leftright)

Màn hình cũng thường cho phép bạn di chuyển trực tiếp từ bên này sang bên kia. Đó là, nếu bạn tập trung vào bức thư J, nhấn rightsẽ cho phép bạn chuyển sang bức thư A.

Bất cứ khi nào tôi nhập tên của mình, tôi luôn cố gắng tìm ra cách nhanh nhất để làm điều đó.

Mục tiêu:

Chương trình của bạn sẽ lấy đầu vào chuỗi có thể bao gồm bất kỳ ký tự chữ và số nào bao gồm dấu cách và dấu gạch nối và mục tiêu của bạn là xuất số lần nhấn phím ngắn nhất trên d-pad để xuất chuỗi cần thiết.

Cân nhắc:

Bạn không cần bao gồm phím được nhấn để nhấn ký tự thực tế.
Lấy nét luôn bắt đầu tại A
Enter =phải được nhấn ở cuối

Thí dụ:

input: Code Golf
output: 43

Giải thích:
A -> C= 2
C-> ^= 6 (di chuyển sang trái)
^-> o= 5
o-> d= 2
d-> e= 1
e-> += 5
+-> _= 1
_-> += 1
+-> G= 3
G-> o= 3
o-> l= 3
l-> f= 5
f-> == 6

Lưu ý rằng đánh nhanh hơn +hai lần cho a _và a Ghơn là đánh ^một lần, sau đó trao đổi lại.

Việc gửi chiến thắng (tôi sẽ cho phép ít nhất 1w) sẽ là giải pháp ngắn nhất (tính bằng byte). Vì đây là câu hỏi đầu tiên của tôi, tôi hy vọng điều này rõ ràng và không quá khó.


12
Thử thách tốt đẹp! Chỉ cần một điểm, 48 giờ có lẽ là quá ít. Đó là mất bao lâu để tiền thưởng được cho phép, vì vậy nó sẽ mất khoảng một tuần +.
Maltysen

@Maltysen nhờ đề nghị, tôi đã cập nhật các thách thức
Tas

1
Bạn có thể quấn theo chiều dọc, quá, hoặc chỉ theo chiều ngang?
Alex Reinking

2
@AlexReinking đó là một điểm tuyệt vời! Có bạn có thể.
TAS

Tuyệt quá! Việc thực hiện của tôi làm điều đó, vì vậy tôi chỉ muốn kiểm tra lại.
Alex Reinking

Câu trả lời:


5

Ruby (369 byte)

Lấy đầu vào từ dòng lệnh.

K="0123456789"+('A'..'Z').to_a.join+" +^="
Q=K.downcase.sub' ','-'
def d x,y
t,s=(x/10-y/10).abs,(x%10-y%10).abs
[t,4-t].min+[s,10-s].min
end
def v s,i,l,a
return l if s.empty?
c,r=s[0],s[1..-1]
j=K.index(c.upcase)||36
return v(r,j,l+d(i,j),a)if a.include?c
s,p=d(i,37)+d(37,j),d(i,38)+d(38,j)
[v(r,j,l+s,a),v(r,j,l+p,a==K ? Q : K)].min
end
puts v("#{ARGV[0]}=",10,0,K)

Đã lưu một loạt byte nhờ @Charlie :)


j=(K.index(c.upcase) or 36)có thể được thay thế bằng j=K.index(c.upcase)||36để lưu 4 byte. def d(x,y)có thể thay thế bằng def d x,yđể lưu một byte và tương tự như vậy def v. v(...) ifđể v(...)ifcho một byte khác. Trên dòng cuối cùng, v(...)có thể được thay thế bằng v ...để tiết kiệm 1 byte, và truevới !!0lưu byte khác.
Charlie

Cảm ơn! Tôi thực sự không biết Ruby. Tôi đã dịch cái này từ python ...
Alex Reinking

Tôi cũng có thể thay thế &&bằng &||với |.
Alex Reinking

Dòng đầu tiên của bạn ( K=...) có thể được thay thế bằng một phạm vi ( K='0123456789'+('A'..'Z').to_a.join+' +^=')
Charlie

Cạo thêm 2 lần nữa!
Alex Reinking

9

Swift 1.2, 812 588 670 byte

Chỉnh sửa: Đã xóa 224 byte bằng cách thay thế các mảng số lớn bằng Phạm vi và thay đổi nó thành Mảng.

Edit2: Đã thêm vòng lặp theo chiều dọc

typealias S=String
typealias I=Int
var A:(I)->S={S(UnicodeScalar($0))},B:(I)->(I,I)={a in(a%10,a/10)},a=Array(48...57).map{A($0)},b=[a+(Array(65...90)+[32,43,94,61]).map{A($0)},a+(Array(97...122)+[45,43,94,61]).map{A($0)}],z=Process.arguments
z.removeAtIndex(0)
func C(e:I,f:I)->I{let(a,b)=B(e),(c,d)=B(f)
return min(abs(d-b), abs(4-(d-b)))+min(abs(c-a),abs(10-(c-a)))}
func D(c:S,_ e:I=10,_ f:Bool=false,_ g:Bool=false)->I{if count(c)==0{return C(e,39)}
let h=c.startIndex,i=c.endIndex,j=S(c[h])
if let k=find(b[f ?1:0],j){return C(e,k)+D(c[advance(h,1)..<i],k,(g ?(!f):f),false)}else{return min(C(e,37)+D(c,37,!f,true),C(e,38)+D(c,38,!f,false))}}
print(D(" ".join(z)))

Để chạy, đặt mã trong một .swifttệp và chạy vớiswift <filename> <your name>


Điều này sử dụng cách tiếp cận đơn giản trong đó hai "bàn phím" được lưu trữ dưới dạng mảng.

B:(I)->(I,I)={a in(a%10,a/10)} Chuyển đổi một chỉ mục từ mảng sang vị trí x, y trên bàn phím ảo.

func C(e:I,f:I)->I{let(a,b)=B(e),(c,d)=B(f) return abs(d-b)+min(abs(c-a),abs(10-(c-a)))} Lấy chỉ số bắt đầu / kết thúc và trả về số lần di chuyển tối thiểu để chuyển từ lần này sang lần khác (chiếm tỷ lệ ngang)

func D(c:S,_ e:I=10,_ f:Bool=false,_ g:Bool=false)->ILà hàm đệ quy chính thực hiện hầu hết các phép tính. Nó tính toán khoảng cách từ vị trí hiện tại với nhân vật mục tiêu, trừ trường hợp cần thay đổi, sau đó nó sẽ tính toán cả những sự thay đổi các caps lock phương pháp và mất nhỏ nhất.

Chạy swift codegolf.swift Code Golfin43


Cần phải tính toán cho bọc dọc.
Alex Reinking

Cập nhật vào tài khoản cho gói dọc quá.
David Skrundz

4

Python 679 661 619 602 589 576 539 520 496 482 byte

Chạy cái này và nó sẽ yêu cầu một đầu vào (không có văn bản nhắc). Đối với đầu vào Code Golfnó in 43.

a=input()+'=';b=0;c="0123456789abcdefghijklmnopqrstuvwxyz-+^=";d=0;e=[0,1];f='+';g='^';h=[i.isupper()or i==' 'for i in a];i=abs;p=lambda z:all([i==b for i in z]);q=0
def l(z):global s;k=c.index(z.lower().replace(' ','-'));s=[k%10,int(k/10)];m,n=s;return sum([min(i(m-e[0]),i(10-(m-e[0]))),min(i(n-e[1]),i(4-(n-e[1])))])
def o(z):global d,e;d+=l(z);e=s
for r in a:
 if p(h[q:q+3]):o(g);b^=1
 if p(h[q:q+2]):
  if l(f)<l(g):o(f)
  else:o(g);b^=1
 if p([h[q]]):o(f)
 o(r);q+=1
print(d)

Chương trình đầy đủ:

input = input() + '='
capsOn = False

keys = "0123456789abcdefghijklmnopqrstuvwxyz-+^="
totalKeys = 0
caret = [0, 1]

shiftKey = '+'
capsKey = '^'

cases = [char.isupper() or char == ' ' for char in input]

def locate(char):
    """
        Find the location of the char on the keyboard
        regardless of case
    """
    location = keys.find(char.replace(' ', '-').lower())
    return [location % 10, int(location / 10)]


def dist(key):
    """
        Calculate the min dist to a char
    """
    nx, ny = locate(key)
    return sum([min(abs(nx - caret[0]), abs(10 - (nx - caret[0]))), min(abs(ny - caret[1]), abs(4 - (ny - caret[1])))])


def moveTo(char):
    """
        Move the caret to the char, ignoring case and
        adds the dist to the tally
    """
    global totalKeys, caret
    totalKeys = totalKeys + dist(char)

    print(keys[caret[0] + caret[1] * 10], '->', char, '=', dist(char))

    caret = locate(char)

diffCase = lambda case: all([i == capsOn for i in case])

for ind, ch in enumerate(input):
    if diffCase(cases[ind:ind + 3]): # use caps
        moveTo(capsKey)
        capsOn ^= 1
    elif diffCase(cases[ind:ind + 2]): # use closest
        if dist(shiftKey) < dist(capsKey):
            moveTo(shiftKey)
        else:
            moveTo(capsKey)
            capsOn ^= 1
    elif diffCase([cases[ind]]): # use shift
        moveTo(shiftKey)

    moveTo(ch) # apply the move

print('Total:', totalKeys)

Đầu ra mở rộng từ chương trình đầy đủ:

Code Golf
a -> C = 2
c -> ^ = 6
^ -> o = 5
o -> d = 2
d -> e = 1
e -> + = 5
+ -> _ = 1
- -> + = 1
+ -> G = 3
g -> o = 3
o -> l = 3
l -> f = 5
f -> = = 6
Total: 43

Đã lưu một byte nhờ @justin https://codegolf.stackexchange.com/a/18983/42736
4 @xnor https://codegolf.stackexchange.com/a/40791/42736 19 nhờ @Alex


Bất kỳ trợ giúp đều được đánh giá cao vì tôi vẫn đang học python và đây là môn đánh gôn đầu tiên của tôi.
J Atkin

Bạn có thể sử dụng khoảng trắng thay vì dấu gạch dưới trong bảng nội bộ của mình.
Alex Reinking

Tôi đã không nghĩ về điều đó, cảm ơn;)
J Atkin

3

C 675 byte

Lấy đầu vào từ đối số dòng lệnh. Sử dụng đệ quy chính:

#define Y(_) (!isdigit(_)?!isalpha(_)?3:1+(toupper(_)-65)/10:0)
#define X(_) (!isdigit(_)?!isalpha(_)?_-32&&_-45?_-43?9-(_==94):7:6:(toupper(_)-5)%10:_-48)
x,y,z;char*s;main(a,_,p,q,r){a<2?s[_]?!isdigit(s[_])&&((s[_]-32&&!isupper(s[_]))||!a)&&((s[_]-45&&!islower(s[_]))||a)?q=x,r=y,main(3,43),p=z,x=X(43),y=Y(43),main(3,s[_]),p+=z,x=X(s[_]),y=Y(s[_]),main(a,_+1),p+=z,x=q,y=r,main(3,94),q=z,x=X(94),y=Y(94),main(3,s[_]),q+=z,x=X(s[_]),y=Y(s[_]),main(!a,_+1),q+=z,z=(q<p?q:p):(main(3,s[_]),q=z,x=X(s[_]),y=Y(s[_]),main(a,_+1),z+=q):(main(3,61)):(a<3?s=((char**)_)[1],x=0,y=1,main(1,0),printf("%d",z):(x=X(_)-x,y=Y(_)-y,x+=10*(x<0),y+=4*(y<0),z=(x>5?10-x:x)+(y>2?4-y:y)));}
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.