Zainspirowany pytaniem w Stack Overflow .
Biorąc pod uwagę niepustą tablicę liczb całkowitych x
i dodatnią liczbę całkowitą n
, oblicz sumę każdego przesuwającego się bloku długości n
wzdłuż tablicy x
, wypełniając cyklicznie brakujące wartości po lewej stronie wartościami z prawej strony w następujący sposób:
- pierwszy blok zawiera pierwszy wpis
x
poprzedzonyn-1
przesuniętymi kołowo wpisami; - drugi blok ma pierwszy i drugi wpis
x
poprzedzonyn-2
okrągłym przesunięciem wpisów; i tak dalej.
Tablica wyjściowa y
ma taki sam rozmiar jak x
. Możliwe jest n
przekroczenie długości x
, a następnie wartości x
są kilkakrotnie ponownie używane w obiegu .
Przykłady
Przykład 1 (wartości są ponownie używane tylko raz)
x = [2, 4, -3, 0, -4]
n = 3
podać jako wynik
y = [-2, 2, 3, 1, -7]
gdzie
-2
jest sumą bloku[0, -4, 2]
(pierwsze dwie wartości pochodzą z przesunięcia kołowego)2
jest sumą[-4, 2, 4]
(pierwsza wartość pochodzi z przesunięcia kołowego)3
jest sumą[2, 4, -3]
(nie trzeba już przesuwać kołowo)1
jest sumą[4, -3, 0]
-7
jest sumą[-3, 0, -4]
.
Przykład 2 (wartości są wielokrotnie używane)
x = [1, 2]
n = 5
dać
y = [7, 8]
gdzie
7
jest sumą bloku[1, 2, 1, 2, 1]
(pierwsze cztery wartości zostały ponownie wykorzystane cyklicznie)8
jest sumą bloku[2, 1, 2, 1, 2]
(pierwsze trzy wartości zostały ponownie wykorzystane cyklicznie)
Dodatkowe zasady
- Algorytm powinien działać dla tablic o dowolnym rozmiarze i dla dowolnych wartości całkowitych. Jest dopuszczalne, jeśli program jest ograniczony typem danych lub ograniczeniami pamięci; ale należy obsługiwać zarówno dodatnie, jak i ujemne wartości całkowite.
- Dane wejściowe / wyjściowe można przyjmować / wytwarzać dowolnymi rozsądnymi środkami .
- Programy lub funkcje są dozwolone w dowolnym języku programowania . Standardowe luki są zabronione.
- Najkrótszy kod w bajtach wygrywa.
Przypadki testowe
x, n, -> y
[2, 4, -3, 0, -4], 3 -> [-2, 2, 3, 1, -7]
[1, 2], 5 -> [7, 8]
[2], 7 -> [14]
[-5, 4, 0, 1, 0, -10, -4], 4 -> [-19, -15, -5, 0, 5, -9, -13]
[-5, 4, 0, 1, 0, -10, -4], 1 -> [-5, 4, 0, 1, 0, -10, -4]
[-2, -1, 0, 1, 2, 3], 5 -> [4, 3, 2, 1, 0, 5]
[-10, 0, 10], 4 -> [-10, 0, 10]
code-golf
math
arithmetic
array-manipulation
integer
Luis Mendo
źródło
źródło
Odpowiedzi:
Galaretka , 5 bajtów
Wypróbuj online!
Jak to działa
źródło
MATL,
111097 bajtów3 bajty zapisane dzięki @Luis!
Pierwsze wejście to rozmiar okna, a drugie wejście to tablica
Wypróbuj w MATL Online
Wyjaśnienie
źródło
Mathematica, 29 bajtów
Lub tej samej długości:
źródło
CJam (16 bajtów)
Zestaw testów online . Jest to anonimowy blok (funkcja), który pobiera tablicę i długość stosu i pozostawia tablicę na stosie.
Sekcja
źródło
Haskell, 57 bajtów
Wypróbuj online!
Tylko niektóre zapętlanie indeksów i dostęp do listy danych wejściowych przy indeksach modulo długości listy.
źródło
Haskell ,
696564 bajtówWypróbuj online! Przykładowe zastosowania:
[2, 4, -3, 0, -4] # 3
.Użycie
n
następnej zamiast poprzednich pozycji może wynosić5046 bajtów (pozbycie się rewersu na początku i na końcu):Wypróbuj online!
źródło
Japt , 12 bajtów
Wypróbuj online!
TIO nie obsługuje
Ë
, więc łącze TIO nie będzie działać. Zamiast tego spróbuj tutaj .źródło
Pyth ,
1816 bajtówZaoszczędź 2 bajty dzięki @FryAmTheEggman !
Wypróbuj tutaj lub Zweryfikuj wszystkie przypadki testowe.
Naprawiono wszystkie wady kosztem -6 bajtów ! Bardzo dziękuję Luisowi za zrozumienie zadania na czacie.
Objaśnienie (do aktualizacji)
źródło
Java 8, 102 bajty
Lambda (curry) od
int[]
do lambda odInteger
doint[]
. Przypisz doFunction<int[], Function<Integer, int[]>>
.Wypróbuj online
Niegolfowana lambda
(j % l + l) % l
oblicza nieujemną resztę dla dowolnegoj
. Zabrano stąd .źródło
C, 91 bajtów
Wypróbuj online!
źródło
Oktawa, 53 bajty
Wypróbuj online!
imfilter
Funkcję z opcjącircular
oblicza okrągły splot na środku okna więc wynik powinien być przesunięty.źródło
05AB1E , 10 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Perl 6 ,
4239 bajtówWypróbuj online!
Mój pierwszy wpis w Perlu 6. Prawdopodobnie można to poprawić.
źródło
->\a,\b{[«+»] map {a.rotate(-$_)},^b}
Pamiętaj, że tak nie jest, ale tak by było, gdyby$b
w kodzie było inne wystąpienie .Kotlin ,
141140138 bajtówTylko pierwszy raz
Uległość
Upiększony
TryItOnline
Edycje
źródło
Röda , 52 bajty
Wypróbuj online!
Wyjaśnienie:
źródło
JavaScript ES6
8078 bajtów2 bajty zapisane dzięki Neilowi
Stosowanie:
źródło
,N
wydaje mi się to konieczne ...Perl 5 , 66 + 1 (-a) = 67 bajtów
Wypróbuj online!
źródło
Python 2 ,
6961 bajtów- 8 bajtów Wielkie dzięki @muru
Wypróbuj online!
Wyjaśnienie:
Najpierw musimy upewnić się, że po lewej stronie oryginalnej listy jest wystarczająca liczba, jest to osiągnięte przez
x*n+x
część.Na przykład
[2,4,-3,0,4],5
:Następnie odwrócimy listę:
Następnie otrzymujemy odpowiednie bloki dla każdego elementu przez
[len(x)+~i:][:n]
. Wycinek będzie odwrotny, tzn. 2 otrzyma blok:[2,-4,0,-3,4]
co jest odwrotnością oczekiwanego[4,-3,0,-4,2]
, ale przecież potrzebujemy sumy. To działa. :)źródło
x[-n+1:]+x*n
powinienem dać ci listę z wystarczającą dopełnieniem po obu stronach, bez konieczności odwracania (lambda x,n:[sum((x[-n+1:]+x*n)[i:i+n])for i in range(len(x))]
)R ,
1019389 bajtówWypróbuj online!
źródło
K (oK) , 18 bajtów
Rozwiązanie:
Wypróbuj online!
Przykłady:
Wyjaśnienie:
Już miałem opublikować 31-bajtowe rozwiązanie, a potem przypomniałem sobie, że ok ma wbudowane okno przesuwne ...
Premia:
31 bajt rozwiązanie, które działa również w K4 :
źródło