Danh sách thứ tự các chuỗi nhị phân của nhiều chiều


8

Cho một số nguyên dương n, xuất ra các 2^nchuỗi nhị phân có độ dài được nsắp xếp theo thứ tự chính xác sau đây.

Các trường hợp thử nghiệm:

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

Vân vân.

Ngoài ra, mô hình tổ hợp có liên quan đến Tam giác của Pascal.

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

Vân vân.


1
Đối với tôi ở trên có thể là kết quả của một lỗi trong một thuật toán sắp xếp ...
RosLuP

Câu trả lời:


3

Haskell, 78 byte

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

Ví dụ sử dụng: f 2-> [[0,0],[0,1],[1,0],[1,1]].

Làm thế nào nó hoạt động:

         [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

Tôi đã sử dụng trình biên dịch Haskell từ Apple Store và tôi không chắc liệu điều đó có cho phép tôi chạy mã này không. Đã chụp ảnh màn hình về những gì xảy ra khi tôi chạy nó: m.imgur.com/VIByUah
defarm

@DreadVim: có vẻ như bạn không có phiên bản mới nhất của thư viện ( Preludecho <$Data.Listcho sortOn). Ngoài ra: mã của tôi không phải là một chương trình đầy đủ, vì vậy nó sẽ không được biên dịch.
nimi

Ah. Điều đó có ý nghĩa. Tôi sẽ phải làm điều đó trên máy tính xách tay của tôi.
bảo vệ

TIL về sortOn. Tôi sẽ bỏ lỡ sortBy (compare `on` f).
Angs

2

Python 2, 146 byte

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)],[])

Tôi vẫn đang làm việc này, mặc dù mọi đề xuất sẽ được đánh giá rất cao!

Ung dung

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

làm from itertools import*và sau đó chỉ sử dụng permutationstrong lambda. tiết kiệm 1 byte
FlipTack

1

Python 2, 122 120 102 98 byte

Lưu 18 byte nhờ Flp.Tkc

4 byte được lưu nhờ xnor

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

Giải trình

Điều này làm cho tất cả các chuỗi nhị phân có độ dài x với:

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

Sau đó tôi sắp xếp chúng theo:

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

sorted(x)ưu tiên số 1s trong khi int(x[::-1],2)ưu tiên điều kiện thứ hai

Cuối cùng, những thứ này được nối với dòng mới và được in.


Điều này không đủ điều kiện.
bảo vệ

@DreadVim Bây giờ
Ad Hoc Garf Hunter

Đã đồng ý. Làm tốt lắm.
bảo vệ

Điều này dường như để cắt các số 0 hàng đầu.
xnor

Phiên bản 106 byte dường như đưa ra một thứ tự khác cho n = 4. Bạn cho 0110 rồi 1001, được chuyển qua trường hợp thử nghiệm. Tôi không chắc thứ tự chính xác thực sự được chỉ định như thế nào.
xnor

1

Perl, 63 byte

-4 cảm ơn @TonMedel.
-2 cảm ơn @Gabriel Benamy.

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

Chạy với -E(cho phép tính năng này say):

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


Giải thích ngắn gọn :

  • "{1,0}"x$_tạo một chuỗi bao gồm các $_lần {1,0}( $_là đầu vào). Ví dụ với 3: {1,1}{1,0}{1,0}.
  • Sau đó, globthực hiện một số phép thuật và tạo ra tất cả các kết hợp của một yếu tố từ mỗi nhóm niềng răng (nghĩa là tất cả các kết hợp chúng tôi muốn in).
  • Và sau đó là sort: $b=~y/1//c-$a=~y/1//cso sánh số lượng 1trong mỗi chuỗi và nếu chúng có cùng số, $b-$asẽ sắp xếp theo quy tắc thứ hai.

Tôi tin rằng bạn có thể tiết kiệm hai byte bằng cách thay đổi y/1//cđể y/0//cả hai lần
Gabriel Benamy

@GabrielBenamy Thật vậy, cảm ơn. Tôi đã quá quen với việc sử dụng y///c!
Dada

Thay thế <=>bằng-
TonMedel 6/11/2016

@TonH Phúc sửa, cảm ơn!
Dada

0

Perl, 116 106 105 102 byte

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

Có thể đọc được

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

Chương trình con echuyển đổi đối số của nó thành giá trị nhị phân, được đệm bằng số 0, thành độ dài đầu vào (ví dụ: đầu vào của 5 miếng đệm có số không cho đến khi dài 5 ký tự). Chương trình con fnhận một giá trị nhị phân như vậy và cho nó sắp xếp trọng số theo cách nó sẽ được xử lý.

Phạm vi 0 .. [đầu vào] 2 -1 sau đó được sắp xếp ổn định, sắp xếp theo trọng số (ở đây, "ổn định" có nghĩa là khi hai giá trị có cùng trọng số, chúng được trả về theo thứ tự chúng xuất hiện trong đầu vào), và sau đó chúng được đưa trở lại chương trình con evà đầu ra.

Một số bạn có thể đã thấy bài viết gốc của tôi, nhưng tôi hoàn toàn đọc sai vấn đề ngày hôm qua và xóa nó ngay lập tức sau khi tôi nhận ra nó.


Điều này không tạo ra đầu ra yêu cầu cho n>=5. Ví dụ, với n>=5, 01101đến trước 10011nhưng nó nên sau.
Dada

0

Vợt 109 byte

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

Ung dung:

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

Kiểm tra:

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

Đầu ra:

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
Trong trường hợp n = 3 ở trên không giống nhau để thực hiện văn bản 000 001 010 100, v.v.
RosLuP

Bài tập này sẽ viết đúng hàm để sắp xếp danh sách các số (và hơn là in dạng nhị phân)
RosLuP

0

Ruby 2.x, 129 byte

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
Chào mừng bạn đến với Câu đố lập trình & Code Golf! Thật không may, điều này dường như không thực hiện được những gì thách thức yêu cầu. Ví dụ, đầu vào 5 in năm dòng đầu tiên của đầu ra tương ứng với 3 .
Dennis

0

PHP, 49 byte

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

Chạy với -r.


0

MATLAB, 68 byte

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

0

Bash, 65 byte

Chơi gôn

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

Kiểm tra

>./binseq 4

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

Đó là sai ... Tôi sao chép và dán đầu ra ở trên: 0011 0101 1001 0110 1010 1100 sau 0101 có 1001 chứ không phải 0110
RosLuP

Thật vậy , imgur.com/a/yxBLp , tôi đoán, có lẽ bạn chỉ đang chạy một hệ thống với một ngôn ngữ khác (tôi sử dụng "en_US.UTF-8"), vì vậy các quy tắc đối chiếu khác nhau được áp dụng (đó là một quy tắc dự kiến và ghi lại hành vi "sắp xếp"). Hãy thử thay đổi ngôn ngữ hoặc cho tôi biết địa điểm của bạn và tôi sẽ xem bạn nên sử dụng char nào thay cho ~.
zeppelin

Một điều khác bạn có thể thử là thực thi thứ tự từ điển theo cách sắp xếp với "-d" (sẽ tạo ra kết quả cụ thể ít địa phương hơn)
zeppelin

tôi nói rằng kết quả của bạn được in ở trên cho n = 4 [0000 0001 0010 0100 1000 0011 0101 0110 1001 1010 1100 0111 1011 1101 1110 1111] khác với kết quả của câu hỏi cho n = 4 [0000 0001 0010 0100 1000 0011 0101 1001 0110 1010 1100 0111 1011 1101 1110 1111] giữ nguyên vị trí thứ 9 của mảng đó có một giá trị khác
RosLuP

@RosLup Tôi tin rằng 0101 => 1001 là lỗi trong dữ liệu trường hợp thử nghiệm, không phải do tôi thực hiện, hãy xem thảo luận về câu trả lời "Python 2" bên dưới: "Bạn đưa ra 0110 rồi 1001, được chuyển qua trường hợp thử nghiệm. Tôi không chắc chắn làm thế nào thứ tự chính xác thực sự được chỉ định. - xnor "" Lỗi của tôi. Nó thực sự bị lật ... - Dread Vim "(OP)
zeppelin

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.