Сортировка и повторное применение дельт массива


11

Кажется, что любая простая модификация дельт с использованием непротиворечивой функции почти всегда может быть сделана другим, более коротким способом , Денисом . Таким образом, единственное решение, которое я могу себе представить, чтобы сделать это сложнее, это ввести какую-то противоречивую функцию.

Сортировка.

Ваша задача - взять массив целых чисел, отсортировать их дельты и перекомпилировать, чтобы получить новый массив целых чисел.

НАПРИМЕР.

Для ввода:

1  5 -3  2  9

Получите следующие Deltas:

  4 -8  5  7

Затем сортируйте эти дельты, получая:

 -8  4  5  7

И повторно применить их, что дает:

1 -7 -3  2  9

Ввод, вывод

Вам будет предоставлен список / массив / таблица / кортеж / стек / и т. Д. целых чисел со знаком в качестве ввода через любой стандартный метод ввода.

Вы должны вывести измененные данные еще раз в любой приемлемой форме, следуя вышеописанному методу дельта-сортировки.

Вы получите N входов, 0 < N < 10где каждое число попадает в диапазон-1000 < X < 1000

Тестовые случаи

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

Заметки

  • Как указано выше, вы всегда будете получать по крайней мере 1 вход, и не более 9.
  • Первый и последний номер вашего вывода всегда будет совпадать с номером ввода.
  • Только стандартные входные данные принимаются
  • Применяются стандартные лазейки
  • Это , поэтому побеждает самый низкий счетчик байтов!
  • Повеселись!

2
ИМО вы должны удалить второй заголовок (тот, что в теле самого поста). Это некрасиво и просто занимает место, и это копия заголовка (который как 20 пикселей над ним).
Rɪᴋᴇʀ

Ответы:




3

Mathematica, 40 байт

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

Чистая функция, принимающая список (что угодно) в качестве входных данных и возвращающая список. FoldList[Plusначинается с числа (в данном случае #&@@#это первый элемент ввода) и многократно добавляет элементы списка, требующего пояснения Sort@Differences@#. Это имитирует поведение встроенного Accumulate, но первое число должно быть добавлено вручную к списку различий вручную, что увеличивает количество байтов (насколько я могу судить).



2

Python 2, 92 байта

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

2

Haskell, 59 байт

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

Сломать:

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

2
scanl(+)a$sort...
Ними

2

JavaScript (ES6), 68 байт

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

В JavaScript оказывается, что лучше вычислять обратные дельты массива . Затем они сортируются в порядке убывания и кумулятивно вычитаются из первого элемента.


2

Python 2 ,

90 байт

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

84 байта

Сохранено 6 байт при использовании лямбды. Благодаря овс!

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

Попробуйте онлайн!

Сломать код,

>>> 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]

Удачного кодирования!


Я пытался найти способ сделать это так!
Quintopia

1
Вы можете сохранить несколько байтов, преобразовав это в функцию:lambda x:[sum(sorted(map(int.__sub__,x[1:],x[:-1]))[:i])+x[0]for i in range(len(x))]
ovs

1

JavaScript (ES6), 93 байта

(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]


1

Pyth, 11 байт

.u+NYS.+QhQ

Это просто делает очевидную вещь, описанную в заявлении.

Попробуйте онлайн

      .+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

Предложения по дальнейшей игре в гольф приветствуются.



1

PHP, 89 байт

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

Запустите так:

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_

объяснение

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.

1

Python 2 с NumPy, 67 56 байт

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

Позвольте numpy вычислить дельты, отсортировать их, добавить первый элемент и позволить numpy вычислить кумулятивные суммы. Довольно дешево?


1
Сохранить 3 байта путем изменения импорта в from numpy import*и n.cumsumк cumsumи n.diffкdiff
овсу

Спасибо. Вы можете сказать, что это было давно, так как я играл в гольф на питоне, забыв обо всех стандартных хитростях.
Quintopia

0

Perl 6 , 31 байт

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

Попробуй

Expanded:

{
  [\+]            # 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
}

0

Пакет, 197 байт

@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 не сортирует по численности, поэтому я смещаю все различия на 5000.


0

bash + sort, 102 байта

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 байт

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

0

Clojure, 46 байтов

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

Однажды я собираюсь создать язык Cljr, который имеет более короткие имена функций, чем Clojure.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.