Od dłuższego czasu zbierasz dane z Advanced Collecting Device Controller ™ . Sprawdzasz dzienniki i ku swojemu przerażeniu odkrywasz, że coś poszło nie tak: dane zawierają tylko ostatnie bity liczb!
Na szczęście znasz wartość początkową i ta wartość nigdy się nie zmienia szybko. Oznacza to, że możesz odzyskać resztę, znajdując odległość od początku.
Wyzwanie
Napisz program lub funkcję do obliczenia kwoty, którą zmieniła wartość, biorąc pod uwagę moduł N
i listę wartości pośrednich modulo N
.
Zmiana między każdą parą liczb jest zawsze mniejsza niżN/2
, więc dla każdego przypadku testowego będzie tylko jedna poprawna odpowiedź.
Jako dane wejściowe otrzymasz liczbę całkowitą N
> 2 i listę wartości, w wybranym przez ciebie formacie. Dane wejściowe można podawać za pomocą argumentów STDIN, wiersza polecenia lub funkcji.
Wyprowadzisz jedną liczbę całkowitą, kwotę, którą zmieniła pierwotna wartość. Dane wyjściowe można wydrukować do STDOUT lub zwrócić.
Zasady
- Twój program musi działać dla dowolnej odległości i modułu mniejszej niż
2^20
. - Możesz założyć, że:
N
jest przynajmniej3
.- Lista ma co najmniej 2 wartości.
- Wszystkie wartości na liście wynoszą co najmniej 0 i mniej niż
N
. - Wszystkie zmiany liczb są mniejsze niż
N/2
.
- Cokolwiek innego jest niepoprawnym wejściem, a Twój program może robić, co chce.
- Standardowe luki, niestandardowe biblioteki i wbudowane funkcje do tego konkretnego celu są zabronione.
- To jest golf golfowy , więc wygrywa najkrótszy program w bajtach.
Przykładowe przypadki testowe
Wejście:
3
0 1 2 2 0 1 0 2 1 2 0 1 2 1 1
Wynik:
4
Objaśnienie (z przykładową wartością):
Value mod 3: 0 1 2 2 0 1 0 2 1 2 0 1 2 1 1
Value: 0 1 2 2 3 4 3 2 1 2 3 4 5 4 4
Wejście:
10
5 2 8 9 5
Wynik:
-10
Objaśnienie (z przykładową wartością):
Value mod 10: 5 2 8 9 5
Value: 15 12 8 9 5
Nieprawidłowe dane wejściowe:
2
0 0 0 0 0
(zbyt mały moduł)
6
2 5 4 2
(zbyt duża zmiana między 2 a 5)
:^;[5 2 8 9 5](\
?Odpowiedzi:
TI-BASIC, 15 bajtów
Pobiera listę
Ans
i moduł zInput
.źródło
Python 2, 53 bajty
Super prosta odpowiedź. Zastanawiam się, czy istnieje krótsza droga.
źródło
.:_2
generowaniu par, dopóki nie zobaczyłem Twojej odpowiedzi - korzystałem z zip.Mathematica, 30 bajtów
Jest to anonimowa funkcja, która przyjmuje dwa argumenty. Przykładowe użycie:
Działa się biorąc
Differences
między kolejnymi elementami owijanie ich w zakresie-n/2
do+n/2
zMod
i jego przesunięcie parametrów, przy czym łącznie zTr
(ślad macierzy, suma elementów diagonalnych).Zauważ, że nawet bez golfa ma tylko 43 bajty!
źródło
@
nie jest konieczne, gdy już wywołujesz funkcję za pomocą nawiasów kwadratowych. Posiadanie obu jest błędem składni.J, 24 bajty
Stosowanie:
Spróbuję więcej grać w golfa i dodam trochę wyjaśnień.
Wypróbuj online tutaj.
źródło
Pyth,
2019 bajtówUkradł
.:_2
Jakube, pomysł Maurisa.źródło
R, 38 bajtów
Tworzy to nienazwaną funkcję, która przyjmuje liczbę całkowitą i wektor jako dane wejściowe i zwraca jedną liczbę całkowitą. Aby to nazwać, nadaj mu nazwę, np
f=function(n,v)...
.Niegolfowane + wyjaśnienie:
Przykłady:
źródło
MatLab, 33 bajty
Przepraszam, to moja pierwsza odpowiedź na tej stronie. Wpisanie tego w MatLab, a następnie użycie danych wejściowych
ans(modulus_value, [intermediate_values])
zwróci żądaną wartość, gdzie „wartość modułu” to wartość modułu, a „wartości_pośrednie” to lista wartości pośrednich oddzielonych spacjami lub przecinkami.Przykład:
Funkcja anonimowy korzysta z Matlaba
mod
,diff
orazsum
funkcje, aby obliczyć odpowiedź. Najpierw obliczana jest różnica między każdą z wartości pośrednich. Wynik jest następnie kompensowany przez moduł podzielony przez dwa, w wyniku czego powstaje zestaw wartości różnic, które są ograniczone przez [-modulus / 2 moduł / 2]. Wynik jest następnie kompensowany i sumowany ponownie.Myślę, że można to pograć bardziej w golfa, wkrótce wrócę z aktualizacją. Specjalne podziękowania dla @ 2012rcampion za pomysł.
Edycja:
unwrap
Funkcja Matlaba prawie tutaj działa, ale trudno jest grać w golfa. Poniższy kod zwraca tablicę, w której ostatnia wartość jest wartością, którą zmieniła pierwsza wartość:@(x,y)unwrap(y/x*2*pi)/2/pi*x-y(1)
Wartości pośrednie są skalowane do zakresu [-pi pi], a następnie „rozpakowywane” tak, że żadna kolejna wartość nie jest więcej niż pi od siebie. Wartości te są następnie ponownie skalowane i przesuwane, co daje tablicę odległości od wartości początkowej.
Interesujące, ale niezbyt praktyczne dla tego wyzwania: D
źródło
Pyth, 29 bajtów
Wypróbuj online: Pyth Compiler / Executor
źródło
CJam, 27 bajtów
Sprawdź to tutaj.
źródło
Pip , 39 bajtów
Wymaga listy danych jako argumentów wiersza poleceń i modułu STDIN. Jeśli to zbyt duży odcinek, mam wersję, która wymaga dwóch argumentów wiersza polecenia za 5 bajtów więcej.
Wyjaśnienie:
I tylko, aby udowodnić, że ten mało konkurencyjny wynik bardziej odzwierciedla moje umiejętności gry w golfa niż mój język, oto port rozwiązania Python Maurisa w 30 bajtach :
źródło
Galaretka , niekonkurująca
6 bajtów Ta odpowiedź nie konkuruje, ponieważ wyzwanie poprzedza powstanie galaretki.
Wypróbuj online!
Jak to działa
źródło