多次元のバイナリシーケンスの順序付きリスト


8

正の整数を指定すると、次の正確な順序でソートされた長さのバイナリシーケンスをn出力します。2^nn

テストケース:

0:

0 or 1 (defining this is a matter of debate)

1:

0
1

2:

00
01
10
11

3:

000
001
010
100
011
101
110
111

4:

0000
0001
0010
0100
1000
0011
0101
1001
0110
1010
1100
0111
1011
1101
1110
1111

さらに、組み合わせのパターンはパスカルの三角形に関連しています。

0:

1 (this is given regardless of the definition given to 2^0)

1:

1
1

2:

1
2
1

3:

1
3
3
1

4:

1
4
6
4
1


1
上記の私にとって、並べ替えアルゴリズムの1つのバグの結果である可能性があります...
RosLuP

回答:


3

Haskell、78バイト

import Data.List
f n=sortOn(\x->sum x:reverse(map(1-)x))$mapM id$[0,1]<$[1..n]

使用例:f 2-> [[0,0],[0,1],[1,0],[1,1]]

使い方:

         [0,1]<$[1..n]  -- make n copies of the list [0,1]
     mapM id            -- make all lists where the ith element is from the ith list.
                        -- that gives us all binary sequences
sortOn                  -- sort this list of list
    sum x               -- first by number of ones
      reverse(map(1-)x) -- then by the reversed list with bits flipped

私はApple StoreのHaskellコンパイラを使用しましたが、それでこのコードを実行できないかどうかはわかりません。実行するとどうなるかのスクリーンショットを撮っ
defarm

@DreadVim:ライブラリの最新バージョン(Preludefor <$およびData.Listfor sortOn)がないようです。また、私のコードは完全なプログラムではないため、コンパイルできません。
nimi 2016年

ああ。それは理にかなっている。私のラップトップでそれをしなければならないでしょう。
2016年

TILについてsortOn。寂しいsortBy (compare `on` f)です。
Angs

2

Python 2、146バイト

from itertools import*
lambda i:sum([sorted({''.join(b)for b in permutations((i-n)*"0"+"1"*n)},key=lambda x:x[::-1])[::-1]for n in range(i+1)],[])

私はまだこれに取り組んでいますが、提案があれば大歓迎です!

未ゴルフ

i=input()   
import itertools
p=[]
for n in range(i+1):
    x=(i-n)*"0"+"1"*n
    t=[]
    for b in itertools.permutations(x):t+=[''.join(b)] if ''.join(b) not in t else []
    p.append(sorted(t, key=lambda x:x[::-1])[::-1])

p=sum(p,[])
print
for line in p:print line

して、ラムダでfrom itertools import*使用permutationsします。1バイトを節約
FlipTack

1

Python 2、122 120 102 98バイト

Flp.Tkcにより18バイト節約

xnorのおかげで4バイト節約

lambda x:sorted([bin(i)[2:].zfill(x)for i in range(2**x)],key=lambda x:(sorted(x),int(x[::-1],2)))

説明

これにより、長さxのすべてのバイナリ文字列が次のようになります。

[bin(i)[2:].xfill(x)for i in range(2**x)]

次に、次のように並べ替えます。

lambda x:(sorted(x),int(x[::-1],2))

sorted(x)1s の数をint(x[::-1],2)優先し、2番目の条件を優先します

最後に、これらは改行と結合されて印刷されます。


これは対象外です。
2016年


同意した。よくやった。
2016年

これは先行ゼロをトリムするようです。
xnor

106バイトバージョンは、n = 4に対して異なる順序を与えるようです。あなたは0110を与え、次に1001を与えます。これはテストケースから切り替えられます。正しい順序が実際にどのように指定されているのかわかりません。
xnor 2016年

1

Perl、63バイト

-4 @Ton Hospelに感謝します。
-2 @Gabriel Benamyに感謝します。

say~~reverse for sort{$b=~y/0//-$a=~y/0//||$b-$a}glob"{1,0}"x<>

実行-E(機能を有効にしますsay):

perl -E 'say~~reverse for sort{$b=~y/0//-$a=~y/0//||$b-$a}glob"{1,0}"x<>' <<< 5


短い説明

  • "{1,0}"x$_$_時間で構成される文字列を作成します{1,0}$_入力です)。たとえば3{1,1}{1,0}{1,0}
  • 次にglob、魔法をかけ、中括弧の各グループから1つの要素のすべての組み合わせ(つまり、出力するすべての組み合わせ)を生成します。
  • そして、sort:各文字列の$b=~y/1//c-$a=~y/1//c数を比較し、1それらが同じ数である場合$b-$a、2番目のルールに従ってソートします。

両方に変更y/1//cすることで2バイトを節約できると思いますy/0//
Gabriel Benamy

@GabrielBenamy確かに、ありがとう。慣れすぎて使えないy///c
Dadaは

交換する<=>ことで-
トンHospel

@TonHospel編集ありがとうございます!
ダダ、

0

Perlの、116の 106 105 102バイト

sub e{sprintf"%0$%b",@_}sub f{$_=e@_;/0*$/;$%*y/1//-$-[0]}map{say e$_}sort{f($a)<=>f$b}0..2**($%=<>)-1

読みやすい:

sub e{
    sprintf"%0$%b",@_
}
sub f{
    $_=e@_;/0*$/;$%*y/1//-$-[0]
}
map{
    say e$_
} sort {
    f($a)<=>f$b
} 0..2**($%=<>)-1

サブルーチンはe、引数をゼロで埋められたバイナリ値に変換して入力長にします(たとえば、5文字を入力すると、5文字になるまでゼロが埋め込まれます)。サブルーチンfはそのようなバイナリ値を取り、処理方法に従ってソートの重みを与えます。

次に、範囲0 .. [入力] 2 -1は、重みで並べ替えられた安定した並べ替えが行われます(ここで「安定した」とは、2つの値が同じ重みを持つ場合、値が入力)、そしてそれらはサブルーチンにフィードバックされてe出力されます。

元の投稿を見た方もいるかもしれませんが、昨日は完全に誤解して、気づいたらすぐに削除しました。


これは、のrequire出力を生成しませんn>=5。たとえば、with は前n>=501101来ますが、10011後にする必要があります。
Dada

0

ラケット109バイト

(let loop((s ""))(if(= n(string-length s))(displayln s)(for((i '("0" "1")))(loop(string-append s i)))))

未ゴルフ:

(define (f n)
  (let loop ((s ""))
    (if (= n (string-length s))
        (displayln s)
        (for ((i '("0" "1")))
          (loop (string-append s i))))))

テスト:

(f 2)
(println "-------------")
(f 3)
(println "-------------")
(f 4)

出力:

00
01
10
11
"-------------"
000
001
010
011
100
101
110
111
"-------------"
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

1
上記のn = 3の場合、テキスト000 001 010 100などと同じではありません
RosLuP

この演習では、数値のリストをソートするための適切な関数を記述します(バイナリ形式を
出力するのではありません

0

Ruby 2.x、129バイト

f=->(n){z='0';p=n.bit_length;(0..n).map{|i|sprintf("%0#{p}d",i.to_s(2))}.sort{|a,b|a=a.delete(z).size-(b=b.delete(z).size)||b-a}}

2
プログラミングパズルとコードゴルフへようこそ!残念ながら、これは課題が要求することをまったく実行していないようです。たとえば、input 5は、3に対応する出力の最初の5行を印刷します。
Dennis

0

PHP、49バイト

while($i<1<<$n=$argv[1])printf("%0${n}b\n",$i++);

で実行し-rます。


0

MATLAB、68バイト

d=@(n)dec2bin(sortrows([sum(dec2bin(0:2^n-1)');0:2^n-1]')*~eye(2,1))

0

バッシュ、65バイト

ゴルフ

seq -f "obase=2;%g+2^$1-1" $[2**$1]|bc|cut -c2-|tr 0 ~|sort|tr ~ 0

テスト

>./binseq 4

0000
0001
0010
0100
1000
0011
0101
0110
1001
1010
1100
0111
1011
1101
1110
1111

それは間違っています...私は上記の出力をコピーして貼り付けます:0011 0101 1001 0110 1010 1100 0101の後に0110ではなく1001があります
RosLuP

実際、それはimgur.com/a/yxBLpを実行していると思いますが、おそらく異なるロケールでシステムを実行しているだけなので(「en_US.UTF-8」を使用します)、異なる照合規則が適用されます(これは予想されることです)文書化された「ソート」動作)。ロケールを変更してみるか、自分のロケールを教えてください。そうすれば、〜の代わりに使用する文字がわかります。
zeppelin

もう1つ、"-d"を使用して辞書の順序をソートに適用することもできます(ロケール固有の結果が少なくなります)
zeppelin

上記のn = 4の結果印刷[0000 0001 0010 0100 1000 0011 0101 0110 1001 1010 1100 0111 1011 1101 1110 1111]は、n = 4の質問の結果とは異なります[0000 0001 0010 0100 1000 0011 0101 1001 0110 1010 1100 0111 1011 1101 1110 1111]実際、その配列の9番目の位置には1つの異なる値があります
RosLuP

@RosLup 0101 => 1001は私の実装ではなく、テストケースデータのエラーだと思います。以下の「Python 2」の回答に関する議論を参照してください。正しい順序が実際にどのように指定されているかを確認してください– xnor ""私の間違いです。実際には反転しています...-Dread Vim "(OP)
zeppelin

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