配列のデルタの並べ替えと再適用


11

どのように見えるシンプルな 改変一貫性のある機能を使用してデルタのはほとんど常に他のいくつかの行うことができます短い デニスを。したがって、これをより難しくすることを想像できる唯一の解決策は、ある種の一貫性のない機能を導入することです。

並べ替え。

あなたの仕事は、整数の配列を受け取り、それらのデルタをソートし、それを再コンパイルして新しい整数の配列を与えることです。

例えば。

入力用:

1  5 -3  2  9

次のデルタを取得します。

  4 -8  5  7

次に、これらのデルタを並べ替え、降伏:

 -8  4  5  7

そして、それらを再適用します:

1 -7 -3  2  9

入出力

list / array / table / tuple / stack / etcが与えられます。任意の標準入力メソッドを介した入力としての符号付き整数の。

上記のデルタソート方法に従って、変更されたデータを受け入れ可能な形式でもう一度出力する必要があります。

0 < N < 10各数値が範囲内にあるN個の入力を受け取ります-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では、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...
-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では、配列の逆デルタを計算する方がゴルファーです。これらは降順でソートされ、最初の要素から累積的に減算されます。


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バイトを節約しました。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]

ハッピーコーディング!


私はそのようにする方法を見つけようとしていました!
キントピア

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

numpyのではPython 2、67の 56バイト

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

numpyにデルタを計算させ、ソートし、最初の要素を追加して、numpyに累積合計を計算させます。かなり安い?


1
輸入を変更することにより、3バイトの保存from numpy import*n.cumsumするcumsumn.diffdiff
OVS

ありがとう。私がpythonをゴルフしてからしばらく経ちましたが、すべての標準的なトリックを忘れています。
キントピア


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言語を作成します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.