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.
fuente
+++++--
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.Respuestas:
Python 2, 119 bytes
Enfoque muy lento de fuerza bruta. La tercera línea calcula el puntaje de una cadena
x
; las otras líneas recorren todas las cadenas binarias posibles hasta encontrar una cuya puntuación sea igual al argumento.@Leaky salvó tres bytes!
fuente
s/x==n and len/(x==n)*len/
s
y simplemente usar una división repetida, como esta:def f(n): \n while n>0:print n%2;n/=2
Pyth, 25 bytes
Pruébalo en línea.
Esto es extremadamente ineficiente y se queda sin memoria durante
f(n)
≥ 11. Calculaf(22)
= 10 en aproximadamente 10 segundos en mi computadora portátil.Explicación
T
. (f
)T
. (./T
).pM
)s
){
) Este paso podría eliminarse, pero hace que el código sea mucho más rápido.f
)d
de la partición (*R
) por sí mismo más uno (hd
). Esto le da el doble de número para sumar / restar al resultado.c
...2
)-M
).a
) Si el resultado fue negativo, intercambiar las sumas y restas obtiene el resultado positivo.qyQ
) En este caso, la permutación de la partición es correcta, devuélvala.T
. Devolución e impresiónT
.fuente
MATL ,
4329 bytesEsto es ineficiente en cuanto a memoria y tiempo. El compilador en línea puede manejar
45
solo entradas .Pruébalo en línea!
Aquí hay una versión modificada con todos los casos de prueba hasta
40
(se tarda casi un minuto en el compilador en línea).Explicación
Esto prueba todas las posibles secuencias de pulsación de teclas de cada longitud, en orden de longitud creciente, hasta que se encuentre una secuencia válida.
fuente
Python,
105100bytesUtiliza una búsqueda ineficiente de amplitud.
h
es una lista utilizada como colam
es el valor de la secuencia al principio de la listat
es el último número agregado am
l
es la longitud de la secuencia que generóm
o
es +/- 1, el signo es opuesto al signo det
Editar: Leaky Nun afeitó cinco bytes.
fuente
s/m,t,l,h=0,0,0,[]/m=t=l=0,h=[]/
s/while m!=n/while m-n/