算術シーケンスを再構築する


23

中間からいくつかの項が削除された正の整数の有限の算術シーケンスが与えられた場合、シーケンス全体を再構築します。

タスク

算術シーケンスを考えます。連続する2つの要素の差が同じである正の整数のリスト。

2 5 8 11 14 17

ここで、次の制約に従って、シーケンスから1つ以上の整数が削除されたとします。

  • 削除される整数は、シーケンスの連続した用語になります。
  • シーケンスの最初と最後の整数は削除されません。
  • 少なくとも3つの整数がシーケンスに残ります。

上記のシーケンスの場合、可能な削除は次のとおりです。

2 5 8 14 17  (removed 11)
2 5 17       (removed 8 11 14)
2 14 17      (removed 5 8 11)

あなたのタスク:これらの部分シーケンスのいずれかを指定して、元の完全なシーケンスを再構築します。

詳細

入力が有効(解決策あり)で、少なくとも1つの用語が欠落していると仮定できます。シーケンス内のすべての数値は正の(> 0)整数になります。シーケンスは、用語間に正または負の差がある場合があります(つまり、増加または減少している場合があります)。一定のシーケンスではありません(例:)5 5 5

あなたの解決策は、完全なプログラムまたは機能かもしれません。いずれかのデフォルトの入力と出力の方法が許容されています。

入力および出力は、文字列(合理的な区切り文字を含む)、文字列のリスト、または数字のリストです。あなたの言語にとって都合の良いベースで数字を表すことができます。

他の人があなたのコードをより簡単にテストできるように、あなたの提出物に異常なI / Oメソッド/フォーマットを記載してください。

テストケース

In: 2 5 8 14 17
Out: 2 5 8 11 14 17
In: 2 5 17
Out: 2 5 8 11 14 17
In: 2 14 17
Out: 2 5 8 11 14 17
In: 21 9 6 3
Out: 21 18 15 12 9 6 3
In: 10 9 5
Out: 10 9 8 7 6 5
In: 1 10 91 100
Out: 1 10 19 28 37 46 55 64 73 82 91 100

これはです。各言語の最短回答が勝ちます。



フォームに入力があると興味深いでしょう2 5 ... 17
シュナダー

回答:


9

Haskell、63バイト

f(a:b:c)|s<-[a,b..last c],all(`elem`s)c=s
f a=r$f$r a
r=reverse

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

基本的には、前面から結果を作成し、それが失敗した場合は背面から作成することを試みます。これは、入力の最初と最後のメンバーが常に正しいという事実、削除されたメンバーが連続している必要があるという事実、および入力に常に少なくとも3つのアイテムがあるという事実を使用します。私がしなければならないことは、2番目または最後から2番目のメンバーが正確であると仮定し、それが機能するかどうかをチェックすることです。幸いなことに、Haskellには算術級数を作成するための本当に美しい構文があります。

編集:バグを指摘して解決策を提供してくれた@xnorに感謝します!


5
これはかなりですが、常に動作しないようです:[1,3,4,5]与えます[1,3,5]
-xnor

1
そしてall(`elem`s)c、同じバイト数で修正する必要があると思います。
-xnor

6

05AB1E9 8バイト

Ÿs¥¿Äô€н

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

説明

  • +/- 1の差で範囲[first、...、last]を構築します
  • 入力のデルタを計算する
  • デルタのgcdの絶対値を取得します
  • そのサイズのチャンクで全範囲を分割します
  • 各チャンクの最初の要素を取得します

user202729に触発され、のgcd of deltas代わりにを使用して1バイトを保存min deltaました


5

Brachylog v2、9バイト

⊆.s₂ᵇ-ᵐ=∧

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

これは関数の提出です。BrachylogインタープリターはZ、コマンドライン引数として指定することにより、完全なプログラムであるかのように関数を評価することができます。この場合、入力は、たとえば、形式で指定され[1, 2, 4]、出力は、同様の形式、たとえば、で返されますZ = [1, 2, 3, 4]。(もちろん、関数のサブミットの場合、入力と出力はまったく形式ではなく、単なるリストです。)

これは、OPが要求した問題よりも難しい問題を実際に解決します。削除が連続しているかどうかに関係なく、指定された順序で指定された値を含む整数の最短算術シーケンスを解決します。ブルートフォースを使用するため、多くの値が削除されると非常に遅くなる可能性があります。

説明

プログラムには3つの主要部分があります。

入力のスーパーシーケンス(サブシーケンスとして入力を持つシーケンス)を見つけます。Brachylogプログラムから複数の可能な出力がある場合、選択される出力はタイブレーク順の最初の出力であり、タイブレーク順は意見があるプログラムの最初のコマンドによって決定されます。この場合、長い出力よりも短い出力を優先する順序を指定します。したがって、取得される出力は、プログラムの残りの制限に従う入力の最短スーパーシーケンスになります。

.は、入力として認識される値(この場合はスーパーシーケンス)を出力するために使用されますが、特定の条件が保持されていることも表明します。言い換えれば、特定の条件に従う最短スーパーシーケンスを出力します(そして、条件に従うかどうかを確認するために使用される中間結果を無視します)。

最後にs₂ᵇ-ᵐ =、つまり、「シーケンスのすべてのデルタが等しい」、つまり出力に適用する条件があります。(これからの戻り値は、スーパーシーケンス自体ではなく、デルタのリストです。そのため、正しいものが出力されるようにするために.が必要です。)

Brachylogは、デルタの計算を処理できる組み込み関数を持たないこと、リストから重複するペアに操作を適用することなどにより、ここで抑制されています。代わりに、我々は明示的に何を意味するかを言っている:s₂ᵇ全て(見つけた)部分文字列(s長さ2(のを))(の使用はサブストリングにし、supersequenceでの未知数との間のリンクを維持するために必要とされる、より一般的に使用することは、これを破りますリンク)。次に-ᵐ、これらのペアのそれぞれに対して減算を行い、デルタを生成します。s₂ᵇ-ᵐほとんどの現代のゴルフ言語に組み込まれているもののために5バイトを書く必要があるのは面倒ですが、それがcodegolfが時々行く方法だと思います。


4

Python 2、104 97 89 83 71 67 60バイト

4バイトを節約してくれたChas Brownに感謝します。7バイトを節約して
くれたovsに感謝します。

引数でリストを入力します。

lambda a,b,*c:range(a,c[-1],min(b-a,c[0]-b,key=abs))+[c[-1]]

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

説明:

削除されたものは連続しているため、連続する要素の2つのペアの違いをチェックするだけで十分です。


あなたは置き換えることにより、3つのバイトを保存することができb if b%c else c[c,b][b%c>0]
チャスブラウン

@ChasBrownありがとう、すぐに良いアプローチを思いついたけど。
コレラSu

1
といいkey=absね!ここではf=、再帰関数が使用されない限り、人々はしばしばこの部分を省略しているようです。そのため、2バイト節約できます。
チャスブラウン

1
また、交換するa[-1]-a[-2]a[2]-a[1]-ロジックは同じです、あなたは別の2バイトを取得します。
チャスブラウン


4

Pyth、11バイト

%hS.+SQ}hQe

ここで試してみてください!

バイトを保存してくれたSteven H.に感謝します!

Pyth、12バイト

%.aiF.+Q}hQe

ここで試してみてください!

使い方

%.aiF。+ Q} hQe〜完全なプログラム。

     。+ Q〜デルタを取得します。
   iF〜GCDによる削減。
 .a〜絶対値。
%〜モジュラー。のすべてのn番目の要素を取得...
        }〜の間の包括的数値範囲
         hQ〜最初の要素、および...
           e〜最後の要素。

事前並べ替えQあなたの代わりの最初の要素をソートし、取ることができるようにabs(GCD(Q))のように%hS.+SQ}hQe11バイトのために。テストスイート
スティーブン

3

ゼリー、8バイト

ṂrṀmIg/$

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

ノート:

  • 古いバージョンのJellyでのみ動作します。(たとえば、このコミット)(guse fractions.gcdmath.gcd、常に正の値を返すの代わりに、入力符号と同じ結果符号を持つuse )。

  • TIOリンクは上記のPython 3 TIOリンクで、Pythonコードは(TIOを実行するために)同じファイルにパックのすべて(3つのファイル)を除いて、私は上記のコミットからゼリーのソースコードで構成され、dictionary.pyに縮小されました一部の行のみ。それでもdictionary.py、圧縮文字列を使用しないため、この答えとは無関係です。(“...»構成体)

説明:

まず、連続したセグメントが削除され、少なくとも3つの要素が残っているため、古いリストには2つの連続した数字が残っており、デルタはすべてステップの倍数になります。したがって、gcd差(I、増分)リストはステップの絶対値になります。

幸いなことにgcdが署名されています(上記の注を参照)

したがって、プログラムは次のことを行います。

ṂrṀ

最小値から最大値まで増加する整数範囲

m

モジュラー、n番目の要素ごとに選択します。

Ig/$

モナド($)チェーンはI(増分、差)とg/gcdリストの要素を削減)を組み合わせます。増分が正の場合、gcdは正になり、返されるリストは左から右(増加)になり、逆も同様です。


わーい!05AB1Eの回答を1バイト上回ります!
user202729

ネクタイのgcd代わりに使用しminます。あまりにも悪い私はそう私は7時になるだろう、記号でGCDを取得します。)
Emigna

3

MATL、13バイト

1)0GdYkG0)3$:

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

説明:

Consider the example input [2 14 17]:
           # implicit input, STACK: [[2 14 17]]
1)         # push 1, index, STACK: [2]
0G         # push 0, duplicate input, STACK: [2, 0, [2 14 17]]
d          # take differences, STACK: [2, 0, [12, 3]]
Yk         # get value in [12, 3] nearest to 0, STACK: [2, 3]
G0)        # get last element in input, STACK: [2, 3, 17]
3$:        # 3-input :, computes 2:3:17, the range from 2 to 17 by 3
           # STACK: [[2 5 8 11 14 17]], implicit output.


3

JavaScript(ES6)、92 90

2バイト保存されたthx Arnauldの編集

最初の2つと最後の2つとの違いをチェックするだけで十分なので、簡単です。しかし、信じられないほど長い。

s=>(e=(z=s.pop(a=s[0]))-s.pop(d=s[1]-a),[...Array((z-(a-=d=e*e>d*d?d:e))/d)].map(_=>a+=d))

少ないゴルフ

s=>{
  a =s[0]
  b =s[1]
  z = s.pop()
  y = s.pop()
  d = b-a
  e = z-y
  d = e*e>d*d?d:e  
  n = (z-a)/d+1
  return [...Array(n)].map((_,i) => a + i*d)
}

テスト

var F=
s=>(e=(z=s.pop(a=s[0]))-s.pop(d=s[1]-a),[...Array((z-(a-=d=e*e>d*d?d:e))/d)].map(_=>a+=d))

var test=`In: 2 5 8 14 17 Out: 2 5 8 11 14 17
In: 2 5 17 Out: 2 5 8 11 14 17
In: 2 14 17 Out: 2 5 8 11 14 17
In: 21 9 6 3 Out: 21 18 15 12 9 6 3
In: 10 9 5 Out: 10 9 8 7 6 5
In: 1 10 91 100 Out: 1 10 19 28 37 46 55 64 73 82 91 100`.split`\n`
.map(r=>r.split`Out`.map(x=>x.match(/\d+/g)))

test.forEach(([i,k])=>{
  var o=F(i.slice(0))
  var ok = o+''==k
  console.log(ok?'OK':'KO',i+' => '+o)
})


a-=d=e*e>d*d?d:e動作し、2バイトを節約するはずです。
アーナルド

@ Arnauldは本当に感謝します
-edc65

2

Wolfram言語(Mathematica)、50バイト

Range[#&@@#,#[[-1]],#&@@Differences@#~SortBy~Abs]&

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


「数字のリスト」には、数字を個々の引数として含めることが含まれますか?もしそうなら、かなりのバイト数を節約できるようです。
numbermaniac

最後の入力をフェッチ組み込みがないので、@numbermaniac私は...、そうは思わない
JungHwan分

ああ...本当。それを忘れました。
numbermaniac

あなたは使用することができます{##}し、Last@{##}私はそれを得ることができる最高は51のバイトでした。
numbermaniac


1

Haskell73 69バイト

f(h:t)=do(#)<-[(-),(+)];[h,h#minimum(abs<$>zipWith(-)t(h:t))..last t]

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


1
63バイトのソリューションを見つけましたが、あなたのものとはかなり異なります。別の投稿をする必要がありますか?
user1472751

@ user1472751私はライコニではありませんが、このサイトは競争とコラボレーションを目的としています。だから私はそれを投稿します。
H.PWiz

@ user1472751すてきなアプローチ!どうぞ、あなた自身の答えとして投稿してください。
ライコニ

1

J49、47、46バイト

(0-[:<./2|@-/\]){.@[&]\({.<.{:)+[:i.{:(+*)@-{.

エミグナのソリューションに触発されました。

使い方:

 (0-[:<./2|@-/\]){.@[&]\({.<.{:)+[:i.{:(+*)@-{. - fork of 3 verbs

                        ({.<.{:)+[:i.{:(+*)@-{. - generates a list in the entire range of values
                                     {:     -{. - last minus first element  
                                       (+*)@    - adds the signum of the difference
                                 [:i.           - makes a list 
                       ({.<.{:)                 - the smallest of first and last elements                                     
                               +                - adds the offset to the list (translates all elements according to the first one)

 (0-[:<./2|@-/\])                               - finds the step
         2|@-/\]                                - the absolute differences between all consecutive elements
    [:<./                                       - the smallest one
  0-                                            - negate (for splitting)

                 {.@[&]\                        - splits the list from the right verb into left verb's result sublists and takes their first elements

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


1

、9バイト

m←C▼Ẋ≠⁰…⁰

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

H.PWizに、バイトカウントを半減させてくれてありがとう


@ HP.Wiz X_X Huskがそのような範囲をリストすることを知りませんでした...独自の個別の回答として投稿したくないのですか?
ミスターXcoder

@ HP.Wizありがとうございます
ミスターXcoder

また、?F⌋に置き換えることもできます
H.PWiz

@ H.PWiz @ _ @なぜそれでも機能するのですか?
Mr Xcoder

最小(絶対)差は元の差になります。の唯一の理由gcd、負のデルタに対処するためだった
H.PWiz

1

C#(.NET Core)167 + 13 = 180 145 + 13 = 158バイト

a=>{int x=a[1]-a[0],y=a[2]-a[1],d=x*x<y*y?x:y,s=Math.Abs((a[a.Length-1]-a[0])/d),i=0,j=a[0];var r=new int[s+1];for(;i<=s;j+=d)r[i++]=j;return r;}

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

+13 using System;

驚くべきことに、この挑戦​​には私が最初に予想したより多くのニュアンスがありました。

謝辞

@DLoscの簡潔化により、-22バイトが節約されました。

デゴルフド

a=>{
    int x = a[1]-a[0],        // difference between first and second numbers
        y = a[2]-a[1],        // difference between second to last and last numbers
        d = x*x < y*y? x : y, // smallest absolute value difference
        s = Math.Abs((a[a.Length-1] - a[0]) / d), // number of steps in the reconstructed sequence (not the number of elements)
        i = 0,                // step position
        j = a[0];             // next number in reconstructed sequence

    var r = new int[s+1];

    // reconstruct the sequence
    for(; i <= s; j+=d)
        r[i++]=j;

    return r;
}





0

Japt、12バイト

ÌõUg Uäa ñ g

それを試してみてください


説明

õ入力配列の最後の要素(Ì)から最初の要素()までの整数の配列()を生成しUgます。入力から2つの要素のペアをすべて取得し、絶対差(Uäa)でそれらを減らしñ、その配列を並べ替え()、最初の要素(g)を取得して、要素間のステップを計算します。

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