Delta inversi di una matrice


23

Delta inversi di una matrice

Una continuazione di Delta inversi di una matrice

Il tuo compito è quello di prendere un array di numeri interi a 32 bit con segno, ricompilarlo con i suoi delta invertiti.

Esempio

La lista,

18  19  17  20  16

ha i delta:

   1  -2   3  -4

che, se invertito, produce:

  -4   3  -2   1

quindi quando ricompilato, usando i rendimenti:

18  14  17  15  16

quale dovrebbe essere il tuo valore di ritorno.

La ricompilazione consiste nel prendere il C, che è il primo valore dell'array. In questo caso, 18e applicando i delta in ordine. Quindi 18 + -414, 14 + 317e così via.

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 inversione delta sopra riportato.

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

Casi test

1 2 3 4 5      -> 1 2 3 4 5
18 19 17 20 16 -> 18 14 17 15 16
5 9 1 3 8 7 8  -> 5 6 5 10 12 4 8
6 5 4 1 2 3    -> 6 7 8 5 4 3

Gli 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!

E il vincitore è...

Dennis! Chi per primo ha preso il primo posto, poi si è battuto con una soluzione più breve, regalandosi sia il primo che il secondo posto!

Menzione d'onore a ais523 con la loro Jelly, che se non fosse stato per Dennis che si era presentato poco prima di loro, avrebbe tenuto il secondo posto.


1
Queste sfide delta hanno solo dimostrato quanto i delta non necessari siano in matematica.
ATaco,

4
come i delta non necessari sono in matematica Uno dei rami più importanti della matematica si basa sui delta (infinitamente piccoli)
Luis Mendo,

1
Sono ancora un non felice chappy
ATaco il

Non posso C una sfida matematica su ppcg ...: P
Mukul Kumar il

Risposte:


9

Gelatina , 5 byte

.ịS_Ṛ

Questo utilizza l'algoritmo di risposta di Julia Glen O .

Provalo online!

Come funziona

.ịS_Ṛ  Main link. Argument: A (array)

.ị     At-index 0.5; retrieve the values at the nearest indices (0 and 1). Since
       indexing is 1-based and modular, this gives the last and first element.
  S    Compute their sum.
    Ṛ  Yield A, reversed.
   _   Subtract the result to the right from the result to the left.

7
Dennis Please
Fund Monica's Lawsuit

12

Gelatina , 6 byte

I;ḢṚ+\

Provalo online!

Come funziona

I;ḢṚ+\  Main link. Argument: A (array)

I       Increments; compute the deltas of A.
  Ḣ     Head; yield the first element of A.
 ;      Concatenate the results to both sides.
   Ṛ    Reverse the resulting array.
    +\  Compute the cumulative sum of the reversed array.

7
Dennis Please
ATaco,

Sembra che mi hai battuto di qualche minuto. Sorprendentemente, i nostri programmi non sono nemmeno identici (hai dove ho io U). Non so se questo li rende abbastanza diversi da non considerare i duplicati.

@ ais523 Uvettorializza mentre no, ma il loro comportamento per gli array piatti è identico.
Dennis,

4
Immagino che eliminerò la mia risposta, quindi (pur essendo un po 'seccato da quando sono riuscito a trovare la risposta "giusta" da solo, e l'unico vero problema qui è che qualcun altro è riuscito a trovare prima la stessa risposta) .

In quale formato ASCII viene visualizzato come 6 byte? Pluma su Xubuntu afferma che sono 10 byte e Julia memorizza come 0x1e22 e come 0x1e5a, ognuno dei quali quindi richiede 3 byte.
Glen O

8

Julia, 24 byte

!x=x[end]+x[]-reverse(x)

Questo è il modo "intelligente" per risolvere il problema. Il contrario negativo dell'array ha i "delta" invertiti, e quindi è sufficiente correggere il fatto che inizia / finisce nei punti sbagliati.


6

Snowman 1.0.2, 72 byte

((}#0AaGwR#`wRaCaZ`0NdE`aN0AaG:dU,0aA|1aA,nS;aM`0wRaC|#0aA*|:#nA*#;aM*))

Provalo online!

Questa è una subroutine che porta input e output al permavar corrente.

((
  }       enable variables b, e, and g
  #       store the input in variable b
  0AaG    remove the first element (take indices > 0)
  wR      wrap the array in another array
  #`wRaC  concatenate with the original input array
  aZ      zip (transpose); we now have pairs of elements
  `0NdE   obtain the number -1 (by decrementing 0)
  `aN     reverse the zipped array
  0AaG    remove first (there is one fewer delta than array elements)
  :       map over the array of pairs:
    dU     duplicate; we now have b=[x,y] e=[x,y]
    ,0aA   move the copy and get the first element; b=x g=[x,y]
    |1aA   get the second element from the copy; b=y g=x
    ,nS    subtract; we now have b=y-x which is returned from the map
  ;aM     (map)
  `0wRaC  prepend a zero (in preparation for the next step)
  |#0aA   get the first element of the original array
  *       store this in the permavar
  |:      map over the array of deltas with 0 prepended:
    #       store the permavar in e
    nA      add the delta and the permavar
    *#      make this the new value of the permavar
  ;aM     (map)
  *       "return" the resulting array from the subroutine
))

6

JavaScript (ES6), 45 37 byte

a=>a.reverse(z=a[0]).map(e=>z+a[0]-e)

Porta della risposta di Mathematica di @ JHM. (Sono sicuro che avrei potuto derivarlo da solo, ma non a quest'ora della notte.) Modifica: salvato 8 byte grazie a @ edc65.


C'è un motivo per cui hai bisogno [...e ]?
Mama Fun Roll,

1
@MamaFunRoll altrimenti cambierebbe a, che verrà utilizzato più avanti nel programma
Conor O'Brien,

Oh giusto, me ne sono dimenticato: P
Mama Fun Roll

37:a=>a.reverse(z=a[0]).map(e=>z+a[0]-e)
edc65,

@ edc65 Bah, ieri sera ero abbastanza sveglio da considerare z=a[0], ma ho dimenticato di rimuovere il [...]e (,i,b).
Neil,

4

Mathematica, 23 byte

#&@@#+Last@#-Reverse@#&

Funzione senza nome. Il risultato è semplicemente: reverse ((primo elemento) + (ultimo elemento) - (ogni elemento)).


4

Python 2, 96 74 54 44 byte

lambda l:[l[0]+l[-1]-j for j in l][::-1]

L'input è dato come un array circondato da parentesi quadre. L'output è nello stesso formato.

Grazie a @Kade per aver salvato 22 42 byte usando un metodo molto più semplice di quello che stavo facendo prima!

Grazie a @ Sherlock9 per aver salvato 10 byte eliminando il contatore dell'indice dalla comprensione dell'elenco!

Bene, ora se gioco più a golf avrò il problema "barrato 44 è ancora 44". ; _;


Che dire lambda l:[l[0]+l[-1]-l[i]for i in range(len(l))][::-1]di 54 byte? :) (Crediti a Glen O. per il calcolo)
Kade,

Oh wow, come non l'ho capito. Grazie! :)
HyperNeutrino il

Alex, puoi semplicemente usare quella funzione lambda come risposta :)
Kade,

Che cosa. Oh. Va bene, grazie! :)
HyperNeutrino il

Invece di l[i]for i in range(len(l)), è possibile utilizzare j for j in lper salvare 14 byte.
Sherlock9,

3

05AB1E , 8 byte

¬s¤sR(++

Provalo online!

Traduzione della mia risposta MATL, secondo approccio.

¬    % Implicit input. Head, without consuming the input
s    % Swap
¤    % Tail, without consuming the input
s    % Swap
R(   % Reverse and negate
++   % Add head and tail of input to reversed and negated input. Implicitly display

Più intelligente di quello che stavo provando:¬s¥Rvy)}
Magic Octopus Urn

3

R, 37 30 byte

Modifica: ora usando l'approccio nella risposta Julia di Glen O

x=scan();x[1]+tail(x,1)-rev(x)

Vecchio:

x=scan();cumsum(c(x[1],rev(diff(x))))

Legge l'input, calcola i delta, concatena con il primo elemento e calcola la somma cumulativa.


2

MATL , 8 byte

1)GdPhYs

Provalo online!

Questa è l'applicazione diretta della definizione. Considera l'input [18 19 17 20 16]come esempio.

1)     % Implicit input. Get its first entry
       % STACK: 18
G      % Push input again
       % STACK: 18, [18 19 17 20 16]
d      % Consecutive differences
       % STACK: 18, [1 -2 3 -4]
P      % Reverse
       % STACK: 18, [-4 3 -2 1]
h      % Concatenate
       % STACK: [18 -4 3 -2 1]
Ys     % Cumulative sum. Implicitly display
       % STACK: [18 14 17 15 16]

Approccio diverso, stesso conteggio byte:

P_G5L)s+

Provalo onllne!

Array invertito e negato più la prima e l'ultima voce dell'array originale.

P_     % Implicit inut. Reverse and negate
G      % Push input again
5L)s   % Sum of first and last entries
+      % Add to reversed and negated array. Implicitly display



1

아희 (Aheui) , 3 * 21 caratteri + 2 "\ n" = 65 byte

빪쑥쌳텆슉폎귁삯씬희
뿓팤팧쎢싺솎
싺싹삭당뽔

Presuppone l'inserimento nello stack 아. L'output verrà archiviato nello stack 안.

Se vuoi provare questo codice:

Alla fine della prima riga di questo codice, aggiungi la lunghezza del carattere (n) volte (ovvero se l'input è 7 numeri interi, inseriscilo 7 volte). Per ogni prompt, digitare un numero intero:

어우
우어
빪쑥쌳텆슉폎귁삯씬희
뿓팤팧쎢싺솎
싺싹삭당뽔

Provalo qui! (copia e incolla il codice)

Esempio

Per 1, 2, 3, 4, 5:

어우벙벙벙벙벙
우어
빪쑥쌳텆슉폎귁삯씬희
뿓팤팧쎢싺솎
싺싹삭당뽔

e quindi digitare 1, 2, 3, 4, e 5(ci saranno 5 richieste).

Versione alternativa (65 byte)

빠쑥쌳터슉펴ㅇ삯씬희
뿌파파쎢싺솎
싺싹삭다뽀

Perché non dici semplicemente 65 bytes in UTF-8qualcosa?
mbomb007,

@ mbomb007 perché alcune persone non conoscono i caratteri coreani di 3 byte ciascuno.
JungHwan Min

1

C # 42 byte

Prende un int[]e restituisce un IEnumerable<int>.

a=>a.Select(v=>a[0]+a.Last()-v).Reverse();

(Questa è in realtà solo una versione con porting della versione di JHM ..)


1

TSQL, 200 byte

Variabile di tabella utilizzata come input

DECLARE @ table(a int, b int identity)

INSERT @ values(5),(9),(1),(3),(8),(7),(8);

WITH c as(SELECT*,rank()over(order by b desc)z FROM @)SELECT g+isnull(sum(-f)over(order
by b),0)FROM(SELECT sum(iif(c.b=1,c.a,0))over()g,d.a-lead(d.a)over(order by d.b)f,c.b
FROM c,c d WHERE c.b=d.z)d

Provalo


1

PHP, 60 56 52 byte

-4 byte grazie a @ user59178

for($a=$argv;--$argc;)echo$a[1]+end($a)-$a[$argc],_;

opera su argomenti della riga di comando, usa il trattino basso come separatore. Corri con
php -r '<code>' <space separated numbers>


1
C'è un motivo per cui non si usa solo $ncome variabile di controllo? Ho provato una versione del genere ed era più corta di 4 byte e sembrava funzionare.
user59178

1

Perl 6 ,  48 33  30 byte

{[\+] .[0],|.reverse.rotor(2=>-1).map({[-] @_})}
{.reverse.map: {.[0]+.[*-1]-$^a}}
{[R,] .map: {.[0]+.[*-1]-$^a}}

Provalo

Allargato:

{  # bare block lambda with implicit parameter 「$_」

  [R,]               # reduce the following using the comma operator [R]eversed
                     # (short way to do the same thing as 「reverse」)

    .map:            # map the input (implicit method call on 「$_」

      {              # bare block lambda with placeholder parameter 「$a」

          .[     0 ] # the first value of 「$_」 (implicit “method” call)
        + .[ * - 1 ] # add the last value of 「$_」 (implicit “method” call)
        -     $^a    # declare the parameter and subtract it from the above
      }
}

La *-1è anche un'espressione lambda di tipo WhateverCode, dove *è l'unico parametro posizionale.


Spiegazione per coloro che non parlano perl?
Cyoce,

@Cyoce Aggiunto per la versione più breve. Ciò dovrebbe essere spiegato a qualcuno che conosceva anche Perl 5. Nel caso ti stavi chiedendo [\+]dal primo esempio, è triangolo ridurre [\+] 3,-1,1,-5(3,2,3,-2)e [\,] 3,-1,1,-5((3,), (3,-1), (3,-1,1), (3,-1,1,-5))
Brad Gilbert b2gills


0

BASH, 71 byte

s=$1
echo $s
for i in `seq ${#@} -1 2`;{
echo $[s=s+${!i}-${@:i-1:1}]
}

0

C ++ 14, 103 byte

Come lambda senza nome, richiedendo suo ingresso di avere rbegin, rend, backe push_backcome i contenitori vector, dequeolist .

Utilizzando l'approccio della risposta Julia di Glen O

[](auto c){decltype(c)d;for(auto i=c.rbegin()-1;++i!=c.rend();)d.push_back(c[0]+c.back()-*i);return d;}

Ungolfed e utilizzo:

#include<iostream>
#include<vector>

//declare generic function, return is deduced automatically
auto f=[](auto c){
  //create fresh container of the same type as input
  decltype(c)d;

  //iterate through the reverse container
  for(auto i=c.rbegin()-1;++i!=c.rend();)
    //add the first and last element minus the negative reverse
    d.push_back(c[0]+c.back()-*i);
  return d;
}
;


int main(){
  std::vector<int> a={18,  19,  17,  20,  16};
  auto b = f(a);
  for(auto&x:b)
    std::cout << x << ", ";
  std::cout<<"\n";
}

0

Haskell, 33 byte

Utilizza la stessa logica di JHM:

f a=map(head a+last a-)$reverse a

Abbastanza leggibile pure.


Puoi salvare 3 byte usando (!!0)per heade usando (<$>)per map: Provalo online!
ბიმო


0

Clojure, 101 byte

(fn[c](conj(map #(-(first c)%)(reductions +(reverse(map #(apply - %)(partition 2 1 c)))))(first c))))

Praticamente segue la descrizione:

(def f (fn[c]
         (conj
           (->> c
                (partition 2 1)
                (map #(apply - %))
                reverse
                (reductions +)
                (map #(-(first c)%)))
           (first c))))

0

Java 7, 96 byte

int[]c(int[]a){int l=a.length,i=1,r[]=a.clone();for(;i<l;r[i]=r[i-1]+a[l-i]-a[l-++i]);return r;}

Spiegazione:

int[] c(int[] a){     // Method with integer-array parameter and integer-array return-type
  int l=a.length,     //  Length of input array
      i=1,            //  Index (starting at 1, although Java is 0-indexed)
      r[]=a.clone();  //  Copy of input array
  for(; i<l;          //  Loop over the array
    r[i] =            //   Replace the value at the current index in the copied array with:
      r[i-1]          //    The previous value in this copied array
      + a[l - i]      //    plus the opposite value in the input array
      - a[l - ++i])   //    minus the value before the opposite value in the input array (and increase the index)
  ;                   //  End the loop (implicit / no body)
  return r;           //  Return the result array
}                     // End of method

Codice di prova:

Provalo qui.

class M{
  static int[]c(int[]a){int l=a.length,i=1,r[]=a.clone();for(;i<l;r[i]=r[i-1]+a[l-i]-a[l-++i]);return r;}

  public static void main(String[] a){
    System.out.println(java.util.Arrays.toString(c(new int[]{ 18,19,17,20,16 })));
    System.out.println(java.util.Arrays.toString(c(new int[]{ 1,2,3,4,5 })));
    System.out.println(java.util.Arrays.toString(c(new int[]{ 5,9,1,3,8,7,8 })));
    System.out.println(java.util.Arrays.toString(c(new int[]{ 6,5,4,1,2,3 })));
  }
}

Produzione:

[18, 14, 17, 15, 16]
[1, 2, 3, 4, 5]
[5, 6, 5, 10, 12, 4, 8]
[6, 7, 8, 5, 4, 3]

0

APL (Dyalog Unicode) , SBCS da 11 byte

Funzione prefisso tacito anonimo.

+\⊃,∘⌽2-⍨/⊢

Provalo online!

+\ somma cumulativa di

 il primo elemento dell'argomento

, seguita
 da
 l'inversione di

2-⍨/ la differenza a coppie di

 l'argomento

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.