Krótko mówiąc, to wyzwanie.
Otrzymasz 4 liczby: p1, p2, p3 i p4.
Magiczną sumę liczb definiuje się w następujący sposób:
magic_sum = |p1 - p2| + |p2 - p3| + |p3 - p4| + |p4 - p1|
Możesz zmienić tylko jedną z powyższych wartości całkowitych (p1, p2, p3 lub p4). Musisz zmienić wartość tak, aby magiczna suma wartości osiągnęła wartość minimalną.
Na przykład:
p1, p2, p3, p4 = 17, -6, 15, 33. W tym przypadku wartość magicznej sumy wynosi 78.
Możesz zmienić tutaj -6 na 16, a wartość magicznej sumy wyniesie 36, co jest minimalną możliwą do osiągnięcia wartością.
Pamiętaj, że liczby mogą być dodatnimi lub ujemnymi liczbami całkowitymi.
To jest golf golfowy, więc wygrywa najmniej bajtów kodu. Punkty Brownie za używanie języka praktycznego zamiast języka rekreacyjnego. Niech czwarty będzie z tobą.
Powtarzać:
Próbka 1
Wejście 1
17 -6 15 33
Wyjście 1
36
Wyjaśnienie 1
-6 można zastąpić 16, co daje nam minimalną możliwą do osiągnięcia sumę magii.
Próbka 2
Wejście 2
10 10 10 10
Wyjście 2
0 or 2
albo jest do przyjęcia
Wyjaśnienie 2
Minimalna osiągalna suma magiczna wynosi 0, ponieważ minimalna suma 4 dodatnich liczb całkowitych wynosi 0. Jeśli liczba musi zostać zmieniona, wówczas jedną z 10 można zmienić na 9, uzyskując w ten sposób wynik 2.
Próbka 3
Wejście 3
1 2 3 4
Wyjście 3
4
Wyjaśnienie 3
Wkład sam w sobie daje 6 jako magiczną sumę. Zmieniamy 4 na 1 i osiągamy minimalną sumę magiczną, która wynosi 4.
źródło
+1
ode mnie.Odpowiedzi:
Galaretka , 6 bajtów
Wypróbuj online!
Port mojej odpowiedzi w języku Python .
źródło
Python 2 , 44 bajty
Wypróbuj online!
Sortuje wejście jak
a,b,c,d,
w porządku rosnącym, bierze mniejszy odc-a
ad-b
, i podwaja się. Dlaczego to działa?Po pierwsze, zauważmy, że kiedy zmieniamy element, aby zmaksymalizować do całkowitej cyklicznej sumy odległości, optymalne (lub powiązane z optymalnym) jest to, aby zmienić go na równego sąsiadowi, np
17, -6, 15, 33 -> 17, 17, 15, 33
. Jest tak, ponieważ jego nowa całkowita odległość do lewego i prawego cyklicznego sąsiada jest co najmniej odległością między tymi sąsiadami, więc wyrównanie ich jest najlepszym, co możemy zrobić.Teraz usunięcie jednej z dwóch sąsiadujących kopii liczby daje tę samą cykliczną sumę odległości. W tym przykładzie jest to
17, 15, 33
podawanie odległości2 + 18 + 16
. Zamiast zastępować jedną z czterech liczb, wystarczy ją usunąć, pozostawiając trzy liczby i użyć sumy ich cyklicznych odległości.Zauważ, że przy 3 liczbach największy dystans jest sumą dwóch mniejszych. Dzieje się tak, ponieważ jeśli posortujemy liczby, które mają mieć
a ≤ b ≤ c
, to|a - c| = |a - b| + |b - c|
. Innymi słowy, podróżujemy między największą i najmniejszą liczbą dwa razy, wykorzystując średnią liczbę jako pit stop jeden raz. Tak więc suma trzech odległości jest tylko dwa razy większa od odległości między minimum a maksimum, więc(c-a)*2
.Tak więc pytanie brzmi, którą liczbę usuwamy, aby uzyskać najmniejszą odległość między minimum a maksimum z trzech pozostałych liczb. Oczywiście usuwamy najmniejszą lub największą z liczb. Wywoływanie ich
a, b, c, d
w posortowanej kolejności, usuwaniea
liścid - b
i usuwanied
liścic - a
, a końcowy wynik jest podwójny, w zależności od tego, która wartość jest mniejsza.źródło
p1
za pośrednictwemp5
, i nadal dozwolone tylko zmienia jeden numer? Czterocyfrowy numer wydaje się zbyt łatwy (dopiero po zobaczeniu twojej odpowiedzi).R ,
6633 bajtówWypróbuj online!
Znacznie krócej dzięki algorytmowi xnor (przeczytaj ich wyjaśnienie i oceń swój wpis!).
Stara wersja:
R , 66 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako wektor 4 liczb całkowitych.
Działa to, ponieważ minimum można osiągnąć, ustawiając jedną z liczb jako równą jednemu z sąsiadów (nie jest to jedyny sposób osiągnięcia minimum). Aby zobaczyć, dlaczego tak jest, znajdź konfigurację, która osiąga minimum; powiedzmy, że zmieniliśmy . Każda wartość taka, że da tę samą sumę ( pozostaje stała), więc możemy wybrać .p2 p2 p1≤p2≤p3 |p1−p2|+|p2−p3| p2=p1
Istnieją 4 sposoby wyboru liczby, którą zmieniamy; dla każdego z nich musimy tylko obliczyć sumę 3 różnic bezwzględnych.
Kod ustawia wartości w macierzy , gdzie każda kolumna reprezentuje podzbiór rozmiaru 3 z 4 liczb. Skopiuj pierwszy wiersz do czwartego wiersza i oblicz różnice bezwzględne, a następnie weź minimum sumy kolumn.3×4
rbind
źródło
Galaretka ,
1110 bajtówWypróbuj online!
Łącze monadyczne, które pobiera listę, jeśli dane wejściowe są liczbami całkowitymi. Powinien działać na dowolny rozmiar listy. Działa na podstawie tego, że minimalną sumę można uzyskać, testując usunięcie każdej liczby z listy, obliczając sumę magiczną i biorąc minimum.
źródło
Galaretka , 8 bajtów
Monadyczny link akceptujący listę liczb całkowitych *, który daje liczbę całkowitą
* może być dowolną liczbą, o ile jest ich więcej niż 1; używając magicznej formuły w tym samym stylu, sumując otaczające się różnice sąsiadów.
Wypróbuj online!
W jaki sposób?
źródło
Japt
-Q
, 11 bajtówWykorzystuje algorytm @ xnor, który oszczędził mi 4 bajty.
Zaoszczędź 5 bajtów dzięki @Shaggy
Spróbuj
źródło
ÃÃ
go nową linią.J ,
24201817 bajtówalternatywna wersja wykorzystująca algorytm xnor:
w jaki sposób
Dwa razy
2 *
min[:<./
. 2. rzędu odjęty od pierwszego rzędu[:-/
macierzy 2x2 utworzonego przez ukształtowanie2 2$
posortowanego sortowania w dół\:~
Wypróbuj online!
oryginalna odpowiedź: J , 24 bajty
Wypróbuj online!
Wykorzystując pomysł Nicka Kennedy'ego.
1(...)\.]
zastosuj czasownik w parens do wszystkich outfiksów o długości 1 (outfix o długości n jest listą z n usuniętymi ciągłymi elementami, więc powstaje każda możliwa lista z usuniętym 1 wiązem)(1 #. 2 |@-/\ ] , {.)
oblicza to sumę magiczną, dodając pierwszy wiąz do wejścia] , {.
i stosując różnicę abs|@-/
do przyrostków o długości 22 ...\
i sumując wynik1 #.
.[:<./
zwraca minźródło
05AB1E ,
117 bajtówOdpowiedź Portu @xnor 's Jelly .
-4 bajty dzięki @Emigna i @Grimy .
Wypróbuj online.
7 bajtów alternatywę , która działa tylko w starszej wersji 05AB1E (wymagałaby
€
zanim¥
w nowej wersji):Wypróbuj online.
Wyjaśnienie:
źródło
{2ôø¥W·
lub 8 z€
w przepisaniu.{2ô`αW·
C ++ (gcc)
pełny program: 138 bajtów
Wypróbuj online!
funkcja podstawowa: 84 bajty
Wypróbuj online!
Również za pomocą algorytmu xnor wyjaśnionego w jego poście w języku Python 2.
źródło
Węgiel drzewny , 20 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Okazuje się, że korzystam z pomysłu @ NickKennedy. Wyjaśnienie:
źródło
JavaScript (ES6), 51 bajtów
Używając znacznie bardziej sprytnej metody xnor :
Wypróbuj online!
Oryginalna odpowiedź, 96 bajtów
Pobiera dane wejściowe jako tablicę 4 liczb całkowitych.
Prawdopodobniezdecydowanie nie najkrótsze podejście.Wypróbuj online!
źródło
Wolfram Language (Mathematica) , 29 bajtów
Port algorytmu @ xnor
Wypróbuj online!
źródło
Java 8 , 235 bajtów
Port odpowiedzi i algorytmu Python @ xnor
Wypróbuj online!
Java 10 , niesprawdzony, 222 bajty
W Javie 10 powinienem być w stanie zamienić lewą stronę deklaracji skanera na
var
, chociaż nie mogłem go skompilować online, dlatego mogę go dodać tylko jako ciekawostkę. Przepraszam.źródło