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!

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.

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

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



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

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

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.


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!


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]

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!


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.



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.

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é?


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
}

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.


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.