Sortuj i ponownie stosuj delty tablicy

11

Wygląda na to, że jakakolwiek prosta modyfikacja delt przy użyciu spójnej funkcji może być prawie zawsze wykonana inną, krótszą drogą , Dennis . Zatem jedynym rozwiązaniem, jakie mogę sobie wyobrazić, by to utrudnić, jest wprowadzenie jakiejś niespójnej funkcji.

Sortowanie.

Twoim zadaniem jest pobranie tablicy liczb całkowitych, posortowanie ich delt i ponowne skompilowanie, aby uzyskać nową tablicę liczb całkowitych.

NA PRZYKŁAD.

Dla danych wejściowych:

1  5 -3  2  9

Uzyskaj następujące delty:

  4 -8  5  7

Następnie posortuj te delty, Wydajność:

 -8  4  5  7

I zastosuj je ponownie, co daje:

1 -7 -3  2  9

Wejście wyjście

Otrzymasz listę / tablicę / tabelę / krotkę / stos / itp. liczb całkowitych ze znakiem jako danych wejściowych dowolną standardową metodą wprowadzania.

Zmodyfikowane dane należy ponownie wyprowadzić w dowolnej akceptowalnej formie, zgodnie z powyższą metodą sortowania delta.

Otrzymasz N danych wejściowych, w 0 < N < 10których każda liczba mieści się w zakresie-1000 < X < 1000

Przypadki testowe

1 5 -3 2 9   -> 1 -7 -3 2 9
-5 -1 -6 5 8 -> -5 -10 -7 -3 8
-8 1 -7 1 1  -> -8 -16 -16 -8 1
8 -9 3 0 -2  -> 8 -9 -12 -14 -2
-5 -2 -5 5 0 -> -5 -10 -13 -10 0
-1 9 -1 -7 9 -> -1 -11 -17 -7 9

Notatki

  • Jak wspomniano powyżej, zawsze otrzymasz co najmniej 1 wkład, a nie więcej niż 9.
  • Pierwsza i ostatnia liczba danych wyjściowych zawsze będzie zgodna z wartością wejściową.
  • Akceptowane jest tylko standardowe wyjście wejściowe
  • Standardowe luki zastosowanie
  • To jest , więc wygrywa najmniejsza liczba bajtów!
  • Baw się dobrze!
ATaco
źródło
2
IMO powinieneś usunąć drugi nagłówek (ten w treści samego postu). Jest to trochę brzydkie i zajmuje tylko miejsce, i jest kopią tytułu (który jest jak 20 pikseli nad nim).
Rɪᴋᴇʀ

Odpowiedzi:

4

Galaretka , 7 bajtów

IṢ;@Ḣ+\

Wypróbuj online!

Jak to działa

IṢ;@Ḣ+\  Main link. Argument: A (array)

I        Increments; compute the deltas.
 Ṣ       Sort them.
    Ḣ    Head; pop and yield the first element of A.
  ;@     Concatenate with swapped arguments.
     +\  Take the cumulative sum.
Dennis
źródło
5

MATL , 8 bajtów

1)GdShYs

Wypróbuj online!

1)   % Implicit input. Get its first entry
G    % Push input again
d    % Differences
S    % Sort
h    % Concatenate
Ys   % Cumulative sum. Implicit display
Luis Mendo
źródło
3

Mathematica, 40 bajtów

FoldList[Plus,#&@@#,Sort@Differences@#]&

Czysta funkcja przyjmuje listę (dowolnych elementów) jako dane wejściowe i zwraca listę. FoldList[Pluszaczyna się od liczby (w tym przypadku, #&@@#pierwszego elementu wejścia) i wielokrotnie dodaje elementy listy, która nie wymaga wyjaśnień Sort@Differences@#. To naśladuje zachowanie wbudowanego Accumulate, ale pierwsza liczba musiałaby zostać ręcznie dodana do listy różnic ręcznie, co zwiększa liczbę bajtów (o ile wiem).

Greg Martin
źródło
3

05AB1E , 9 bajtów

-4 dzięki Emignie

¬=s¥{vy+=

Wypróbuj online!

¬         # Get the head
 =        # Print
  s¥{     # Get sorted Deltas
     vy   # For each
       += # Add to the previous value and print
Riley
źródło
Możesz zapisać 4 bajty za pomocą¬=s¥{vy+=
Emigna
2

Python 2, 92 bajty

l=input();p=0;d=[]
r=l[0],
for e in l:d+=e-p,;p=e
for e in sorted(d[1:]):r+=r[-1]+e,
print r
orlp
źródło
2

Haskell, 59 bajtów

import Data.List
f l@(a:b)=scanl1(+)$a:(sort$zipWith(-)b l)

Awaria:

f l@(a:b) =           --we create a function f that takes as input a list l with head a and tail b
zipWith(-)b l        --we make a new list with the deltas
sort$                    --sort it
a:                          --prepend a to the list
scanl1(+)$          --create a new list starting with a and adding the deltas to it cumulatively
Ogólna nazwa wyświetlana
źródło
2
scanl(+)a$sort...
nimi
2

JavaScript (ES6), 68 bajtów

([p,...a])=>[s=p,...a.map(e=>p-(p=e)).sort((a,b)=>b-a).map(e=>s-=e)]

W JavaScript okazuje się, że golfistą jest obliczanie odwrotnych delt tablicy . Są one następnie sortowane w kolejności malejącej i kumulatywnie odejmowane od pierwszego elementu.

Neil
źródło
2

Python 2 ,

90 bajtów

x=input()
print[sum(sorted(map(int.__sub__,x[1:],x[:-1]))[:i])+x[0]for i in range(len(x))]

84 bajtów

Zaoszczędzono 6 bajtów przy użyciu lambda. Dzięki ovs!

lambda x:[sum(sorted(map(int.__sub__,x[1:],x[:-1]))[:i])+x[0]for i in range(len(x))]

Wypróbuj online!

Rozbijając kod,

>>> x
[1, 5, -3, 2, 9]
>>> map(int.__sub__,x[1:],x[:-1]) #delta
[4, -8, 5, 7]
>>> sorted(map(int.__sub__,x[1:],x[:-1])) #sorted result
[-8, 4, 5, 7]
>>> [sorted(map(int.__sub__,x[1:],x[:-1]))[:i]for i in range(len(x))]
[[], [-8], [-8, 4], [-8, 4, 5], [-8, 4, 5, 7]]
>>> [sum(sorted(map(int.__sub__,x[1:],x[:-1]))[:i])+x[0]for i in range(len(x))]
[1, -7, -3, 2, 9]

Happy Coding!

Keerthana Prabhakaran
źródło
próbowałem znaleźć sposób, aby to zrobić w ten sposób!
kwintopia
1
Możesz zaoszczędzić kilka bajtów, przekształcając je w funkcję:lambda x:[sum(sorted(map(int.__sub__,x[1:],x[:-1]))[:i])+x[0]for i in range(len(x))]
ov
1

JavaScript (ES6), 93 bajty

(p,M=[p[0]])=>p.map((a,b)=>p[b+1]-a).sort((a,b)=>a-b).map((a,b)=>M=[...M,M[b]+a])[p.length-2]
R. Kap
źródło
1

Python 2 , 97 bajtów

p=input()
d=[p[i+1]-p[i] for i in range(len(p)-1)]
o=p[:1]
for n in sorted(d):o+=o[-1]+n,
print o

Wypróbuj online!

Pręt
źródło
Możesz usunąć spację na liście dla 96 bajtów:[p[i+1]-p[i]for i in range(len(p)-1)]
sagiksp
1

Pyth, 11 bajtów

.u+NYS.+QhQ

To właśnie robi oczywistą rzecz opisaną w oświadczeniu.

Wypróbuj online

      .+Q    Take the deltas of the input
     S       sort it
.u           Cumulative reduce
  +NY        using addition
         hQ  starting with the first element of the input

Sugestie dotyczące dalszego golfa mile widziane.

kwintopia
źródło
1

PHP, 89 bajtów

for($a=$argv;n|$i=$a[++$x+1];)$d[]=$i-$a[$x];for(sort($d);$x-$y++;)echo$a[1]+=$d[$y-2],_;

Uruchom tak:

php -nr 'for($a=$argv;n|$i=$a[++$x+1];)$d[]=$i-$a[$x];for(sort($d);$x-$y++;)echo$a[1]+=$d[$y-2],",";' 1  5 -3  2  9;echo
> 1_-7_-3_2_9_

Wyjaśnienie

for(
  $a=$argv;          # Set input to $a.
  n | $i=$a[++$x+1]; # Iterate over input.
)
  $d[] = $i-$a[$x];  # Add an item to array $d, with the difference between
                       the current and previous item.

for(
  sort($d);          # Sort the delta array.
  $x-$y++;           # Loop as many times as the previous loop.
)
  echo
    $a[1]+=$d[$y-2], # Print the first input item with the delta applied
                     # cumulatively. First iteration takes $d[-1], which
                     # is unset, so results in 0.
    _;               # Print underscore as separator.
aross
źródło
1

Python 2 z numpy, 67 56 bajtów

from numpy import*
lambda l:cumsum(l[:1]+sorted(diff(l)))

Pozwól numpy obliczyć delty, posortuj je, wstaw pierwszy element i pozwól numpy obliczyć sumy sumaryczne. Całkiem tania?

kwintopia
źródło
1
Zapisz 3 bajtach zmieniając przywóz do from numpy import*i n.cumsumdo cumsumi n.diffdodiff
OVS
Dzięki. Możesz powiedzieć, że minęło trochę czasu, odkąd grałem w Pythona, zapominając o wszystkich standardowych trikach.
kwintopia
0

Perl 6 , 31 bajtów

{[\+] @_[0],|sort @_[1..*]Z-@_}

Spróbuj

Rozszerzony:

{
  [\+]            # triangle produce values using &infix<+>
    @_[0],        # starting with the first argument
    |             # slip the following into this list
      sort        # sort the following

         # generate the list of deltas

         @_[1..*] # the arguments starting with the second one
         Z[-]     # zipped using &infix:<->
         @_       # the arguments
}
Brad Gilbert b2gills
źródło
0

Partia, 197 bajtów

@set n=%1
@set s=
:l
@set/ad=5000+%2-%1
@set s=%s% %d%
@shift
@if not "%2"=="" goto l
@echo %n%
@for /f %%a in ('"(for %%b in (%s%)do @echo %%b)|sort"') do @set/an+=%%a-5000&call echo %%n%%

sort nie sortuje liczbowo, więc odchylam wszystkie różnice o 5000.

Neil
źródło
0

bash + sort, 102 bajty

echo $1
n=$1
shift
for e in $*
do
echo $((e-n))
n=$e
done|sort -n|while read e
do
echo $((n+=e))
done

sh + sort + expr, 106 bajtów

echo $1
n=$1
shift
for e in $*
do
expr $e - $n
n=$e
done|sort -n|while read e
do
n="$n + $e"
expr $n
done
Neil
źródło
0

Clojure, 46 bajtów

#(reductions +(first %)(sort(map -(rest %)%)))

Pewnego dnia zamierzam stworzyć język Cljr, który ma krótsze nazwy funkcji niż Clojure.

NikoNyrh
źródło