ラミーシーケンスを生成する


18

あなたの仕事は、私が作成したシーケンスであるラミーシーケンスの入力nおよび出力要素を取得することですn(OEISを調べても役に立ちません)。

定義

ラミーシーケンスの各要素は、真偽値のセットです。例:[true, false]

ラミーシーケンスのメンバーを作成する手順は非常に簡単です。

  1. 最初のインデックスから始めます[](これは要素0です)。
  2. 左端の偽物を真実に設定します。変更するfalseysがない場合は、リストの長さを1増やして、新しいリストのすべてのメンバーをfalseyに設定します。
  3. elementに達するまで手順2を繰り返しますn

関数を次のように定義してみましょうrummy(int n){}答えは答えを得るための手順です):

>>> rummy(5)
{[]}
{[false]}
{[true]}
{[false, false]}
{[true, false]}
[true, true]

ルール

  • 標準の抜け穴が適用されます。
  • ご使用の言語の数値の上限を超える入力0で機能する必要があります。
  • 出力が真実/偽のセットであることは明らかである限り、適切と思われる方法で出力できます。

トリビア

これを「ラミーシーケンス」と呼びます。これは、インデックス2から、プログレッシブラミーの各ラウンドで設定する必要があるセットを定義するためです。

テストケース

>>> rummy(0)
[]

>>> rummy(1)
[false]

>>> rummy(6)
[false, false, false]

>>> rummy(20)
[true, true, true, true, true]

>>> rummy(1000)
[true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]

これは、逆にバイナリをカウントするようなものです
-ThreeFx

@ThreeFxただし、に追加1すると11、の000代わりにが取得されます100。; P
アディソンクランプ

1
私たちの答えは1つのインデックスに登録できますか?
ダウンゴート

例で暗黙的に出力が言及されている場合でも、さらにいくつかのテストケースを含める必要があると思います。私の最初のリビジョンは、コーナーケース1で破損し
デニス

@VTCAKAVSMoACEこれにより、全単射バイナリになります(これにも課題があります)が、すべての数値が常にの形式であるという点でより多くの違いがあります1*0*
マーティンエンダー

回答:


10

JavaScriptのES6、94 92 72 70 66 64バイト

ニールのおかげで6バイト節約できました!

n=>[...Array(a=Math.sqrt(8*n+1)-1>>1)].map((_,l)=>l<n-a*(a+1)/2)

これはもっとゴルフできるとは思わない。少なくとも方程式は。

説明

これらは2つの主要な方程式です(n入力です)。

(Math.sqrt(8*n+1)-1)/2

これにより、出力配列に必要な合計サイズが得られます。私のプログラムでは、これらの>>1代わりに使用した(...)/2ものは、バイナリの最初のビットの値が2であるのと同じです。それをシフトすると、floor(.../2)


n-a*(a+1)/2

これは、trues の量です。a前の式の結果です。


これは構文が行うことです:

[...Array(n)]

このコードは、[0, n)この答えnが最初の方程式である範囲を持つ配列を生成します。


.map((_,l)=>l<n)これは上記の範囲をループしlます。範囲内の現在のアイテムを含む変数です。アイテムがtrueの量(2番目の式で決定)より小さい場合、を返しtrueますfalse


2
>>1代わりに使用します/2|0。の(_,l)=>代わりに使用します.keys()
ニール

@ニールありがとう!それはかなり節約しました。あなたの最後のポイントまでに、あなたは使用するつもりですArray.from()か?、塗りつぶし、または他の何か?
ダウンゴート

1
いいえ、私は[...Array(a)].map((_,l)=>)それがわずかに短いと考えてい()ましたが>>1、に切り替えたときにいくつかのs を削除することで良いキャッチは、私はそれを発見していませんでした!
ニール

ああ、またありa*-~a/2ます; なぜこれまで考えなかったのか分かりません。
ニール

6

Python、51バイト

f=lambda n,i=0:n>i and f(n+~i,i+1)or[1]*n+[0]*(i-n)

1と0のリストを出力します。


5

Pyth、8バイト

_@{y/RQy

オンラインで試す:デモンストレーションまたはテストスイート

これは指数関数的に遅いです。

説明:

_@{y/RQyQQ    implicit Qs at the end, (Q = input)
       yQ     2*Q
    /RQ       divide each number in [0, 1, ..., 2*Q-1] by Q
              this results in a list of Q zeros and Q ones
   y          take all subsets
  {           remove duplicates
 @       Q    take the Qth element
_             print it reversed

5

ゼリー13 11 バイト

Ḷṗ2SÞ⁸ị1,0x

このコードは、チャレンジが投稿される前のJellyの最新バージョンでは機能しませんが、チャレンジより前のこのバージョンでは機能していました。

インデックスは1から始まります。オンラインでお試しください!(数秒かかります)、または複数の入力を一度に確認します

使い方

Ḷṗ2SÞ⁸ị1,0x  Main link. Argument: n (integer)

Ḷ            Unlength; yield [0, ..., n - 1].
 ṗ2          Take the second Cartesian power, i.e., generate the array of all
             pairs of elements of [0, ..., n - 1].
   SÞ        Sort the pairs by their sum. The sort is stable, so ties are broken
             by lexicographical order.
     ⁸ị      Retrieve the pair at index n.
       1,0x  Map [a, b] to a copies of 1 and b copies of 0.


4

Java、117 110バイト

enum B{T,F};B[]r(int n){int i=0,c=0,j=0;while(n>=i)i+=++c;B[]a=new B[c-1];for(;j<n-i+c;)a[j++]=B.T;return a;}

独自のブール型を作成し、7バイトを節約できました


enumの使用は賢いです。+1
アディソンクランプ

2

Python 2、69 63バイト

a=b=0
exec'a,b=[a-1,b+1,0][a<1:][:2];'*input()
print[1]*b+[0]*a

Ideoneでテストします。


2

Python 2、61バイト

j=(2*input()+.25)**.5-.5
print[i/j<j%1for i in range(int(j))]

n = j・(j + 1)/ 2について解きますます。入力は標準入力から取得されます。

サンプルの使用法

$ echo 20 | python rummy-seq.py
[True, True, True, True, True]

$ echo 50 | python rummy-seq.py
[True, True, True, True, True, False, False, False, False]

デモ


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