O quebra-cabeça:
Considere um console / jogo portátil com um d-pad em que você deve digitar um nome. Isso apareceu em muitos jogos mais antigos antes que o uso do QWERTY fosse popularizado nos consoles (por exemplo, acredito que o Wii use um layout de teclado QWERTY para entrada). Normalmente, o teclado na tela parece o efeito de *:
Padrão:
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 _ + ^ =
Com o caso alternado:
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 - + ^ =
Ou seja, todas as chaves alfanuméricas e o seguinte:
_
: Um único espaço
-
: Um hífen
+
: Alternar maiúsculas e minúsculas apenas para a próxima letra
^
: Alternar maiúsculas e minúsculas (ou seja, alternar maiúsculas e minúsculas)
=
: Digite, conclua
* Obviamente, troquei teclas como "BKSP" e "ENTER" por versões mais curtas
E então o hardware incluiria um d-pad (ou alguma forma de controle onde você pode ir up
, down
, left
e right
)
A tela também normalmente permite mover-se de um lado diretamente para o outro. Ou seja, se você estivesse focado na letra J
, pressionar pressionaria right
para mover para a letra A
.
Sempre que eu estava digitando meu nome, eu sempre tentava descobrir a maneira mais rápida de fazer isso.
Objetivo:
Seu programa terá entrada de string, que pode incluir qualquer caractere alfanumérico, incluindo espaço e hífen, e seu objetivo é produzir a menor quantidade de pressionamentos de tecla no d-pad para produzir a string necessária.
Considerações:
Você não precisa incluir a tecla pressionada para pressionar o caractere real.
O foco sempre começa no A
Enter e =
deve ser pressionado no final
Exemplo:
input: Code Golf
output: 43
Explicado:
A
-> C
= 2
C
-> ^
= 6 (movendo-se para a esquerda)
^
-> 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
Observe que é mais rápido pressionar as +
duas vezes por a _
e a G
do que bater ^
uma vez e depois trocar de volta.
A submissão vencedora (permitirei pelo menos 1w) será a solução mais curta (em bytes). Como esta é minha primeira pergunta, espero que isso seja claro e não muito difícil.
Respostas:
Ruby (369 bytes)
Recebe entrada da linha de comando.
Economizei um monte de bytes graças a @Charlie :)
fonte
j=(K.index(c.upcase) or 36)
pode ser substituído porj=K.index(c.upcase)||36
para salvar 4 bytes.def d(x,y)
pode ser substituído pordef d x,y
para salvar um byte, e o mesmo vale paradef v
.v(...) if
parav(...)if
por outro byte. Na última linha,v(...)
pode ser substituído porv ...
para salvar 1 byte etrue
por!!0
para salvar outro byte.&&
por&
e||
com|
.K=...
) pode ser substituído por um intervalo (K='0123456789'+('A'..'Z').to_a.join+' +^='
)Swift 1,2,
812588670 bytesEditar: foram removidos 224 bytes, substituindo as grandes matrizes de números por um intervalo e convertendo-o em uma matriz.
Edit2: Adicionado loop vertical
Para executar, coloque o código em um
.swift
arquivo e execute-o comswift <filename> <your name>
Isso usa a abordagem simples em que os dois 'teclados' são armazenados como matrizes.
B:(I)->(I,I)={a in(a%10,a/10)}
Converte um índice da matriz em uma posição x, y no teclado virtual.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)))}
Toma um índice de início / fim e retorna o número mínimo de movimentos a serem movidos de uma vez para a outra (contabilizando quebra horizontal)func D(c:S,_ e:I=10,_ f:Bool=false,_ g:Bool=false)->I
É a principal função recursiva que faz a maioria dos cálculos. Ele calcula a distância da posição atual para o personagem alvo, a menos que o caso deve mudar, em seguida, ele calcula tanto a mudança e os Caps Lock métodos e leva o menor.swift codegolf.swift Code Golf
Impressões em execução43
fonte
Python
679661619602589576539520496482 BytesExecute isso e ele solicitará uma entrada (sem texto de prompt). Para a entrada
Code Golf
impressa43
.Programa completo:
Saída estendida do programa completo:
fonte
C 675 bytes
Recebe entrada do argumento da linha de comando. Usa recursivo principal:
fonte