Odwróć delty tablicy

23

Odwróć delty tablicy

Kontynuacja odwrotnych delt tablicy

Twoim zadaniem jest pobranie tablicy 32-bitowych liczb całkowitych z rekompilacją z odwróconymi deltami.

Przykład

Lista,

18  19  17  20  16

ma delty:

   1  -2   3  -4

który po odwróceniu daje:

  -4   3  -2   1

następnie po ponownej kompilacji, używając zbiorów:

18  14  17  15  16

która powinna być twoją wartością zwrotu.

Ponowna kompilacja polega na przyjęciu C, która jest pierwszą wartością tablicy. W takim przypadku 18i zastosowanie do niego delt w kolejności. Tak 18 + -4daje 14, 14 + 3daje 17i tak dalej.

Wejście wyjście

Otrzymasz listę / tablicę / tabelę / krotkę / stos / itp. liczb całkowitych ze znakiem jako danych wejściowych dowolną standardową metodą wprowadzania.

Zmodyfikowane dane należy ponownie wyprowadzić w dowolnej akceptowalnej formie, zgodnie z powyższą metodą odwracania delta.

Otrzymasz N danych wejściowych, w 0 < N < 10których każda liczba mieści się w zakresie-1000 < X < 1000

Przypadki testowe

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

Notatki

  • Jak wspomniano powyżej, zawsze otrzymasz co najmniej 1 wkład, a nie więcej niż 9.
  • Pierwsza i ostatnia liczba danych wyjściowych zawsze będzie zgodna z wartością wejściową.
  • Akceptowane jest tylko standardowe wyjście wejściowe
  • Obowiązują standardowe luki
  • To jest , więc wygrywa najmniejsza liczba bajtów!
  • Baw się dobrze!

A zwycięzcą jest...

Dennis! Kto najpierw zajął pierwsze miejsce, a potem pokonał się krótszym rozwiązaniem, zdobywając zarówno pierwsze, jak i drugie miejsce!

Wyróżnienie dla ais523 z galaretką, że gdyby nie Dennis, który znalazł się tuż przed nimi, zająłby drugie miejsce.

ATaco
źródło
1
Te wyzwania delta dowiodły tylko, jak niepotrzebne są delty w matematyce.
ATaco,
4
jak niepotrzebne są delty w matematyce Jedna z najważniejszych gałęzi matematyki oparta jest na (nieskończenie małych) deltach
Luis Mendo
1
Nadal jestem niezadowolonym chappy
ATaco,
Nie mogę C matematyczne wyzwanie na ppcg ...: P
Mukul Kumar

Odpowiedzi:

9

Galaretka , 5 bajtów

.ịS_Ṛ

Ten wykorzystuje algorytm z Julią odpowiedź Glen O jest .

Wypróbuj online!

Jak to działa

.ị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.
Dennis
źródło
7
Dennis Please
pozew Fund Moniki
12

Galaretka , 6 bajtów

I;ḢṚ+\

Wypróbuj online!

Jak to działa

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.
Dennis
źródło
7
Dennis Please
ATaco
Wygląda na to, że pokonałeś mnie o kilka minut. O dziwo, nasze programy nie są nawet identyczne (masz tam, gdzie ja U). Nie wiem, czy to czyni je wystarczająco różnymi, aby nie brać pod uwagę duplikatów.
@ ais523 Uwektoryzuje, podczas gdy nie, ale ich zachowanie dla płaskich tablic jest identyczne.
Dennis,
4
Myślę, że wtedy skasuję swoją odpowiedź (choć jestem trochę zirytowany, ponieważ udało mi się wymyślić „właściwą” odpowiedź na własną rękę, a jedynym prawdziwym problemem jest to, że komuś innemu udało się najpierw znaleźć tę samą odpowiedź) .
W jakim formacie ASCII ma 6 bajtów? Pluma na Xubuntu mówi, że ma 10 bajtów, a Julia przechowuje jako 0x1e22 i 0x1e5a, z których każdy wymaga 3 bajtów.
Glen O
8

Julia, 24 bajty

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

Jest to „sprytny” sposób rozwiązania problemu. Negatywne odwrócenie tablicy ma odwrócone „delty”, a następnie wystarczy naprawić fakt, że zaczyna się / kończy w niewłaściwych miejscach.

Glen O
źródło
6

Snowman 1.0.2, 72 bajty

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

Wypróbuj online!

Jest to podprogram, który pobiera dane wejściowe i wyjściowe do bieżącego permawaru.

((
  }       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
))
Klamka
źródło
6

JavaScript (ES6), 45 37 bajtów

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

Port odpowiedzi Mathematica @ JHM. (Jestem pewien, że sam mogłem to wyprowadzić, ale nie o tej porze nocy). Edycja: Zapisałem 8 bajtów dzięki @ edc65.

Neil
źródło
Czy istnieje powód, dla którego potrzebujesz [...i ]?
Mama Fun Roll
1
@MamaFunRoll inaczej by to zmodyfikował a, który jest używany później w programie
Conor O'Brien
No tak, zapomniałem o tym: P
Mama Fun Roll
37:a=>a.reverse(z=a[0]).map(e=>z+a[0]-e)
edc65,
@ edc65 Bah, ostatniej nocy czułem się wystarczająco rozbudzony z=a[0], ale zapomniałem usunąć [...]i (,i,b).
Neil,
4

Mathematica, 23 bajty

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

Funkcja bez nazwy. Wynik jest po prostu: reverse ((pierwszy element) + (ostatni element) - (każdy element)).

JungHwan Min
źródło
4

Python 2, 96 74 54 44 bajty

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

Dane wejściowe są podawane jako tablica otoczona nawiasami kwadratowymi. Dane wyjściowe są w tym samym formacie.

Dzięki @Kade za zaoszczędzenie 22 42 bajtów przy użyciu znacznie prostszej metody niż cokolwiek wcześniej robiłem!

Dzięki @ Sherlock9 za zaoszczędzenie 10 bajtów poprzez wyeliminowanie licznika indeksów ze zrozumienia listy!

Świetnie, teraz jeśli już będę grać w golfa, dostanę problem „44 przekreślone to wciąż 44”. ; _;

HyperNeutrino
źródło
Co powiesz lambda l:[l[0]+l[-1]-l[i]for i in range(len(l))][::-1]na 54 bajty? :) (Podziękowania dla Glen O. do obliczeń)
Kade
Och, wow, jak tego nie rozgryzłem. Dzięki! :)
HyperNeutrino,
Alex, możesz użyć tej funkcji lambda jako odpowiedzi :)
Kade
Co. O. Ok, dzięki! :)
HyperNeutrino,
Zamiast tego l[i]for i in range(len(l))możesz użyć j for j in ldo zapisania 14 bajtów.
Sherlock9,
3

05AB1E , 8 bajtów

¬s¤sR(++

Wypróbuj online!

Tłumaczenie mojej odpowiedzi MATL, drugie podejście.

¬    % 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
Luis Mendo
źródło
Mądrzejszy niż to, czego próbowałem:¬s¥Rvy)}
Magiczna ośmiornica Urn
3

R, 37 30 bajtów

Edycja: Teraz wykorzystuję podejście z odpowiedzi Julii autorstwa Glen O.

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

Stary:

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

Odczytuje dane wejściowe, oblicza delty, łączy z pierwszym elementem i oblicza sumę skumulowaną.

Billywob
źródło
2

MATL , 8 bajtów

1)GdPhYs

Wypróbuj online!

Jest to bezpośrednie zastosowanie definicji. Rozważ dane wejściowe [18 19 17 20 16]jako przykład.

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]

Inne podejście, ta sama liczba bajtów:

P_G5L)s+

Wypróbuj to wszystko!

Odwrócona i zanegowana tablica oraz pierwszy i ostatni zapis oryginalnej tablicy.

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
Luis Mendo
źródło
1

Pyth - 10 bajtów

sM._+hQ_.+

Pakiet testowy .

Maltysen
źródło
1

아희 (Aheui) , 3 * 21 znaków + 2 "\ n" = 65 bajtów

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

Zakłada wejście w stos 아. Dane wyjściowe zostaną zapisane w stosie 안.

Jeśli chcesz wypróbować ten kod:

Na końcu pierwszego wiersza tego kodu dodaj liczbę znaków długości (n) razy (tzn. Jeśli wejście zawiera 7 liczb całkowitych, wstaw je 7 razy). Dla każdego monitu wpisz jedną liczbę całkowitą:

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

Wypróbuj tutaj! (skopiuj i wklej kod)

Przykład

Dla 1, 2, 3, 4, 5:

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

i typ 1, 2, 3, 4i 5(nie będzie 5 komunikaty).

Alternatywna wersja (65 bajtów)

빠쑥쌳터슉펴ㅇ삯씬희
뿌파파쎢싺솎
싺싹삭다뽀
JungHwan Min
źródło
Dlaczego po prostu nie powiesz 65 bytes in UTF-8czy coś?
mbomb007,
@ mbomb007, ponieważ niektórzy ludzie nie znają koreańskich znaków, każdy ma 3 bajty.
JungHwan Min.
1

C # 42 bajtów

Bierze int[]i zwraca an IEnumerable<int>.

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

(To jest właściwie tylko przeniesiona wersja wersji JHM ..)

Stefan
źródło
1

TSQL, 200 bajtów

Zmienna tabelowa używana jako dane wejściowe

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

Wypróbuj to

t-clausen.dk
źródło
1

PHP, 60 56 52 bajtów

-4 bajty dzięki @ user59178

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

działa na argumentach wiersza poleceń, używa podkreślnika jako separatora. Biegnij z
php -r '<code>' <space separated numbers>

Tytus
źródło
1
Czy istnieje powód, dla którego nie używasz tylko $nzmiennej kontrolnej? Wypróbowałem taką wersję, która była o 4 bajty krótsza i wydawało się, że działa.
user59178,
1

Perl 6 ,  48 33  30 bajtów

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

Spróbuj

Rozszerzony:

{  # 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
      }
}

Jest *-1to również wyrażenie lambda typu WhokolwiekCode, gdzie *jest jedynym parametrem pozycyjnym.

Brad Gilbert b2gills
źródło
Wyjaśnienie dla tych, którzy nie mówią perl?
Cyoce,
@Cyoce Dodano dla najkrótszej wersji. To wymagałoby wyjaśnienia komuś, kto znał Perl 5. Jeśli zastanawiasz się [\+]nad pierwszym przykładem, to zmniejsz trójkąt [\+] 3,-1,1,-5(3,2,3,-2)i [\,] 3,-1,1,-5((3,), (3,-1), (3,-1,1), (3,-1,1,-5))
Brad Gilbert b2gills
0

BASH, 71 bajtów

s=$1
echo $s
for i in `seq ${#@} -1 2`;{
echo $[s=s+${!i}-${@:i-1:1}]
}
Ipor Sircer
źródło
0

C ++ 14, 103 bajty

Jako bezimiennego lambda, wymagające jego wejścia, aby rbegin, rend, backi push_backpodobne pojemniki vector, dequelub list.

Korzystając z podejścia z Julii Glen O, odpowiedz

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

Niegolfowane i użytkowanie:

#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";
}
Karl Napf
źródło
0

Haskell, 33 bajty

Używa tej samej logiki co JHM:

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

Całkiem czytelny.

Renzeee
źródło
Można zapisać za pomocą 3 bajtów (!!0)do headi korzystania (<$>)z map: Spróbuj online!
ბიმო
0

Clojure, 101 bajtów

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

Prawie podąża za opisem:

(def f (fn[c]
         (conj
           (->> c
                (partition 2 1)
                (map #(apply - %))
                reverse
                (reductions +)
                (map #(-(first c)%)))
           (first c))))
NikoNyrh
źródło
0

Java 7, 96 bajtów

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;}

Wyjaśnienie:

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

Kod testowy:

Wypróbuj tutaj.

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 })));
  }
}

Wydajność:

[18, 14, 17, 15, 16]
[1, 2, 3, 4, 5]
[5, 6, 5, 10, 12, 4, 8]
[6, 7, 8, 5, 4, 3]
Kevin Cruijssen
źródło