排序并重新应用阵列的增量


11

看来,任何简单的 修改使用一致的功能三角洲的几乎总是可以做一些其他的更短的 方式丹尼斯。因此,我能想到的唯一使它变得更困难的解决方案是引入某种不一致的功能。

排序。

您的任务是获取一个整数数组,对它们的增量进行排序,然后重新编译以提供新的整数数组。

例如。

对于输入:

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ɪᴋᴇʀ

Answers:


4

果冻,7个字节

IṢ;@Ḣ+\

在线尝试!

这个怎么运作

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.


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

2

JavaScript(ES6),68个字节

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

在JavaScript中,计算Array反向Delta变得更加困难。然后将它们按降序排序,并从第一个元素中累计减去。


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字节

使用lambda节省了6个字节。感谢ovs!

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's

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

Python 2,97字节

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

在线尝试!


您可以删除列表理解中的96个字节的空间:[p[i+1]-p[i]for i in range(len(p)-1)]
sagiksp

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.cumsumcumsumn.diffdiff
OVS

谢谢。您可以说自从我打python以来已经有一段时间了,而忘记了所有标准技巧。
quintopia's

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 + 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 %)%)))

有一天,我将使用比Clojure函数名称短的Cljr语言。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.