Inspirowany /puzzling//q/626
W swoich przygodach dochodzisz do serii 7 mostów, które musisz pokonać. Pod każdym mostem mieszka troll. Aby przejść przez most, musisz najpierw dać trollowi liczbę ciastek jako procent liczby ciast, które nosisz. Ponieważ są to miłe trolle, oddadzą ci pewną liczbę ciastek.
Na początku każdego dnia lokalny król trolli ustala procent podatku od tortów, który każdy podróżny musi zapłacić, oraz zwrot kosztu trolli - liczbę ciast, które każdy troll musi zwrócić podróżnym.
Twoim zadaniem jest obliczenie minimalnej liczby ciastek potrzebnych do przejścia wszystkich 7 mostów trolli dla danych warunków w danym dniu.
Założyć:
- Dwa parametry wejściowe: procent podatku od ciasta (liczba całkowita od 0 do 100) i zwrot ciasta za troll.
- Nikt, nawet trolle, nie chce ciasta częściowo zjedzonego przez innego trolla. Jeśli zostanie ci ułamek ciasta, troll go dostanie.
- Jeśli troll zaakceptuje podatek od ciast, ale potem będzie musiał oddać ci wszystkie ciastka (pozostanie z tymi samymi lub mniejszymi ciastami niż wcześniej), rozzłości się i zje ciebie oraz twoje ciastka.
- Każdy troll musi zachować co najmniej jedno pełne ciasto.
- Możesz przewozić maksymalnie 100 ciastek.
- Musisz zakończyć dzień, w którym aktualnie się znajdujesz lub po drugiej stronie wszystkich 7 mostów.
Wyzwanie:
Napisz kompletny program, który wyświetli minimalną liczbę ciastek do przejechania w bieżącym dniu lub zero, jeśli dzisiaj nie będzie można bezpiecznie podróżować - poczekasz, aby zobaczyć, jakie będą liczby jutro.
Dane wejściowe należy przekazywać jako stdin, argumenty wiersza poleceń lub dane wejściowe pliku.
Najkrótszy kod (liczba bajtów) wygrywa.
Przykład:
25% podatku od ciast, zwrot 2 ciastek trolli.
zacznij od 19 ciast
przed trollem 1: (19 * 0,75) = 14,25
po trollem 1: (14 + 2) = 16
przed trollem 2: (16 * 0,75) = 12
po trollem 2: (12 + 2) = 14
itp.
19 ciast -> 16 -> 14 -> 12 -> 11 -> 10 -> 9 -> 8
18 ciast -> 15 -> 13 -> 11 -> 10 -> 9 -> 8 -> 8 (reguła 3)
W przypadku 18 ciast ostatni troll nie zdoła zatrzymać ciastek. Dlatego minimalna liczba ciastek na 25% / 2 dni wynosi 19.
input: 25 2
output: 19
Przykład 2:
90% podatku od ciast, zwrot 1 ciasta na trolla
100 ciastek -> 11 -> 2 -> 1 (reguła 4)
Trzeci troll nie zdążył zatrzymać ciasta. Dlatego nie można podróżować w 90% / 1 dniu, nawet zaczynając od maksymalnej liczby ciastek.
input: 90 1
output: 0
Dane
Przygotuj szybki wykres wartości wejściowych i wyjściowych. Byłem zaskoczony, że nie było to „gładkie” (jak krzywa dzwonowa lub podobna); jest kilka zauważalnych wysp.
Dane dla zainteresowanych. Kolumny są podzielone na 5% przedziały, rzędy to jednostki 1 odstępu zwrotu ciasta (excel obrócił obraz). Widać, że zwrot nie może przekroczyć 28 ciast.
27, 17, 13, 14, 15, 18, 20, 24, 53, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
47, 27, 20, 19, 19, 19, 24, 39, 48, 68, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0
67, 37, 28, 24, 23, 28, 27, 29, 50, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
87, 47, 33, 29, 27, 28, 31, 44, 37, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 57, 40, 34, 31, 29, 34, 34, 62, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 67, 48, 39, 35, 38, 37, 49, 57, 76, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 77, 53, 44, 39, 38, 47, 39, 59, 78, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 87, 60, 49, 43, 39, 40, 54, 46, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 97, 68, 54, 47, 48, 44, 44, 71, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 73, 59, 51, 48, 47, 59, 73, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 80, 64, 55, 49, 51, 49, 68, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 88, 69, 59, 58, 54, 64, 70, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 93, 74, 63, 58, 57, 54, 57, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 100, 79, 67, 59, 67, 69, 82, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 84, 71, 68, 60, 59, 77, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 89, 75, 68, 64, 74, 79, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 94, 79, 69, 67, 64, 66, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 99, 83, 78, 71, 79, 91, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 87, 78, 74, 69, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 91, 79, 77, 84, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 95, 88, 87, 74, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 99, 88, 80, 89, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 89, 84, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 87, 94, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 91, 84, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 99, 94, 99, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 97, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
25 2
11 tortów dajesz trollowi 2,75 ciasta i odzyskujesz 2, aby troll zachował 0,75 (+. 25) i przeżyłeś. W przypadku90 1
2 ciastek dajesz trollowi 1.8 i odzyskujesz 1, więc troll utrzymuje 0,8 (+. 2), ale umierasz.Odpowiedzi:
CJam,
46434139383633 bajtówWejście przez ARGV.
Istnieje internetowy tłumacz, ale niestety nie obsługuje on argumentów wiersza poleceń. Do testowania możesz naśladować go ze STDIN za pomocą tej wersji:
Objaśnienie wersji opartej na ARGV:
Zawartość stosu jest automatycznie drukowana na końcu programu.
źródło
55 2
(0
zamiast100
) i56 5
(98
zamiast94
). To dlatego,100_0.55*-i
i25_0.56*-i
padają ofiarą zmiennoprzecinkowej niedokładności. O ile wiem, pary31 24, 31 25, 33 21, 33 22, 33 23, 35 10, 35 12, 35 15, 35 16, 35 27, 56 1, 57 4
dają również nieprawidłowe wyniki.CJam,
44 40 38 3735 bajtówLub używając argumentów wiersza poleceń i
{}#
lewy, 33 bajty :Nie umieszczenie tego jako mojego głównego
{}#
podejścia jest inspirowane odpowiedzią Martina.Przykładowy przebieg:
Wejście:
Wynik:
Inne:
Wejście:
Wynik:
Jak to działa
Wypróbuj online tutaj
źródło
]W=
sztuczka, ale jak dotąd, za każdym razem, gdy próbuję jej użyć, kończę z tą samą liczbą postaci.APL (39)
Wyjaśnienie:
T R←⎕
: odczytaj dwie cyfry z klawiatury i zapisz je wT
(podatek) iR
(zwrot).Z←⍳M←100
: Zapisać numer100
wM
, i wszystkie numery od1
do100
wZ
.{
...}⍣7¨
: dla każdego elementuZ
uruchom 7 razy następującą funkcję:R+⌊1-T÷M
: obliczyć, ile ciastek trzeba zapłacić,⍵(⊢×>)
: pomnóż tę kwotę przez 1, jeśli troll skończy z większą ilością ciasta, niż zaczął, lub przez 0, jeśli nie.⊃Z/⍨
: dla każdego elementuZ
powtórz go według numeru podanego przez tę funkcję. (Tak więc wszystkie liczby, dla których zwrócono funkcję,0
znikają.) Następnie wybierz pierwszy element z tej listy. Jeśli lista okazała się pusta, daje to0
.źródło
C, 83 bajty
Jeśli to działa, działa dla wszystkich możliwych ciastek startowych, nie tylko od 1 do 100.
EDYCJA: Działa. Gra w golfa:
Z limitem „maksymalnie 100 ciastek”:
91 bajtów.
źródło
CJam, 36 bajtów
źródło
C ++ - 202 znaków
Jak zwykle mój C ++ zrobił najgorsze:
źródło
APL, 36
Wyjaśnienie
Zauważ, że istnieje „próg ciasta”. Aby uzyskać stawkę podatku
x
i zwrot pieniędzyy
, będziesz potrzebować czegoś więcej niży÷x
ciasta, aby przejść przez kolejny most.x y←⎕
weź dane wejściowe i przypisz dox
(podatek) iy
(zwrot)⍳x÷←100
podzielx
przez 100, a następnie wygeneruj tablicę od 1 do 100{y+⍵-⌈⍵×x}⍣6
zadzwoń do funkcji „most przejściowy” 6 razy:⌈⍵×x
liczba posiadanych ciastek, stawka podatku, zaokrąglanie w górę (⍵-
płacona kwota) Odejmij od liczby posiadanych ciasteky+
Dodaj zwrotNastępnie otrzymasz tablicę zawierającą 100 elementów, pokazującą liczbę ciastek, które pozostały Ci po przejściu 6 mostów, jeśli zaczniesz od 1 ~ 100 ciastek. Aby sprawdzić, czy możesz przejść przez ostatni most, sprawdź, czy przekroczyłeś próg
y÷x
. Alternatywnie:x×
pomnóż tablicę przezx
y<
sprawdzenie, czy jest większa niży
Na koniec
1⍳⍨
znajdź indeks pierwszego wystąpienia1
(true), zwraca101
jeśli nie znaleziono101|
mod 101źródło
C 128
Całkiem podobne do innych rozwiązań C, ale myślę, że to nieuniknione. Główną sztuczką jest wyrwanie się z wewnętrznej pętli z różnymi wartościami w zależności od tego, czy dojdzie do jej zakończenia, czy nie. Pozwala mi to używać?: Kiedy nie mogłem, jeśli użyłem break;
Nie golfił
źródło