上ウィトオフまたは下ウィトオフ?


20

まず、Beattyシーケンスについて説明しましょう。正の無理数rが与えられた場合、正の整数をrに順番に乗算し、結果の各計算のフロアを取得することにより、無限シーケンスを構築できます。例えば、
rのビーティーシーケンス

r > 1の場合、特別な条件があります。s = r /(r -1)として別の無理数sを形成できます。これにより、独自のBeattyシーケンスB sを生成できます。巧妙なトリックは、B rB s相補的であるということです。つまり、すべての正の整数は、2つのシーケンスのうちの1つに正確に含まれます。

r = the(黄金比)を設定すると、s = r + 1と2つの特別なシーケンスが得られます。下WythoffシーケンスのためのR

1, 3, 4, 6, 8, 9, 11, 12, 14, 16, 17, 19, 21, 22, 24, 25, 27, 29, ... 

そして、上側Wythoffシーケンスのため

2, 5, 7, 10, 13, 15, 18, 20, 23, 26, 28, 31, 34, 36, 39, 41, 44, 47, ... 

これらは、それぞれOEISのシーケンスA000201およびA001950です。

チャレンジ

入力整数が正の場合1 <= n <= 1000、入力が下位のWythoffシーケンス上位のシーケンスかを示す2つの異なる値のいずれかを出力します。出力値は-1and 1trueand falseupperand lowerなどです。

送信されたアルゴリズムは、理論的にはすべての入力に対して機能する必要がありますが、実際には最初の1000個の入力番号でのみ機能する必要があります。

I / Oとルール

  • 入力と出力は、任意の便利な方法で指定できます。
  • 入力と出力は、言語のネイティブの数値型に適合すると想定できます。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

1
上部のWythoffシーケンスは、下部のWythoffシーケンスよりも1多いopを必要とするため、基本的には「下部のWythoffシーケンスのゴルフ」です(ファイの平方)。
魔法のタコ

回答:


12

JavaScript(ES6)、50 35バイト

f=(n,s="1",t=0)=>s[n-1]||f(n,s+t,s)
<input type=number min=1 oninput=o.textContent=this.value&amp;&amp;f(this.value)><pre id=o>

1下部および0上部の出力。説明:ブール値の部分的なリストを使用して構築することができるフィボナッチ状アイデンティティ:所与の二つのリスト、始まる110、後続の各リストは、その結果、前の二つのの連結である1011011010110101それはわずかにgolfier有することです。この場合、等の偽の0番目のエントリで0あり、それを使用してリストの2番目の要素を作成します。


4
どのように
...-AdmBorkBork

4
説明によって+1が減ったことがわかりました。部分的なブール型のwhoozitsは、フィボナッチという名前の男の身元を盗み、フィボナッチは孫と一緒になって建設のエントリを偽造します。
魔法のタコ

近似値を使用することで、この33バイトバージョンがどこまで機能するかを知りたいと思いました。答えは明らかにn = 375までです。
アーナルド

7

Haskell、26バイト

(l!!)
l=0:do x<-l;[1-x..1]

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

フロートなし、無制限の精度。2バイトのH.PWizをありがとう。


これも26バイトになりますが、なぜ機能しないのかわかりません
-H.PWiz

@ H.PWiz空のリストが固定小数点だからだと思う。
xnor

ああ、私はそれを考慮していなかったので、それを使用する「同等の」方法と比較していました~(x:t)。ありがとう
-H.PWiz

@ H.PWiz / xnor技術的には、Haskellでは、使用される固定小数点は、表記上最小のものであり、ここではbottom / undefinedです。同様に2つの異なる定義されたものがあるという事実は偶然です。
Ørjanヨハンセン

7

Python、25バイト

lambda n:-n*2%(5**.5+1)<2

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

非常に単純な条件を使用します。

nの場合、Wythoffシーケンスは正確に下にあり-n%phi<1ます。

モジュロの結果は-n負であるにもかかわらず正であり、Pythonがモジュロを行う方法と一致することに注意してください。

証明: Let a = -n%phi、範囲内にあります0 <= a < phi。正の整数については-nモジュロphiを分割でき ます。それを並べ替えます。-n = -k*phi + akn+a = k*phi

場合はa<1、その後n = floor(n+a) = floor(k*phi)、およびその下Wythoffシーケンスです。

そうでなければ、1 <= a < phiそうです

n+1 = floor(n+a) = floor(k*phi)
n > n+a-phi = k*phi - phi = (k-1)*phi

これn間の隙間に入るfloor((k-1)*phi)floor(k*phi) と下部Wythoff配列によって見逃されます。

これは次のコードに対応します。

lambda n:-n%(5**.5/2+.5)<1

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

を2倍にして1バイト節約します-(n*2)%(phi*2)<2


公式がどのように成り立つのか説明していただけますか?シーケンス定義からそれを導き出そうとしましたが、森の中で迷子になりました。
スンダ

@sundar証拠を追加しました。
xnor

5

05AB1E、9バイト

L5t>;*óså

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


0は上、1は下を意味します。最初の100を試してくださいオンラインで試してください!


    CODE   |      COMMAND      # Stack (Input = 4)
===========+===================#=======================
L          | [1..a]            # [1,2,3,4]
 5t>;      | (sqrt(5) + 1)/2   # [phi, [1,2,3,4]]
     *     | [1..a]*phi        # [[1.6,3.2,4.8,6.4]]
      ó    | floor([1..a]*phi) # [[1,3,4,6]]
       så  | n in list?        # [[1]]

生のコマンドダンプ:

----------------------------------
Depth: 0
Stack: []
Current command: L

----------------------------------
Depth: 0
Stack: [[1, 2, 3, 4]]
Current command: 5

----------------------------------
Depth: 0
Stack: [[1, 2, 3, 4], '5']
Current command: t

----------------------------------
Depth: 0
Stack: [[1, 2, 3, 4], 2.23606797749979]
Current command: >

----------------------------------
Depth: 0
Stack: [[1, 2, 3, 4], 3.23606797749979]
Current command: ;

----------------------------------
Depth: 0
Stack: [[1, 2, 3, 4], 1.618033988749895]
Current command: *

----------------------------------
Depth: 0
Stack: [[1.618033988749895, 3.23606797749979, 4.854101966249685, 6.47213595499958]]
Current command: ó

----------------------------------
Depth: 0
Stack: [[1, 3, 4, 6]]
Current command: s

----------------------------------
Depth: 0
Stack: [[1, 3, 4, 6], '4']
Current command: å
1
stack > [1]

私は同じでしたが、ï:) を使用しました
エミグナ

@emigna phiが数学定数にないことに驚いた。5t>;2 byterに...にもかかわらず価値がないかもしれません
マジックタコ壺

ええ、私はそれがあったかもしれないことを半分覚えていました(しかしそうではありません)。追加する必要があるようです。
エミグナ

@Emigna Jellyの答えは合法的にはこれですが、phiが組み込まれていると確信しています。
魔法のタコ

母は私には同じですが、使用していたïし、¢笑:)すべての当社のソリューションは非常に密接に関連している
ミスターXcoder

5

ゼリー、5バイト

N%ØpỊ

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

xnorのPython golfのおかげで1バイト節約されました


ゼリー、6バイト

×€ØpḞċ

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

下位の場合は1、上位の場合は0を返します。

×€ØpḞċ – Full Program / Monadic Link. Argument: N.
×€     – Multiply each integer in (0, N] by...
  Øp   – Phi.
    Ḟ  – Floor each of them.
     ċ – And count the occurrences of N in that list.

(0,N]Zφ>1N>00<N<Nφ


私はそれらの1つがphi:Pの1バイト定数であると推測していますか?
魔法のタコ

2
いいえ、2バイトの1つ:Øp
Mr. Xcoder

Hehe、05AB1Eの私の4バイトよりも良い:5t>;
魔法のタコ



3

ジュリア0.6、16バイト

n->n÷φ<-~n÷φ

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

数字で遊んでいると、このプロパティに出会いました:floor(n /φ)== floor((n + 1)/φ)nが上位のWythoffシーケンスにあり、floor(n /φ)<floor( (n + 1)/φ)nが下のWythoffシーケンスにある場合。このプロパティがどのように発生するかはわかりませんが、少なくともn = 100000(おそらくそれ以上)までは正しい結果が得られます。


古い答え:

ジュリア0.6、31バイト

n->n∈[floor(i*φ)for i1:n]

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

true下位およびfalse上位のWythoffシーケンスを返します。


nまでの数のn /φがより低く、他の数がより高いため、連続するより低い数の間の平均差はφです。小さい数値をφで除算すると、平均差が1のシーケンスが得られます。これにより、そのシーケンスのフロアを整数にすることができます。私の数学はそれをさらに進めるには十分ではありません。
ニール


1

Wolfram言語(Mathematica)、26バイト

#~Ceiling~GoldenRatio<#+1&

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

整数nは、より低いWythoffシーケンスiffにありceil(n/phi) - 1/phi < n/phiます。

証拠ceil(n/phi) - 1/phi < n/phiは...

十分:

  1. させてくださいceil(n/phi) - 1/phi < n/phi

  2. その後、ceil(n/phi) * phi < n + 1

  3. n == n/phi * phi <= ceil(n/phi) * phi

  4. したがって、n <= ceil(n/phi) * phi < n + 1

  5. 以来nceil(n/phi)整数であり、我々は床と状態の定義を呼び出すfloor(ceil(n/phi) * phi) == nと、n下Wythoffシーケンスです。

必要; 反陽性による証明:

  1. させてくださいceil(n/phi) - 1/phi >= n/phi

  2. その後、ceil(n/phi) * phi >= n + 1

  3. 注意 n + phi > (n/phi + 1) * phi > ceil(n/phi) * phi

  4. したがってn > (ceil(n/phi) - 1) * phi

  5. 以来(ceil(n/phi) - 1) * phi < n < n + 1 <= ceil(n/phi) * phin低Wythoffシーケンスではありません。


これには丸め誤差もありません。
user202729

1

Japt、10バイト

下位の場合はtrue、上位の場合falseを返します。

õ_*MQ fÃøU

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

説明:

õ_*MQ fÃøU
             // Implicit U = Input
õ            // Range [1...U]
 _           // Loop through the range, at each element:
  *MQ        //   Multiply by the Golden ratio
      f      //   Floor
       Ã     // End Loop
        øU   // Return true if U is found in the collection

1
私が持っていたこれをあまりにも10バイトのために。
シャギー

1

Java 10、77 53 52バイト

n->{var r=Math.sqrt(5)/2+.5;return(int)(-~n/r)<n/r;}

@RodのPython 2回答のポート。@Zacharýの
おかげで-1バイト。

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


古い77 76バイトの答え:

n->{for(int i=0;i++<n;)if(n==(int)((Math.sqrt(5)+1)/2*i))return 1;return 0;}

先週私が自分自身を推薦したことに対して、@ ovsのおかげで-1バイト.. xD

1低い値を返します。0アッパー用。

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

説明:

n->{                    // Method with integer as both parameter and return-type
  for(int i=0;++i<=n;)  //  Loop `i` in the range [1, `n`]
    if(n==(int)((Math.sqrt(5)+1)/2*i))
                        //   If `n` is equal to `floor(Phi * i)`:
      return 1;         //    Return 1
  return 0;}            //  Return 0 if we haven't returned inside the loop already

i*Phiはを取得すること(sqrt(5)+1)/2 * iで計算されます。その後、整数にキャストして小数点を切り捨てることによりフロア化します。


1
++i<=nあなたの古い答えであることができますi++<n
-ovs

1
もちろん、@ ovs ..>。< 先週このゴルフを他の人に実際にお勧めしました、笑。ありがとう。
ケビンクルーッセン

1
これは-1バイトで機能するはずです。– n->{var r=Math.sqrt(5)/2+.5;return(int)(-~n/r)<n/r;}
ザカリー

@Zacharý確かにそうです、ありがとう!
ケビンクルーッセン

1

ハスケル153の 139 126 79バイト

無制限の精度!

l=length
f a c|n<-2*l a-c,n<0||l a<a!!n=c:a|1>0=a
g x=x==(foldl f[][1..x+1])!!0

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

説明

結果を計算するために黄金比の近似値を使用する代わりに、入力のサイズが大きくなるとエラーが発生しやすくなります。この答えはそうではありません。代わりに、OEISで提供されるa、一意のシーケンスである式を使用します。

n . b(n) = a(a(n))+1

b注文したお世辞はどこですか。


1
「すべて」は、あなたがアウトゴルフされる前に真実でさえありませんでした...
ニール

@ニール良い点。あなたの答えを逃したに違いない。
小麦ウィザード

あなたの答えは、javascriptが整数型を持っていないという事実によって制限されていますか?
小麦ウィザード

まあ、それはかなり前にメモリを使い果たします
ニール

1

Brachylog、8バイト

≥ℕ;φ×⌋₁?

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

入力が下位のWythoffシーケンスにある場合、述部は成功し、上位のWythoffシーケンスにある場合、失敗します。

 ℕ          There exists a whole number
≥           less than or equal to
            the input such that
  ;φ×       multiplied by phi
     ⌋₁     and rounded down
       ?    it is the input.

終了の失敗が有効な出力方法である場合、最初のバイトは省略できます。


これはおそらく初めてです φ Brachylogプログラムで使用されるのはです。ついに!
致命的



0

TI-BASIC(TI-84)、18バイト

max(Ans=iPart((√(5)+1)/2randIntNoRep(1,Ans

入力はですAns
出力があり、Ans自動的に印刷されます。
プリント1入力は下のシーケンスである場合、または0、それは、上の順序でいます。

0<N<1000

例:

27
             27
prgmCDGFA
              1
44
             44
prgmCDGFA
              0

説明:

max(Ans=iPart((√(5)+1)/2randIntNoRep(1,Ans    ;full program, example input: 5
                        randIntNoRep(1,Ans    ;generate a list of random integers in [1,Ans]
                                               ; {1, 3, 2, 5, 4}
              (√(5)+1)/2                      ;calculate phi and then multiply the resulting
                                              ;list by phi
                                               ; {1.618 4.8541 3.2361 8.0902 6.4721}
        iPart(                                ;truncate
                                               ; {1 4 3 8 6}
    Ans=                                      ;compare the input to each element in the list
                                              ;and generate a list based off of the results
                                               ; {0 0 0 0 0}
max(                                          ;get the maximum element in the list and
                                              ;implicitly print it

注: TI-BASICはトークン化された言語です。文字数がバイト数と等しくありませ


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