Jest N drzwi i K małp. Początkowo wszystkie drzwi są zamknięte.
Runda 1: 1. małpa odwiedza każde drzwi i zamyka je (jeśli drzwi są zamknięte, zostają otwarte; jeśli są otwarte, zostają zamknięte).
Runda 2 : 1. małpa odwiedza każde drzwi i zamyka je. Następnie 2. małpa odwiedza każde drugie drzwi i zamyka je.
. . .
. . .
Runda k: 1. małpa odwiedza każde drzwi i zamyka je. . . . . . . . . . K-ta małpa odwiedza każde k-te drzwi i zamyka je.
Dane wejściowe: NK (oddzielone pojedynczym odstępem)
Wyjście: Numery drzwi, które są otwarte, każdy oddzielony pojedynczym odstępem.
Przykład :
Wejście: 3 3
Wyjście: 1 2
Ograniczenia :
0 <N <101
0 <= K <= N
Uwaga :
Załóżmy, że N drzwi są ponumerowane od 1 do N, a małpy K są ponumerowane od 1 do K
Wygrywa ten z najkrótszym kodem. Wyświetl także dane wyjściowe dla N = 23, K = 21
źródło
n=k=3
wyprowadziłoby1 2
tak źle ... a 5 wyjść1 2 4
ma pewien wzorzec, ale jest to mniej oczywiste.Odpowiedzi:
APL,
322826Wyjaśnienie
{+/0=⍺|⍨⍳⍵}
to funkcja zwracająca liczbę⍺
przełączeń drzwi (lewy argument) w rundzie⍵
(prawy argument), co równa się liczbie czynników,⍺
która wynosi ≤⍵
:⍳⍵
Wygeneruj tablicę numeryczną od 1 do⍵
⍺|⍨
Oblicz⍺
moduł każdego elementu tej tablicy0=
Zmień na 1, gdzie było 0 i 0 dla każdej innej rzeczy+/
Zsumuj wynikową tablicęFunkcja zewnętrzna:
(⍳⍺)
,⍳⍵
Generuj tablice od 1 do N i od 1 do K∘.{...}
Dla każdej pary elementów dwóch tablic zastosuj funkcję. Daje to macierz liczby przełączeń, każdy rząd reprezentuje drzwi, a każda kolumna reprezentuje rundę.+/
Zsumuj kolumny. Daje to tablicę liczby przełączeń każdych drzwi we wszystkich rundach.2|
Moduł 2, więc jeśli drzwi są otwarte, jest to 1; jeśli jest zamknięty, to jest 0.(...)/⍳⍺
Na koniec wygeneruj tablicę od 1 do N i wybierz tylko te, w których w poprzednim kroku jest 1./⎕
Na koniec wstaw funkcję między liczbami z wejścia.EDYTOWAĆ
,↑⍳¨⍳⍵
Wygeneruj wszystkie „małpy” (jeśli K = 4, to jest1 0 0 0 1 2 0 0 1 2 3 0 1 2 3 4
)⍳⍵
Tablica od 1 do⍵
(K)⍳¨
Dla każdego z nich wygeneruj tablicę od 1 do tej liczby,↑
Przekształć zagnieżdżoną tablicę w macierz (↑
), a następnie rozpakuj do prostej tablicy (,
)(,↑⍳¨⍳⍵)∘.|⍳⍺
Dla każdej liczby od 1 do⍺
(N) zmodyfikuj ją dla każdej małpy.0=
Zmień na 1, gdzie było 0 i 0 dla każdej innej rzeczy. Daje to matrycę przełączeń: rzędy są małpami w każdej rundzie, kolumny są drzwiami; 1 oznacza przełącznik, 0 oznacza brak przełączenia.+⌿
Zsumuj rzędy, aby uzyskać tablicę liczby przełączeń każdych drzwiInne części nie są zmieniane
EDYTOWAĆ
Użyj XOR redukuj (
≠⌿
) zamiast sumy i mod 2 (2|+⌿
)źródło
{}/
zamiast tylko wziąć N i K jako argumenty do dfn?i←⍳⍺
GolfScript, 33 znaki
Gdyby drzwi były ponumerowane zaczynając od zera, zapisałoby to 3 znaki.
Przykłady ( online ):
źródło
Mathematica, 104 znaki
Przykład:
źródło
{n,k}=%~Read~{Number,Number}
. : .Ruby, 88
Na podstawie odpowiedzi @ manatwork.
Te podejrzane globale zawsze przerywają podświetlanie składni!
źródło
count
#sum
Python 3,
9784Jeśli małpa pojawia się w parzystej liczbie rund, nie ma żadnej zmiany. Jeśli małpa pojawia się w parzystej liczbie razy, to tak samo jak w dokładnie jednej rundzie.
W ten sposób niektóre małpy mogą zostać pominięte, a inne muszą tylko raz zmienić drzwi.
Dane wyjściowe dla
23 21
:źródło
range(2-K%2,K+1,2)
dorange(K,0,-2)
.for
pętlę nawhile
pętlę:while K>0:r^=set(range(K,N+1,K));K-=2
R - 74
Symulacja:
źródło
javascript
148127tutaj jest (trochę) czytelna wersja:
Skrzypce DEMO
powinienem zauważyć, że zaczyna się od zera (technicznie błąd off-by-one)
źródło
b=Array(n);
To inicjalizuje tablicę jako n długości wypełnionej niezdefiniowaną. ! undefined jest prawdą, więc pierwsze przejście małpy zmieni to wszystko w trues.+1
JavaScript, 153
Wyjście dla N = 23, K = 21:
Testowany w Chrome, ale nie używa żadnych nowych, ciekawych funkcji ECMAScript, więc powinien działać w dowolnej przeglądarce!
Wiem, że nigdy nie wygram z innymi wpisami i że @tryingToGetProgrammingStrainght przesłał już wpis w JavaScript, ale nie otrzymałem takich samych wyników dla N = 23, K = 21, jak wszyscy inni, więc pomyślałem, że wypróbowałbym własną wersję.
Edycja : źródło z adnotacjami (przeglądając to ponownie, zauważyłem miejsca, w których można zapisać kolejne 3 znaki, więc prawdopodobnie można je jeszcze ulepszyć ...)
źródło
+1
Ruby - 65 znaków
Oto obliczenia w pseudokodzie:
Jeśli nie jesteś przekonany, że wyrażenie dla s (d) jest poprawne, spójrz na to w ten sposób:
źródło
n
i skądk
pochodzą? Wydaje się, że wynik jest oddzielony znakiem nowej linii niż spacją.PowerShell: 132
Kod do gry w golfa:
Kod bez komentarza:
źródło
PowerShell, 66 bajtów
Skrypt testowy:
Wynik:
źródło