Stöhrシーケンスを生成する


12

私はRubyを学び、この問題を解決するための最初の重要なコードを書きました。

課題は、第一生成するn個の要素Stöhr配列S以下のように定義されます:

S [0] = 1

S [n]は、シーケンス内の2つの異なる前の要素の合計として表現できない最小数です。

したがって、シーケンスは1、2、4、7、10で始まります。11(= 1 + 10)と12(= 2 + 10)は前の要素の合計ですが、13はそうではないため、次の要素は13です。

最短のコードを探しています。私自身のRubyの長さは108文字ですが、投稿する前に他の人がどのようなものを思いつくのを待つのでしょうか?


私はこれまでのところ答えが好きです。さて、戻って要件を変更するのは遅すぎるかもしれませんが、シーケンスの定義自体を使用するソリューションに特に興味があることに言及する必要があります(つまり、コードは最終的に数字は3)上がります。だから:あなたがそれを行うことができる場合、道徳的なボーナスポイント。
テオフィル

これが数学的シーケンスの問題です。パターンがわかれば、通常は短くなります。

このシーケンスは、use(?)なしの算術です。
user75200

@ user75200最初の3つの要素の違いからわかるように、シーケンスは算術的ではありませんが、3番目のエレメントから始まるサブシーケンスは実際には算術的です。郵便切手の問題に関連して使用されます。
テオフィル

回答:


13

APL、7

APLでは、インデックス0とインデックス1のどちらで作業するかを選択できます。これを行うには、グローバル変数⎕IO←0を設定します。

インデックス0で作業することを選択した場合、次のようになります。

+\3⌊1⌈⍳

説明:

⍳    creates a sequence 0...n   (0 1 2 3 4 5)
1⌈   takes whichever is bigger, number in sequence or 1 (1 1 2 3 4 5)
3⌊   takes whichever is lower, number in sequence or 3 (1 1 2 3 3 3)
+\   partial sums for the sequence (1 2 4 7 10 13)

tryapl.orgで試してください


1ベースのインデックスで作業してから1対n配列を作成し、単純に別の1を追加することはできませんか?それができれば、短くなりますか?
オプティマイザー

私が得たコードは長かった。これは、インデックス1、10文字の私のコードでした:+ \3⌊1、⍳¯1+また、インデックス0バージョンも引数0で機能しますが、これは機能しません。
モリスズッカ

あ。ええ。APLは本当にここで輝いていました..
オプティマイザー

9

ハスケル- 11 21

遅延無限シーケンス

1:2:[4,7..]

指定された数のメンバーを返す関数(ため息)

flip take$1:2:[4,7..]

あなたは持っている入力を取ると、初回のみ印刷するn数字を。
オプティマイザー

4
@Optimizerまあ、技術的、「Stöhrシーケンスの最初のn個の要素を生成する」必要があります。残りの要素も生成できないとは言えません。入力する必要があるとも言っていません。swishの元のコードは、実際には、任意のnに対して最初のn項を生成します。
wchargin

1
@WCharginが過剰になろうとするのは新しいことではありません。OPの文言を文字通りに取りすぎて、必要以上の出力を生成することは、標準の抜け穴と見なされます。
オプティマイザー

2
@Optimizer実際、怠zyであることは、要求するまで追加の出力が生成されないことを意味し、必要用語を要求できます。
スウィッシュ

1
@swishわかりません。ここで怠け者は何ですか?
オプティマイザー


6

CJam、14バイト

1l~{_p_3e<+}*;

ここでテストしてください。

1から始まります。その後、S [n] = S [n-1] + min(S [n-1]、3)になります。

1l~{_p_3e<+}*;
1              "Push 1.";
 l~            "Read and evaluate input N.";
   {       }*  "Repeat this block N times.":
    _p         "Duplicate the last number and print it.";
      _3e<     "Duplicate it again, and take minimum with 3.";
          +    "Add to last number.";
             ; "Discard final number to prevent output.";

この一般化は簡単に時間 -Stöhrシーケンス我々は交換した場合3によって2 時間 -1


6

Brainfuck、13文字

+.+.++.[+++.]

または、出力をn個に制限する場合は30文字です。

,->+.<[->+.<[->++.<[->+++.<]]]

1
n無限のストリームではなく、最初の要素を印刷する必要があると思います
...-Sp3000

@ Sp3000数値入力および出力として文字コードを一般的に使用していますか?メタで見つけることができません。これにより、BFコードを修正するのはかなり簡単になります。
randomra

個人的には、これに対する一般的なコンセンサスが何なのかわかりません、すみません。私もこれに少し問題がありました。
Sp3000

最初のn個の要素については、-> +。<[-> +。<[-> ++。<[-> +++。<]]](29文字)ができると思いますが、それほどエレガントではありません。そして、私は言語が入力と出力にASCIIコードを使用することに特に制限されているとは思わない。
jgosar

1
あなたのコード、それがそれほどエレガントでなくても、質問に答えなければなりません。投稿を編集して、回答を修正することをお勧めします,->+.<[->+.<[->++.<[->+++.<]]]。(最初にカンマの入力を逃しました。)
randomra

4

Python、136バイト

def f(n):
 if n<1:return[1]
 x=f(n-1);y=set(x)|{a+b for a in x for b in x if a!=b};return x+[min([a for a in range(1,max(y)+2)if{a}-y])]

定義から直接。これをどれだけゴルフできるかわからない-予想よりもずっと長い。


3

J、14文字

これは[1,2, 4+3*k (k=0..n-1) ]シーケンスをハードコードして最初のものを取得しますN

   ({.1,2,4+3*i.) 10
1 2 4 7 10 13 16 19 22 25

J、18文字

この1は、線形の組み合わせを使用しています[0,1,2,3...][1,1,0,0...][0,1,1,1...]。短くする必要がありますが、ゴルフのようには見えません。

   ((3&*+<&2-2**)@i.) 10
1 2 4 7 10 13 16 19 22 25

3

プレリュード32 20

編集: ...今では2倍の声で!

?(1-)
4 +3
2  ^
1 !^

これは、PythonインタープリターNUMERIC_OUTPUT = True。Brainfuckの投稿のように、この回答は入力がコードポイントの形式で与えられることを前提としています。これは、このメタディスカッションでより多くの注目を集めるためです(そして、私はPreludeが大好きだからです)。したがって、最初の32個の数字を印刷する場合は、たとえば、STDINにスペースを入れる必要があります。もちろん、これは有効な入力に上限があることを意味しますが、この答えはとにかく勝てないので、プレリュードの制限内でこれは問題ないと思います。

説明

Preludeでは、すべての行が並行して実行されます。この行は独自のスタックを持ち、無限のゼロに初期化されます。指示ポインターは1つ(列を指す)のみであるため、1つの音声でループに入ると、他のすべての音声がループします。

以下では、列の代わりに行に注釈を付けることができるように、コードを転置しました。

?421  Read a character into the first stack. Push 4, 2, 1 onto the other stacks, respectively.
      Generally, the fourth stack will hold the next number to be printed, the third stack the
      one after that, and the second stack the number two steps ahead.
(     Start a loop if the input wasn't 0.
1+ !  Push a 1 onto the first stack. Add the top elements in the second stack. On the first
      iteration this will be 0 and 4, so it does nothing. On all further iterations
      this will increment the last number by 3.
-3^^  Subtract one from the first stack. Push a 3 onto the second stack for the next iteration.
      Copy the last value from the second to the third, and the third to the fourth stack.
)     If the top of the first stack is not 0, jump back to the column after the (.

2

JavaScript(ES6)92

問題定義に基づいた再帰関数として

S=(n,v=1,s=[],r=0)=>[for(a of s)for(b of s)r+=(a-b&&a+b==v)]|r||(s.push(v),--n)?S(n,v+1,s):s

パターン1,2、1 + 3 * kを使用:58

S=(n)=>(i=>{for(t=1;n>r.push(t+=i);i+=(i<3));})(0,r=[])||r

サイドノート:h-Stöhrシーケンスを見つける(h2つではなく最大数の合計を検証する)。このR関数は、指定された数のリスト要素の可能な合計をすべて試行します。

S=(n,h=2,s=[],v=1,R=(t,v,l,i=0,r=t,w)=>{
  for(;r&&l&&v[i];i++)
    w=[...v],r=!R(t-w.splice(i,1),w,l-1)
  return!r;
})=>R(v,s,h)||(s.push(v),--n)?S(n,h,s,v+1):s

ほぼ同等のUngolfed(およびES5互換)

function S(n, v, s)
{
  var r=0,a,b
  v = v||1
  s = s||[]
  for(a of s)
    for(b of s)
    {
      if (a != b && a+b == v) 
        r++;
    }
  if (r == 0) 
  {
    s.push(v);
    --n;
  }
  if (n != 0)
     return S(n,v+1,s)
  else
     return s
}

FireFox / FireBugコンソールでテストします。シンプルな機能:

S(20)

[1、2、4、7、10、13、16、19、22、25、28、31、34、37、40、43、46、49、52、55]

高度な機能:

S(10,5)

[1、2、4、8、16、32、63、94、125、156]


2

> <>(魚)72 65 49 46文字

1n1-:?!;' 'o2n1-v
v1&no' ':<4&;!?:<
>-:?!;&3+^

入力はインタープリターに提供されます。

>fish.py stohr.fish -v 10
1 2 4 7 10 13 16 19 22 25

私の最初の> <>プログラム、提案に感謝します。


ああ、いいね!私は誰かが<>プログラムを書くことを望んでいました。
テオフィル

2

> <>、31バイト

4i1nao:?!;2nao1-:?!;$:nao3+$d0.

単一の文字を読み取り、そのコードポイント(たとえば、スペース= 32)を使用して、各行に数字を1つずつ出力します。


2

Perl6 22/30

Perl6がシーケンスを推測できるかどうかを確認します。

そのために、Perl6に組み込まれたREPLを使用しました

$ perl6
> 1,2,4,7...*
Unable to deduce arithmetic or geometric sequence from 2,4,7 (or did you really mean '..'?)
> 1,2,4,7,10...*
1 2 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 ...

うーん、Perlが推測したパターンが見えます。4の後に次の値を取得するには、3を追加します。

1,2,4,*+3...*

これは、1文字を保存してコードを作成し、13文字のシュトールシーケンス内の数値の無限リストを取得します。

このコードは結果の要点を出力するため、REPLで有用なことのみを行います。そうでない場合は、結果を印刷するように明示的にPerlに指示する必要があります。

$ perl6 -e 'say 1,2,4,*+3...*'

* + 3単にその引数に追加された3を返すコード参照を取得する方法です。それを記述する他の方法は{ $_ + 3 }、または-> $i { $i + 3 }、または{ $^i + 3 }またはですsub ($i){ $i + 3 }


最初のn個の要素を生成するCallableを作成する最も簡単な方法は、要素のスライスを取得することです。

{(1,2,4,*+3...*)[^$_]} # 22

最初の$_値を生成するvoidコンテキストでは、すぐにそれらを破棄します。

voidコンテキスト以外では、1つの引数を取る匿名コードブロック(名前のない基本サブルーチン)を作成します。

# store it in a scalar variable
my $sub = {(1,2,4,*+3...*)[^$_]};
say $sub.(5);
# 1 2 4 7 10

# use it immediately
say {(1,2,4,*+3...*)[^$_]}.(5);
# 1 2 4 7 10

# pretend it always had a name
my &Stöhr-first = {(1,2,4,*+3...*)[^$_]};
say Stöhr-first 5;

このチャレンジに有効であると認定するために名前を付ける必要があると本当に考えている場合は、おそらく次のようにします。

sub s(\n){(1,2,4,*+3...*)[^n]} # 30

以来、けれどもsまた、置換演算子のために使用され、これを呼び出すために括弧は省略不可です。(別の名前を付けたと思われます)

say s(5);
# 1 2 4 7 10

チャレンジで特に指定されていない限り、ゴルフチャレンジをコードするための提出物は、単なるスニペットではなく、完全なプログラムまたは機能なければなりません。
マーティンエンダー

@MartinBüttner 1,2,4,*+3...*は、実際には、必要な値を生成するオブジェクトを作成します。多くの人が実際にPerl6のようなものの周りにCallableを作成するとは思わない。
ブラッドギルバートb2gills

2

私はすでにはるかに優れたJavaの答えがありますが、私はこれにしばらく費やし、それを投稿するつもりです。たとえそれが吸っても。

Java 313文字(画面に収まるように+4)

import java.util.*;public class S{public static void main(String[] a){
Set<Integer> S=new HashSet<Integer>();S.add(1);int i=1,k=0;
while(S.size()<=new Integer(a[0])){if(S.contains(i)){}else{k=0;for(int j:S){
for(int l:S){if(l!=j){if((j+l)==i)k=1;}}}if(k==0)S.add(i);}i++;}for(int x:S)
{System.out.println(x);}}}

改善するためのヒントや指針を得ることにいつも感謝しています


1

T-SQL 204

入力が@Nという変数にあると想定します。必要に応じてプロシージャを作成できますが、T-SQLでSTD_INを取得する良い方法はありません。

また、モラルボーナスをイェイ!

DECLARE @Q INT=0,@B INT=2
DECLARE @ TABLE(A INT)WHILE @N>0
BEGIN
SET @N-=1
WHILE @B>1
BEGIN
SET @Q+=1
SELECT @B=COUNT(*)FROM @ C,@ B WHERE C.A+B.A=@Q
END
INSERT INTO @ VALUES(@Q)SET @B=2
END
SELECT*FROM @

いいね!SQLについてあまり知りません。ここで@Nはどのように使用されますか?最初の段階で設定されていることがわかりますが、後で参照されるようには見えません。
テオフィル

@N「forループ」の「i」のようです。
ジェイコブ

ジェイコブは正しい。@Nはforループの「i」で、SQLのwhileループです。基本的に、テーブルをそれ自体とクロス結合し、@ Qに追加されるペアを見つけます。少なくとも2つのペアがある場合(つまり、それ自体の数字だけではない場合)、スキップします。それ以外の場合は、テーブルに追加します。@はテーブルの名前です。
bmarks

1

Mathematica、27バイト

うーん、まだMathematicaの答えはありませんか?2つあります。

NestList[#+3~Min~#&,1,#-1]&
Array[i=1/2;i+=3~Min~i&,#]&

どちらも整数を受け取り、整数のリストを返す名前のない純粋な関数を定義します。これは、私のCJam提出と同じ繰り返し関係に基づいています。値が返される前に繰り返し関係が常に適用されるため、Arrayから始まるコードに注意してください1/2



1

Python-近くさえない(139)

これは他の人が行ったように簡単に計算できないという仮定の下で行動すると、私が見つけた最短の解決策は以下のとおりです:

from itertools import combinations as C
x,i,n=[],1,input()
while len(x)<=n:
 if i not in [sum(y) for y in C(x,2)]:x.append(i)
 i+=1
print n

1

Clojureの- 130 118

(defn s[n](last(take n(iterate #(if(<(count %)3)(conj %(+ (apply + %)1))(conj %(+(last %)(second %)(first %))))[1]))))

非ゴルフバージョン:

(defn stohr [n]
  (last
    (take n
      (iterate #(if (< (count %) 3)
                   (conj % (+ (apply + %) 1))
                   (conj % (+ (last %) (second %) (first %)))) [1]))))

共有してお楽しみください。


1

ルビー-108 88

q=->n{*k=1;(m=k[-1];k<<([*m+1..2*m]-k.combination(2).map{|i,j|i+j})[0])while k.size<n;k}

これは、シーケンスの定義を使用します。

より読みやすいバージョン:

q=->n{
    *k=1
    (
        m = k[-1]
        k << ([*m+1..2*m] - k.combination(2).map{|i,j|i+j})[0]
    ) while k.size < n
    k
}

印刷q [10]

[1、2、4、7、10、13、16、19、22、25]


ルビーのゴルフのヒント:の*k=1代わりにk=[1]foo while barの代わりにwhile bar;foo;end[*s..e]の代わりに(s..e).to_a.mapの代わりにto_a.map{|a,b|a+b}の代わりに{|i|i.inject(:+)}
-histocrat

@histocratありがとう、とても助かります!
テオフィル

0

スタタ51

di 1 2 _r(a) 
loc b=3*$a-2
forv x=4(3)`b'{
di `x'
}


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