Créditos a @ Agawa001 por hacer esta pregunta.
Explicación
Mi nuevo "keybore" solo tiene 2 botones, a saber, +
y -
.
El número en la memoria comienza en 0
.
Cada presión consecutiva de +
o -
aumentará / disminuirá la memoria exactamente cuántas veces se ha presionado consecutivamente.
Por lo tanto, si presiona +
4 veces, la primera vez agrega 1, la segunda vez agrega 2, la tercera vez agrega 3, la cuarta vez agrega 4, lo que le da 10
(diez).
Ahora, si presiona -
3 veces, la primera vez que resta 1, la segunda vez 2, la tercera vez 3, dejándolo con 4
(cuatro).
TL; DR
Dada una cadena de + y -, divídala en cada cambio de carácter. Luego, cada cadena resultante de m +
símbolos suma el m-ésimo número de triángulo, y cada cadena de n -
símbolos resta el n-ésimo número de triángulo.
Recorrido
Ahora, si todavía no entiendes, te mostraré cómo se +++--+--
crea 1
.
Program | Counter | Memory
----------------------------
| 0 | 0
+ | +1 | 1
++ | +2 | 3
+++ | +3 | 6
+++- | -1 | 5
+++-- | -2 | 3
+++--+ | +1 | 4
+++--+- | -1 | 3
+++--+-- | -2 | 1
Tarea
- Tomarás un entero positivo como entrada, ya sea como argumento funcional o desde STDIN.
- Luego, generará / imprimirá el número mínimo de pulsaciones de teclas necesarias para crear ese número utilizando el método anterior.
Casos de prueba
Dado que la reorganización de las ejecuciones +
o -
da el mismo número, para cada grupo solo se enumera la secuencia lexicográfica más temprana.
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 extra
- Prueba de que se puede hacer cualquier número : básicamente, al repetir
++-
, puede obtener cualquier número par. Para obtener los números impares, simplemente ponga un+
al final. - Otra forma general de obtener cualquier número. Por ejemplo, para generar
50
, una forma es presionar+
50 veces, y luego presionar-
49 veces. - Solución de los primeros 50 números .
- Obligatorio JSFiddle .
Puntuación
Este es el código de golf . La solución más corta en bytes gana.
+++++--
que también es una alternativa, pero eliminé ++-++++
ya que es equivalente a ++++-++
). Todavía tengo un caso más que me gustaría agregar más tarde en caso de que alguien presente una solución eficiente, si logro generarla.
++-++++
eliminar. Además, esta fue MI edición, no TUYA.
+++++--
(o, de manera equivalente --+++++
), por lo que sentí la necesidad de editar en primer lugar.