Classificar e reaplicar deltas de uma matriz

11

Parece que qualquer Modificação Simples de deltas usando uma função consistente quase sempre pode ser feita de outra maneira mais curta , Dennis . Assim, a única solução que posso imaginar para tornar isso mais difícil é introduzir algum tipo de função inconsistente.

Ordenação.

Sua tarefa é pegar uma matriz de números inteiros, classificar seus deltas e recompilar para fornecer a nova matriz de números inteiros.

POR EXEMPLO.

Para a entrada:

1  5 -3  2  9

Obtenha os seguintes deltas:

  4 -8  5  7

Em seguida, classifique estes deltas, produzindo:

 -8  4  5  7

E reaplicá-los, o que dá:

1 -7 -3  2  9

Entrada / Saída

Você receberá uma lista / matriz / tabela / tupla / pilha / etc. de números inteiros assinados como entrada por qualquer método de entrada padrão.

Você deve imprimir os dados modificados novamente de qualquer forma aceitável, seguindo o método de classificação delta acima.

Você receberá N entradas 0 < N < 10onde cada número se enquadra dentro da faixa-1000 < X < 1000

Casos de teste

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

Notas

  • Como mencionado acima, você sempre receberá pelo menos 1 entrada e não mais que 9.
  • O primeiro e o último número da sua saída sempre corresponderão ao da entrada.
  • Somente saída de entrada padrão é aceita
  • Aplicam-se brechas padrão
  • Isso é , então a menor contagem de bytes vence!
  • Diverta-se!
ATaco
fonte
2
Na IMO, você deve remover o segundo cabeçalho (aquele no corpo do próprio post). É meio feio e ocupa apenas espaço, e é uma cópia do título (que tem 20 px acima).
Rɪᴋᴇʀ

Respostas:

4

Geléia , 7 bytes

IṢ;@Ḣ+\

Experimente online!

Como funciona

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
fonte
5

MATL , 8 bytes

1)GdShYs

Experimente online!

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

Mathematica, 40 bytes

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

Função pura pegando uma lista de (qualquer coisa) como entrada e retornando uma lista. FoldList[Pluscomeça com um número (nesse caso, #&@@#o primeiro elemento da entrada) e adiciona repetidamente elementos da lista auto-explicativa Sort@Differences@#. Isso imita o comportamento do built-in Accumulate, mas o primeiro número precisaria ser anexado à lista de diferenças manualmente, o que aumenta a contagem de bytes (tanto quanto eu sei).

Greg Martin
fonte
3

05AB1E , 9 bytes

-4 graças a Emigna

¬=s¥{vy+=

Experimente online!

¬         # Get the head
 =        # Print
  s¥{     # Get sorted Deltas
     vy   # For each
       += # Add to the previous value and print
Riley
fonte
Você pode salvar 4 bytes com¬=s¥{vy+=
Emigna 29/17/17
2

Python 2, 92 bytes

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
fonte
2

Haskell, 59 Bytes

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

Demolir:

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
Nome de exibição genérico
fonte
2
scanl(+)a$sort...
nimi 29/03
2

JavaScript (ES6), 68 bytes

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

No JavaScript, verifica-se ser mais golfista para calcular os deltas inversos de uma matriz . Eles são classificados em ordem decrescente e subtraídos cumulativamente do primeiro elemento.

Neil
fonte
2

Python 2 ,

90 bytes

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

84 bytes

Economizou 6 bytes ao usar lambda. Graças a ovs!

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

Experimente online!

Quebrando o código,

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

Feliz codificação!

Keerthana Prabhakaran
fonte
Eu estava tentando encontrar uma maneira de fazê-lo assim!
quintopia 29/03
1
Você pode salvar alguns bytes convertendo-o em uma função: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 bytes

(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
fonte
1

Python 2 , 97 bytes

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

Experimente online!

Cajado
fonte
Você pode excluir um espaço na compreensão da lista para 96 ​​bytes:[p[i+1]-p[i]for i in range(len(p)-1)]
sagiksp
1

Pitão, 11 bytes

.u+NYS.+QhQ

Isso apenas faz o óbvio descrito na declaração.

Experimente 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

Sugestões para mais boas-vindas no golfe.

quintopia
fonte
1

PHP, 89 bytes

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

Execute assim:

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_

Explicação

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
fonte
1

Python 2 com numpy, 67 56 bytes

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

Deixe numpy calcular os deltas, classificá-los, preceder o primeiro elemento e deixe numpy calcular as somas cumulativas. Muito barato?

quintopia
fonte
1
Guardar 3 bytes alterando a importação from numpy import*e n.cumsumpara cumsume n.diffparadiff
OVS
Obrigado. Você pode dizer que já faz um tempo desde que joguei python, esquecendo todos os truques padrão.
quintopia 29/03
0

Perl 6 , 31 bytes

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

Tente

Expandido:

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

Lote, 197 bytes

@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 não classifica numericamente, então inclino todas as diferenças em 5000.

Neil
fonte
0

bash + classificação, 102 bytes

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 bytes

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
fonte
0

Clojure, 46 bytes

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

Um dia vou criar a linguagem Cljr, que tem nomes de função mais curtos que o Clojure.

NikoNyrh
fonte