Зворотні дельти масиву


23

Зворотні дельти масиву

Продовження обернених дельт масиву

Ваше завдання - взяти масив підписаних 32-бітових цілих чисел, перекомпілювати його з перевернутими дельтами.

Приклад

Список,

18  19  17  20  16

має дельти:

   1  -2   3  -4

що при зворотному ході дає результат:

  -4   3  -2   1

то при перекомпіляції, використовуючи урожай:

18  14  17  15  16

яка повинна бути вашою віддачею.

Перекомпіляція складається з взяття значення C, яке є першим значенням масиву. У цьому випадку 18і застосування дельта до нього по порядку. Так 18 + -4дає 14, 14 + 3дає 17тощо.

Введення-виведення

Вам буде наданий список / масив / таблиця / кортеж / стек / тощо. підписаних цілих чисел як введення через будь-який стандартний метод введення.

Ви повинні вивести змінені дані ще раз у будь-якій прийнятній формі, дотримуючись вищевказаного методу дельтування назад.

Ви отримаєте N входів, 0 < N < 10де кожне число потрапляє в діапазон-1000 < X < 1000

Випробування

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

Примітки

  • Як зазначено вище, ви завжди отримаєте щонайменше 1 вхід і не більше 9.
  • Перше та останнє число вашого виводу завжди відповідатиме вхідному.
  • Приймається лише стандартний вихідний вихід
  • Застосовуються стандартні лазівки
  • Це , тому виграє найменший байт!
  • Веселіться!

І переможець ...

Денніс! Хто спочатку зайняв перше місце, потім побив себе коротшим рішенням, віддавши собі і перше, і друге місце!

Почесна згадка ais523 з їхнім Jelly, що якби не Денніс, що потрапив безпосередньо перед ними, зайняв би друге місце.


1
Ці дельтові виклики лише довели, наскільки непотрібні дельти в математиці.
Атако

4
як непотрібні дельти в математиці Одна з найважливіших галузей математики заснована на (нескінченно малих) дельтах
Луїс Мендо

1
Я все ще не щасливий
балаканина

Я не можу С математичної виклик на ppcg ...: P
Mukul Кумар

Відповіді:


9

Желе , 5 байт

.ịS_Ṛ

При цьому використовується алгоритм з Джулії відповіді Глен Виходів .

Спробуйте в Інтернеті!

Як це працює

.ị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
Денніс Будь ласка
покладіть на позов Моніку

12

Желе , 6 байт

I;ḢṚ+\

Спробуйте в Інтернеті!

Як це працює

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
Денніс Будь ласка
Атако

Схоже, ти побив мене за кілька хвилин. Дивно, але наші програми навіть не однакові (у вас є там, де я є U). Я не знаю, чи це робить їх досить різними, щоб не вважати дублікати.

@ ais523 Uвекторизується , але ні, але їх поведінка для плоских масивів однакова.
Денніс

4
Я думаю, що тоді я видалю свою відповідь (поки трохи роздратований, оскільки мені вдалося самостійно придумати "правильну" відповідь, і єдине справжнє питання тут полягає в тому, що хтось інший зумів спочатку знайти ту саму відповідь) .

У якому форматі ASCII він виходить у вигляді 6 байт? Pluma на Xubuntu говорить, що це 10 байт, а Julia зберігає як 0x1e22 і як 0x1e5a, кожен з яких потребує 3 байти.
Глен О

8

Юлія, 24 байти

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

Це "розумний" спосіб вирішення проблеми. У негативному зворотному напрямку масиву "дельти" перевернуто, і тоді вам просто потрібно зафіксувати той факт, що він починається / закінчується в неправильних місцях.


6

Сніговик 1.0.2, 72 байти

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

Спробуйте в Інтернеті!

Це підпрограма, яка приймає вхід і виводить поточну permavar.

((
  }       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 байт

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

Порт відповіді Mathematica @ JHM (Я впевнений, що міг би це зробити сам, але не в цей час ночі.) Редагувати: Збережено 8 байт завдяки @ edc65.


Чи є причина, чому вам це потрібно [...і ]?
Mama Fun Roll

1
@MamaFunRoll в іншому випадку буде модифікований a, який буде використаний пізніше в програмі
Conor O'Brien

Ну так, забув про це: P
Mama Fun Roll

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

@ edc65 Ба, я прокинувся вчора ввечері, щоб розглянути z=a[0], але я забув видалити [...]і (,i,b).
Ніл

4

Математика, 23 байти

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

Безіменна функція. Результат просто: зворотний ((перший елемент) + (останній елемент) - (кожен елемент)).


4

Python 2, 96 74 54 44 байт

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

Вхід подається у вигляді масиву, оточеного квадратними дужками. Вихід є в тому ж форматі.

Завдяки @Kade за економію 22 42 байтів, використовуючи набагато простіший метод, ніж все, що я робив раніше!

Завдяки @ Sherlock9 за збереження 10 байт, усунувши лічильник індексів зі списку розуміння!

Чудово, зараз, якщо я більше заграю в гольф, я отримаю проблему "перекресленої 44 все ще 44". ; _;


А як lambda l:[l[0]+l[-1]-l[i]for i in range(len(l))][::-1]з 54 байтами? :) (Подяка Глена О. за розрахунок)
Каде

О, вау, як я цього не зрозумів. Спасибі! :)
HyperNeutrino

Алекс, ти можеш просто використовувати цю лямбда-функцію як свою відповідь :)
Kade

Що. Ой. Добре, дякую! :)
HyperNeutrino

Замість цього l[i]for i in range(len(l))можна використовувати j for j in lдля збереження 14 байт.
Шерлок9

3

05AB1E , 8 байт

¬s¤sR(++

Спробуйте в Інтернеті!

Переклад моєї відповіді MATL, другий підхід.

¬    % 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

Розумніший за те, що я намагався:¬s¥Rvy)}
Чарівний восьминіг Урна

3

R, 37 30 байт

Редагувати: Тепер використовуючи підхід у відповіді Джулії Глена О

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

Старий:

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

Прочитує введення, обчислює дельти, об'єднується з першим елементом і обчислює сукупну суму.


2

MATL , 8 байт

1)GdPhYs

Спробуйте в Інтернеті!

Це пряме застосування визначення. Розглянемо вклад [18 19 17 20 16]як приклад.

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]

Різний підхід, кількість байтів:

P_G5L)s+

Спробуйте це онлайн!

Зворотний і заперечений масив плюс перший і останній записи вихідного масиву.

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 символів + 2 "\ n" = 65 байт

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

Передбачає введення в стек 아. Вихід буде зберігатися у стеку 안.

Якщо ви хочете спробувати цей код:

В кінці першого рядка цього коду додайте символьну довжину (n)-разів (тобто якщо вхід становить 7 цілих чисел, вставте його 7 разів). Для кожного запиту введіть одне ціле число:

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

Спробуйте тут! (скопіюйте та вставте код)

Приклад

Для 1, 2, 3, 4, 5:

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

а потім введіть 1, 2, 3, 4, і5 (буде 5 підказок).

Альтернативна версія (65 байт)

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

Чому ти просто не скажеш 65 bytes in UTF-8чи щось таке?
mbomb007

@ mbomb007, оскільки деякі люди не знають корейських символів - це 3 байти.
JungHwan Min

1

C # 42 байт

Бере int[]і повертає IEnumerable<int>.

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

(Це фактично лише перенесена версія версії JHM.)


1

TSQL, 200 байт

Таблична змінна, що використовується як вхідна інформація

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

Спробуй


1

PHP, 60 56 52 байти

-4 байти завдяки @ user59178

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

працює на аргументах командного рядка, використовує підкреслення як роздільник. Бігайте з
php -r '<code>' <space separated numbers>


1
Чи є причина, чому ви не використовуєте просто $nяк змінну керування? Я спробував таку версію, і вона була на 4 байти коротшою і, здавалося, працює.
user59178

1

Perl 6 ,  48 33  30 байт

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

Спробуй це

Розширено:

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

Це *-1також лямбда-вираз типу WeverCode, де *єдиний позиційний параметр.


Пояснення для тих, хто не говорить perl?
Кіос

@Cyoce Додано для найкоротшої версії. Це потребує пояснення тому, хто знав Perl 5. Якщо вам цікаво [\+]з першого прикладу, чи зменшити трикутник [\+] 3,-1,1,-5(3,2,3,-2)і [\,] 3,-1,1,-5((3,), (3,-1), (3,-1,1), (3,-1,1,-5))
Бред Гілберт b2gills



0

C ++ 14, 103 байти

Як безіменного лямбда, вимагаючи його вхід , щоб мати rbegin, rend, backі , push_backяк контейнери vector, dequeабо list.

Використовуючи підхід з відповіді Джулії Глена О

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

Безголівки та використання:

#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

Clojure, 101 байт

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

Досить багато відповідає опису:

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

0

Java 7, 96 байт

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

Пояснення:

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

Код тесту:

Спробуйте тут.

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

Вихід:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.