एक डी-पैड के माध्यम से अपना नाम दर्ज करें


32

पहेली:

डी-पैड के साथ एक कंसोल / हाथ से आयोजित गेम पर विचार करें जहां आपको किसी प्रकार का नाम दर्ज करना आवश्यक है। 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" जैसी कुंजियों को छोटे संस्करणों के साथ बदल दिया है

और फिर हार्डवेयर एक डी-पैड (या नियंत्रण के कुछ फार्म जहां जा सकते हैं को शामिल किया जाएगा up, down, leftऔर right)

स्क्रीन भी आमतौर पर आपको एक तरफ से दूसरी तरफ ले जाने देती है। यही है, यदि आपको पत्र पर ध्यान केंद्रित किया गया था J, तो दबाने से rightआप पत्र पर स्थानांतरित हो सकते हैं A

जब भी मैं अपना नाम दर्ज कर रहा था, मैं हमेशा ऐसा करने के लिए सबसे तेज़ तरीका निकालने की कोशिश करता हूँ।

लक्ष्य:

आपका कार्यक्रम स्ट्रिंग इनपुट लेगा जिसमें किसी भी अल्फ़ान्यूमेरिक वर्ण को शामिल किया जा सकता है जिसमें एक स्थान और हाइफ़न शामिल है, और आपका लक्ष्य आवश्यक स्ट्रिंग को आउटपुट करने के लिए डी-पैड पर सबसे कम मात्रा में प्रेस करना है।

बातें:

वास्तविक चरित्र को दबाने के लिए आपको कुंजी को दबाने की आवश्यकता नहीं है ।
हमेशा A
एंटर में शुरू होने वाला फोकस अंत में दबाया= जाना चाहिए

उदाहरण:

input: Code Golf
output: 43

समझाया:
A -> C= 2
C-> ^= 6 (बाएं की ओर बढ़ रहा है)
^-> o= 5
o-> d2
d-> e= 1
e-> += 5
+-> _= 1
_-> += 1
+-> G3
G-> o= 3
o-> l= 3
l-> f= 5
f-> == 6

ध्यान दें कि यह एक के लिए +दो बार हिट करने के लिए तेज है _और एक बार Gहिट करने के लिए ^, फिर वापस स्वैप करना है।

जीतने वाला सबमिशन (मैं कम से कम 1w की अनुमति दूंगा) सबसे छोटा समाधान (बाइट्स में) होगा। जैसा कि यह मेरा पहला प्रश्न है, मुझे आशा है कि यह स्पष्ट है और बहुत कठिन नहीं है।


12
अच्छी चुनौती! बस एक बिंदु, 48 घंटे शायद बहुत कम है। यह कितना समय लगता है जब बाउंसियों को अनुमति दी जाती है, इसलिए यह लगभग एक सप्ताह + से अधिक होना चाहिए।
माल्टीसेन

@Maltysen धन्यवाद सुझाव के लिए, मैं चुनौती को नवीनीकृत किया है
Tas

1
क्या आप लंबवत भी लपेट सकते हैं, या केवल क्षैतिज रूप से?
एलेक्स रिंकिंग

2
@AlexReinking यह एक महान बिंदु है! हाँ तुम कर सकते हो।
Tas

महान! मेरा कार्यान्वयन वह करता है, इसलिए मैं सिर्फ दो बार जांचना चाहता था।
एलेक्स रिंकिंग

जवाबों:


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 vv(...) ifकरने के लिए v(...)ifएक और बाइट के लिए। अंतिम पंक्ति पर, 1 बाइट को बचाने के लिए और दूसरे बाइट को बचाने के लिए के साथ v(...)प्रतिस्थापित किया जा सकता है । v ...true!!0
चार्ली

धन्यवाद! मैं वास्तव में रूबी को नहीं जानता। मैंने इसका अनुवाद अजगर से किया ...
एलेक्स रिंकिंग

मैं भी जगह ले सकता है &&के साथ &और ||साथ |
एलेक्स रिंकिंग

आपकी पहली पंक्ति ( K=...) को एक सीमा ( K='0123456789'+('A'..'Z').to_a.join+' +^=')
चार्ली

एक और 2 बंद करता है!
एलेक्स रिंकिंग

9

स्विफ्ट 1.2, 812 588 670 बाइट्स

संपादित करें: एक सीमा के साथ संख्याओं के बड़े सरणियों को प्रतिस्थापित करके और इसके बजाय एक सरणी में परिवर्तित करके 224 बाइट्स निकाले।

Edit2: लंबवत लूपिंग जोड़ा गया

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)} वर्चुअल कीबोर्ड पर एक इंडेक्स को एक्स से वाई स्थिति में परिवर्तित करता है।

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


ऊर्ध्वाधर लपेटने के लिए खाते की आवश्यकता है।
एलेक्स रिंकिंग

वर्टिकल रैप के लिए भी अपडेट किया जाता है।
डेविड स्कर्न्ड्ज़

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 19 @ @ धन्यवाद के लिए बाइट का धन्यवाद


किसी भी मदद की सराहना की है क्योंकि मैं अभी भी अजगर सीख रहा हूं और यह मेरा पहला कोड गोल्फ है।
J Atkin

आप अपने आंतरिक तालिकाओं में एक अंडरस्कोर के बजाय एक स्थान का उपयोग कर सकते हैं।
एलेक्स रिंकिंग

मैं उस के बारे में सोचा नहीं था, धन्यवाद;)
जे Atkin

3

C 675 बाइट्स

कमांड लाइन तर्क से इनपुट लेता है। पुनरावर्ती मुख्य का उपयोग करता है:

#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)));}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.