Rentang berfluktuasi

19

Diberikan daftar dengan angka, tampilkan rentang seperti ini:

Input: [0, 5, 0]akan menjadi [0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0].

Ini memetakan rentang melalui array, jadi pertama-tama kita harus membuat rentang [0, 5], yaitu [0, 1, 2, 3, 4, 5]. Setelah itu, kami menggunakan 5untuk membuat rentang [5, 0]. Di tambahkan pada kisaran kami sebelumnya, ini memberi kami:

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

Mari kita amati test case dengan dua digit yang sama di samping satu sama lain:

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

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

Jadi ini akan memberi kita [3, 4, 5, 5, 4, 3].

Beberapa test case lainnya:

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

Input akan selalu memiliki setidaknya 2 bilangan bulat.

Jawaban terpendek menang!

Lamaro
sumber
3
Terkait Terkait
Martin Ender
1
Dalam hal apa input dan output terkait? Apa yang merupakan input yang valid?
flawr

Jawaban:

21

05AB1E, 1 byte

Ÿ

Cobalah online!

Bagaimana itu bekerja

Ini built-in.

Dennis
sumber
18
Apakah Anda memiliki kamus semua bawaan di semua esolang di kepala Anda, atau apa? ;)
ETHproductions
2
Terima kasih telah menggunakan osabie: P
Adnan
7
Mengapa bahkan ada built-in untuk ini?
Neil
Seharusnya ada kompilasi semua program 0byte dan 1byte (mungkin bahkan 2byte) yang melakukan hal-hal.
CalculatorFeline
2
@ Neil Ini pada dasarnya fungsi rentang inklusif, benar-benar tidak spektakuler.
Adnan
5

Javascript, 99 95 93 byte

4 6 byte mati terima kasih @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>

dihapus
sumber
1
Hemat 3 byte dengan menggunakan y<b?b-y:y-b||1. Simpan byte lain dengan menggunakan y>b||y-b&&-1.
Neil
@Neil. Bagus !! Terima kasih :)
dihapus
1
Sebenarnya y<b?-1:y>bmasih lebih baik.
Neil
5

JavaScript (SpiderMonkey 30+), 81 76 byte

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

Diuji di Firefox 44. Menggunakan kemampuan menghancurkan argumen ES6 yang luar biasa dan pemahaman array ES7 (yang sayangnya telah dihapus dari spesifikasi ES7).

Produksi ETH
sumber
Tidak berfungsi [3, 0, 0, -3]. Saya memperbaiki RangeError dan menyelamatkan 10 byte tetapi tetap tidak berhasil:([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
Maaf, maksud saya ([n,...a])=>[n].concat([for(i of a)for(j of[...Array((r=n<i)?i-n:n-i)])i=r?++n:--n])tentu saja.
Neil
@Neil Tetap, dengan banyak lagi
bermain golf
4

JavaScript (ES6) 66 72

Fungsi rekursif yang berulang kali menambahkan nilai di dalam array untuk mengisi kesenjangan antara angka yang dekat

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

Uji

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>

edc65
sumber
3

C, 120 + 12 = 132 byte

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

Contoh panggilan:

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

Tes langsung pada ideone .

dihapus
sumber
3

Python 2, 77 byte

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

Cobalah online

Terima kasih kepada Neil, DenkerAffe, dan Erwan karena menunjukkan perbaikan yang saya lewatkan

Mego
sumber
Tentunya +1itu tidak perlu?
Neil
kenapa tidak ikut lambda n:n[0:1]+sum([range(x,y,[1,-1][y+1<x])[1:]+[y]for(x,y)in zip(n,n[1:])],[])? menghemat beberapa byte.
Denker
Saya sangat lelah saat menulis ini :) Jawab dulu, tingkatkan nanti.
Mego
saya pikir Anda dapat mengganti [1,-1][y+1<x]dengan 2*(y>x)-1(juga saya tidak mengerti mengapa Anda menggunakan y<=x dan tidak hanya y<x)
Erwan
n[0:1]setara dengan n[:1].
Jonathan Frech
3

Perl, 47 byte

Termasuk +3 untuk -p(kode mengandung $'spasi dan -juga hitungan)

Berikan daftar angka pada STDIN:

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

fluctuating.pl:

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

Variabel sementara dan semua tanda kurung ini terasa ...

Ton Hospel
sumber
Sepertinya Anda memposting jawaban yang salah: sepertinya tidak berfungsi dan $' Anda sebutkan tidak ada dalam kode ...
Dada
@Dada: Ya, sekali lagi menempelkan versi kode yang belum diuji dan bukan yang diperbaiki. Terima kasih dan telah diperbaiki
Ton Hospel
2

Haskell, 63 55 byte

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

Contoh penggunaan: g [3,5,5,3]-> [3,4,5,5,4,3].

Ini modifikasi dari jawaban saya untuk tantangan terkait . Sekali lagi, pekerjaan utama dilakukan dengan menggabungkan daftar dari aatas ke b-1dan dari abawah ke b+1(di mana satu daftar akan kosong) dan panggilan rekursif. Untuk menangani a==bkasus di mana kedua daftar kosong, kami menambahkan [a|a==b]yang mengevaluasi ke [a]jika a==bdan []sebaliknya.

nimi
sumber
2

R, 86 82 75 byte

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

disimpan 4 byte menggunakan rep bukan rep.int (golf kode bukan kinerja!) menyimpan 7 byte lainnya dengan menggunakan pencocokan parsial bawaan saat menggunakan $(dan mengecilkan definisi fungsi menjadi 1 baris

mnel
sumber
Saya pikir (y=...)bukan (y<-...)juga valid, dan satu byte lebih sedikit.
Giuseppe
2

Ruby, 116 82 byte

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

Golf pertama saya.

Sunting: Terima kasih manatwork untuk saran yang luar biasa.

emagdne
sumber
Tidak perlu ditugaskan ke variabel, proc anonim sudah cukup; tidak perlu menempatkan tanda kurung di sekitar parameter formal; menghapus elemen pertama array lebih pendek dengan penugasan paralel dan percikan; map's blok kode bisa mengambil array sebagai beberapa parameter: ->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}. Golf pertama yang bagus.
manatwork
Memilih dari array 3 elemen oleh operator pesawat ruang angkasa lebih pendek dari 2 operator ternary: [[u],[*u+1..t],[*t..u-1].reverse][t<=>u].
manatwork
1

Perl 6, 94 byte

Saya tidak terlalu senang dengan ini sekarang, saya mungkin akan mengambil gambar lain nanti

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

PHP 5.4, 86 byte

Ini dimaksudkan untuk digunakan sebagai file yang disertakan, yang mengembalikan hasilnya.

Nilai dilewatkan sebagai parameter baris perintah.

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

Tidak persis cantik atau apa pun, tetapi melakukan pekerjaan.

Ismael Miguel
sumber
1

Python 3 , 76 byte

Upaya pertama pada jawaban Python. Ide dasarnya adalah untuk berulang kali mengidentifikasi pasangan dalam urutan di mana perbedaannya lebih besar dari langkah dan memasukkan satu (dan hanya satu) elemen tambahan untuk menyelesaikan urutan di arah yang benar. Ulangi sampai semua perbedaan antara elemen berturut-turut adalah antara +1 dan -1.

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

Cobalah online!

NofP
sumber
0

Lua, 156 Bytes

Fungsi yang mengambil array dalam parameter dan mengembalikan array yang diperluas.

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

Tidak terseret dan penjelasan

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

Untuk kemudahan penggunaan, Anda dapat menggunakan fungsi berikut untuk mencetak array yang dikembalikan oleh f().

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

Saat menguji kiriman ini, Anda dapat menyebutnya seperti:

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]
Katenkyo
sumber
0

Mathcad, 62 "byte"

masukkan deskripsi gambar di sini

Karena Mathcad menggunakan "papan tulis" 2D dan operator khusus (misalnya, operator penjumlahan, operator integral), dan menyimpan dalam format XML, lembar kerja yang sebenarnya mungkin berisi beberapa ratus (atau lebih) karakter. Untuk keperluan Code Golf, saya telah mengambil "byte byte" Mathcad untuk menjadi jumlah karakter atau operator yang harus dimasukkan pengguna untuk membuat lembar kerja.

Mengubah definisi fungsi menjadi program lurus, dan mengganti variabel pertama dengan nama karakter tunggal, memberikan total 62 "byte". Dengan fungsi, menggunakan karakter tunggal daripada nama lengkap, ini meningkat menjadi 65 "byte" untuk definisi dan 4 "byte" untuk setiap panggilan (dengan asumsi bahwa pembuatan daftar itu sendiri tidak termasuk dalam byte keseluruhan count (Menggunakan tabel bawaan Mathcad adalah cara lain untuk memasukkan daftar).

Stuart Bruff
sumber
0

PHP, 144 byte

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;}
Tampilan meledak
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;
}
Input / panggilan fungsi
f([ bound1, bound2, bound3, ... ]);
Keluaran
[int, int, int, int, ...]

Ini berantakan dan tebal, dan saya akan mencoba mengoptimalkannya nanti. Ini menciptakan range()dari setiap pasangan pasangan nilai yang berdekatan, lalu menjahitnya bersama-sama (setelah popmengakhiri kumulatif sebelumnya Array).

ricdesi
sumber
0

Perl6, 21

.join adalah kependekan dari $ _. gabung

say EVAL .join: "..."

Tes (rakudo)

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

Keluaran

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

R , 74 byte

Solusi R. lainnya

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

Cobalah online!

NofP
sumber
ini tidak cukup berfungsi karena nilai terakhir tampaknya hilang ...
Giuseppe