Wprowadzenie
Deszcz w końcu opadł. Większość ludzkości utonęła z powodu błędu w kodzie @ user12345 . Ocaleni są rozproszeni po całym archipelagu. Komunikacja radiowa jest uruchomiona, a ludzkość jest gotowa do ponownego rozwoju. Bez żadnego powodu piraci zombie zgromadzili się w Prime Meridian i zamiatają na zachód. Horda pożera wszystko.
Problem
Nasz scenariusz zagłady może być opisany przez 5 liczb całkowitych w jednym wierszu, które reprezentują zestaw współpracujących społeczności wyspiarskich. Są one uporządkowane od zachodu (skrajnie po lewej stronie) do wschodu (skrajnie po prawej stronie).
Począwszy od wyspy najbardziej na wschód, wyspiarze uciekają parami na następną najbliższą wyspę. Co ciekawe, dla każdej pary, która wyrusza, tylko jedna z nich przeżyje podróż. Wyspiarze podróżują tylko parami. Dziwne populacje wybierają jedynego mieszkańca, który pozostanie w tyle i zapewni najnowsze wiadomości radiowe na temat wybryków hordy piratów zombie. Populacje odmawiają podróży, dopóki wszystkie wyspy na wschód od nich nie zakończą migracji lub nie umrą. Kiedy ludność dotrze do ostatniej, najbardziej wysuniętej na zachód wyspy, podróż ustaje.
Kierownik operacyjny na końcu świata potrzebuje programu, który może wyprowadzić ostateczną liczbę mieszkańców każdej wioski.
Przykładowe dane wejściowe
3 8 6 0 2
Przykładowy wynik
8 1 0 1 0
Założenia
- Dane wejściowe mogą być dostarczane przez stdin, odczytane z dowolnego pliku lub zaakceptowane jako argument
- Dla każdej wyspy 0 <= populacja <= 1024
- Populacje nigdy nie opuszczają wyspy
Najkrótsza odpowiedź wygrywa!
Odpowiedzi:
APL, 16 znaków
Dane wejściowe są dostarczane jako ciąg do tego bloku:
lub jeden znak mniej, jeśli dane wejściowe podano jako argument do tego bloku:
Opiera się na idei Ilmari Karonen w tym komentarzu .
2⊥⍵
wykonuje podstawową konwersję 2 danych wejściowych.(1e9,4⍴2)⊤
w ten sposób konwertuje tę liczbę z powrotem na bazę 2 (dla czterech ostatnich cyfr) i bazę 1e9 dla pierwszej, co wystarcza dla podanych wyżej zakresów wejściowych. (1e9,4⍴2
buduje listę1e9 2 2 2 2
).Zauważ, że ucieczka na zachód odbywa się automatycznie przez konwersję bazy podczas tego procesu.
źródło
APL
powinno być nielegalne ...GolfScript,
2322 znakówPodejście iteracyjne. Tablica jest kilkakrotnie iterowana i za każdym razem liczba par jest przenoszona z prawej do lewej. Wypróbuj przykład online .
Krótkie objaśnienie kodu:
źródło
~]{2base}2*' '*
GolfScript (25 znaków)
Demo online
Całkiem proste rozwiązanie: istnieje bardziej interesujące podejście, które definiuje wartość wyjściową dla każdej wyspy jako funkcję wartości wejściowych, ale nie sądzę, że można ją zagrać w golfa tak dalece, jak faktycznie postępuje zgodnie z algorytmem redystrybucji opisanym w pytaniu.
źródło
Javascript / ES6 (69)
Gra z operatorami bitowymi:
x&=1
zachowuje najniższy bit (1 jeśli nieparzysty, 0 jeśli parzysty)x>>1
to dzielenie przez 2 dla liczb całkowitychWersja bez ES6:
Przykłady:
f("3 8 6 0 2")
zwraca[8, 1, 0, 1, 0]
f("0 997 998 999 1000")
zwroty[935, 0, 1, 1, 0]
źródło
f=a=>{a=a.split(' ');for(x=5;--x;a[x]&=1)a[x-1]-=-a[x]/2|0;return a}
68 znaków.Python - 96 znaków
Pierwszy raz w golfa! Dane wejściowe ze standardowego wejścia.
źródło
' '
podział, zmniejszając go do 96 i pokonując inne rozwiązania python2.J (26 znaków)
Oto moje rozwiązanie w J:
((<.@-:@}.,0:)+{.,2|}.)^:_
To ogólne rozwiązanie powinno działać z dowolną liczbą wysp.
źródło
Rubin,
97907472Wersja online
Grałem w golfa nieco dalej, nie odwracając już tablicy ...
źródło
C - 121 znaków
Dane wejściowe są pobierane ze standardowego wejścia.
źródło
Python2 - 98 znaków
Dane wejściowe ze standardowego wejścia.
Python3 - 79 znaków
Dane wejściowe ze standardowego wejścia.
źródło
Python 2,
8580 bajtówX osób rozpoczynających na dowolnej wyspie odpowiada X * 2 osobom rozpoczynającym jedną wyspę po prawej stronie. Ten kod konwertuje wszystkich w konfiguracji początkowej na ich odpowiednik w skrajnie prawicowych wyspach, a następnie wykorzystuje binarną reprezentację wyniku, aby określić, ile osób kończy na każdej wyspie.
EDYCJA: Skrócono kod inicjując
b
do 1 zamiast 0, umożliwiając użyciebin
zamiast ciągu formatu.źródło
Python (101)
Przewijamy listę od tyłu do przodu i przesuwamy populacje zgodnie ze specyfikacją, a następnie drukujemy listę. Oto szybki test:
źródło
Mathematica 105
Powinno to działać z dowolną liczbą wysp.
Przykłady
5 wysp
25 wysp
źródło
270, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0
długie dane testowe. Myślę, że potwierdziłem, że mam rację.Java -
647533, ale liczę na punkty brownie dla strumieni Java 8.Nieskompresowana forma:
Z pomocą:
Nieco zaniepokojony, że test @ DavidCarraher:
generuje
źródło
Java -
196195Powiedziałem sobie, że nie opublikuję tego, gdybym nie mógł dostać go poniżej 200 ... Szczerze mówiąc, nie sądzę, żebym mógł się pozbyć czegokolwiek innego, jest dość wąski jak na Javę.
Podziały wierszy:
Przykładowe dane wejściowe:
źródło
Java - 179 znaków
Sprężony:
Normalna:
Przykładowe dane wyjściowe:
źródło
Emacs Lisp 144 znaków
Nie malutki, ale działa
źródło
awk - 44 znaki
źródło
Java - 116 znaków
Na przykład
int[] i = {2, 33, 16, 5};
(myślę, że te nie dodają się do liczby, ponieważ każda liczba może się różnić) wyszedł23 0 0 1
źródło