阵列的反向增量


23

阵列的反向增量

数组反增量的延续

您的任务是获取一个带符号的32位整数数组,并以相反的增量重新编译它。

列表,

18  19  17  20  16

具有增量:

   1  -2   3  -4

反转后得出:

  -4   3  -2   1

然后在重新编译时,使用yields:

18  14  17  15  16

这应该是您的返回值。

重新编译包括采用C,它是数组的第一个值。在这种情况下,请18按顺序应用增量。所以18 + -4给定1414 + 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的果冻一起提及,如果不是Dennis进入他们的眼前,那将是第二名。


1
这些增量挑战仅证明了数学中不需要的增量。
ATaco '16

4
数学中不需要的三角洲的数量数学的最重要分支之一是基于(无限小)的三角洲
Luis Mendo

1
我仍然不开心
ATaco

我不能ç上PPCG数学挑战...:P
穆库尔·库马尔

Answers:


9

果冻,5个字节

.ịS_Ṛ

这使用了Glen O的Julia答案中的算法。

在线尝试!

怎么运行的

.ị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
丹尼斯·请
ATaco

好像你把我击败了几分钟。令人惊讶的是,我们的程序甚至都不相同(您在我的位置U)。我不知道这是否使它们足够不同以至于不考虑重复项。

@ ais523 U向量化虽然不,但它们对平面数组的行为是相同的。
丹尼斯

4
我想我会删除答案,(因为我自己设法提出了“正确的”答案,所以有点恼火,这里唯一真正的问题是其他人首先设法找到了相同的答案) 。

它以什么ASCII格式显示为6个字节?Xubuntu上的Pluma说这是10个字节,Julia存储为0x1e22和0x1e5a,因此每个存储区都需要3个字节。
Glen O

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*))

在线尝试!

这是一个子例程,用于从当前永久对象获取输入并输出至当前永久对象。

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

@JHM的Mathematica答案的端口。(我敢肯定自己可以派生它,但晚上不是这个时候。)编辑:感谢@ edc65,节省了8个字节。


是否有你为什么需要理由[...]
Mama Fun Roll'December

1
@MamaFunRoll否则它将进行修改a,稍后将在程序中使用
Conor O'Brien

哦,对了,忘了那
件事

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

@ edc65 Bah,昨晚我足够清醒,无法考虑z=a[0],但我忘了删除[...](,i,b)
尼尔

4

Mathematica,23个字节

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

未命名的函数。结果很简单: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个字节?:)(计入Glen O.进行计算)
Kade

哦,我怎么不知道。谢谢!:)
HyperNeutrino

亚历克斯,您可以使用lambda函数作为答案:)
Kade

什么。哦。好的谢谢!:)
HyperNeutrino

代替l[i]for i in range(len(l)),您可以j for j in l用来保存14个字节。
Sherlock16年

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字节

编辑:现在使用Glen O的Julia答案中的方法

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个字节

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

假设输入堆栈아。输出将存储在堆栈안中。

如果您想尝试以下代码:

在此代码第一行的末尾,添加字符length(n)-times(即,如果输入为7个整数,则将其插入7次)。对于每个提示,键入一个整数:

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

在这里尝试!(复制并粘贴代码)

对于1, 2, 3, 4, 5

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

然后键入1234,和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 2013年

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是还类型WhateverCode,其中的一个lambda表达式*是唯一的位置参数。


对于那些不讲Perl的人的解释?
Cyoce

@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个字节

作为无名拉姆达,要求其输入有rbeginrendbackpush_back像容器vectordequelist

使用Glen O的Julia答案中的方法

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

Haskell,33个字节

使用与JHM相同的逻辑:

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

也很可读。


您可以通过使用节省3个字节(!!0)head使用(<$>)map网上试试吧!
'18 -10-6


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]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.