Сортування та повторне застосування дельтами масиву


11

Здається, що будь-яка Проста Модифікація дельт за допомогою послідовної функції майже завжди може бути виконана іншим більш коротким способом , Денніс . Таким чином, єдине рішення, яке я можу уявити, щоб зробити це важче, - це ввести якусь непослідовну функцію.

Сортування.

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

EG.

Для введення:

1  5 -3  2  9

Отримайте такі дельти:

  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
IMO, ви повинні видалити другий заголовок (той, який знаходиться в тілі самої публікації). Це якось некрасиво і просто займає місце, і це копія заголовка (що приблизно на 20 пікселів вище).
Rɪᴋᴇʀ

Відповіді:




3

Математика, 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

Хаскелл, 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

Пітон 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]

Щасливе кодування!


я намагався знайти спосіб зробити це так!
Кінтопія

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
вівсу

Дякую. Ви можете сказати, що минув час, коли я пограв у пітон, забувши всі стандартні трюки.
Кінтопія

0

Perl 6 , 31 байт

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

Спробуй це

Розширено:

{
  [\+]            # 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 + сортування, 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 + сортування + 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.