Od pewnego czasu przewijam tę stronę, ale ostatnio bardzo zainteresowałem się wypróbowaniem niektórych wyzwań. Zamierzałem spróbować swoich sił w niektórych z istniejących tematów związanych z golfem, ale wczoraj nie miałem dostępu do Internetu, a tymczasem wymyśliłem własne wyzwanie.
Twoim zadaniem jest stworzenie programu lub funkcji, która pobiera tablicę a
liczb zmiennoprzecinkowych i liczbę całkowitą n
, a następnie ustawia każdą wartość a
na średnią dwóch obok siebie n
razy. Przy wielokrotnym stosowaniu z rosnącymi wartościami n
generuje to ruch podobny do fali:
Specyfika:
- Jeśli zdarzy się, że jest tylko jeden element
a
, lub jeślin
ma wartość 0 lub mniej, program powinien zwrócić oryginalną tablicę. - Wejścia i wyjścia mogą być w dowolnym formacie, pod warunkiem, że są wyraźnie oddzielone.
Dla każdego kroku:
- Pierwszy element
a
powinien stać się średnią dla siebie i następnego elementu. - Ostatni element
a
powinien stać się średnią dla siebie i dla poprzedniego elementu. - Każdy inny element w
a
powinien stać się średnią z poprzedniego elementu i następnego elementu. - Upewnij się, że obliczasz tablicę poprzedniego kroku, a nie bieżącą!
Przypadki testowe: UWAGA: Twoje wejścia / wyjścia nie muszą być w tym formacie!
[0, 0, 1, 0, 0], 1 -> [0, 0.5, 0, 0.5, 0]
[0, 0, 1, 0, 0], 2 -> [0.25, 0, 0.5, 0, 0.25]
[0, 0, 1, 0, 0], 0 -> [0, 0, 1, 0, 0]
[0, 0, 1, 0, 0], -39 -> [0, 0, 1, 0, 0]
[0, 16, 32, 16, 0], 1 -> [8, 16, 16, 16, 8]
[0, 1, 2, 3, 4, 5], 1 -> [0.5, 1, 2, 3, 4, 4.5]
[0, 64], 1 -> [32, 32]
[0], 482 -> [0]
[32, 32, 32, 16, 64, 16, 32, 32, 32], 4 -> [33, 27, 40, 22, 44, 22, 40, 27, 33]
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach. Zwycięzca zostanie wybrany za tydzień (1 sierpnia). Powodzenia!
Edycja: Gratulacje dla zwycięzcy, @issacg , z ogromną liczbą 18 bajtów!
źródło
n
nie dostarczonych ia
nie dostarczonych skrzynek - tak naprawdę niewiele.n
powinna być 4, a nie 5.Odpowiedzi:
Pyth,
4618 bajtówTen kod oczekuje danych wejściowych w formularzu
iterations, [wave1, wave2, wave3 ...]
, jak widać w pierwszym linku poniżej.Demonstracja. Uprząż testowa.
Program działa poprzez zastosowanie kodu w funkcji zmniejszania (
u
) do listy danych wejściowych, tyle razy ile jest iteracji.Pokażę funkcję propagacji fali na liście
[0, 1, 2, 3, 4, 5]
, która znajduje się wG
:+hGG
przygotowujeG
pierwszy element doG
formowania[0, 0, 1, 2, 3, 4, 5]
.t+GeG
dołączaG
ostatni elementG
i usuwa jego pierwszy element, tworząc[1, 2, 3, 4, 5, 5]
.sV
pierwsze formy par z list, dając[[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5]]
z końcowym elementem pierwszej listy obciętym. Następnie pary są sumowane za pomocąs
funkcji, dając[1, 2, 4, 6, 8, 9]
.cR2
Zastosowania zmiennoprzecinkowej podział podzielić wszystkich numerów przez 2, co daje pożądany efekt,[0.5, 1.0, 2.0, 3.0, 4.0, 4.5]
.źródło
Snowman 1.0.0 , 219 znaków
Z podziałami dla „czytelności”:
Wersja bez golfa / nieuprawniona:
Przykładowy format we / wy:
źródło
Pyth -
2524 bajtówUżywa wyliczenia, redukuje do iteracji.
Wypróbuj online tutaj .
źródło
Rakieta,
164145 bajtówNie golfił
Uwaga, może być potrzebna
#lang racket
linia do uruchomienia tego.źródło
R, 109 bajtów
Tworzy to nienazwaną funkcję, która akceptuje wektor i liczbę całkowitą i zwraca wektor. Podejście polega na traktowaniu danych wejściowych jako jednowymiarowych szeregów czasowych i zastosowaniu liniowego filtra splotowego.
Niegolfowane + wyjaśnienie:
Przykłady:
źródło
Haskell, 76 znaków
Sztuczka polega na dodaniu pierwszego numeru na początku listy i ostatniego na końcu listy zamiast zajmowania się warunkami brzegowymi.
Testy:
źródło
if then else
, tj.c
Staje sięa#n|n<1=a|1<2=iterate f a!!n
is
stajex!y=(x+y)/2
(i jest wywoływany...zipWith(!)(x:a)...
).c
operatora Infix, powiedzieć#
:a#n|n<1=a|1<2=iterate f a!!n
. Nazwij to jak[0, 0, 1, 0, 0] # 2
.CJam,
2322 bajtówWypróbuj online
Dane wejściowe są w formacie listy CJam, np. Dla ostatniego przykładu:
Dane wyjściowe to także lista CJam:
Podstawowe podejście polega na tym, że na każdym kroku wektor jest przesuwany o jedną pozycję w lewo i jedną pozycję w prawo. Każdy z dwóch wektorów jest wypełniany pierwszym / ostatnim elementem, a następnie obliczana jest średnia z dwóch wektorów.
Wyjaśnienie:
źródło
Java, 181 bajtów
Oto wersja golfowa:
Nie golfowany:
W Javie starałem się maksymalnie skracać zadania i warunki warunkowe. Oczywiście usprawnienia są mile widziane.
źródło
JavaScript (ES6),
15313267 znakówWracam do mojej pierwszej odpowiedzi 6 miesięcy później i co mam zrobić? 50% zniżki na golfa, właśnie to. ;)
Ta wersja wywołuje się wielokrotnie, aż
n
będzie mniejsza niż 1, zmniejszając sięn
za każdym razem o 1.Rozwiązanie nierekurencyjne (
15113078 znaków):Ungolfed: (nieaktualny)
Rekurencyjne:
Brak rekurencji:
źródło
if(n<2)return b;return s(b,n-1)
można sprowadzić doreturn n<2?b:s(b,n-1)
Java, 203 bajty
Próbuję po raz pierwszy w Javie. Wskazówki dotyczące udoskonalania są mile widziane :)
Dość drukowane:
źródło
for
pętli do instrukcji przyrostowej pętli? Jakfor(i=0;i<n;b[0]=...,b[s-1]=...,a=...,++i)for(...)b[j]=...;
? Wtedy powinieneś być w stanie pozbyć się aparatów ortodontycznych.++i
siebie przecinkami zamiast średnikami). Wypróbuj to. :)f(a;b;c){d;e;}
powinny być całkowicie identycznef{a;b;}{d;e;c;}
, a zatem takżef(a;b;e,c)d;
. Jednak ze zmienionym kodem, który już nie działa, ponieważ nie można przenosićfor
wewnątrz drugiegofor
, więc myślę, że to wszystko nie ma już znaczenia. ;)Python 2, 98 bajtów
Zastosowałem proste podejście, używane
exec
do wyjścia z pętli while. Myślę, że istnieje lepszy sposób na zrobienie logiki w celu ustalenia specjalnych pozycji spraw, ale na razie to działa. Dane wejściowe powinny być sformatowane jak[list], times
.Nie golfowany:
źródło
Mathematica, 81 bajtów
Mam wrażenie, że można by bardziej zagrać w golfa, gdybym wymyślił lepszy sposób radzenia sobie z warunkiem pozytywności.
Warto zauważyć: Mathematica oferuje wiele potencjalnych wbudowanych rozwiązań w zakresie funkcji przetwarzania list i filtrów, a także
CellularAutomaton
. Wybrałem,Nest[... ListConvolve ...]
ponieważ był to najłatwiejszy sposób na załamanie na końcach listy, ale inne kąty mogą okazać się krótsze.źródło
Matlab, 109
Przykłady:
źródło
Scala,
195 znaków (186 z leniwym wyjściem, tj.187 znakówStream
)prawdopodobnie nie jest optymalne, mapowanie
sliding(3)
jest w tym przypadku bardzo przydatne.testy:
źródło
q (27 znaków)
Przykłady
źródło
R, 93 bajtów
Jako funkcja bez nazwy
Rozszerzony
Testy
źródło
Japt,
3937 bajtów (niekonkurencyjny)Ta odpowiedź nie jest konkurencyjna, ponieważ język jest nowszy niż wyzwanie. Chciałem tylko zobaczyć, jak dobrze mój język golfa może wytrzymać moje pierwsze wyzwanie.
Wypróbuj online!
źródło
C ++ 14, 158 bajtów
Wymaga danych wejściowych
value_type==double
, takich jak kontenervector<double>
.Nie golfowany:
źródło
Rakieta 223 bajtów
Nie golfowany:
Testowanie:
Wydajność:
źródło
Galaretka , 14 bajtów
Wypróbuj online!
Pełny program
źródło
C # (interaktywny kompilator Visual C #) ,
160144 bajtówKorzysta z dobrej rekurencji.
Wypróbuj online!
źródło