Trier et réappliquer les deltas d'un tableau

11

Il semble que toute modification simple de deltas utilisant une fonction cohérente puisse presque toujours être effectuée d'une autre manière plus courte , Dennis . Ainsi, la seule solution que je peux imaginer pour rendre cela plus difficile, est d'introduire une sorte de fonction incohérente.

Tri.

Votre tâche consiste à prendre un tableau d'entiers, à trier leurs deltas et à le recompiler pour donner le nouveau tableau d'entiers.

PAR EXEMPLE.

Pour l'entrée:

1  5 -3  2  9

Obtenez les deltas suivants:

  4 -8  5  7

Ensuite, triez ces deltas, cédant:

 -8  4  5  7

Et réappliquez-les, ce qui donne:

1 -7 -3  2  9

Entrée sortie

Vous recevrez une liste / tableau / table / tuple / pile / etc. des entiers signés en entrée via toute méthode d'entrée standard.

Vous devez à nouveau générer les données modifiées sous toute forme acceptable, en suivant la méthode de tri delta ci-dessus.

Vous recevrez N entrées 0 < N < 10où chaque numéro se situe dans la plage-1000 < X < 1000

Cas de test

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

Remarques

  • Comme indiqué ci-dessus, vous recevrez toujours au moins 1 entrée et pas plus de 9.
  • Le premier et le dernier numéro de votre sortie correspondront toujours à celui de l'entrée.
  • Seule la sortie d'entrée standard est acceptée
  • Des échappatoires standard s'appliquent
  • C'est le , donc le nombre d'octets le plus bas gagne!
  • S'amuser!
ATaco
la source
2
OMI, vous devez supprimer le deuxième en-tête (celui du corps du message lui-même). C'est un peu moche et prend juste de la place, et c'est une copie du titre (qui est comme 20 px au-dessus).
Rɪᴋᴇʀ

Réponses:

4

Gelée , 7 octets

IṢ;@Ḣ+\

Essayez-le en ligne!

Comment ça fonctionne

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
la source
5

MATL , 8 octets

1)GdShYs

Essayez-le en ligne!

1)   % Implicit input. Get its first entry
G    % Push input again
d    % Differences
S    % Sort
h    % Concatenate
Ys   % Cumulative sum. Implicit display
Luis Mendo
la source
3

Mathematica, 40 octets

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

Fonction pure prenant une liste de (anythings) en entrée et renvoyant une liste. FoldList[Pluscommence par un nombre (dans ce cas, #&@@#le premier élément de l'entrée) et ajoute à plusieurs reprises des éléments de la liste explicite Sort@Differences@#. Cela imite le comportement de la fonction intégrée Accumulate, mais le premier nombre devrait être ajouté à la liste des différences à la main, ce qui augmente le nombre d'octets (pour autant que je sache).

Greg Martin
la source
3

05AB1E , 9 octets

-4 merci à Emigna

¬=s¥{vy+=

Essayez-le en ligne!

¬         # Get the head
 =        # Print
  s¥{     # Get sorted Deltas
     vy   # For each
       += # Add to the previous value and print
Riley
la source
Vous pourriez économiser 4 octets avec¬=s¥{vy+=
Emigna
2

Python 2, 92 octets

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
la source
2

Haskell, 59 octets

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

Panne:

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
Nom d'affichage générique
la source
2
scanl(+)a$sort...
nimi
2

JavaScript (ES6), 68 octets

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

En JavaScript, il s'avère être plus efficace pour calculer les deltas inverses d'un tableau . Ceux-ci sont ensuite triés par ordre décroissant et soustraits cumulativement du premier élément.

Neil
la source
2

Python 2 ,

90 octets

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

84 octets

Sauvegardé 6 octets lors de l'utilisation de lambda. Merci aux ovs!

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

Essayez-le en ligne!

Décomposer le code,

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

Codage heureux!

Keerthana Prabhakaran
la source
j'essayais de trouver un moyen de le faire comme ça!
quintopie
1
Vous pouvez enregistrer quelques octets en les convertissant en une fonction: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 octets

(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
la source
1

Python 2 , 97 octets

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

Essayez-le en ligne!

Barre
la source
Vous pouvez supprimer un espace dans la liste de compréhension pour 96 octets:[p[i+1]-p[i]for i in range(len(p)-1)]
sagiksp
1

Pyth, 11 octets

.u+NYS.+QhQ

Cela fait juste la chose évidente décrite dans la déclaration.

Essayez-le en ligne

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

Suggestions pour plus de bienvenue au golf.

quintopie
la source
1

PHP, 89 octets

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

Courez comme ceci:

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_

Explication

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
la source
1

Python 2 avec numpy, 67 56 octets

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

Laissez numpy calculer les deltas, triez-les, ajoutez le premier élément et laissez numpy calculer les sommes cumulées. Assez bon marché?

quintopie
la source
1
Économisez 3 octets en modifiant l'importation vers from numpy import*et n.cumsumvers cumsumet n.diffversdiff
ovs
Merci. Vous pouvez dire que cela fait un moment que je n'ai pas joué au python, oubliant tous les trucs standard.
quintopie
0

Perl 6 , 31 octets

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

Essayez-le

Étendu:

{
  [\+]            # 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
la source
0

Lot, 197 octets

@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 ne trie pas numériquement, donc je polarise toutes les différences de 5000.

Neil
la source
0

bash + sort, 102 octets

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 octets

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
la source
0

Clojure, 46 octets

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

Un jour, je vais créer un langage Cljr qui a des noms de fonction plus courts que Clojure.

NikoNyrh
la source