波动范围


19

给定一个带数字的列表,输出如下范围:

输入:[0, 5, 0]将变为[0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0]

这是通过数组映射范围,因此我们首先必须创建范围[0, 5],即[0, 1, 2, 3, 4, 5]。之后,我们使用5来创建range [5, 0]。附加在我们之前的范围中,这使我们:

[0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0]

让我们观察一下两个彼此相邻的相同数字的测试用例:

[3, 5, 5, 3], ranges:

[3, 5] = 3, 4, 5
[5, 5] = 5 (actually [5, 5] due to overlapping)
[5, 3] = 5, 4, 3

所以这会给我们[3, 4, 5, 5, 4, 3]

其他一些测试用例:

[1, 9] > [1, 2, 3, 4, 5, 6, 7, 8, 9]
[10, -10] > [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10]
[3, 0, 0, -3] > [3, 2, 1, 0, 0, -1, -2, -3]
[1, 3, 5, 7, 5, 3, 1, -1, -3] > [1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3]

输入将始终至少包含2个整数。

最短答案胜出!



1
输入和输出以什么方式相关?什么是有效输入?
瑕疵的

Answers:


21

05AB1E,1个字节

Ÿ

在线尝试!

怎么运行的

它是内置的。


18
您脑中是否有包含所有esolang中所有内置字典的词典?;)
ETHproductions

2
好吧,谢谢您使用osabie:P
Adnan

7
为什么它甚至为此内置了?
尼尔

应该对所有负责工作的0byte和1byte(甚至2byte)程序进行编译。
CalculatorFeline

2
@Neil基本上是一个范围内的范围函数,实际上并不那么壮观。
阿德南

5

Javascript,99 95 93字节

4 6个字节的关闭,感谢@Neil

a=>a.reduce((x,y)=>x.concat(b.map?b=y:[...Array(y<b?b-y:y-b||1)].map(_=>b+=y<b?-1:y>b)),b=[])

f=
a=>a.reduce(
    (x,y)=>
        x.concat(
            b.map?b=y
            :[...Array(y<b?b-y:y-b||1)]
                .map(_=>b+=y<b?-1:y>b)
        )
    ,b=[])


G.addEventListener('click',_=>O.innerHTML=f(JSON.parse(I.value)));
<input id=I value="[3,5,5,3]"><button id=G>Go</button><pre id=O>


1
使用保存3个字节y<b?b-y:y-b||1。使用保存另一个字节y>b||y-b&&-1
尼尔2016年

@尼尔 好的!!谢谢:)
删除

1
其实y<b?-1:y>b还是更好。
尼尔2016年

5

JavaScript(SpiderMonkey 30 +),81 76字节

([n,...a])=>[n,...[for(i of a)for(j of Array(i<n?n-i:i-n||1))n+=i<n?-1:i>n]]

在Firefox 44中进行了测试。使用ES6出色的参数解构功能和ES7的数组理解能力(可悲的是,它们已从ES7规范中删除)。


不适用于[3, 0, 0, -3]。我修复了RangeError并保存了10个字节,但是仍然无法正常工作:([n,...a],z=[n])=>z.concat([for(i of a)for(j of[...Array((r=n<i)?i-n-1:n-i-1),0])i=r?++n:--n])
Neil

抱歉,我([n,...a])=>[n].concat([for(i of a)for(j of[...Array((r=n<i)?i-n:n-i)])i=r?++n:--n])当然是说。
尼尔

@Neil固定,与一群多在过程golfed断
ETHproductions

4

JavaScript(ES6)66 72

一个递归函数,它在数组内反复添加值以填充接近的数字之间的间隙

f=l=>l.some((x,i)=>(z=l[i-1]-x)*z>1&&l.splice(i,0,x+z/2|0))?f(l):l

测试

f=l=>l.some((x,i)=>(z=l[i-1]-x)*z>1&&l.splice(i,0,x+z/2|0))?f(l):l

console.log=x=>O.textContent+=x+'\n'

;[[1,9],[10,-10],[3,0,0,-3],[1, 3, 5, 7, 5, 3, 1, -1, -3]]
.forEach(t=>console.log(t+' -> ' +f(t)))
<pre id=O></pre>


3

C,120 + 12 = 132字节

i,j,k;f(a,n)int*a;{a[0]--;for(i=0;i<n-1;i++)for(k=0,j=a[i]-a[i+1]?a[i]:a[i]-1;j-a[i+1];)printf("%i ",j+=a[i+1]>j?1:-1);}

示例调用:

f(a,sizeof(a)/4);        // I've added 12 bytes because of ",sizeof(a)/4"

ideone上进行实时测试。


3

Python 2,77个字节

lambda n:n[0:1]+sum([range(x,y,2*(y>x)-1)[1:]+[y]for(x,y)in zip(n,n[1:])],[])

在线尝试

感谢Neil,DenkerAffe和Erwan指出我错过的改进之处


当然+1是不必要的吗?
尼尔2016年

为什么不去lambda n:n[0:1]+sum([range(x,y,[1,-1][y+1<x])[1:]+[y]for(x,y)in zip(n,n[1:])],[])?保存一些字节。
Denker

我在写这篇文章时很累:)首先回答,然后改进。
Mego

我认为您可以替换[1,-1][y+1<x]2*(y>x)-1(同样,我也不明白您为什么使用y<=x 而不是简单地使用y<x
Erwan

n[0:1]等价于n[:1]
乔纳森·弗雷奇

3

Perl,47个字节

包含+3 -p(代码也包含$'空格和-计数)

给出STDIN上的数字列表:

fluctuating.pl <<< "3 5 5 3"

fluctuating.pl

#!/usr/bin/perl -p
($n=$&+($'<=>$&))-$'&&s/\G/$n / while/\S+ /g

临时变量和所有这些括号感觉都不理想。


好像您发布了错误的答案:似乎没有用,并且$' 您提到的代码中也没有提到……
Dada

@Dada:是的,再次粘贴旧的未经测试的代码版本,而不是固定的版本。感谢并修复
Ton Hospel '16

2

Haskell,63 55字节

g(a:b:r)=[a|a==b]++[a..b-1]++[a,a-1..b+1]++g(b:r)
g x=x

用法示例:g [3,5,5,3]-> [3,4,5,5,4,3]

这是相关挑战的回答的修改。同样,主要工作是通过将列表a从上到下b-1和从a下到下b+1(其中一个列表为空)并进行递归调用来完成的。为了处理a==b两个列表都为空的情况,我们将[a|a==b]其添加为[a]if a==b[]else。


2

R,86 82 75字节

function(x)rep((y<-rle(unlist(Map(seq,head(x,-1),x[-1]))))$v,pmax(1,y$l-1))

使用rep not rep保存了4个字节,而不是rep.int(代码高尔夫没有性能!)在使用时$(和将函数定义折叠为1行)使用了内置的局部匹配,另外节省了7个字节


我认为(y=...)而不是(y<-...)也有效,并且少了一个字节。
朱塞佩

2

Ruby,116 82字节

->n{o,*m=n;o=[o];m.zip(n).map{|t,u|o+=[[u],[*u+1..t],[*t..u-1].reverse][t<=>u]};o}

我第一次打高尔夫球。

编辑:感谢manatwork的很棒的建议。


无需分配给变量,匿名proc就足够了;无需在形式参数周围加上括号;通过并行分配和splat,取出数组的第一个元素会更短;map的代码块可以将数组作为多个参数:->n{o,*m=n;o=[o];m.zip(n).map{|t,u|o+=u==t ?[u]:(u<t ?[*u+1..t]:[*t..u-1].reverse)};o}。否则不错的第一场高尔夫球。
manatwork'Mar

太空飞船算子从3个元素的数组中进行选择的时间比2个三元算子短[[u],[*u+1..t],[*t..u-1].reverse][t<=>u]
manatwork'Mar


1

Perl 6,94位元组

我现在对此不太满意,我可能稍后再拍

{reduce {|@^a[0..*-2],|@^b},map {@_[0]!= @_[1]??(@_[0]...@_[1])!!(@_[0],@_[1])},.rotor(2=>-1)}

1

PHP 5.4,86字节

这打算用作包含文件,返回结果。

这些值作为命令行参数传递。

<?for($i=1;$i<$argc-1;$R=array_merge($R?:[],range($argv[$i++],$argv[$i++])));return$R;

不完全漂亮,也不是什么,但是能完成任务。


1

Python 3,76个字节

第一次尝试Python答案。基本思想是在差异大于步长的序列中重复标识对,并插入一个(只有一个)附加元素以按正确方向完成序列。重复直到连续元素之间的所有差都在+1和-1之间。

d=diff
while any(d(x)**2>1):i=argmax(d(x)**2);x[:i+1]+=[x[i]+sign(d(x)[i])]

在线尝试!


0

Lua,156字节

该函数接受参数中的数组并返回扩展数组。

function f(t)r={}for i=2,#t
do x,y=t[i-1],t[i]r[#r+1]=x==y and x or nil
z=x>y and-1or 1
x=x==r[#r]and x+z or x
for j=x,y,z
do r[#r+1]=j end end
return r end

脱节和解释

function f(t)
  r={}                        -- Initialise an empty array
  for i=2,#t                  -- Iterate over the parameter array
  do
    x,y=t[i-1],t[i]           -- x and y are shorter names than t[i-1]
    r[#r+1]=                  -- when there's a range like [5,5]
      x==y and x or nil       -- put this number once in the array
    z=x>y and-1or 1         -- determine the step value
    x= x==r[#r]               -- prevent repeating the last value of r
          and x+z or x        -- by incrementing/decrementing x
    for j=x,y,z               -- iterate from t[i-1] to t[i] by step z (-1 or 1)
    do
      r[#r+1]=j               -- put j into the array r
    end
  end
  return r                    -- return the extended array
end

为了易于使用,您可以使用以下函数来打印由返回的数组f()

function printArray(t)
  print("["..table.concat(t,",").."]")
end

测试此提交时,可以这样称呼它:

printArray(f( {0,5,0,3,4,4,7,3,-3} ))
> [0,1,2,3,4,5,4,3,2,1,0,1,2,3,4,4,5,6,7,6,5,4,3,2,1,0,-1,-2,-3]

0

Mathcad,62个“字节”

在此处输入图片说明

由于Mathcad使用2D“白板”和特殊运算符(例如,求和运算符,积分运算符)并以XML格式保存,因此实​​际的工作表可能包含数百个(或更多)字符。出于Code Golf的目的,我将Mathcad的“字节数”作为用户创建工作表时必须输入的字符或运算符的数量。

将函数定义转换为简单的程序,并将变量lst替换为单个字符名称,则总共有62个“字节”。使用该功能时,使用单个字符而不是全名,定义将增加到65个“字节”,每次调用又增加4个“字节”(假设列表本身的创建未包含在整个字节中计数(使用Mathcad的内置表是输入列表的另一种方法)。


0

PHP,144字节

function f($r){$m=[];for($i=0;++$i<count($r);){$d=array_pop($m);$n=$r[$i];$p=$r[$i-1];$m=array_merge($m,$p==$n?[$p,$n]:range($p,$n));}return$m;}
分解图
function f($r) {
  $m = [];
  for ($i=0; ++$i < count($r); ) {
    $d = array_pop($m);
    $n = $r[$i];
    $p = $r[$i-1];
    $m = array_merge($m, $p==$n ? [$p,$n]
                                : range($p,$n));
  }
  return $m;
}
输入/功能调用
f([ bound1, bound2, bound3, ... ]);
输出量
[int, int, int, int, ...]

它很凌乱而且很笨拙,稍后我将尝试对其进行优化。它range()从每对相邻的值对中创建一个,然后将它们缝合在一起(pop剔除前一个cumulative的末尾之后Array)。


0

Perl6,21

.join是$ _。join的缩写

say EVAL .join: "..."

测试(rakudo)

perl6 -MMONKEY-SEE-NO-EVAL -e'say EVAL @*ARGS.join: "..."' 1 3 5 7 5 3 1 -1 -3

输出量

(1 2 3 4 5 6 7 6 5 4 3 2 1 0 -1 -2 -3)


-1

R,74字节

另一个R解决方案

function(x){b=x[1];z=c();for(a in x[-1]){z=c(z,c(b:(a-sign(a-b))));b=a};z}

在线尝试!


这不太起作用,因为最后一个值似乎丢失了……
朱塞佩
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.