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.