Créditos para @ Agawa001 por ter feito essa pergunta.
Explicação
Meu novo "furo de chave" possui apenas 2 botões, a saber +e -.
O número na memória começa em 0.
Cada pressão consecutiva +ou -incrementa / diminui a memória exatamente quantas vezes ela foi pressionada consecutivamente.
Portanto, se você pressionar +4 vezes, na primeira vez em que adicionar 1, na segunda vez em adicionar 2, na terceira vez em adicionar 3 e na quarta vez em adicionar 4, fornecendo a você 10(dez).
Agora, se você pressionar -3 vezes, na primeira vez subtrai 1, na segunda vez 2, na terceira vez 3, deixando você com 4(quatro).
TL; DR
Dada uma sequência de + e -, divida-a a cada mudança de caractere. Então, cada sequência resultante de m +símbolos adiciona o m-ésimo número do triângulo e cada seqüência de n -símbolos subtrai o n-ésimo número do triângulo.
Walk-through
Agora, se você ainda não entende, mostrarei como +++--+--cria 1.
Program | Counter | Memory
----------------------------
| 0 | 0
+ | +1 | 1
++ | +2 | 3
+++ | +3 | 6
+++- | -1 | 5
+++-- | -2 | 3
+++--+ | +1 | 4
+++--+- | -1 | 3
+++--+-- | -2 | 1
Tarefa
- Você receberá um número inteiro positivo como entrada, como argumento funcional ou de STDIN.
- Em seguida, você imprimirá / imprimirá o número mínimo de teclas necessárias para criar esse número usando o método acima.
Casos de teste
Como reorganizar as execuções +ou -fornece o mesmo número, para cada grupo, apenas a sequência lexicograficamente mais antiga é listada.
Input | Output | Possible corresponding sequences
-------------------------------------------------
4 | 5 | -+++-
6 | 3 | +++
9 | 5 | ++++-
11 | 7 | +++-+++
12 | 7 | +++++--, ++++-++
19 | 8 | -++++++-
39 | 12 | +++++++++---
40 | 13 | +++++++++---+, ++++++++-+++-
45 | 9 | +++++++++
97 | 20 | ++++++++++++++--+---, +++++++++++++-++++--, ++++++++++++-++++++-
361 | 34 | ++++++++++++++++++++++++++-+++-+++
Recursos extras
- Prova de que qualquer número pode ser feito : basicamente, repetindo
++-, você pode obter qualquer número par. Para obter os números ímpares, basta colocar um+no final. - Outra maneira geral de obter qualquer número. Por exemplo, para gerar
50, uma maneira é pressionar+50 vezes e, em seguida, pressionar-49 vezes. - Solução dos 50 primeiros números .
- JSFiddle obrigatório .
Pontuação
Isso é código-golfe . A solução mais curta em bytes vence.
+++++--também é uma alternativa, mas eu removi ++-++++porque isso é equivalente a ++++-++). Ainda tenho mais um caso que gostaria de adicionar mais tarde, caso alguém tenha uma solução eficiente, se eu conseguir gerá-la.
++-++++remover. Além disso, esta foi a minha edição, não a sua.
+++++--(ou, equivalentemente --+++++), e foi por isso que senti a necessidade de editar em primeiro lugar.