Zarządzanie zapasami w Minecraft jest trudne. Masz 17 diamentów, ale potrzebujesz 7, aby stworzyć stół zaklęcia, kilof i miecz. Czy bierzesz je i klikasz prawym przyciskiem 7 razy? A może raz prawym przyciskiem myszy i dwa razy prawym przyciskiem myszy i wziąć 7 w lewo? To takie mylące!
dla tych z was, którzy są teraz zdezorientowani, nie martw się, wyjaśnię to wszystko za chwilę
Wyzwanie
Biorąc pod uwagę rozmiar stosu przedmiotów i pożądaną ilość, określ najmniejszą liczbę kliknięć, aby uzyskać tę liczbę. Musisz obsłużyć do 64 dla obu danych wejściowych i możesz założyć, że masz nieskończone miejsca na ekwipunek. Nie można użyć sztuczki przeciągania i rozpowszechniania.
Definicje
Inwentarz jest zbiorem szczeliny w której można przechowywać przedmioty.
Szczelina to przestrzeń do przechowywania w magazynie, w którym można umieścić do jednego typu elementu.
Stos jest liczba elementów umieszczonych w tej samej grupie. Na potrzeby tego wyzwania stos jest po prostu zbiorem przedmiotów w tym samym miejscu (więc zignoruj rozmiar stosu)
Kursor to pointy thingy. Ten kursor. Może zawierać elementy „na nim”; innymi słowy, jeśli klikniesz miejsce i podniosłeś przedmioty, przedmioty, które podniosłeś, są „na kursorze”, dopóki ich nie odłożysz.
Dane techniczne
Istnieją cztery możliwe sytuacje. Albo masz element na kursorze, albo go nie masz, albo klikniesz lewym przyciskiem myszy, albo prawym przyciskiem myszy.
Jeśli nie masz przedmiotu na kursorze, a kliknięcie lewym przyciskiem myszy na polu, podnosi cały stos.
Jeśli nie masz przedmiotu na kursorze i klikniesz miejsce prawym przyciskiem myszy, podnosisz połowę stosu, zaokrąglając w górę.
Jeśli masz element na kursorze i klikniesz lewy przycisk na polu, umieścisz wszystkie elementy w tym polu. (W przypadku wszystkich graczy Minecraft nie będziesz mieć> 64 przedmiotów do tego wyzwania i wszystkie można układać w stosy w 64, a masz tylko jeden typ, więc zamiana przedmiotów nie ma tutaj zastosowania)
Jeśli masz kursor na przedmiot i klikniesz na niego prawym przyciskiem myszy, umieścisz w nim jeden przedmiot.
Tak więc zaczynasz od wszystkich podanych elementów (pierwsze wejście lub drugie; możesz wybrać kolejność) w gnieździe i chcesz zakończyć z żądaną ilością (inne wejście) w kursorze.
Przejrzyjmy przykład. Powiedzmy, że zaczynasz z 17 przedmiotami i chcesz 7. Najpierw kliknij stos prawym przyciskiem myszy, co oznacza, że wybrałeś 9 i jest tam 8. Następnie, jeśli ponownie klikniesz stos prawym przyciskiem myszy, umieścisz jeden przedmiot z powrotem w polu, pozostawiając ci 8, a pole 9. Wreszcie, ponownie kliknij prawym przyciskiem myszy i masz 7, a pole ma 10. Zatem, zwrócisz 3
(liczba kliknięć).
Jeśli uda ci się wygrać w golfa, proszę powiedz mi, a ja wyedytuję przykład: P
Przypadki testowe
Są one generowane ręcznie, więc proszę o informację, czy są jakieś błędy. Zarządzam zapasami poprzez kliknięcie jittera prawym przyciskiem myszy, więc nie mam doświadczenia w optymalnym zarządzaniu zapasami: P
Given, Desired -> Output
17, 7 -> 3
64, 8 -> 5
63, 8 -> 5
10, 10 -> 1
10, 0 -> 0 # note this case
25, 17 -> 7
Objaśnienia
To wyzwanie może być trudne dla graczy spoza Minecrafta, nie mam pojęcia. Oto kilka wyjaśnień.
64, 8 -> 5
ponieważ podnosisz 32 za pomocą kliknięcia prawym przyciskiem myszy, odkładasz go, podnosisz 16, odkładasz, a następnie podnosisz 8.
63, 8 -> 5
z tego samego powodu.
25, 17 -> 7
ponieważ podnosisz 13, odkładasz, odrywasz 6 z resztek 12, umieszczasz 2 z powrotem na stosie resztek, a następnie umieszczasz 4 w kursorze na 13, a następnie podnosisz je.
Zasady
- Obowiązują standardowe luki
- Możesz to założyć
0 <= desired <= given <= 64
- Możesz przyjmować dane wejściowe w dowolnej kolejności i wykonywać operacje we / wy w dowolnym rozsądnym formacie
0,[n]
, może przejść: (1) od0,[a,b,...]
doa,[b,...]
,b,[a,...]
,ceil(a/2),[floor(a/2),b,...]
, lubceil(b/2),[a,floor(b/2),...]
; lub (2) zx,[a,b,...]
(x>0
) ix-1,[a+1,b,...]
,x-1,[a,b+1,...]
,x-1,[a,b,...,1]
,0,[a+x,b,...]
,0,[a,b+x,...]
,0,[a,b,...,x]
. Wyzwanie polega zatem na znalezieniu minimalnych możliwych przejść od miejsca,0,[g]
gdzie g jest podane, dot,L
gdziet
jest pożądany cel i czyL
jest jakaś lista?Odpowiedzi:
C ++ ,
498482457 bajtówJeśli ta funkcja zostanie wywołana tylko raz, może mieć 455 bajtów.
Przekonałem się, że prawie wszystkie internetowe kompilatory GCC (w tym TIO) zabraniają mi pomijania typu funkcji
f
. Jednak GCC na moim komputerze pozwala na to i nie wiem dlaczego.Ten może obsłużyć duże dane wejściowe, jeśli gniazdo może zawierać taką liczbę elementów (choć wymaga większej tablicy i prawdopodobnie skończy się czas).
Nie golfowany:
źródło
Galaretka , 74 bajty
Pełny program z pierwszym wejściem (3. argument) bieżącym stosem, a drugim wejściem (4. argument) pożądany kursor.
Wypróbuj online! Ze względu na implementację osiąga to 60-sekundowy limit czasu TIO dla
25, 17
przypadku testowego. Można temu zaradzić, usuwając nadmiarowość pozostawioną do gry w golfa za pomocą 84 bajtów (która odfiltrowuje stosy o zerowej wielkości i sortuje te, które pozostałyḟ€Ṣ¥0¦€0
na końcu łącza 6 i zachowuje unikalne stany na każdym kroku przy użyciuQ$
w Main połączyć).W jaki sposób?
Program implementuje zdefiniowaną maszynę stanu.
Tworzy stan pierwotny,
[0, [argument 1]]
a następnie wielokrotnie przechodzi do wszystkich następnych możliwych stanów,
aż zostanie znaleziony pasujący
[argument 2, [...]]
.Uwaga: pozycja programu znajduje się pod „linkiem głównym”, który jest najniższy (
Wṭ0WÇ€Ẏ$ÑпL’
)źródło