W matematyce jednym ze sposobów ustalenia, jaki typ danej relacji (liniowy, kwadratowy itp.) Jest obliczenie różnic. Aby to zrobić, weź listę wartości y, dla których odstęp między odpowiednimi wartościami x jest taki sam, i odejmij każdą z liczb powyżej, tworząc listę liczb o jedną krótszą niż poprzednia. Jeśli wynikowa lista jest całkowicie złożona z identycznych liczb, wówczas relacja ma różnicę 1 (jest liniowa). Jeśli nie są identyczne, powtórz proces na nowej liście. Jeśli są teraz identyczne, relacja ma różnicę 2 (jest kwadratowa). Jeśli nie są identyczne, po prostu kontynuuj ten proces, aż będą. Na przykład, jeśli masz listę wartości y [1,6,15,28,45,66] do stopniowego zwiększania wartości x:
First Differences:
1
6 1-6 =-5
15 6-15 =-9
28 15-28=-13
45 28-45=-17
66 45-66=-21
Second differences:
-5
-9 -5+9 =4
-13 -9+13 =4
-17 -13+17=4
-21 -17+21=4
As these results are identical, this relation has a difference of 2
Twoje zadanie:
Napisz program lub funkcję, która, gdy otrzyma tablicę liczb całkowitych jako dane wejściowe, zwraca różnicę relacji opisanej przez tablicę, jak wyjaśniono powyżej.
Wkład:
Tablica liczb całkowitych, które mogą mieć dowolną długość> 1.
Wydajność:
Liczba całkowita reprezentująca różnicę relacji opisanej przez dane wejściowe.
Przypadki testowe:
Input => Output
[1,2,3,4,5,6,7,8,9,10] => 1
[1,4,9,16,25,36] => 2
[1,2,1] => 2 (when there is only one value left, all values are automatically identical, so the largest difference an array can have is equal to the length of the array-1)
"Hello World" => undefined behavior (invalid input)
[1,1,1,1,1,1,1,1,1] => 0 (all elements are already identical)
[1, 3, 9, 26, 66, 150, 313, 610] => 6
Punktacja:
To jest golf golfowy , najniższy wynik w bajtach w każdym języku wygrywa dla tego języka. Najniższy wynik ogółem otrzymuje zielony znacznik wyboru.
źródło
[1,2,1]
dać 2?[1,2,1] -> [1,-1] -> [-2]
[1,3,9,26,66,150,313,610]
->6
jeśli chceszOdpowiedzi:
Łuska , 6 bajtów
Dzięki Leo za pozwolenie na użycie jego wersji, która działa
[1,1,1,1,1,1]
Wypróbuj online!
Wyjaśnienie
źródło
[1,1,1,1]
, czy mogę użyć twojego?JavaScript (ES6), 47 bajtów
Przypadki testowe
Pokaż fragment kodu
źródło
MATL , 8 bajtów
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
W ten sposób iteracyjnie obliczane są kolejne różnice, aż wynik będzie zerowy lub pusty. Dane wyjściowe to wymagana liczba iteracji minus 1.
źródło
R ,
5044 bajtówWypróbuj online!
Trwa
diff
odl
, przypisuje mu wartośćl
, i sprawdza, czy wynik zawiera żadnych wartości niezerowe. Jeśli tak, przyrostF
(zainicjowany jakoFALSE
niejawnie) i powracaF*1
do konwersjiFALSE
, aby0
w przypadku, gdy wszyscyl
są już identyczne.źródło
+F
trick na 5 bajtów . Zgrabna odpowiedź btw!Mathematica, 49 bajtów
thanx @alephalpa dla -6 bajtów i @hftf -1 bajt
a oto inne podejście z @hftf
Mathematica, 49 bajtów
źródło
(s=#;t=0;While[UnsameQ@@s,s=Differences@s;t++];t)&
UnsameQ[1,2,1]
to fałsz;!SameQ[1,2,1]
jest prawdziwy. Nie sądzę, instrukcja pętli zapisuje znaki albo:Length@NestWhileList[Differences,#,!SameQ@@#&]-1&
jest już taka sama długość jak ty po wymianieUnsameQ
z!SameQ
.Galaretka , 7 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
IÐĿE€ċ0
Japt ,
107 bajtówWypróbuj online!
Opiera się na tym, że gwarantowany wynik mieści się w zakresie tablicy wejściowej.
Wyjaśnienie
Do końca, ten będzie mapować tablicę
[1, 3, 9, 26, 66, 150, 313, 610]
do[true, true, true, true, true, true, false, false]
,który zawiera
6
true
s.Poprzednia 10 bajtowa wersja
Wypróbuj online!
źródło
Perl 6 , 37 bajtów
Wypróbuj online!
Objaśnienie: Funkcja przyjmuje dane wejściowe jako jedną listę. Następnie buduje sekwencję rekurencyjną w ten sposób: pierwszy element jest oryginalną listą (
$_
), kolejne elementy są zwracane przez{@(@$_ Z- .[1..*])}
wywołanie poprzedniego elementu, i to jest iterowane do momentu spełnienia warunku*.none
, co dzieje się tylko wtedy, gdy lista jest albo puste lub zawiera tylko zera (lub, technicznie rzecz biorąc, inne wartości falsey). Następnie pobieramy listę i odejmujemy od niej 2, co wymusza ją najpierw w kontekście liczbowym (a listy w kontekście numerycznym są równe liczbie ich elementów), a na koniec zwraca 2 mniej niż liczba elementów w lista.Dziwny blok
{@(@$_ Z- .[1..*])}
po prostu bierze podaną listę (.[]
- tak zwany plasterek Zen - indeksowanie pustymi nawiasami daje całą listę), zamyka ją za pomocą operatora minus (Z-
) z tą samą listą bez pierwszego elementu (.[1..*]
) i wymusza na liście (@(...)
- potrzebujemy tego, ponieważ zip zwraca tylko Seq, który jest w zasadzie listą jednokierunkową, którą można powtórzyć tylko raz. Którego nie lubimy.) I to jest to.źródło
@(.[] Z- .[1..*])
na[.[] Z-.[1..*]]
powinna zaoszczędzić dwa bajty.Java 8,
191 + 58 = 249198140 bajtów.Dzięki PunPun1000 za 51 bajtów.
Dzięki Nevay za 58 bajtów.
Wypróbuj online!
Wypróbuj online (wersja 198 bajtów)
To pierwszy raz, kiedy piszę tutaj w PPCG (i po raz pierwszy wykonuję wyzwanie w golfa kodem). Każda konstruktywna krytyka jest mile widziana i doceniana. Starałem się postępować zgodnie z wytycznymi dotyczącymi publikowania, jeśli coś jest nie tak, zachęcamy do zwrócenia na to uwagi.
Wersja upiększona:
źródło
java.util.stream.IntStream k = java.util.Arrays.stream(a);
public
nie musi być uwzględniany w liczbie bajtów. 2) Nie powinieneś akceptować drugiego parametru, ale usunięcie go może faktycznie zaoszczędzić bajty. 3) możesz usunąć niepotrzebne nawiasy klamroweHaskell, 46 bajtów
to po prostu się powtarza -
zipWith(-)l$last l
to lista różnicl
. ig
jest funkcją, która odpowiada na pytanie.źródło
Kotlin , 77 bajtów
pierwszy post, 2 razy próbował edytować ostatnią odpowiedź na kotlin; D
wziął udział w testowaniu od @jrtapsell
TryItOnline
źródło
APL (Dyalog Classic) ,
2217 bajtówWypróbuj online!
Dzięki @ngn za -5 bajtów!
W jaki sposób?
{ ... }
, funkcja1=≢∪⍵:0
, jeśli każdy element jest taki sam w argumencie, zwróć0
1+∇2-/⍵
, w przeciwnym razie zwróć 1+n
różnic (co oznaczan-1
, że dodanie jednego do niej dajen
)źródło
{1=≢∪⍵:0⋄1+∇2-/⍵}
Galaretka , 7 bajtów
Wypróbuj online!
Wyjaśnienie
-1 bajt dzięki Jonathan Allan
źródło
IÐĿEÐḟL
na siedem (widzę, że Miles również znalazł siódemkę za pomocą rekurencji).05AB1E , 7 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript (ES6), 58 bajtów
źródło
Python 2 , 65 bajtów
-7 bajtów dzięki Jonathanowi Allanowi.
Wypróbuj online!
źródło
c
do1
, zmniejszanie, a następnie przy użyciuprint-c
.f=lambda l,c=1:any(l)and f([j-i for i,j in zip(l,l[1:])],c-1)or-c
max(...,0)
zaliczenia[1, 1, 1, 1, ...]
przypadków testowych.Dyalog APL, 19 bajtów
Wyjaśnienie:
źródło
≢-1+∘≢2-/⍣{1=≢∪⍵}⊢
k , 21 bajtów
Działa to w k, ale nie w ok, ponieważ pętla while ok działa przed sprawdzeniem warunku (w przeciwieństwie do pierwszego sprawdzenia warunku, a następnie uruchomienia kodu). Dlatego w ok
1 1 1 1 1
przykład nie będzie działał poprawnie.Wypróbuj ok online!
Wyjaśnienie:
źródło
~&/1_=':
->1<#?
Haskell ,
666160 bajtówWypróbuj online!
Zaoszczędź 5 bajtów dzięki Christian Sievers
Oszczędność 1 bajtu dzięki dumnemu haskellerowi
iterate(z(-))
oblicza listy różnic.or.z(/=)
sprawdza, czy na tych listach nie ma równych elementów.length.takeWhile
zlicza listy różnic z nierównymi elementami.źródło
or.z(/=)
z=(=<<tail).zipWith
jednego bajtu krótszegoJava (OpenJDK 8) ,
9894 bajtówWypróbuj online!
źródło
Japt , 7 bajtów
To samo podejście (ale niezależnie wyprowadzone) jak Justin z inną implementacją.
Sprawdź to
Wyjaśnienie
Domniemane wejście tablicy
U
.Mapuj nad każdym elementem.
Weź każdą sekwencyjną parę (
ä
) elementówU
i zmniejsz ją o różnicę bezwzględną (a
).Ponownie przypisz tę tablicę do
U
.Count (
è
) liczba podtablic, które zwracają wartość true (tzn. Niezerową), gdy zostaną zmniejszone przez dodanie.źródło
TI-Basic, 19 bajtów
Domyślnie zmienne zaczynają się od zera. Poza tym nigdy nie myślałem, że będę używał
IS>(
do czegoś użytecznego.źródło
C # (.NET Core) ,
7069 + 18 bajtów-1 bajt dzięki Kevin Cruijssen
Należy podać 0, aby zadzwonić, aby działać poprawnie. Również uwzględniony w liczbie bajtów:
Wypróbuj online!
Wyjaśnienie:
Wersja iteracyjna 84 + 18 bajtów:
Wypróbuj online!
źródło
(y,z)=>y-z
. Ale fajna odpowiedź, +1 ode mnie.Clojure, 62 bajty
Ładnie
=
może przyjmować dowolną liczbę argumentów, a pojedynczy argument jest identyczny z „samym”.(apply = [1 2 3])
zostaje stracony jako(= 1 2 3)
.źródło
Pyth , 15 bajtów
Sprawdź wszystkie przypadki testowe.
W jaki sposób?
Wyjaśnienie nr 1
źródło
Wtl{Q=hZ=.+Q)Z
WP{Q=hZ=.+Q)Z
. Dzięki!Perl 5 , 83 + 1 (-a) = 84 bajtów
Wypróbuj online!
Wprowadź jako listę liczb oddzielonych jednym spacją.
źródło
Pyke , 11 bajtów
Wypróbuj tutaj!
źródło
Pyth, 10 bajtów
Jeśli możemy indeksować od 1, możemy zapisać bajt, usuwając wiodące
t
.Wypróbuj online
Wyjaśnienie
źródło
Kotlin , 83 bajty
Upiększony
Test
TryItOnline
źródło
lang-kotlin
tylkokotlin
o wskazówki dotyczące zakreślacza.Swift 4 , 90 bajtów
Alternatywne wdrożenie oparte na zamknięciu:
przypadki testowe:
źródło