ช่วงที่ผันผวน


19

เมื่อรับรายการด้วยตัวเลขให้แสดงช่วงดังนี้:

การป้อนข้อมูล: จะกลายเป็น[0, 5, 0][0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0]

นี้จะทำแผนที่ช่วงผ่านอาร์เรย์ดังนั้นเราจึงต้องสร้างช่วงซึ่งเป็น[0, 5] [0, 1, 2, 3, 4, 5]หลังจากนั้นเราจะใช้ในการสร้างช่วง5 [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
อินพุตและเอาต์พุตเกี่ยวข้องกันอย่างไร อะไรคืออินพุตที่ถูกต้อง
ข้อบกพร่อง

คำตอบ:


21

05AB1E, 1 ไบต์

Ÿ

ลองออนไลน์!

มันทำงานอย่างไร

มันเป็นในตัว


18
คุณมีพจนานุกรมทั้งหมดที่มีอยู่แล้วใน esolangs ทั้งหมดในหัวของคุณหรือไม่? ;)
ETHproductions

2
ขอขอบคุณที่ใช้ osabie: P
Adnan

7
ทำไมถึงมีในตัวสำหรับสิ่งนี้?
Neil

ควรมีการรวบรวมโปรแกรม 0byte และ 1byte ทั้งหมด (อาจถึง 2byte) ที่ทำสิ่งต่างๆ
CalculatorFeline

2
@ Neil มันเป็นฟังก์ชั่นการทำงานแบบรวมมันไม่ได้น่าประทับใจ
Adnan

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บันทึกไบต์อื่นโดยใช้
Neil

@Neil คนดี !! ขอบคุณ :)
นำออก

1
จริงๆแล้วy<b?-1:y>bยังดีกว่า
Neil

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

@Neil จับจ้องไปที่กระบวนการเพิ่มเติม
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ไม่จำเป็น?
Neil

ทำไมไม่ไปด้วย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]เทียบเท่ากับ
Jonathan Frech

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

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]ถ้าa==bและ[]เป็นอย่างอื่น


2

R, 86 82 75 ไบต์

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

บันทึก 4 ไบต์โดยใช้ตัวแทนไม่ใช่ rep.int (รหัสกอล์ฟไม่ได้ประสิทธิภาพ!) บันทึกอีก 7 ไบต์โดยใช้การจับคู่บางส่วนในตัวเมื่อใช้$(และนิยามฟังก์ชันฟังก์ชั่นการยุบ 1 บรรทัด


ฉันคิดว่า(y=...)มากกว่า(y<-...)นั้นเป็นสิ่งที่ถูกต้องและน้อยกว่าหนึ่งไบต์
Giuseppe

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 ที่ไม่ระบุชื่อก็เพียงพอแล้ว ไม่จำเป็นต้องใส่วงเล็บรอบพารามิเตอร์ที่เป็นทางการ การออกองค์ประกอบแรกของอาร์เรย์จะสั้นลงด้วยการกำหนดแบบขนานและเครื่องหมาย map's ->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}ป้องกันรหัสสามารถใช้อาร์เรย์เป็นหลายพารามิเตอร์: มิฉะนั้นกอล์ฟครั้งแรกที่ดี
จัดการ

หยิบจากอาร์เรย์องค์ประกอบ 3 โดยผู้ประกอบการยานอวกาศจะสั้นกว่าผู้ประกอบการ 2 [[u],[*u+1..t],[*t..u-1].reverse][t<=>u]ประกอบไปด้วย:
จัดการ


1

Perl 6, 94 ไบต์

ฉันไม่ได้มีความสุขสุด ๆ ในตอนนี้ฉันอาจจะถ่ายอีกครั้งในภายหลัง

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

1

PHP 5.4, 86 ไบต์

สิ่งนี้มีไว้เพื่อใช้เป็นไฟล์ที่รวมไว้ซึ่งจะส่งคืนผลลัพธ์

ค่าจะถูกส่งเป็นพารามิเตอร์ commandline

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

ไม่ว่าสวยหรืออะไร แต่งาน


1

Python 3 , 76 ไบต์

ความพยายามครั้งแรกที่คำตอบของงูหลาม แนวคิดพื้นฐานคือการระบุคู่ซ้ำ ๆ กันในลำดับที่ความแตกต่างใหญ่กว่าขั้นตอนหนึ่งแล้วใส่องค์ประกอบเพิ่มเติมหนึ่งอัน (และเพียงอันเดียว) เพื่อให้ลำดับสมบูรณ์ในทิศทางที่ถูกต้อง ทำซ้ำจนกว่าความแตกต่างทั้งหมดระหว่างองค์ประกอบที่อยู่ติดกันจะอยู่ระหว่าง +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

Ungolfed และคำอธิบาย

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 "ไวท์บอร์ด" และตัวดำเนินการพิเศษ (เช่นตัวดำเนินการ summation ตัวดำเนินการรวม) และบันทึกในรูปแบบ XML แผ่นงานจริงอาจมีอักขระหลายร้อย (หรือมากกว่า) สำหรับจุดประสงค์ของ Code Golf ฉันได้นำ Mathcad "byte count" เป็นจำนวนอักขระหรือตัวดำเนินการที่ผู้ใช้ต้องป้อนเพื่อสร้างแผ่นงาน

การแปลงนิยามฟังก์ชันเป็นโปรแกรมแบบตรงและแทนที่ตัวแปร 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ปิดท้ายของการสะสมก่อนหน้านี้Array)


0

Perl6, 21

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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.