Podziękowania dla @ Agawa001 za wymyślenie tego pytania.
Wyjaśnienie
Mój nowy „keybore” ma tylko 2 przyciski, a mianowicie +
i -
.
Numer w pamięci zaczyna się od 0
.
Każde kolejne naciśnięcie +
lub -
zwiększy / zmniejszy pamięć dokładnie tyle razy, ile razy zostało naciśnięte kolejno.
Dlatego, jeśli naciśniesz +
4 razy, za pierwszym razem dodaje 1, za drugim razem dodaje 2, za trzecim razem dodaje 3, po raz czwarty dodaje 4, dając ci 10
(dziesięć).
Teraz, jeśli naciśniesz -
3 razy, za pierwszym razem odejmie 1, drugi raz 2, trzeci raz 3, pozostawiając ci 4
(cztery).
TL; DR
Biorąc pod uwagę ciąg + i -, dziel go przy każdej zmianie charakteru. Następnie każdy wynikowy ciąg m +
symboli dodaje m-ty numer trójkąta, a każdy ciąg n -
symboli odejmuje n-ty numer trójkąta.
Walk-through
Teraz, jeśli nadal nie rozumiesz, pokażę ci, jak +++--+--
tworzy 1
.
Program | Counter | Memory
----------------------------
| 0 | 0
+ | +1 | 1
++ | +2 | 3
+++ | +3 | 6
+++- | -1 | 5
+++-- | -2 | 3
+++--+ | +1 | 4
+++--+- | -1 | 3
+++--+-- | -2 | 1
Zadanie
- Jako dane wejściowe weźmiesz dodatnią liczbę całkowitą, albo jako argument funkcjonalny, albo ze STDIN.
- Następnie wydrukujesz / wydrukujesz minimalną liczbę naciśnięć klawiszy potrzebnych do utworzenia tej liczby, korzystając z powyższej metody.
Przypadki testowe
Ponieważ przestawienie sekwencji +
lub -
daje ten sam numer, dla każdej takiej grupy wymieniona jest tylko najwcześniejsza sekwencja leksykograficzna.
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 | ++++++++++++++++++++++++++-+++-+++
Dodatkowe zasoby
- Dowód, że można wykonać dowolną liczbę : w zasadzie powtarzając
++-
, można uzyskać dowolną liczbę parzystą. Aby uzyskać liczby nieparzyste, po prostu umieść+
na końcu. - Kolejny ogólny sposób na uzyskanie dowolnej liczby. Na przykład, aby wygenerować
50
, można nacisnąć+
50 razy, a następnie nacisnąć-
49 razy. - Rozwiązanie pierwszych 50 liczb .
- Obowiązkowe JSFiddle .
Punktacja
To jest golf golfowy . Najkrótsze rozwiązanie w bajtach wygrywa.
+++++--
jest to również alternatywa, ale usunąłem, ++-++++
ponieważ jest to równoważne ++++-++
). Wciąż mam jeszcze jedną sprawę, którą chciałbym dodać później, na wypadek gdyby ktoś wymyślił wydajne rozwiązanie, jeśli uda mi się je wygenerować.
++-++++
usunięty. Poza tym to była MOJA edycja, a nie WASZA.
+++++--
(lub równoważnie --+++++
), dlatego przede wszystkim czułem potrzebę edycji.