Todos sabemos que os programadores tendem a ser preguiçosos. Para maximizar seu tempo livre, você decide escrever um programa que produz um número mínimo de pressionamentos de tecla para o texto inserido nele.
Entrada : texto que precisa ser convertido em pressionamentos de tecla. Você pode decidir como inserir o texto (STDIN / leitura de um arquivo fornecido nos argumentos)
Saída : as ações necessárias no seguinte formato:
- Eles devem ser numerados
H
: Pressionando uma tecla e liberando-a imediatamenteP
ress: Pressionar uma tecla e não soltá-la (isso nunca será o ideal quando a tecla forR
pressionada como o próximo pressionamento de tecla)R
elease: Liberando umaP
chave ressed
Exemplo :
Entrada:
Hello!
Resultado:
Uma solução ingênua seria:
1 P Shift
2 H h
3 R Shift
4 H e
5 H l
6 H l
7 H o
8 P Shift
9 H 1
10 R Shift
Isso seria mais eficiente:
1 P Shift
2 H h
3 H 1
4 R Shift
5 H Left
6 H e
7 H l
8 H l
9 H o
Meio Ambiente:
- O editor usa uma fonte monoespaçada
- O texto é encapsulado com 80 caracteres
- Seta para cima e Seta para baixo preservam a coluna, mesmo se houver linhas mais curtas entre
- Presume-se que a área de transferência esteja vazia
- Presume-se que o bloqueio numérico esteja ativado
- Presume-se que o caps lock esteja desativado
- Caps lock funciona apenas para as letras (ou seja, sem Shift Lock)
Teclas de atalho / atalhos :
- Home: Salta para o início da linha atual
- End: Pula para o final da linha atual
- Ctrl+ A: Marcar tudo
- Ctrl+ C: Copiar
- Ctrl+ X: Cortar
- Ctrl+ V: Colar
- Shift+ Cursor em movimento: Marcação
- Ctrl+ F: Abre uma caixa de diálogo de pesquisa.
- Correspondência de texto estúpida, sem expressões regulares
- Maiúsculas e Minúsculas
- Pesquisas envolvem
- Entrada de texto de linha única para a pesquisa
- A entrada é pré-preenchida com a seleção atual, a menos que haja uma nova linha no meio, a entrada completa é selecionada
- Copiar / colar funciona normalmente
- Pressionar Enterrealiza a pesquisa, selecionando a primeira correspondência após a posição atual do cursor
- F3: Repetir a última pesquisa
- Ctrl+ H: Abre uma caixa de diálogo de substituição
- Correspondência de texto estúpida, sem expressões regulares
- Maiúsculas e Minúsculas
- Substitua Tudo, com a envolvente
- Entradas de texto de linha única
- A entrada de pesquisa é pré-preenchida com a seleção atual, a menos que haja uma nova linha no meio, a entrada completa é selecionada
- A entrada de substituição está vazia
- Copiar / colar funciona normalmente
- Tab pula para a entrada de substituição
- Pressionar Enterexecuta a substituição de todos. O cursor é colocado após a última substituição
Regras :
- As soluções devem ser um programa completo que compile / analise e execute sem nenhuma modificação adicional
- O teclado exibido acima é o teclado a ser usado
- Não é necessário manipular caracteres que não podem ser digitados com ele
- Cada chave deve ser liberada no final
- O cursor não precisa estar no final do arquivo no final
Pontuação :
Sua pontuação é a soma da quantidade de ações necessárias para digitar os seguintes textos. O vencedor é a solução com a menor pontuação. Usando minha solução ingênua, recebo 1371 + 833 + 2006 = 4210
. Cai fora! Eu vou escolher um vencedor em duas semanas.
1 Minha solução ingênua
number = 1
H = (char) -> console.log "#{number++} H #{char}"
P = (char) -> console.log "#{number++} P #{char}"
R = (char) -> console.log "#{number++} R #{char}"
strokes = (text) ->
shiftActive = no
for char in text
if /^[a-z]$/.test char
if shiftActive
R "Shift"
shiftActive = no
H char
else if /^[A-Z]$/.test char
unless shiftActive
P "Shift"
shiftActive = yes
H char.toLowerCase()
else
table =
'~': '`'
'!': 1
'@': 2
'#': 3
'$': 4
'%': 5
'^': 6
'&': 7
'*': 8
'(': 9
')': 0
'_': '-'
'+': '='
'|': '\\'
'<': ','
'>': '.'
'?': '/'
':': ';'
'"': "'"
'{': '['
'}': ']'
if table[char]?
unless shiftActive
P "Shift"
shiftActive = yes
H table[char]
else
H switch char
when " " then "Space"
when "\n" then "Enter"
when "\t" then "Tab"
else
if shiftActive
R "Shift"
shiftActive = no
char
R "Shift" if shiftActive
input = ""
process.stdin.on 'data', (chunk) -> input += chunk
process.stdin.on 'end', -> strokes input
2 Fácil repetição
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
3 Repetição mais complexa
We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy
I just wanna tell you how I'm feeling
Gotta make you understand
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
We've known each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it
And if you ask me how I'm feeling
Don't tell me you're too blind to see
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
(Ooh, give you up)
(Ooh, give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)
We've know each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it
I just wanna tell you how I'm feeling
Gotta make you understand
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Você pode usar o programa de repetição criado por mim para testar suas soluções (Nota: ele ainda não suporta Pesquisa / Substituição, todo o resto deve funcionar).
fonte
Respostas:
Haskell 1309 + 457 + 1618 = 3384
Finalmente, uma resposta (a pontuação melhorou muito quando percebi que há guias no seu primeiro teste - era necessário editar a pergunta para vê-las). Compilar com
ghc
, fornecer entrada no stdin. Exemplo:Tentei as coisas óbvias como Dijkstra, mas era muito lento, mesmo depois de reduzir a ramificação para os únicos movimentos úteis, que são: enviar a próxima chave ou copiar desde o início da linha (Shift + Home, Ctrl + C, Fim) ou cole.
Portanto, essa abordagem usa uma área de transferência de comprimento fixo, copia quando um prefixo de linha está prestes a se tornar 'útil' e continua usando esse prefixo desde que seja possível de ser colado em mais linhas do que os prefixos de linhas que alcançar a seguir. Quando não pode usar a área de transferência, ela recorre à solução ingênua, por isso é garantida que será vencida assim que a duração escolhida for superior ao custo de uma cópia.
A pontuação mínima é alcançada quando o tamanho do prefixo é escolhido para caber em "Never going". Existem maneiras de melhorar isso, mas eu já tive o bastante de ler Rick Astley.
fonte