D 패드를 통해 이름을 입력하십시오


32

퍼즐 :

종류의 이름을 입력해야하는 d- 패드가있는 콘솔 / 핸드 헬드 게임을 고려하십시오. 이것은 QWERTY 사용이 콘솔에서 대중화되기 전에 많은 오래된 게임에서 나타났습니다 (예를 들어 Wii는 입력에 QWERTY 키보드 레이아웃을 사용한다고 생각합니다). 일반적으로 화상 키보드는 다음과 같은 효과를 나타냅니다.

태만:

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 _ + ^ =

케이스를 전환 한 상태 :

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 - + ^ =

즉, 모든 영숫자 키 및 다음과 같습니다.

_: 단일 공백
-: 하이픈
+: 다음 문자 전용 대소 문자
^전환 : 대문자 잠금 전환 (즉, 모든 문자 대소 문자 전환)
=: 입력, 완료

* "BKSP"및 "ENTER"와 같은 키를 더 짧은 버전으로 바꿨습니다.

그리고 하드웨어는 D 패드 (또는 당신이 갈 수있는 컨트롤의 형태 포함 할 것 up, down, leftright)

화면은 일반적으로 한쪽에서 다른쪽으로 직접 이동할 수 있습니다. 즉, 당신이 편지에 초점을 맞춘 경우를 J누르면 편지 right로 이동할 수 있습니다 A.

이름을 입력 할 때마다 항상 가장 빠른 방법으로 운동하려고합니다.

골:

프로그램은 공백과 하이픈을 포함한 모든 영숫자 문자를 포함 할 수있는 문자열 입력을 사용하며, 목표는 d-pad 에서 가장 짧은 키 누름 을 출력하여 필요한 문자열을 출력하는 것입니다.

고려 사항 :

실제 문자 를 누르기 위해 누른 키를 포함 할 필요는 없습니다 .
(가)에서 초점은 항상 시작 A
입력 =해야 누르면

예:

input: Code Golf
output: 43

설명 :
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

이 것을 빨리 주 명중하는 +A의 두 배를 _하고 G그것을 공격하는 것보다 ^다음 번 스왑 등을.

우승작 (최소 1w는 허용)이 가장 짧은 솔루션 (바이트)입니다. 이것이 첫 번째 질문이므로 명확하고 어렵지 않기를 바랍니다.


12
좋은 도전! 48 시간이 너무 적을 수도 있습니다. 바운티가 허용되는 데 시간이 오래 걸리므로 일주일 이상이 소요됩니다.
Maltysen

@Maltysen 제안에 감사드립니다, 도전을 업데이트했습니다
Tas

1
당신은 수직 또는 수평으로 포장 할 수 있습니까?
Alex Reinking

2
@AlexReinking 그게 좋은 지적입니다! 그래 넌 할수있어.
Tas

큰! 내 구현은 그렇게하므로 그냥 다시 확인하고 싶었습니다.
Alex Reinking

답변:


5

루비 (369 바이트)

명령 행에서 입력을받습니다.

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)

@Charlie 덕분에 많은 바이트를 절약했습니다. :)


j=(K.index(c.upcase) or 36)j=K.index(c.upcase)||364 바이트를 절약하기 위해 대체 될 수 있습니다 . 바이트를 저장하기 위해 def d(x,y)로 대체 할 수 def d x,y있으며, 동일합니다 def v. v(...) ifv(...)if또 다른 바이트. 마지막 줄에서 v(...)교체 할 수 있습니다 v ...1 바이트 저장, 및에 true!!0또 다른 바이트를 저장합니다.
Charlie

감사! 나는 정말로 루비를 모른다. 나는 이것을 파이썬에서 번역했습니다 ...
Alex Reinking

또한 대체 할 수 &&&||함께 |.
Alex Reinking

첫 줄 ( K=...)을 범위 ( K='0123456789'+('A'..'Z').to_a.join+' +^=') 로 바꿀 수 있습니다
Charlie

다른 2 개를 면도합니다!
Alex Reinking

9

스위프트 1.2, 812 588 670 바이트

편집 : 큰 숫자 배열을 범위로 바꾸고 대신 배열로 변환하여 224 바이트를 제거했습니다.

편집 2 : 세로로 반복 추가

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

실행하려면 코드를 .swift파일에 넣고 다음으로 실행하십시오.swift <filename> <your name>


이것은 두 개의 '키보드'가 배열로 저장되는 간단한 접근 방식을 사용합니다.

B:(I)->(I,I)={a in(a%10,a/10)} 배열의 색인을 가상 키보드의 x, y 위치로 변환합니다.

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)))} 시작 / 종료 색인을 가져오고 한 번에서 다른 번으로 이동할 최소 이동 수를 반환합니다 (가로 줄 바꿈).

func D(c:S,_ e:I=10,_ f:Bool=false,_ g:Bool=false)->I대부분의 계산을 수행하는 주요 재귀 함수입니다. 이 경우에 변경해야 않는다면, 그것은 계산 대상 캐릭터의 현재 위치로부터 거리를 계산 모두 시프트 Caps Lock 키 방법과 최소 걸린다.

swift codegolf.swift Code Golf인쇄 실행43


수직 랩을 설명해야합니다.
Alex Reinking

세로 포장도 설명하도록 업데이트되었습니다.
David Skrundz

4

파이썬 679 661 619 602 589 576 539 520 496 482 바이트

이것을 실행하면 입력하라는 메시지가 표시됩니다 (프롬프트 텍스트 없음). 입력에 Code Golf대해 인쇄합니다 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)

전체 프로그램 :

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)

전체 프로그램에서 확장 된 출력 :

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

@justin https://codegolf.stackexchange.com/a/18983/42736 덕분에 바이트를 절약했습니다.
4 @xnor https://codegolf.stackexchange.com/a/40791/42736 @Alex 덕분에 19


나는 여전히 파이썬을 배우고 있으므로 도움을 주시면 이것이 첫 번째 코드 골프입니다.
J Atkin

내부 테이블에서 밑줄 대신 공백을 사용할 수 있습니다.
Alex Reinking

나는 그것에 대해 생각하지 않았다, 감사합니다;)
J Atkin

3

C 675 바이트

명령 행 인수에서 입력을받습니다. 재귀 main을 사용합니다.

#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)));}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.