Ordina e riapplica i delta di una matrice


11

Sembra che qualsiasi semplice modifica dei delta che utilizza una funzione coerente possa quasi sempre essere eseguita in qualche altro modo più breve , Dennis . Pertanto, l'unica soluzione che posso immaginare di rendere questo più difficile è introdurre una sorta di funzione incoerente.

Ordinamento.

Il tuo compito è prendere un array di numeri interi, ordinare i loro delta e ricompilarlo per dare il nuovo array di numeri interi.

PER ESEMPIO.

Per l'input:

1  5 -3  2  9

Ottieni i seguenti delta:

  4 -8  5  7

Quindi, ordina questi delta, cedendo:

 -8  4  5  7

E riapplicarli, il che dà:

1 -7 -3  2  9

Input Output

Ti verrà dato un elenco / array / table / tuple / stack / etc. di numeri interi con segno come input tramite qualsiasi metodo di input standard.

È necessario inviare nuovamente i dati modificati in qualsiasi forma accettabile, seguendo il metodo di ordinamento delta sopra riportato.

Riceverai N input in 0 < N < 10cui ogni numero rientra nell'intervallo-1000 < X < 1000

Casi 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

Appunti

  • Come indicato sopra, riceverai sempre almeno 1 input e non più di 9.
  • Il primo e l'ultimo numero dell'output corrisponderanno sempre a quello dell'input.
  • È accettata solo l' uscita di ingresso standard
  • Si applicano scappatoie standard
  • Questo è , quindi vince il conteggio di byte più basso!
  • Divertiti!

2
IMO dovresti rimuovere la seconda intestazione (quella nel corpo del post stesso). È un po 'brutto e occupa solo spazio, ed è una copia del titolo (che è come 20 px sopra di esso).
Rɪᴋᴇʀ

Risposte:


4

Gelatina , 7 byte

IṢ;@Ḣ+\

Provalo online!

Come funziona

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 byte

1)GdShYs

Provalo online!

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 byte

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

Funzione pura che prende un elenco di (qualunque cosa) come input e restituisce un elenco. FoldList[Plusinizia con un numero (in questo caso, #&@@#il primo elemento dell'input) e aggiunge ripetutamente elementi dell'elenco autoesplicativo Sort@Differences@#. Questo imita il comportamento del built-in Accumulate, ma il primo numero dovrebbe essere anteposto manualmente all'elenco delle differenze, il che rende il conteggio dei byte più alto (per quanto posso dire).



2

Python 2, 92 byte

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 byte

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

Abbattersi:

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 byte

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

In JavaScript risulta essere più golfista per calcolare i delta inversi di un array . Questi vengono quindi ordinati in ordine decrescente e sottratti cumulativamente dal primo elemento.


2

Python 2 ,

90 byte

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

84 byte

6 byte salvati su usando lambda. Grazie a ovs!

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

Provalo online!

Abbattere il codice,

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

Buona programmazione!


stavo cercando di trovare un modo per farlo in quel modo!
Quintopia,

1
È possibile salvare alcuni byte convertendoli in una funzione: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 byte

(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 byte

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

Provalo online!


È possibile eliminare uno spazio nella comprensione dell'elenco per 96 byte:[p[i+1]-p[i]for i in range(len(p)-1)]
sagiksp

1

Pyth, 11 byte

.u+NYS.+QhQ

Questo fa solo la cosa ovvia descritta nell'affermazione.

Provalo online

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

Suggerimenti per un ulteriore benvenuto nel golf.



1

PHP, 89 byte

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

Esegui in questo modo:

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_

Spiegazione

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 con numpy, 67 56 byte

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

Consenti a numpy di calcolare i delta, ordinali, anteponi il primo elemento e lascia che numpy calcoli le somme cumulative. Abbastanza economico?


1
Salvare 3 byte modificando l'importazione in from numpy import*e n.cumsumverso cumsume n.diffversodiff
ovs

Grazie. Si può dire che è passato un po 'di tempo da quando ho giocato a golf in pitone, dimenticando tutti i trucchi standard.
Quintopia,

0

Perl 6 , 31 byte

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

Provalo

Allargato:

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

Lotto, 197 byte

@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 non esegue l'ordinamento numerico, quindi distendo tutte le differenze di 5000.


0

bash + ordina, 102 byte

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 byte

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 byte

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

Un giorno farò il linguaggio Cljr che ha nomi di funzioni più brevi di Clojure.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.