新しい注文#2:私のやり方を変える


15

はじめに(無視してもよい)

すべての正の数を規則正しい順序(1、2、3、...)で並べるのは少し退屈ですよね?そのため、すべての正の数の順列(再編成)に関する一連の課題があります。これは、このシリーズの2番目の課題です。最初の挑戦はここで見つけることができます

この課題では、グレーコードを使用して自然数を再調整します。グレイコード、または「反射バイナリコード」は、2つの連続する値が1ビットだけ異なるような方法でのバイナリエンコーディングです。このエンコードの実用的な用途は、ロータリーエンコーダーで使用することです。したがって、「Turn My Way」を参照します。

3ビットバイナリでマークされた角度測定デバイス用のロータリーエンコーダー。

このエンコードはある程度の自由度があることに注意してください。例えば、バイナリ1100以下の4つの可能な次のコードがある:1101 1110 1000 0100 Iが定義する理由であるnはバイナリエンコーディングが異なるだけ一文字こと最小、以前に使用されていない値として。このシーケンスはA163252に対応しますa(n)

これは「純粋なシーケンス」のチャレンジであるため、タスクは入力として特定のnに対してa n を出力a(n)です。ここでa n A163252です。na(n)

仕事

整数入力n与えられると、整数形式(バイナリ形式ではないa(n)出力ます。

a(n)は、a(n1)a(n)が2進数で書かれた場合に1ビットだけ異なるように、シーケンスの初期に発生しない最小の正の整数として定義されます。

注:ここでは、1ベースのインデックス付けが想定されています。0ベースのインデックスを使用できます。そのためa(0)=1;a(1)=3など。これを使用することを選択した場合は、回答にこれを記載してください。

テストケース

Input | Output
--------------
1     | 1
5     | 4
20    | 18
50    | 48
123   | 121
1234  | 1333
3000  | 3030
9999  | 9997

ルール

  • 入出力は整数です(プログラムは少なくとも1〜32767の範囲の入出力をサポートする必要があります)
  • 無効な入力(0、フロート、文字列、負の値など)は、予期しない出力、エラー、または(未)定義された動作につながる可能性があります。ではA1632520 この挑戦のために0として定義され、我々はこれを無視します。a(0)
  • デフォルトのI / Oルールが適用されます。
  • デフォルトの抜け穴は禁止されています。
  • これはであるため、バイト単位の最短回答が優先されます

最後のメモ

次の関連する(ただし等しくない)PP&CGの質問を参照してください。

回答:


1

Stax19 17 バイト

êÑ{╚α8è╙mc┼σ▀»É▲ü

実行してデバッグする

ハードコード化されたビットインデックスの反復により、指定されたドメインの後のある時点で動作を停止します。(32767)

開梱されていない、コメントされていない、これはこのように見えます。

z0,         push an empty array, literal zero, and the input, in that order
             - the zero represents the last calculated value in the sequence
             - the array contains all the previous ones
D           repeat the rest of the program n times (from input)
  +         append the last calculated value to the array
  17r       [0 .. 16] (these are the bit indices necessary to cover the input range)
  {|2nH|^m  calculate candidate values; previous value with each of these bits toggled 
  n-        remove all values previously calculated
  |m        keep the minimum candidate remaining

これを実行する


最短の05AB1E回答より1バイト遅れています。これをさらに最適化する予定はありますか?それ以外の場合は、ケビンの答えを受け入れます
...-

1
機会があれば、今日、次の14時間以内に作業します。
再帰的

大丈夫。私は別の日にそれを開いたままにします。幸運を!
agtoever

@agtoever:ありがとう。できました。
再帰的

よくやった!あなたが勝ちます!おめでとう!
-agtoever

4

JavaScript(ES6)、65バイト

1インデックス。

n=>{for(o=p=[k=1];o[k]|~-(i=p^k)&i?k++:k=o[p=k]=!!n--;);return p}

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

コメント済み

n => {                  // n = index of requested term
  for(                  // for loop:
    o =                 //   o = storage object for the terms of the sequence
    p =                 //   p = last term found in the sequence
      [k = 1];          //   k = current term
    o[k] |              //   if k was already encountered
    ~-(i = p ^ k) & i ? //   or (p XOR k) has more than 1 bit set:
      k++               //     increment k
    :                   //   else:
      k = o[p = k]      //     set o[k], set p to k
        = !!n--;        //     stop if n is equal to 0 or set k to 1; decrement n
  );                    // end of for()
  return p              // return p
}                       // end

TIOでは、n>〜1024のスタックオーバーフローが発生します。アブの他の環境でそれをどのように処理するかについての提案はありますか?規則:「プログラムは少なくとも
1〜32767の

1
@agtoever私はそれを非再帰バージョンに更新しました。
アーナルド

4

ゼリー26 20バイト

ṀBLŻ2*^1ị$ḟ⁸Ṃ;
0Ç⁸¡Ḣ

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

単一の引数としてnを取る完全なプログラム。すべてのテストケースで機能します。また、必須ではありませんが、n = 0を処理します。

説明

ヘルパーリンク:次の用語を見つけて追加する

Ṁ              | maximum of list so far
 B             | convert to binary
  L            | number of binary digits
   Ż           | 0..above number
    2*         | 2 to the power of each of the above
      ^        | exclusive or with...
       1ị$     | ... the most recent term in the list so far
          ḟ⁸   | filter out anything used already
            Ṃ  | find the minimum
             ; | prepend to existing list

メインリンク

0              | start with zero
 Ç             | call the above link
  ⁸¡           | and repeat n times
    Ḣ          | take the last term added

3

Java(JDK)142 138 124 123の 132 130 98バイト

n->{int s[]=new int[9*n],j,k=0;for(;n-->0;s[k=j]++)for(j=0;s[++j]>0|n.bitCount(j^k)>1;);return k;}

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


1
インポートはバイトカウントに含める必要があると思います。ただし、import java.util.*;+ Set s=new HashSet();から+ までゴルフできvar s=new java.util.HashSet();ます。さらに、残りは次の目的でゴルフできますInteger i=0,j,k=0;for(;i++<n;s.add(k=j))for(j=0;s.contains(++j)|i.bitCount(j^k)>1;);return k;。それでもいい答えだから、私から+1。:)
ケビンクルーイッセン

1
Stackではなく2バイトを節約しましたHashSet。かなり遅くなりますが動作します!
ダニエルウィッディス

1
ああ、もちろん、スマート。そして、どんなに遅くても、バイトを節約できれば、コードとゴルフのチャレンジに値します。; p複雑さた答えがあったOnOnn

2
最初のコメントで提案した2番目のゴルフで、まだ126バイトまでゴルフできます。:)
ケビンクルーイッセン


2

Python 2、81バイト

1ベースのインデックス付け

l=[0];p=0
exec"n=0\nwhile(p^n)&(p^n)-1or n in l:n+=1\np=n;l+=p,;"*input()
print p

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


Python 2、79バイト

これには多くの時間がかかります(ローカルで7分間実行した後、9999は終了しませんでした)

l={0};p=0;n=input()
exec'p=min({p^2**k for k in range(n)}-l);l|={p};'*n
print p

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


1
最大入力32767はサポートされていません(デフォルトの再帰深度はシステムに依存しません)。
エリックアウトゴルファー

指定されたテストケース9999でもサポートされていません。:)
ダニエル・ウィディス

@EriktheOutgolferを反復アプローチに変更しました。おそらくまだTIOで間に合いませんが、ローカルで問題なく動作します。
ovs

@ovsああ、タイムアウトだけは問題ではありません。
エリックアウトゴルファー

涼しい!n = 9999で試したところ、約1時間で正常に完了しました。+1。わーい!;-)
agtoever



1

木炭、65バイト

≔⁰θFN«⊞υθ≔¹ηW¬‹θ⊗η≦⊗ηW∧›η¹∨¬&θη№υ⁻θη≧÷²ηW№υ⁻|θη&θη≦⊗η≔⁻|θη&θηθ»Iθ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

≔⁰θ

結果を0に初期化します。

FN«

ループn時間。

⊞υθ

以前の結果を保存して、再度使用しないようにします。

≔¹ηW¬‹θ⊗η≦⊗η

前の結果の最上位ビットを見つけます。

W∧›η¹∨¬&θη№υ⁻θη≧÷²η

そのビットが1より大きい間、ビットが前の結果で設定されている場合、そのビットを減算して、結果が見えない結果であるかどうかを確認してください。これにより、潜在的な結果が値の昇順で確実に試行されます。

W№υ⁻|θη&θη≦⊗η

次に、そのビットを前の結果とXORし、見えない結果が見つかるまでビットを2倍にします。これは、ビットを値の昇順で設定する必要がある場合を処理しますが、最下位ビットを切り替える必要がある場合も処理します。前のループはテストする必要がありませんここに)。前のループで見えない結果が見つかった場合、このループは実行されません。そうでない場合、このループはそれらの結果を無駄に再テストします。

≔⁻|θη&θηθ

実際にビットをXORすることで結果を更新します。

»Iθ

ループの最後に最終結果を出力します。


1

05AB1E21 20 18 バイト

ÎFˆ∞.Δ¯θy^bSO¯yå_*

非常に効率が悪いため、入力が大きいほど、結果を得るのに時間がかかります。0ただし、入力に対しても機能します。

オンラインそれを試してみてくださいまたは最初の検証n用語

説明:

Î                # Push 0 and the input
 F               # Loop the input amount of times:
  ˆ              #  Pop the current number and add it to the global_array
  ∞.Δ            #  Inner loop starting at 1 to find the first number which is truthy for:
     ¯θy^        #   XOR the last number of the global_array with the loop-number `y`
         b       #   Convert it to binary
          SO     #   Sum it's binary digits
     ¯yå_        #   Check if the loop-number `y` is NOT in the global_array yet
            *    #   Multiply both (only if this is 1 (truthy), the inner loop will stop)
                 # (after the loops, output the top of the stack implicitly)

1

Haskell、101バイト

import Data.Bits
(u!n)0=n
(u!n)m|q<-minimum[x|r<-[0..62],x<-[xor(2^r)n],notElem x u]=(n:u)!q$m-1
[]!0

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

だけのためxorにインポートを行うのは残念に思えますが、まだ良い回避策は見つかりませんでした。また、ループを表現するより良い方法があるのだろうか。


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