4
一般化グレーコード
入力:配列Iのk個の正の整数。整数は100以下で、k≤100です。 出力:あなたのコードを出力しなければならないすべての可能な配列のO長の非負整数のkの制限と0≤O I ≤I I。 ある配列から次の配列に移動するには、配列の1つの値に1を加算または減算します。コードで同じ配列を2回出力してはいけません。出力される異なる配列の数が非常に多い場合、コードは強制終了されるまで永久に出力を続ける必要があります。 例 Iがk個の配列である場合、これはビット幅kのすべてのグレイコードを反復処理する問題です。ただし、最初と最後の要素が1ステップで到達可能である必要はありません。 その場合I = [2,1]、出力配列の可能な順序は次のとおりです。(0,0),(0,1),(1,1),(1,0),(2,0),(2,1) その場合I = [2,1,3]、出力配列の可能な順序の1つは(0,0,0),(0,0,1),(0,0,2),(0,0,3),(0,1,3),(0,1,2),(0,1,1),(0,1,0),(1,1,0),(1,1,1),(1,1,2),(1,1,3),(2,1,3),(2,1,2),(2,1,1),(2,1,0),...です。 これはコードゴルフの挑戦であり、最短のソースコードでの提出が勝ちです。ゴルフ言語での短い回答が他の言語での回答の投稿を妨げないようにしてください。どの言語でも最短回答を考えてください。 これも複雑さの制限の課題です。すべての新しい配列は、前に出力された配列(または出力された最初の配列のプログラムの開始)から経過したO(k)時間で出力される必要があります。つまり、新しい出力配列(それぞれの長さはk)あたりの実行時間はO(k)以下でなければなりません。つまり、k 2または2 kのように、kに比例する時間が必要です。これは、出力ごとの平均時間ではなく、出力される各配列の最悪の場合の時間であることに注意してください。 64ビット整数でのすべての算術演算は、配列内の値の割り当てと検索および変更だけでなく、それらの読み取りおよび出力と同様に、一定時間で実行できると想定できます。 複雑さが制限されていることの1つの結果は、プログラムの終了時にのみ出力されるソリューションは受け入れられないことです。