Adını D-pad ile gir


32

Bulmaca:

Bir tür ad girmeniz gereken d-pad'li bir konsolu / elde tutulan bir oyun düşünün. Bu, QWERTY kullanımının konsollarda yaygınlaştırılmasından önce birçok eski oyunda ortaya çıktı (örneğin, Wii'nin giriş için bir QWERTY klavye düzeni kullandığına inanıyorum). Genellikle, ekran klavyesi * etkisine bakar:

Varsayılan:

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

Dava açıkken:

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

Yani, tüm alfanümerik tuşlar ve aşağıdakiler:

_: Tek boşluk
-: Tire
+: Yalnızca bir sonraki harf
^için büyük / küçük harf değiştirme: Büyük harf kilidini aç / kapa (yani, tüm harflerin büyük / küçük harflerini değiştir)
=: Girin, tamamlandı

* Açıkçası "BKSP" ve "ENTER" gibi tuşları daha kısa versiyonlarla değiştirdim

Ve sonra donanım d-pad (veya gidebiliriz tür kontrolün yer alacağını up, down, leftve right)

Ekran ayrıca tipik olarak bir taraftan doğrudan diğerine geçmenizi sağlar. Diğer bir deyişle, eğer mektuba odaklanmış olsaydınız J, tuşuna basmak mektuba rightgeçmenize izin verirdi A.

Adımı ne zaman girsem, bunu yapmanın en hızlı yolunu bulmaya çalışırdım.

Hedef:

Programınız boşluk ve kısa çizgi gibi herhangi bir alfasayısal karakter içerebilen dizge girişini alır ve hedefiniz istenen dizgiyi çıkarmak için d-pad'e en kısa tuşa basmaktır .

hususlar:

Gerçek karaktere basmak için basılan tuşu dahil etmeniz gerekmez .
En Odak hep başlar A
girin =olmalıdır preslenmiş sonunda

Örnek:

input: Code Golf
output: 43

Açıklanan:
A -> C= 2
C-> ^= 6 (sola doğru hareket ediyor)
^-> 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

O olduğunu çabuk Not vurmak için +bir iki kez _ve bir Go vurmak daha ^sonra, bir kez takas geri.

Kazanan teslimi (en az 1w izin vereceğim) en kısa çözüm (bayt olarak) olacaktır. Bu benim ilk sorum olduğu için, umarım bu açık ve çok zor değildir.


12
Güzel meydan okuma! Sadece bir nokta, 48 saat muhtemelen çok azdır. Ödüllerin kabul edilmesinin süresi bu kadar sürüyor, bu yüzden bir haftadan daha fazla olmalı.
Maltysen

@Maltysen öneri için teşekkürler, meydan okumayı güncelledim
Tas

1
Dikey olarak da veya yatay olarak sarabilir misiniz?
Alex Reinking,

2
@AlexReinking bu harika bir nokta! Evet yapabilirsin.
Tas

Harika! Uygulamam bunu yapıyor, ben de iki kez kontrol etmek istedim.
Alex Reinking

Yanıtlar:


5

Yakut (369 bayt)

Komut satırından girdi alır.

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 :) sayesinde bir sürü bayt kaydedildi


j=(K.index(c.upcase) or 36)j=K.index(c.upcase)||364 bayt kaydetmek için ile değiştirilebilir . Bir bayt kaydetmek için def d(x,y)ile değiştirilebilir def d x,yve aynı şey geçerli def v. v(...) ifiçin v(...)ifbaşka bir bayt için. Geçen satırda, v(...)değiştirilebilir v ...1 byte tasarrufu, ve trueile !!0başka bir bayt kaydedin.
Charlie

Teşekkürler! Ruby'yi gerçekten tanımıyorum. Bunu
python'dan

Ben de yerini alabilir &&ile &ve ||ile |.
Alex Reinking,

İlk satırınız ( K=...), bir dizi ile değiştirilebilir ( K='0123456789'+('A'..'Z').to_a.join+' +^=')
Charlie

2 tane daha tıraş eder!
Alex Reinking,

9

Swift 1.2, 812 588 670 bayt

Düzenleme: 224 bayt, büyük sayı dizilerini bir Range ile değiştirip yerine bir Diziye dönüştürerek kaldırıldı.

Edit2: Dikey olarak döngü ekledi

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

Çalıştırmak için kodu bir .swiftdosyaya yerleştirin veswift <filename> <your name>


Bu, iki 'klavyenin' diziler olarak depolandığı basit yaklaşımı kullanır.

B:(I)->(I,I)={a in(a%10,a/10)} Dizideki bir dizini sanal klavyedeki x, y konumuna dönüştürür.

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)))} Bir başlangıç ​​/ bitiş endeksi alır ve bir kereden diğerine almak için minimum hamle sayısını döndürür (yatay kaydırma için muhasebe)

func D(c:S,_ e:I=10,_ f:Bool=false,_ g:Bool=false)->IHesaplamaların çoğunu yapan ana özyinelemeli fonksiyonudur. Bu durum değişmelidir sürece, o zaman hesaplar, hedef karakterine anki konumuna mesafeyi hesaplar hem kayma ve caps lock yöntemleri ve en küçük sürer.

Koşu swift codegolf.swift Code Golfbaskıları43


Dikey kaydırma için hesaba katılması gerekiyor.
Alex Reinking

Dikey sarma için hesap olarak güncellendi.
David Skrundz

4

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

Bunu çalıştırın ve bir giriş isteyecektir (bilgi istemi metni olmadan). Giriş Code Golfiçin yazdırır 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)

Tam program:

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)

Tam programdan genişletilmiş çıktı:

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 e-posta ile bir bayt kaydedildi


Herhangi bir yardım hala python öğreniyorum ve bu benim ilk kod golf.
J Atkin

İç tablolarınızda alt çizgi yerine boşluk kullanabilirsiniz.
Alex Reinking

Bunu hiç düşünmemiştim, teşekkürler;)
J Atkin

3

C 675 Bayt

Komut satırı argümanından girdi alır. Özyinelemeli ana kullanır:

#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)));}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.