変動範囲


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]

同じ数字が2つ並んだテストケースを見てみましょう。

[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
入力と出力はどのように関係していますか?有効な入力とは何ですか?
-flawr

回答:


21

05AB1E、1バイト

Ÿ

オンラインでお試しください!

使い方

それは組み込みです。


18
あなたの頭の中のすべてのエソランのすべてのビルトインの辞書を持っていますか、それとも何ですか?;)
ETHproductions

2
さて、osabieを使用していただきありがとうございます:P
アドナン

7
なぜこの機能が組み込まれているのですか?
ニール

すべてを処理する0バイトおよび1バイト(場合によっては2バイト)のプログラムすべてのコンパイルが必要です。
電卓

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
ニール

@ニール。良いもの!!ありがとう:)
削除

1
実はy<b?-1:y>bまだまだましです。
ニール

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])
ニール

申し訳ありませんが、([n,...a])=>[n].concat([for(i of a)for(j of[...Array((r=n<i)?i-n:n-i)])i=r?++n:--n])当然のことです。
ニール

@Neil Fixed、その過程でより多くのゴ​​ルフが行われた
-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不要ですか?
ニール

一緒に行きませんlambda n:n[0:1]+sum([range(x,y,[1,-1][y+1<x])[1:]+[y]for(x,y)in zip(n,n[1:])],[])か?いくつかのバイトを節約します。
デンカー

これを書いている間、私は非常に疲れました:)最初に答えて、後で改善してください。
メゴ

私はあなたが交換することができると思い[1,-1][y+1<x]によって2*(y>x)-1(また、私はあなたが使用する理由を理解していないy<=x だけではなくy<x
エルワン・

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

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]

これは、関連する課題に対する私の答えの修正です。繰り返しますが、メインの作業は、リストを上から下へ(1つのリストが空になる場所)に連結し、再帰呼び出しによって行われます。両方のリストが空の場合を処理するために、if とelse に評価する前に追加します。ab-1ab+1a==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))

(!コードゴルフない性能)rep.intない担当者を使用して4つのバイトを保存使用して別の7つのバイトを保存内蔵部分一致使用する場合$(1つのラインに関数定義を崩壊


私も有効では(y=...)なく(y<-...)、1バイト少ないと思います。
ジュゼッペ

2

ルビー、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。


変数に割り当てる必要はありません。匿名プロシージャで十分です。仮パラメータを括弧で囲む必要はありません。配列の最初の要素を取り出すことは、並列割り当てとスプラットで短くなります。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}。それ以外の場合、最初の素敵なゴルフ。
マナトワーク

宇宙船演算子による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バイト

これは、結果を返すインクルードファイルとして使用するためのものです。

値はコマンドラインパラメータとして渡されます。

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

必ずしもきれいではありませんが、仕事をしています。


1

Python 3、76バイト

Pythonでの最初の回答。基本的な考え方は、差がステップよりも大きいシーケンス内のペアを繰り返し識別し、正しい方向にシーケンスを完了するために1つ(および1つだけ)の追加要素を挿入することです。連続する要素間の差がすべて+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形式で保存するため、実際のワークシートには数百(またはそれ以上)の文字が含まれる場合があります。コードゴルフの目的で、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前の累積値の終わりを消した後Array)。


0

Perl6、21

.joinは$ _。joinの短縮形です

say EVAL .join: "..."

テスト(楽堂)

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.