Na tej stronie jest pytanie podobne do tego pytania, ale dodałem zwrot.
Masz trzy dane wejściowe, liczbę osób w kręgu n , k-ta osoba odliczana na każdym kroku i q-ta osoba, która przeżyła. Ludzie w kręgu są ponumerowani od 1 do n .
Na przykład w kręgu 20 osób 20. osoba, która przeżyła, jest pierwszą usuniętą osobą, a 19. osoba, która przeżyła, to druga osoba usunięta i tak dalej. Zazwyczaj problemem Józefa Flawiusza jest określenie ostatniej osoby, która została usunięta, zwanej tutaj pierwszą osobą, która przeżyła.
Napisz najkrótszy program lub funkcję, która przy tych trzech wejściach zwraca liczbę q- tej osoby, która przeżyła.
Jeśli są jakieś problemy z jasnością, daj mi znać.
Kilka przykładów:
>>> josephus(20, 3, 9)
4
>>> josephus(4, 3, 1)
1
>>> josephus(100, 9, 12)
46
Edycja: Załóż, że wszystkie dane wejściowe są prawidłowe. To znaczy, że nikt nie poprosi o 0 lub jakiekolwiek liczby ujemne i nikt nie poprosi o 20. ocalałego w kręgu 5 osób (to znaczy 1 ≤ q ≤ n)
Edycja: Przyjmę odpowiedź o północy UTC + 7 na początku 2 grudnia.
q=1
jest to dokładnie to samo, co powiązane pytanie Józefa, prawda?Odpowiedzi:
Pyth, 16 bajtów
Wypróbuj online: pakiet demonstracyjny lub testowy
Dane wejściowe mają formę
k<newline>n<newline>q
.Wyjaśnienie:
źródło
Piet,
280273 kodeksówEdycja: Grałem trochę w golfa i myślę, że mogę pograć w golfa jeszcze bardziej, ale to dopiero nadejdzie. Na razie cieszę się, że to działa i że mam miejsce na podpis w lewym dolnym rogu. Dwa pomysły, które muszę zapisać więcej kodów to: a) zmiana instrukcji końcowych to
pop, push 1, add, out num
(pop n, wyjście r + 1) i b) powtórzenie w lewym dolnym rogu, aby zapisać kody w manipulacji stosem później w pętli.Obrazek powyżej to mój kod przy 8 pikselach na kodel. Zasadniczo jest to ten sam algorytm, co moja odpowiedź w języku Python, ale z danymi wejściowymi w kolejności k , q , n . W praktyce istnieje również wiele manipulacji stosami. Możesz spróbować tutaj , otwierając tam obraz i uruchamiając z nim kod.
Wyjaśnienie
Jest to krok po kroku rozwiązanie problemu.
źródło
CJam,
222019 bajtówOdczytuje to dane wejściowe jako
q k n
. Wypróbuj online w interpretatorze CJam .Jak to działa
źródło
Golfscript,
585655353130 bajtówZakładając, że trzy wejścia są już na stosie, w kolejności n , k , q
To rozwiązanie zakłada, że muszę pozbyć się wszystkiego oprócz ostatecznej odpowiedzi.
Jak to działa
j(n,k,q)
Więcej szczegółów znajdziesz w moim rozwiązaniu Python 3.Edycja 1: Użyto sugestii @ Doorknob (Dodano znak +, aby uzyskać wszystkie dane wejściowe do tablicy)
Dawniej,
Edycja 2: Dodano ~, zgodnie z zasadami wiki i skrócono kod. Dzięki @Dennis
Dawniej,
Edycja 3: Zaimplementowano krótszy algorytm.
Dawniej,
Edycja 4: Zrozumiałem, że mogę użyć
%
jako mapy.Dawniej,
Edycja 5: Drobna edycja. Zmieniły
2$
się@
dokonać[0..q-1]
i3$
aby2$
odzyskaćk
. Zapisane ugryzienieDawniej,
źródło
\;\;\;\;
może być zastąpiony przez])\;
(zawijanie w tablicę, prawo-uncons, zamiana i pop).JavaScript (ES6), 56 bajtów
Nie golfił
Zasadniczo adaptacja JavaScript odpowiedzi Python @ Sherlock9 .
Test
źródło
Mathematica, 50 bajtów
Anonimowa funkcja. Pobiera dane wejściowe w kolejności
q,n,k
.źródło
C,
8173 bajtówNa podstawie implementacji JavaScript @ user81655 mojej odpowiedzi w języku Python.
Edycja: Usunięto i
Test
źródło
int
przed nazwy parametrów.Python 3,
726662 bajtówDynamiczna funkcja programowania w 62 bajtach. Na podstawie algorytmu z Wikipedii. Kiedyś na tej stronie istniała bezpośrednia implementacja tego algorytmu, gdy q = 1 (tj. I = 1, r = 0), ale widzę, że został teraz usunięty.
Edycja 1: Usunąłem,
i
aby zapisać 4 bajty. Wyjaśnienie pozostaje niezmienione.Edycja 2: Przeliczenie w liczbie bajtów. Używałem
\r\n
do EOL i nie zauważył, że gdy dodaje 3 bajty. Odpowiednio obniżyłem liczbę bajtów.Jak to działa
Dzięki @Dennis za przypomnienie, że powinienem wyjaśnić mój kod (choćby pośrednio, ponieważ on umieścił jeden w swojej odpowiedzi). Jeśli coś jest niejasne, daj mi znać.
Edytować:
Dawniej,
Funkcja iteracyjna zaadaptowana z gry Concrete Mathematics przez Grahama, Knutha i Patashnika. Chociaż ten algorytm jest dłuższy, jest szybszy dla dużych n i małych k .
źródło
+
.PHP, 71 bajtów
Na podstawie odpowiedzi @ Sherlock9. Zobacz jego odpowiedź na algorytm dla Pythona.
Alternatywnie, oto moje oryginalne naiwne podejście bez algorytmu. Wykorzystuje tablicę do oznaczenia osób, które zostaną znalezione.
91 bajtów
źródło
Haskell,
484743 bajtówOparty na algorytmie Haskell na stronie Kod Rosetty funkcji Józefa z dwoma danymi wejściowymi. Sugestie dotyczące gry w golfa są mile widziane.
Edit: Dziękuję Nimi o pomoc z golfa pierwszego algorytmu poprzez sugerując wersję pointfree, a za pomoc w golfa drugi algorytm, pozwalając mi znać, że
until
kluczowe istnieje.Wersja algorytmu na końcu mojej odpowiedzi w Pythonie zaadaptowana z gry Concrete Mathematics przez Grahama, Knutha i Patashnika. Chociaż ten algorytm ma dłuższą wartość 62 bajtów i nie został obniżony tak bardzo jak pierwszy, jest szybszy dla dużych
n
i małychk
.Nie golfowany:
Pierwszy algorytm
Drugi algorytm
źródło
until
do (mniej lub bardziej) bezpośrednim tłumaczeniem wersji Pythona z 2 algorytmu:(n#k)q|m<-k-1=1+n*k-until(>n*m)(\z-> -div(-z*k)m)(q*k-mod m q)
.foldl
i nieskończoną liczbę list i wszelkiego rodzaju rzeczy. Dzięki za pomoc!GameMaker Language (GML), 88 bajtów
Na podstawie odpowiedzi @ user81655
źródło
Galaretka ,
1413 bajtówTryItOnline!
W jaki sposób?
źródło
Rubin,
5348 bajtówLambda
Jak to działa
źródło