Phạm vi dao động


19

Đưa ra một danh sách với số, xuất ra các phạm vi như thế này:

Đầu vào: [0, 5, 0]sẽ trở thành [0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0].

Đây là ánh xạ một phạm vi thông qua mảng, vì vậy trước tiên chúng ta phải tạo ra phạm vi [0, 5]đó là [0, 1, 2, 3, 4, 5]. Sau đó, chúng tôi sử dụng 5để tạo phạm vi [5, 0]. Được áp dụng ở phạm vi trước của chúng tôi, điều này mang lại cho chúng tôi:

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

Chúng ta hãy quan sát một trường hợp thử nghiệm có hai chữ số giống nhau cạnh nhau:

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

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

Vì vậy, điều này sẽ cung cấp cho chúng tôi [3, 4, 5, 5, 4, 3].

Một số trường hợp thử nghiệm khác:

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

Đầu vào sẽ luôn có ít nhất 2 số nguyên.

Câu trả lời ngắn nhất sẽ thắng!



1
Những cách liên quan đến đầu vào và đầu ra? Điều gì tạo thành một đầu vào hợp lệ?
flawr

Câu trả lời:


21

05AB1E, 1 byte

Ÿ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Đó là một tích hợp.


18
Bạn có một từ điển của tất cả các tích hợp trong tất cả các esolang trong đầu của bạn, hoặc những gì? ;)
Sản phẩm ETH

2
Vâng, cảm ơn bạn đã sử dụng osabie: P
Adnan

7
Tại sao nó thậm chí có tích hợp sẵn cho việc này?
Neil

Cần có một bản tổng hợp của tất cả các chương trình 0byte và 1byte (thậm chí là 2byte) để thực hiện.
Máy

2
@Neil Về cơ bản, đây là một chức năng bao gồm, nó thực sự không ngoạn mục.
Ad Nam

5

Javascript, 99 95 93 byte

4 6 byte tắt cảm ơn @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
Lưu 3 byte bằng cách sử dụng y<b?b-y:y-b||1. Lưu một byte khác bằng cách sử dụng y>b||y-b&&-1.
Neil

@Neil. Những người tốt!! Cảm ơn :)
đã xóa

1
Thật ra y<b?-1:y>bvẫn tốt hơn.
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]]

Đã thử nghiệm trong Firefox 44. Sử dụng các khả năng phá hủy đối số tuyệt vời của ES6 và khả năng hiểu mảng của ES7 (điều đáng buồn đã bị xóa khỏi thông số ES7).


Không hoạt động [3, 0, 0, -3]. Tôi đã sửa lỗi RangeError và lưu 10 byte nhưng nó vẫn không hoạt động:([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

Xin lỗi, tôi có nghĩa là ([n,...a])=>[n].concat([for(i of a)for(j of[...Array((r=n<i)?i-n:n-i)])i=r?++n:--n])tất nhiên.
Neil

@Neil Đã sửa lỗi, trong quá trình chơi golf nhiều hơn trong quá trình
ETHproductions 6/03/2016

4

JavaScript (ES6) 66 72

Hàm đệ quy liên tục thêm các giá trị bên trong mảng để lấp đầy khoảng trống giữa các số gần

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

Kiểm tra

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

Cuộc gọi ví dụ:

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

Kiểm tra trực tiếp trên ideone .


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:])],[])

Dùng thử trực tuyến

Cảm ơn Neil, DenkerAffe và Erwan vì đã chỉ ra những cải tiến mà tôi đã bỏ lỡ


Chắc chắn +1là không cần thiết?
Neil

tại sao không đi với lambda n:n[0:1]+sum([range(x,y,[1,-1][y+1<x])[1:]+[y]for(x,y)in zip(n,n[1:])],[])? lưu một số byte.
Denker

Tôi đã rất mệt mỏi khi viết bài này :) Trả lời trước, cải thiện sau.
Mego

tôi nghĩ bạn có thể thay thế [1,-1][y+1<x]bằng 2*(y>x)-1(tôi cũng không hiểu tại sao bạn sử dụng y<=x và không chỉ đơn giản y<x)
Erwan

n[0:1]tương đương với n[:1].
Jonathan Frech

3

Perl, 47 byte

Bao gồm +3 cho -p(mã chứa $'không gian và- số lượng quá)

Đưa ra danh sách các số trên STDIN:

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

fluctuating.pl:

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

Biến tạm thời và tất cả các dấu ngoặc đơn này cảm thấy không tối ưu ...


Có vẻ như bạn đã đăng câu trả lời sai: có vẻ như nó không hoạt động và $' bạn đã đề cập không có trong mã ...
Dada

@Dada: Có, một lần nữa dán một phiên bản mã chưa được kiểm tra cũ thay vì phiên bản cố định. Cảm ơn và đã sửa chữa
TonMedel

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

Ví dụ sử dụng: g [3,5,5,3]-> [3,4,5,5,4,3].

Đó là một sửa đổi câu trả lời của tôi cho một thách thức liên quan . Một lần nữa, công việc chính được thực hiện bằng cách ghép danh sách từ alên xuống b-1và từa dưới lên b+1(trong đó một danh sách sẽ trống) và một cuộc gọi đệ quy. Để xử lý a==btrường hợp cả hai danh sách đều trống, chúng tôi sẽ thêm vào [a|a==b]đó để đánh giá [a]nếu a==b[]nếu không.


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

đã lưu 4 byte bằng cách sử dụng rep not rep.int (mã golf không hiệu suất!) đã lưu 7 byte khác bằng cách sử dụng khớp một phần tích hợp khi sử dụng $(và thu gọn định nghĩa hàm thành 1 dòng


Tôi nghĩ (y=...)thay vì (y<-...)cũng hợp lệ, và ít hơn một byte.
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 đầu tiên của tôi.

Chỉnh sửa: Cảm ơn manatwork cho các đề xuất tuyệt vời.


Không cần gán cho biến, Proc ẩn danh là đủ; không cần đặt dấu ngoặc quanh tham số chính thức; lấy ra phần tử đầu tiên của mảng ngắn hơn với phép gán và splat song song; mapKhối mã có thể lấy mảng làm nhiều tham 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}. Nếu không thì tốt đẹp đầu tiên golf.
manatwork

Chọn từ một mảng 3 phần tử bởi toán tử tàu vũ trụ ngắn hơn 2 toán tử ternary : [[u],[*u+1..t],[*t..u-1].reverse][t<=>u].
manatwork


1

Perl 6, 94 byte

Tôi không siêu hạnh phúc với điều này ngay bây giờ, có lẽ tôi sẽ thực hiện một cảnh quay khác sau

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

1

PHP 5,4, 86 byte

Điều này có nghĩa là được sử dụng như một tập tin bao gồm, trả về kết quả.

Các giá trị được truyền dưới dạng tham số dòng lệnh.

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

Không chính xác đẹp hay bất cứ điều gì, nhưng làm công việc.


1

Con trăn 3 , 76 byte

Lần thử đầu tiên với câu trả lời của Python. Ý tưởng cơ bản là liên tục xác định các cặp trong chuỗi trong đó chênh lệch lớn hơn một bước và chèn một (và chỉ một) phần tử bổ sung để hoàn thành chuỗi theo đúng hướng. Lặp lại cho đến khi tất cả các khác biệt giữa các yếu tố liên tiếp nằm trong khoảng từ +1 đến -1.

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

Hãy thử trực tuyến!


0

Lua, 156 byte

Một hàm lấy một mảng trong tham số và trả về mảng mở rộng.

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 và giải thích

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

Để dễ sử dụng, bạn có thể sử dụng chức năng sau để in mảng được trả về f().

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

Khi kiểm tra trình này, bạn có thể gọi nó như:

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 "byte"

nhập mô tả hình ảnh ở đây

Vì Mathcad sử dụng "bảng trắng" 2D và các toán tử đặc biệt (ví dụ: toán tử tổng, toán tử tích phân) và lưu ở định dạng XML, một bảng tính thực tế có thể chứa hàng trăm (hoặc hơn) ký tự. Với mục đích của Code Golf, tôi đã lấy "số byte" của Mathcad là số lượng ký tự hoặc toán tử mà người dùng phải nhập để tạo bảng tính.

Chuyển đổi định nghĩa hàm thành một chương trình thẳng và thay thế biến lst bằng một tên ký tự duy nhất, cho tổng cộng 62 "byte". Với hàm, sử dụng một ký tự thay vì tên đầy đủ, điều này tăng lên 65 "byte" cho định nghĩa và thêm 4 "byte" cho mỗi cuộc gọi (giả sử rằng việc tạo danh sách tự nó không được bao gồm trong byte tổng thể đếm (Sử dụng các bảng dựng sẵn của Mathcad là một cách khác để nhập danh sách).


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;}
Khung nhìn bùng nổ
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;
}
Cuộc gọi đầu vào / chức năng
f([ bound1, bound2, bound3, ... ]);
Đầu ra
[int, int, int, int, ...]

Nó lộn xộn và chunky, và tôi sẽ cố gắng tối ưu hóa nó sau. Nó tạo ra một range()từ mỗi cặp giá trị liền kề, sau đó ghép chúng lại với nhau (sau khi poplấy hết phần tích lũy trước đó Array).


0

Perl6, 21

.join là viết tắt của $ _. tham gia

say EVAL .join: "..."

Kiểm tra (rakudo)

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

Đầu ra

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


-1

R , 74 byte

Một giải pháp R khác

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

Hãy thử trực tuyến!


điều này không thực sự hiệu quả vì giá trị cuối cùng dường như bị thiếu ...
Giuseppe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.