Daftar urutan urutan biner dari beberapa dimensi


8

Diberikan bilangan bulat positif n, menampilkan 2^nurutan panjang biner yang ndiurutkan dalam urutan tepat berikut.

Kasus uji:

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

dll.

Selain itu, pola kombinatorik terkait dengan Segitiga 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

dll.


1
Bagi saya di atas dapat menjadi hasil dari satu bug dalam penyortiran ...
RosLuP

Jawaban:


3

Haskell, 78 byte

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

Contoh penggunaan: f 2-> [[0,0],[0,1],[1,0],[1,1]].

Bagaimana itu bekerja:

         [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

Saya menggunakan kompiler Haskell dari Apple Store, dan saya tidak yakin apakah itu tidak memungkinkan saya menjalankan kode ini. Mengambil tangkapan layar dari apa yang terjadi ketika saya menjalankannya: m.imgur.com/VIByUah
defarm

@DreadVim: sepertinya Anda tidak memiliki versi terbaru dari perpustakaan ( Preludeuntuk <$dan Data.Listuntuk sortOn). Juga: kode saya bukan program lengkap, jadi tidak akan dikompilasi.
nimi

Ah. Itu masuk akal. Saya harus melakukannya di laptop saya.
Menembak

TIL tentang sortOn. Aku akan merindukan 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)],[])

Saya masih mengerjakan ini, meskipun ada saran akan sangat dihargai!

Tidak disatukan

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

lakukan from itertools import*dan kemudian gunakan permutationsdi lambda. menghemat 1 byte
FlipTack

1

Python 2, 122 120 102 98 byte

18 byte disimpan berkat Flp.Tkc

4 byte disimpan berkat xnor

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

Penjelasan

Ini membuat semua string biner dengan panjang x dengan:

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

Saya kemudian mengurutkannya sesuai dengan:

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

sorted(x)memprioritaskan jumlah 1s sementara int(x[::-1],2)memprioritaskan kondisi kedua

Terakhir, ini bergabung dengan baris baru dan dicetak.


Ini tidak memenuhi syarat.
defarm

@DreadVim Sekarang
Ad Hoc Garf Hunter

Sepakat. Kerja bagus.
defarm

Ini tampaknya memangkas nol terkemuka.
xnor

Versi 106 byte tampaknya memberikan urutan berbeda untuk n = 4. Milik Anda memberi 0110 kemudian 1001, yang dialihkan dari test case. Saya tidak yakin bagaimana urutan yang benar ditentukan.
xnor

1

Perl, 63 byte

-4 Terima kasih kepada @Ton Hospel.
-2 Terima kasih kepada @Gabriel Benamy.

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

Jalankan dengan -E(yang mengaktifkan fitur say):

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


Penjelasan singkat :

  • "{1,0}"x$_menciptakan string yang terdiri dari $_waktu {1,0}( $_adalah input). Misalnya dengan 3: {1,1}{1,0}{1,0}.
  • Kemudian globlakukan sihir dan hasilkan semua kombinasi dari satu elemen dari setiap kelompok kawat gigi (yaitu, semua kombinasi yang ingin kita cetak).
  • Dan kemudian sortir: $b=~y/1//c-$a=~y/1//cmembandingkan jumlah 1setiap string, dan jika mereka memiliki nomor yang sama, $b-$aakan mengurutkan berdasarkan aturan kedua.

Saya percaya Anda dapat menyimpan dua byte dengan mengubah y/1//cke y/0//kedua kali
Gabriel Benamy

@GabrielBenamy Memang, terima kasih. Saya terlalu terbiasa menggunakannya y///c!
Dada

Ganti <=>oleh-
Ton Hospel

@TonHospel diedit, terima kasih!
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

Dapat dibaca:

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

Subrutin emengubah argumennya menjadi nilai biner, diisi dengan nol, menjadi panjang input (mis. Input 5 bantalan dengan nol hingga panjangnya 5 karakter). Subrutin fmengambil nilai biner seperti itu, dan memberikan bobot penyortiran sesuai dengan bagaimana seharusnya diproses.

Rentang 0 .. [input] 2 -1 kemudian dimasukkan ke dalam jenis yang stabil, memesan berdasarkan berat (di sini, "stabil" berarti bahwa ketika dua nilai memiliki bobot yang sama, mereka dikembalikan dalam urutan yang sama mereka muncul di input), dan kemudian mereka diumpankan kembali ke subrutin edan output.

Beberapa dari Anda mungkin telah melihat posting asli saya, tetapi saya sepenuhnya salah membaca masalah kemarin dan segera menghapusnya setelah saya menyadarinya.


Ini tidak menghasilkan output yang diperlukan untuk n>=5. Misalnya, dengan n>=5, 01101datang sebelum 10011tetapi harus setelah.
Dada

0

Racket 109 byte

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

Tidak Disatukan:

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

Pengujian:

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

Keluaran:

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
Dalam kasus n = 3 di atas tidak sama dengan menggunakan teks 000 001 010 100 dll
RosLuP

Latihan ini akan menulis fungsi yang tepat untuk menyortir daftar angka (dan daripada mencetak bentuk biner)
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
Selamat Datang di Programming Puzzles & Code Golf! Sayangnya, ini tampaknya tidak melakukan apa yang diminta oleh tantangan. Misalnya, input 5 mencetak lima baris pertama dari output yang sesuai dengan 3 .
Dennis

0

PHP, 49 byte

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

Jalankan dengan -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

Golf

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

Uji

>./binseq 4

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

Itu salah ... Saya salin dan tempel output di atas: 0011 0101 1001 0110 1010 1100 setelah 0101 ada 1001 dan bukan 0110
RosLuP

Memang benar imgur.com/a/yxBLp , tebakan saya, adalah bahwa Anda mungkin hanya menjalankan sistem dengan lokal yang berbeda (saya menggunakan "en_US.UTF-8"), sehingga aturan pengumpulan yang berbeda berlaku (yang diharapkan dan perilaku "semacam" yang didokumentasikan). Cobalah mengubah lokal, atau beri tahu saya milik Anda, dan saya akan melihat karakter mana yang harus Anda gunakan sebagai pengganti ~.
zeppelin

Hal lain yang dapat Anda coba adalah untuk menegakkan urutan kamus pada sortir dengan "-d" (yang seharusnya menghasilkan hasil spesifik kurang lokal)
zeppelin

saya katakan hasil cetak Anda di atas untuk n = 4 [0000 0001 0010 0100 1000 0011 0101 0110 1001 1010 1100 0111 1011 1101 1110 1111] berbeda dari hasil pertanyaan untuk n = 4 [0000 0001 0010 0100 1000 0011 0101 1001 0110 1010 1100 0111 1011 1101 1110 1111] infact posisi ke-9 array itu memiliki satu nilai yang berbeda
RosLuP

@ RosLup Saya percaya 0101 => 1001 adalah kesalahan dalam data kasus uji, bukan implementasi saya, lihat diskusi pada jawaban "Python 2" di bawah ini: "Milik Anda memberikan 0110 kemudian 1001, yang dialihkan dari kasus uji. Saya tidak yakin bagaimana urutan yang benar sebenarnya ditentukan. - xnor "" Kesalahan saya. Itu benar-benar terbalik ... - Dread Vim "(OP)
zeppelin

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.