1つのシーケンスを作成する


12

整数のシーケンスは、このシーケンス内の連続する2つの数値の差が-1または1で、その最初の要素が0の場合、1シーケンスです。

より正確には:a1、a2、...、anは次の場合に1シーケンスです。

For any k (1 ≤  k < n): |a[k] - a[k+1]|=1, 
a[1]=0

入力

  • n -シーケンス内の要素の数
  • s -シーケンス内の要素の合計

出力

  • 可能であればn、要素の合計を含む長さの1シーケンスセット/リスト/配列/などs
  • 空のset / list / array / etc不可能な場合

入力の8 4場合、出力は[0 1 2 1 0 -1 0 1]またはになり[0 -1 0 1 0 1 2 1]ます。他の可能性があるかもしれません。

入力の3 5場合、出力は[]実行できないため、空です。

ルール

これはコードゴルフで、バイト単位の最短回答が勝ちです。提出物はプログラムまたは機能でなければなりません。入出力は、標準的な方法のいずれかで指定できます


ところで、長さlの1つのシーケンスとして表現可能なすべての数値は(l-1)*l/2、間のすべての数値であり-(l-1)*l/2、と同じパリティを持っているという証拠があります(l-1)*l/2
誇りに思ってhaskeller 14年

これは一つのシーケンスの所望せる効率的なアルゴリズム(O(n))を作製するために使用することができる
誇りhaskeller

回答:


7

CJam、56 47 44 34バイト

ここには多くの改善の余地がありますが、ここで最初の試みが行われます:

L0aa{{[~_(]_)2++}%}l~:N;(*{:+N=}=p

{ ... }%パートを効率的に行うためのデニスの功績。

可能であれば配列表現を出力します ""

こちらからオンラインでお試しください


私は混乱しています:{}%あなたのコードの一部は私のもののように見えません(これは@PeterTaylorのコードで、ドットをアンダースコアに置き換えています)。私はあなたのコードには、何も貢献している場合、それはだ{}=...オペレータ
デニス・

最初は_{_W=)+}%\{_W=(+}%+2つのコピーを作成し、最初のコピーに1を加え、他のコピーから1を引いていました。あなたの例から、1つの{ ... }%ブロックでそれを行う方法がわかりました。については{ ... }=、まだ投稿していませんが、実験でそれをすでにかなり減らしていました。
オプティマイザー14年

私は与えられた入力という質問から理解し3 5、出力があるべき[]ではなく""
ピーター・テイラー

1
@PeterTaylor「ができないならばセット/リスト/配列の/ etc空」 -だから私は...私はちょうどそれを明確にしなければならないことだと思う
オプティマイザ

さらに、[]pCJamでは単にに出力し""ます。したがって、言語が空の配列を表す方法です。
オプティマイザー14年

6

JavaScript(E6)79 82

F=(n,t,
  d=n+n*~-n/4-t/2,
  l=1,
  q=[for(x of Array(n))d<n--?++l:(d+=~n,--l)]
)=>d?[]:q

総当たりやすべてのタプルの列挙は不要です。

長さnのシーケンスをn -1ステップとして参照します。各ステップは増分または減分されます。
インクリメントはデクリメントにしか交換できず、合計は2ずつ変化するため、任意の長さに対して、合計は常に偶数または常に奇数になります。
すべての増分があるため、シーケンスは0、1、2、3、...、n-1であり、合計は(n-1)* n / 2であることがわかります。
最後のステップを変更すると、合計が2変化します。最後のステップの重量は2です。
次のステップから最後のステップを変更すると、合計が4変化するため、最後のステップの重量は4になります。これは、これまでの連続ステップが部分合計に基づいているためです。
前のステップを変更すると、合計が6変化するため、最後のステップの重量は6です(8ではなく、2進数ではありません)。
...
最初のステップの重量を変更する(n-1)* 2

アルゴリズム

Find the max sum (all increments)  
Find the difference with the target sum (if it's not even, no solution)  
Seq[0] is 0  
For each step  
  Compare current difference with the step weight
  if is less 
     we have an increment here, seq[i] = seq[i-1]+1 
  else 
     we have a decrement here, seq[i] = seq[i-1]-1.  
     Subtract we current weight from the current diff.
If remaining diff == 0, solution is Seq[]. Else no solution

未ゴルフコード

F=(len,target)=>{
  max=(len-1)*len/2
  delta = max-target
  seq = [last=0]
  sum = 0
  weight=(len-1)*2
  while (--len > 0)
  {
    if (delta >= weight)
    {
      --last
      delta -= weight;
    }
    else
    {
      ++last
    }  
    sum += last
    seq.push(last);
    weight -= 2;
  }  
  if (delta) return [];
  console.log(sum) // to verify

  return seq
}

Firefox / FireBugコンソールでテストする

F(8,4)

出力

[0, -1, 0, -1, 0, 1, 2, 3]

5

GolfScript(41 39バイト)

[][1,]@~:^;({{.-1=(+.)))+}%}*{{+}*^=}?`

オンラインデモ

41-> 39のDennisに感謝します。


あなたは短縮することができます,0=?。短いCJamへの直接的なポートは次のようになり5バイト:L1,al~:S;({{_W=(+_)))+}%}*{:+S=}=p
デニス

@Dennis oooh、これは2つの{}%ブロックに乗るのに便利な方法です。私はそれを使用する場合、注意してください?
オプティマイザー14年

@Optimizer:ありませんが、実際には私の仕事ではありません。
デニス14年

私は{ ... }%ブロックについて話していました。私のコードでは、2つ持っていましたが、1に減らそうとしていました。実際のアルゴリズムと同様に、Peterと私は同じアルゴリズムをほぼ同時に投稿したと思います。
オプティマイザー14年

3

Mathematica、73バイト

f=FirstCase[{0}~Join~Accumulate@#&/@Tuples[{-1,1},#-1],l_/;Tr@l==#2,{}]&;

シンプルなブルートフォースソリューション。

すべてのステップの選択肢を生成しています。次に、それらを累積リストに変換して、1つのシーケンスを取得します。そして、合計が2番目のパラメーターに等しい最初のものを探しています。存在しない場合、デフォルト値は{}です。


Mathematicaは、数学/組み合わせに関連する問題を解決するだけです。;)
オプティマイザー14年

@Optimizerそれにもかかわらず、CJamはそれを打ち負かすと確信しています。;)実際、この同じアルゴリズムをCJamで実行するのは難しくありません。
マーティンエンダー14年

1
それは間違いなくそれを打ち負かすでしょうが、それは単にメソッド名が短いためです。アルゴリズムは単純ではありません。
オプティマイザー14年

@Optimizer?この関数の構成よりも単純なループとフィルターの方が簡単だと思います。
ピーターテイラー14年

3

Haskell、56バイト

n%s=[x|x<-scanl(+)0`map`mapM(\_->[1,-1])[2..n],s==sum x]

説明:

  • 順列1,-1と長さがn-1のリストを作成します。replicateM n-1[-1,1]
    例:replicateM 2 [-1,1]==[[-1,-1],[-1,1],[1,-1],[1,1]]
  • それからワンシーケンスを構築します。scanlパフォーマンスは低いですが、ここでは適切な仕事をしています。
  • 長さのすべての可能な一系列フィルタn和でありますs

1
単純な改善は、aを中置関数に変更することです。ここに、より直感的でない改善のヒントがあります。Control.Monad使用replicateMするためだけにインポートするのは、すでに長すぎます。シミュレーションに使用できる他のモナド関数は何replicateMですか?
誇りに思ってhaskeller 14年

ところで、ソリューションを1つだけ返す必要があるhead$ため、ソリューションに追加する必要があります。
誇りに思っているhaskeller 14年

head返さない[]ために[] :: [[a]]-と、私はエラーを憎みます。
ヨハネスクーン14年

1
時間が経ったので、私が何を意味したかを説明します。およびのmapM(\x->[1,-1])[2..n]代わりに使用できます。sequencereplicate
誇りに思ってhaskeller 14年

面白い。それはさらに短いです:P
ヨハネス・クーン

2

Python、138

from itertools import*
def f(n,s):
 for i in[list(accumulate(x))for x in product([-1,1],repeat=n-1)]:
  if sum(i)==s:return[0]+i
 return[]

0

CJam、65 58 54バイト

私のMathematicaソリューションよりもやや短いですが、それでもCJamを適切に使用していないことのほとんどが私のせいです:

0]]l~:S;({{_1+\W+}%}*{0\{+_}%);}%_{:+S=}#_@\i=\0>\[]?p

文字通り同じアルゴリズムです:のすべてのn-1タプルを取得します{1, -1}。蓄積がである最初のものを探し、先頭にsaを追加し0ます。何も見つからない場合は空の配列を出力します。



0

ルビー(136)

def one_sequences(n)
  n.to_s.chars.map(&:to_i).each_cons(2).to_a.select{|x|x[0] == 0 && (x[1] == 1 || x[1]
  == -1)}.count
end

0

J、47文字

他の多くの回答と同様に、すべてのシーケンスをチェックします。短いO(n)ソリューションを作成しようとします。

   f=.4 :'(<:@#}.])(|:#~y=+/)+/\0,|:<:2*#:i.2^<:x'

   8 f 4
0 1 2 1 0 1 0 _1

   3 f 5
[nothing]

0

APL 38

{⊃(↓a⌿⍨⍺=+/a←+\0,⍉1↓¯1*(⍵⍴2)⊤⍳2*⍵),⊂⍬}

例:

     4 {⊃(↓a⌿⍨⍺=+/a←+\0,⍉1↓¯1*(⍵⍴2)⊤⍳2*⍵),⊂⍬}8
0 1 2 1 0 1 0 ¯1

これは他の多くの組み合わせと同様に、すべての組み合わせを総当たりして、一致するものを見つけ、見つからない場合は何も返しません。実際には、コードを短くするためにいくつかの組み合わせを複数回試行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.