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.