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.
źródło
+++++--
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.Odpowiedzi:
Python 2, 119 bajtów
Bardzo wolne podejście z użyciem siły brutalnej. Trzecia linia oblicza wynik ciągu
x
; pozostałe linie zapętlają wszystkie możliwe ciągi binarne, dopóki nie zostanie znaleziony taki, którego wynik jest równy argumentowi.@Leaky zapisał trzy bajty!
źródło
s/x==n and len/(x==n)*len/
s
i po prostu użyć powtarzającego się podziału, takiego jak to:def f(n): \n while n>0:print n%2;n/=2
Pyth, 25 bajtów
Wypróbuj online.
Jest to wyjątkowo nieefektywne i zabraknie pamięci dla
f(n)
≥ 11. Obliczaf(22)
= 10 w około 10 sekund na moim laptopie.Wyjaśnienie
T
. (f
)T
. (./T
).pM
)s
){
) Ten krok można usunąć, ale znacznie przyspiesza kod.f
)d
partycji (*R
) przez siebie plus jedną (hd
). To daje podwójną liczbę, aby dodać / odjąć do wyniku.c
…2
)-M
).a
) Jeśli wynik był ujemny, zamiana dodawania i odejmowania daje wynik dodatni.qyQ
) W takim przypadku permutacja partycji jest poprawna, zwróć ją.T
. Wróć i wydrukujT
.źródło
MATL ,
4329 bajtówJest to nieefektywne pod względem pamięci i czasu. Kompilator online może obsługiwać
45
tylko dane wejściowe .Wypróbuj online!
Oto zmodyfikowana wersja ze wszystkimi przypadkami testowymi do
40
(zajmuje to prawie minutę w kompilatorze online).Wyjaśnienie
Testuje to wszystkie możliwe sekwencje naciskania klawiszy dla każdej długości, w kolejności rosnącej długości, aż do znalezienia prawidłowej sekwencji.
źródło
Python,
105100 bajtówKorzysta z nieefektywnego wyszukiwania szerokości.
h
to lista używana jako kolejkam
to wartość sekwencji na początku listyt
jest ostatnim numerem dodanym dom
l
to długość wygenerowanej sekwencjim
o
wynosi +/- 1, znak jest przeciwny do znakut
Edycja: Dziurawa Zakonnica ogoliła pięć bajtów.
źródło
s/m,t,l,h=0,0,0,[]/m=t=l=0,h=[]/
s/while m!=n/while m-n/