前後のシーケンス


18

で構成されたパスを想像<し、>そしてで終わる@、例えば

><>@

ウォーカーは左端のセルから始まります。彼は次のようにパスを横断します。

  • 歩行者が@セル上にいる場合、彼は目標に到達して完了です。
  • 歩行者が>セル上にいる場合、経路全体が右に1ステップずつ周期的に移動し、歩行者を連れて行きます。
  • 歩行者が<セル上にいる場合、パス全体が左に1ステップずつ周期的に移動し、歩行者を連れて行きます。
  • その後、歩行者は一歩を踏み出します。彼がパスのどちらかの端にいる場合、彼は端から離れます。それ以外の場合、彼は最後のステップで移動した方向に(回転を無視して)移動し続け、最初は右に歩きます。

上記の例を見ていきましょう。歩行者の位置には次のマークが付いてい^ます。

><>@   --rotate-->  @><>
^                    ^
step right (first step):
@><>   --rotate-->  ><>@
  ^                  ^
step right:
><>@   --rotate-->  @><>
  ^                    ^
step left (dead end):
@><>   --rotate-->  ><>@
  ^                  ^
step left:
><>@   --rotate-->  @><>
^                    ^
step left:
@><>   Goal reached!
^

ウォーカーは、プロセスで6つのセルを訪問しました(開始セルとを含み、@訪問した各セルを頻繁にカウントします)。

以下は、歩行者が回転によって端を越えて運ばれる小さな例です。

>>@   --rotate-->  @>>
^                   ^
step right (first step):
@>>   --rotate-->  >@>
  ^                ^
step right (dead end):
>@>   Goal reached!
 ^

今回は、歩行者は3つのセルを訪問しました。

これを簡単に整数シーケンスに変換できます。

  • たとえば、正の整数Nが与えられます9
  • たとえば、この整数のバイナリ表現を計算し1001ます。
  • 次に回し1>して0<し、追加@><<>@
  • このようにして構築された数で、歩行者が訪れた細胞の数をNと関連付けます。

結果のシーケンスの最初のいくつかの要素は次のとおりです。

2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6,
6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7

これは非常にarbitrary意的に思えるかもしれませんが、結果のシーケンスは実際には多くの構造を持っていることがわかります。

ここに画像の説明を入力してください

参考までに、このpastebinでシーケンスの最初の2048個の番号を見つけることができます。

チャレンジ

ご想像のとおり、上記のシーケンスを計算することになります。次の3つの方法のいずれかを実行できます。

  • 値を連続的に出力する(数字以外の文字で区切る)か、それらをサポートする言語で何らかの形式の無限ジェネレーターを使用することにより、(メモリが許可する限り)無限シーケンスを生成できます。STDOUTに無限ストリームを印刷する場合、数字を1つずつ印刷する必要はありませんが、すべての数字が有限時間後に(順番に)印刷されることを確認してください。このオプションを使用する場合は、何も入力しないでください。
  • 入力として整数Nを取り、シーケンスのN番目の項を生成できます。
  • あなたは、整数取ることができますN入力および農産物のすべてとまではNのいずれかの明確な分離器を使用して、リストまたは文字列として、シーケンスの第用語を。

基数間で簡単に変換できない言語にペナルティを与えたくないので、整数Nの代わりに、通常のsおよびs(リストまたは文字列として)を使用して、Nのバイナリ表現を代わりに使用できます。 -有意ビットが最初。01

プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、STDOUT(または最も近い代替)、関数の戻り値または関数(out)パラメーターを介して結果を出力できます。

標準の規則が適用されます。

バックグラウンド

これは実際に、難解なプログラミング言語Labyrinthの単純なインタープリターが「パス」をソースコードとして解釈するのに必要な「ティック」の数を計算します。その場合は、「歩行者」は、単に(位置及び方向を有する)命令ポインタであり、@コマンドは、プログラムを終了し、<そして>ソースコード変更コマンドです。


どれが必要ですか?1、2、または3、および提出物の採点方法
-Abr001am

@ Agawa001「次の3つの方法のいずれかを実行できます。」どちらかを選択します。使用するアプローチと言語に最も簡単だと思う方を選択してください。
マーティンエンダー

なぜ今日すべての繰り返し番号!?!codegolf.stackexchange.com/questions/78787/...:D

回答:


6

ゼリー、10 バイト

ð+\ḤiḤoµL‘

この関数は、2進数のリスト形式の単一の整数を入力として受け入れます。

このアルゴリズムは、@ Agawa001の回答のアルゴリズムと同等です。

オンラインでお試しください!または、最初の2048番号を生成します

バックグラウンド

0からLまでのパスの下の位置を列挙し、合計でL + 1の位置を与えます。Lは、パスをエンコードする数値Nの 2進数の桁数と一致します。この表記では、ウォーカーは位置0から開始し、ゴールは位置Lから始まります。

歩行者が歩むたびに、目標に1歩近づきます(現在歩いている方向)。また、シフトステップごとに、シフト方向と一緒に歩くか反対方向に歩くかに応じて、位置を2モジュロL + 1ずつ増減するか、現在の位置に留まります。

方向を変えるには、彼は位置L-1Lに面している)または位置10に面している)に着地し、彼の方向にシフトしなければなりません。次のステップで彼は前の位置に戻り、反対の方向に向かいます。

  • Lが偶数の場合、L-1は奇数なので、最初の位置から直接L-1に進むことはできません。それに到達する唯一の方法は、Lを通過して0に到達し、1に着陸するために次のステップを踏んだ後、右に進むことです。これには2Lの位置を進める必要があり、これはLステップ以上で実行できます。

    ただし、方向を変えずにLステップを踏んだ後、彼は目標に到達します。開始セルに1つを追加すると、この場合、合計でL + 1個の訪問済みセルが取得されます。

  • Lが奇数の場合、L-1は偶数なので、(L-1)/ 2回右にシフトすると、その位置に到達できます。ポジション場合はL - 1は、下にある1その時、彼はポジションにシフトしてしまいますL、振り向くと、位置にステップL - 1(左方向を向いています)。

    これは、目標を達成する前に発生する場合と発生しない場合があるため、分析する必要があるケースは2つあります。

    • 未満である場合は(L + 1)/ 2の出現1のバイナリ膨張のNは、撮影Lのステップは方向をオンするのに十分ではないであろう。これらのLステップにより、ウォーカーが目標に到達し、開始セルに1つ追加されるため、この場合は合計でL + 1個の訪問済みセルが得られます。

    • 少なくともある場合は(L + 1)/ 2の出現1のバイナリ膨張Nに進む、((L + 1)/ 2)番目の発生が必要になり、私はここで、ステップIは、その発生の初期位置であります1

      したがって、I歩を行った後、歩行者は位置L-1にあり、左向きです。再び方向を変えるには、彼は左に進んで位置1まで歩かなければなりません。ただし、偶数の場合と同様に、(L-1)-1は奇数であるため、0を通過してLステップ以上を必要とします。

      左方向のゴールまでの最初の距離は1であるため、Iステップ踏んだ後、歩行者は方向を変えた後、ゴールからI + 1の距離にいることに気付きます。以来I <L 、我々が持っているI + 1≤L 、次のようにI + 1つのステップは、目標に彼をもたらすでしょう。

      これにより、合計でI + I + 1 = 2I + 1の手順が実行されます。開始セルに1つ追加すると、この場合、合計2I + 1 + 1 = 2(I + 1)の訪問済みセルを取得します。

使い方

ð+\ḤiḤoµL‘  Main link. Argument: x (list of binary digits of N)

       µ    Monadic chain. Argument: x
        L   Compute L, the length of x.
         ‘  Increment to yield L + 1.

ð           Dyadic chain. Left argument: x. Right argument: L + 1
 +\         Compute the cumulative sum of x.
            This replaces the k-th one (and all zeroes to its right) with k.
   Ḥ        Unhalve; multiply all partial sums by 2.
    i       Find the first index of L + 1.
            This either gives I + 1, the 1-based index of the ((L + 1) / 2)-th one
            or 0 if the list doesn't contain L + 1.
            The result will be 0 if x contains less than (L + 1) / 2 ones
            or if L + 1 is an odd integer.
     Ḥ      Unhalve; yield either 2(I + 1) or 0.
      o     Logical OR with L + 1; if the previous operation returned a falsy
            value (i.e., if it yielded 0), replace that value with L + 1.

9

Matlab(score = 230、n = inf)

function w(s,f),b=[];e=0;for i=s:f,a=dec2bin(i);c=find(a=='1');g=numel(a)+1;if numel(c)>=g/2;if mod(g,2)==1,fprintf('%d ',g);else,d=c(g/2);fprintf('%d ',2*d);end,else,fprintf('%d ',g);end,e=e+1;if(e==100),e=0;fprintf('\n');end;end
  • この関数は、開始インデックスとしてsを、終了インデックスとしてfを使用しinfます(無限に保持したい場合はタイプします)。
  • この機能は、2つの出力タイプ間で顕著なタイムラグなしで永久に実行できh=1000000000000000000000000000000000000000000000000000;w(h,h+1)ます。
  • アルゴリズムは、後で説明する数学的アプローチに従い、このプログラムに基づいてMartinの参照リストを確認します。

    stored=[2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 14, 8, 8, 8, 14, 8, 14, 12, 12, 8, 8, 8, 14, 8, 14, 12, 12, 8, 14, 12, 12, 10, 10, 10, 10, 8, 8, 8, 14, 8, 14, 12, 12, 8, 14, 12, 12, 10, 10, 10, 10, 8, 14, 12, 12, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13];
    b=[];for i=1:numel(stored)
    a=dec2bin(i);
    c=find(a=='1');
    if numel(c)>=(numel(a)+1)/2
    if mod(numel(a)+1,2)==1
    b=[b numel(a)+1];
    else
    d=c((numel(a)+1)/2);
    b=[b 2*d];
    end
    else
    b=[b numel(a)+1];
    end
    end
    for i=1:numel(stored)
    if (b(i))
    if b(i)~=stored(i)
    'error',
    end
    end
    end
    
  • アルゴリズムは2048個の最初のテストケースを検証するため、すべてのテストケースで盲目的に想定するため、このプロセスで発見されたいくつかのプロパティに関して、ポインターを移動したり移動したりすることなくアルゴリズムが機能します。

    1-バイナリ変換の1の2倍の数がシーケンスの長さを超えない場合L、出力はL+1

    2-シーケンスの長さが偶数で、前の条件が設定されていないため出力が同じ場合 L+1

    3-それ以外の場合、出力はL/21のthインデックスの2倍です。


「出力はL / 2番目のインデックスの1の2倍です」と言う意味を明確にできますか?それは信じられないほど不明瞭です。
-orlp

このシーケンスで@orlp 10010001 1の第2の出現は2で、4 8である
Abr001am

1
これは、少なくとも89バイトまでゴルフすることができます。これa=dec2bin(input(''));c=find(a=='1');g=nnz(a)+1;if nnz(c)<g/2|mod(g,2);g,else,2*c(g/2),endは、シーケンスの単一の要素のみを提供します。
デビッド

8

パイソン、122の 119 113 110 108 107 103バイト

def l(b):
 p=e=w=len(b);d=i=1
 while e:p+=1-2*b[w-e];d*=2*(1!=d-p>~w)-1;p-=d;e=(e-d)%-~w;i+=1
 return i

入力を2進数のリストとして受け取ります。テストするヘルパー関数:

b = lambda n: [int(d) for d in bin(n)[2:]]

7バイトの節約に対するLynnの功績。


4
ピューピューピュー。:D
AdmBorkBork

それほど多くはありませんが、… p-d-1in[-2,w]1バイト節約できると思います。
リン

ステートメントを変更してd*=2*(1!=d-p>~w)-1さらに4つ節約します!°v°
リン

@Lynnドゥモーガンの法則の素晴らしい使用!
-orlp

私と比較するために広い出力範囲を提供してください。thanx
Abr001am

3

Python 2、99バイト

def l(b):l=len(b);return(l>=sum(b)*2or l%2<1)and-~l or[i+1for i,c in enumerate(b)if b[i]][l/2]*2

Agawa001のすばらしいPython移植版。

読み取り可能なバージョン:

def l(b):
    if len(b) >= 2*sum(b) or len(b)%2 == 0:
        return len(b) + 1

    return 2*[i+1 for i, c in enumerate(b) if b[i]][len(b)//2]

@ Agawa001私はまだあなたのアルゴリズムを理解していませんが、最大1,000万まで実験的に検証しました。
orlp

3

MATL、31、25のバイト

BXHnQtHsy2/<w2\+~?2/Hfw)E

これは、整数入力Nを受け取り、シーケンスのN番目の項を返すことを除いて、Agawa001のアルゴリズムのMATLバージョンです。スタック内のすべての要素についていくのは難しいです!私は狂気を避けるためにクリップボードを使用することに頼らなければなりませんでした。オンラインで試すことができます!

:"@コードの前後に追加することで、最初のN項を出力するループにすることができます]D

6バイト全体を節約してくれたLuis Mendoに感謝します!


2

ジュリア0.4、4̷4̷ 42バイト

x->(k=endof(x)+1;try k=2find(x)[k/2]end;k)

この関数は、2進数のリスト形式の単一の整数を入力として受け入れます。

このアルゴリズムは、@ Agawa001の回答および私のJellyの回答ものと同等です。

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

使い方

find(x)xのすべての非ゼロ要素の1ベースのインデックスを返します。結果の配列にインデックスk / 2でアクセスし、成功した場合は、選択したインデックスの2倍でkを上書きします。

次のいずれかに該当する場合にのみ、これは失敗します。

  • k / 2は非整数フロートなので、InexactErrorが発生します。

  • インデックス配列の要素はk / 2未満なので、BoundsErrorが発生します。

どちらの場合でも、kの上書きは失敗するため、元の値が返されます。


1

JavaScript(ES6)、65バイト

s=>(l=s.length+1)%2|!(m=s.match(`(0*1){$l/2}}`))?l:m[0].length*2

バイナリ文字列を受け入れます。他のさまざまな回答のバウンスチェックを使用します。


1

Python 2、74バイト

def f(x):k=len(x)+1;print next((i*2for i in range(k)if k==2*sum(x[:i])),k)

この関数は、2進数のリスト形式の単一の整数を入力として受け入れます。

このアルゴリズムは、@ Agawa001の回答および私のJellyの回答ものと同等です。

Ideoneでテストします。

使い方

nexttrue を返す最初の整数2iを見つけようとしますk==2*sum(x[:i])i個の要素をx[:i]含むため、これは(k / 2)番目の1から始まるインデックスを提供します。

nextk / 2が非整数の場合、またはxk / 2未満の場合は失敗します。この場合、デフォルト値kが返されます。


0

> <>、63バイト

2r11&>}:?v{1->:l2-%?vr{{$>1+$}$:2=$@&101.
 +&?!^&n;>{1+^ .0+bf<

このチャレンジでパターンの例を見た瞬間から、どの言語を使用するかがわかりました:)

Nを使用して N番目の項ます。

スタックでバイナリであると想定される入力。このソリューションは、歩行器を移動するのではなく、主に歩行器の下でテープを移動することに依存しています。

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

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