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.
fonte
+++++--
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.Respostas:
Python 2, 119 bytes
Abordagem de força bruta muito lenta. A terceira linha calcula a pontuação de uma string
x
; as outras linhas passam por todas as seqüências binárias possíveis até encontrar uma pontuação igual à do argumento.@Leaky salvou três bytes!
fonte
s/x==n and len/(x==n)*len/
s
e usar apenas divisão repetida, como este:def f(n): \n while n>0:print n%2;n/=2
Pitão, 25 bytes
Experimente online.
Isso é extremamente ineficiente e fica sem memória por
f(n)
≥ 11. Calculaf(22)
= 10 em cerca de 10 segundos no meu laptop.Explicação
T
. (f
)T
. (./T
).pM
)s
){
) Esta etapa pode ser removida, mas torna o código muito mais rápido.f
)d
da partição (*R
) por ele próprio mais um (hd
). Isso fornece o dobro do número para adicionar / subtrair ao resultado.c
…2
)-M
).a
) Se o resultado foi negativo, a troca das adições e subtrações obtém o resultado positivo.qyQ
) Nesse caso, a permutação da partição está correta, retorne-a.T
. Devolva e imprimaT
.fonte
MATL ,
4329 bytesIsso é ineficiente na memória e no tempo. O compilador online pode manipular
45
apenas entradas .Experimente online!
Aqui está uma versão modificada com todos os casos de teste até
40
(leva quase um minuto no compilador online).Explicação
Isso testa todas as seqüências possíveis de pressionar teclas de cada tamanho, em ordem crescente, até que uma sequência válida seja encontrada.
fonte
Python,
105100 bytesUsa uma pesquisa ineficiente em termos de largura.
h
é uma lista usada como uma filam
é o valor da sequência no topo da listat
é o último número adicionado am
l
é o comprimento da sequência que geroum
o
é +/- 1, o sinal é oposto ao sinal det
Editar: Freira gotejante raspou cinco bytes.
fonte
s/m,t,l,h=0,0,0,[]/m=t=l=0,h=[]/
s/while m!=n/while m-n/