Siła grawitacyjna jest siłą, która przyciąga dowolne dwa obiekty masą. W tym wyzwaniu naszymi obiektami będą Liczby, a ich masa będzie ich wartością. Aby to zrobić, nie dbamy o siłę siły, ale o jej kierunek.
Wyobraź sobie ten zestaw liczb
[1 6 9 4 6 9 7 6 4 4 9 8 7]
Każdy z nich tworzy siłę między sobą a sąsiednimi liczbami. W niektórych warunkach spowoduje to przyciągnięcie (przesunięcie) innej liczby w kierunku liczby. Gdy liczba jest większa niż sąsiednia, przyciąga ją. Rzućmy okiem na nasz poprzedni przykład:
[1 → 6 → 9 ← 4 6 → 9 ← 7 ← 6 ← 4 4 → 9 ← 8 ← 7]
Liczba 1
nie jest wystarczająco duża, aby ją przenieść 6
, ale liczba 6
jest itd. Zasadniczo liczby są przenoszone do największej liczby sąsiedniej (również większej niż sama liczba). Jeśli obie sąsiednie liczby są równe, nie jest to przyciągane. Dzieje się tak również wtedy, gdy liczba i sąsiednie są równe.
Ma to jedynie na celu pokazanie atrakcji, ale co się potem stanie? Liczby, które kolidują z powodu przyciągania, są sumowane:
[20 32 28]
Zasadniczo więc wyzwaniem jest, biorąc pod uwagę zestaw liczb, wyprowadzić wynik przyciągniętego zestawu liczb.
Przykład 1
Input => [10 15 20 10 20 10 10]
[10 → 15 → 20 10 20 ← 10 10]
Output => [45 10 30 10]
Przykład 2
Input => [9 9 9 9 8 1 8]
[9 9 9 9 ← 8 1 8]
Output => [9 9 9 17 1 8]
Przykład 3
Input => [1 6 9 4 6 9 7 6 4 4 9 8 7]
[1 → 6 → 9 ← 4 6 → 9 ← 7 ← 6 ← 4 4 → 9 ← 8 ← 7]
Output => [20 32 28]
Przykład 4
Input => [1 2 3 2 1]
[1 → 2 → 3 ← 2 ← 1]
Output => [9]
Przykład 5
Input => [1]
Output => [1]
Przykład 6
Input => [1 1]
Output => [1 1]
Przykład 7
Input => [2 1 4]
Output => [2 5]
Notatki
- Atrakcja dzieje się tylko raz
- Liczby nie są przyciągane do nieprzylegających liczb
- Zbiór liczb będzie zawierał wyłącznie liczby całkowite dodatnie
[1 3 5 4 2]
= 15?G*M*m / r^2
jest równa dla obu ciał. Lżejszy porusza się bardziej niż cięższy z powodu pędu, a nie z powodu braku przyciągania. Może powiedz „1 nie jest wystarczająco duży, aby przenieść 6”.Odpowiedzi:
JavaScript (ES6),
106 104100 bajtówZaoszczędzono 2 bajty dzięki @Shaggy
Wypróbuj online!
Skomentował
Najpierw aktualizujemy oryginalną tablicę wejściową,0
a[]
wykonując iterację na jej kopii. Podczas tego kroku wszystkie wartości „przyciągane” przez inne są ustawiane na .Ponieważ tablica jest analizowana od lewej do prawej, możemy po prostu dodać do ilekroć wartość jest przyciągana przez jej prawego sąsiada.zaja zai + 1
Przykład: zamienia się w a następnie .4 → 5 → 6 [ 0 , 9 , 6 ] [ 0 , 0 , 15 ]
Ale kiedy lewy sąsiad przyciąga kilka wartości z rzędu, musimy dodać do pierwszego atraktora tej sekwencji (z ) zamiast po prostu .zaja zak k < i zai - 1
Przykład: zamienia się w a następnie .6 ← 5 ← 4 [ 11 , 0 , 4 ] [ 15 , 0 , 0 ]
Następnie odfiltrowujemy wszystkie wpisy równe .0
źródło
[1,3,5,3,1,2,1]
i wyszedł[14,2]
, ale faktycznie działa poprawnie i wyprowadza[13,3]
.Stax ,
27252318 bajtówUruchom i debuguj
Dane wyjściowe są oddzielone znakami nowej linii.
Ten program działa na sąsiednich parach w macierzy i określa, czy należy zastosować podział między nimi za pomocą tej procedury.
Rozważ jakieś arbitralne dane wejściowe
[... w x y z ...]
. Oto jak ustalić, czy powinien istnieć podział nax
iy
.x == y
tak, to tak.x > y
, to iffz >= x
.y > x
, to iffw >= y
.Podsumowanie pozostawia się jako ćwiczenie.
źródło
Retina 0.8.2 , 64 bajty
Wypróbuj online! Link zawiera pakiet testowy. Wyjaśnienie:
Konwertuj na unary.
Usuń separatory między przyciągniętymi liczbami.
(?<=(1+))
ustawia\1
liczbę przed separatorem. Po separatorze występują dwa przypadki:W takich przypadkach istnieje przyciąganie między dwiema liczbami, a usunięcie separatora powoduje zderzenie liczb, łącząc je ze sobą.
Konwertuj na dziesiętny.
źródło
Galaretka , 23 bajty
Wypróbuj online!
Monadyczny link, który przyjmuje listę liczb całkowitych jako argument i zwraca listę liczb całkowitych.
Wyjaśnienie
Inspiracje zaczerpnięte z odpowiedzi Stax na @ recursive .
źródło
C (gcc) , 111 bajtów
Wypróbuj online!
Przyjmuje tablicę liczb całkowitych zakończonych zerem.
Wyjaśnienie
źródło
Python 2 , 162 bajty
Wypróbuj online!
źródło
J , 45 bajtów
Wypróbuj online!
Zainspirowany oryginalną odpowiedzią Stax na rekurencyjne
źródło
R ,
222196173 bajtówOto rozwiązanie z pewną pomocą Robin Ryder
Wypróbuj online!
Krótki zestaw komentarzy
źródło
sign(e)
zamiast(e>0)-(e<0)
{}
pętla for jest niepotrzebna, ponieważ w pętli znajduje się tylko jedna instrukcja.y
.m
jest to wartość logicznaPython,
114112 bajtówWykorzystuje to fakt, że kierunek strzałki nie ma znaczenia i że obecność strzałki między [i] a [i + 1] można określić, patrząc na zakres czterech elementów a [i- 1: i + 3].
Edycja: Dziękuję Jo King za wyjaśnienie zasad
źródło
Perl 5 ,
156147 bajtówWypróbuj online!
źródło
K (ngn / k) , 46 bajtów
Wypróbuj online!
0,x,0
otaczaj argument zerami3'
trojaczki kolejnych pozycji{
}'
dla każdegox 2 0
zdobądź ostatni i pierwszy z obecnej trypletu -x[2]
ix[0]
. są to sąsiedzix[1]
, na których trójka jest wyśrodkowanax<\:
porównaj używając mniej niż z każdym z obecnych trypletów+/
suma. wynikiem jest para odpowiadającax[2]
ix[0]
2=
sprawdź, czy któryś z sąsiadów jest większy niż pozostałe 2 elementyx
, zwróć parę boolanów 0 lub 1-/
odejmij je. wynik -1 oznaczax[1]
przyciągnięcie w lewo, 1 w prawo, a 0 oznacza, że pozostaje na miejscu(!#x)+
dodaj 0 do pierwszego elementu, 1 do drugiego itd. To oblicza wskaźniki, do których przyciągane są przedmioty{x x}/
indeksować się do konwergencji. wynikiem są efektywne wskaźniki, do których ostatecznie przyciągany jest każdy przedmiotx@.=
grupax
(oryginalny argument) według tych. wynikiem jest lista list+/'
zsumuj każdyźródło
Clojure ,
299252 bajtówWypróbuj online!
Wyjaśnienie:
źródło
APL (Dyalog Classic) ,
5251 bajtówWypróbuj online!
tłumaczenie mojej odpowiedzi k
źródło
05AB1E , 21 bajtów
Wypróbuj online!
źródło