Beri aku daftar Kode Kelabu bit lebar n

11

Kode Gray adalah urutan angka-angka biner dari bitwidth di nmana angka-angka berturut-turut hanya berbeda dalam satu bit (lihat contoh output).

Referensi

Input contoh:

3

Contoh output:

000
001
011
010
110
111
101
100

Catatan:

  • Pertanyaan ini tampaknya memiliki penipuan tetapi tidak, karena pertanyaan itu bukan kode-golf, dan menuntut output yang berbeda. Akan membantu untuk memeriksa jawabannya.
  • Anda dapat mengasumsikan variabel nyang berisi input.
ToonAlfrink
sumber
6
Mempertimbangkan bahwa pertanyaan lainnya adalah kode-tantangan kode tercepat tanpa kriteria kemenangan objektif (tercepat diukur bagaimana?), Saya mengusulkan untuk menutup yang lain dan membuka kembali yang ini.
Dennis
2
Saya setuju dengan @dennis dan karena itu saya telah membatalkan jawaban tidak populer berikut pada pertanyaan awal. "Jika jawaban yang Anda cari benar-benar hasil yang cepat, maka jika Anda mendeklarasikan array (dari kode abu-abu) ..." Namun pertanyaan awal aready memiliki 7-karakter dan jawaban 4-karakter jadi saya tidak t melihat banyak ruang untuk perbaikan. Karena itu saya tidak memberikan suara terbuka kembali saat ini.
Level River St
3
Ini sangat mirip dengan Traverse semua angka dengan hanya satu flip per langkah meskipun ...
Dennis
Pertanyaan kode Gray yang paling awal tidak bagus, tetapi sudah memiliki jawaban yang secara fundamental sama dengan jawaban yang diinginkan pertanyaan ini, dan yang kemungkinan tidak akan ditingkatkan. Saya pikir akan lebih masuk akal untuk membiarkan yang satu ini ditutup dan mengubah yang lain menjadi kode golf.
Peter Taylor

Jawaban:

2

JavaScript (77)

for(i=0;i<1<<n;)alert((Array(n*n).join(0)+(i>>1^i++).toString(2)).substr(-n))

Versi yang lebih ramah-browser (console.log dan prompt ()):

n=prompt();for(i=0;i<1<<n;)console.log((Array(n*n).join(0)+(i>>1^i++).toString(2)).substr(-n))
Дамян Станчев
sumber
Mungkin susunan ini ... gabung terlalu banyakfor(i=0;i<(l=1<<n);i++)console.log((i^(i>>1)|l).toString(2).slice(1));
edc65
2

Python 2 (47)

for i in range(2**n):print bin(2**n+i/2^i)[3:]

Ekspresi i/2^iuntuk inomor kode abu-abu ke-'adalah dari jawaban ini . Untuk menambahkan angka nol di depan yang memanjang n, saya menambahkan 2**nsebelum mengkonversi ke string biner, membuat string dengan panjang n+1. Kemudian, aku memotong terkemuka 1awalan dan jenis nomor 0bdengan [3:].

Tidak
sumber
2

APL (Dyalog Classic) , 11 byte

2≠/0,↑,⍳n2

Cobalah online!

n⍴2adalah 2 2...2- vektor nberduaan

adalah indeks n-dimensi array dengan bentuk 2 2...2- yaitu, array 2 × 2 × ... × 2 dari vektor bersarang. Seperti kita menggunakan 0-indexing ( ⎕IO←0), mereka semua adalah vektor biner dengan panjang n.

,ratakan 2 × 2 × ... × 2 bentuk, jadi kami mendapatkan vektor 2 n vektor biner

"mix" - ubah vektor vektor menjadi 2 yang solid matriks n × n . Ini terlihat seperti ini:

0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

0, menambahkan nol di sebelah kiri matriks

2≠/menghitung pairwise ( 2) xor ( ) sepanjang dimensi terakhir ( /sebagai lawan dari ); dengan kata lain, setiap elemen di-xor-ed dengan tetangga kanannya, dan kolom terakhir menghilang

0 0 0
0 0 1
0 1 1
0 1 0
1 1 0
1 1 1
1 0 1
1 0 0
ngn
sumber
maukah Anda menambahkan penjelasan cepat?
Jonah
1
@Jonah yakin, ditambahkan
ngn
sangat pintar, thx
Jonah
2

Japt , 14 12 byte

2pU Ç^z)¤ùTU

Dicukur dua byte berkat produk ETH .

Cobalah online!

Nit
sumber
Contoh sempurna tentang bagaimana ùdigunakan. Karena N.z(n)pembagian integer dengan default arg = 2, Anda dapat menyimpan dua byte dengan 2pU Ç^z)¤ùTU: Coba online!
ETHproduk
@ ETHproductions Terima kasih, saya masih melewatkan argumen default setiap sekarang dan kemudian. Sangat berguna, terima kasih banyak.
Nit
1

Python - 54

Didasarkan pada suatu algoritma dari referensi yang diberikan dalam tantangan:

for i in range(2**n):print'{1:0{0}b}'.format(n,i>>1^i)

Tidak Disatukan:

# For each of the possible 2**n numbers...
for num in range(2**n):
    gray = num>>1 ^ num

    # Print in binary and pad with n zeros.
    print '{1:0{0}b}'.format(grey)
BeetDemGuise
sumber
1

PowerShell (168)

Amatir PowerShell kembali dengan upaya lain di golF! Semoga kamu tidak keberatan! Paling tidak pertanyaan-pertanyaan ini menyenangkan, dan pengalaman belajar untuk boot. Dengan asumsi n telah dimasukkan, kita memiliki:

$x=@('0','1');for($a=1;$a-lt$n;$a++){$x+=$x[($x.length-1)..0];$i=[Math]::Floor(($x.length-1)/2);0..$i|%{$x[$_]='0'+$x[$_]};($i+1)..($x.length-1)|%{$x[$_]='1'+$x[$_]}}$x

Karena PowerShell yang saya gunakan hanya 2.0, saya tidak bisa menggunakan cmdlet bit yang bisa membuat kode lebih pendek. Jadi saya mengambil keuntungan dari metode berbeda yang dijelaskan dalam sumber pertanyaan , membalik array dan menambahkannya ke dirinya sendiri, menambahkan 0 ke depan bagian atas, dan 1 ke bagian bawah.

fuandon
sumber
1

F # (86) (84) (80)

for i in 0..(1<<<n)-1 do printfn"%s"(Convert.ToString(i^^^i/2,2).PadLeft(n,'0'))

Ini mungkin bisa diperbaiki lebih lanjut.

Perhatikan juga, jika dijalankan di FSI, Anda harus open System;;terlebih dahulu. Jika Anda ingin menghindari impor itu, (dan jika Anda tidak peduli dengan urutan nilai dicetak), Anda dapat menggunakan versi 82 ​​karakter ini:

for i in 0..(1<<<n)-1 do(for j in 0..n-1 do printf"%i"((i^^^i/2>>>j)%2));printfn""
pswg
sumber
1

Ruby - 42 39

Algoritma yang sama, bahasa yang berbeda:

(2**n).times{|b|puts"%0#{n}b"%(b>>1^b)}

Beralih dari #mapke #timessebagai @voidpigeon menyarankan untuk menyimpan 3 karakter.

OI
sumber
1
Alih-alih [*0...2**n].mapbisa Anda gunakan (2**n).times.
Berlangsung
1

J, 24 byte

[:#:@(22 b.<.@-:)[:i.2^]

Cobalah online!

Implementasi langsung dari algoritma "XOR dengan setengah lantai sendiri". Perhatikan bahwa 22 b.XOR.

Jonah
sumber
1

MATL , 10 byte

W:qt2/kZ~B

Cobalah online!

Metode "XOR n with n >> 2" yang bagus.

W- menghitung 2 ^ (input) (mendapat input secara implisit)
:q- membuat rentang angka dari 0 hingga 2 ^ n - 1
t - menduplikasi rentang itu
2/k- MATL tidak memiliki bithift, jadi bagi (setiap angka) dengan 2 dan lantai
Z~ - elemen XOR hasil itu dengan array 0 ke 2 ^ n - 1 asli
B - konversi setiap angka dalam hasil ke biner
(Secara implisit menampilkan output.)

sundar - Pasang kembali Monica
sumber
1

K (ngn / k) , 25 byte

{(x-1){,/0 1,''|:\x}/0 1}

Cobalah online!


  • |:\xadalah "scan terbalik x". berlaku mundur ke x sampai output sama dengan input, dan menunjukkan setiap iterasi. mengembalikan (0 1; 1 0) pada pass pertama.
  • 0 1,''adalah "0 1 masing-masing bergabung". bergabung dengan 0 untuk setiap nilai 1 elem, dan 1 untuk setiap nilai 2 elem, memberi ((0 0; 0 1); (1 1; 1 0)) pada pass pertama
  • ,/ adalah "gabung", dan ratakan ke daftar.
  • (x-1){...}/0 1adalah "apply {func} over 0 1x-1 times". mengambil output dari iterasi terakhir sebagai input
tulisan cakar ayam
sumber
0

APL (22)

{(0,⍵)⍪1,⊖⍵}⍣(n-1)⍪0 1

Ini menghasilkan matriks n-by-2 ^ n yang berisi bit sebagai barisnya:

      n←3
      {(0,⍵)⍪1,⊖⍵}⍣(n-1)⍪0 1
0 0 0
0 0 1
0 1 1
0 1 0
1 1 0
1 1 1
1 0 1
1 0 0

Penjelasan:

  • {... }⍣(n-1)⍪0 1: jalankan fungsinyan-1 kali dengan input awal matriks (0 1)T(yang merupakan kode abu-abu 1-bit)

    • (0,⍵): setiap baris dengan 0awalan,
    • : diatas dari,
    • 1,⊖⍵: setiap baris dengan 1awalan, dalam urutan terbalik
marinus
sumber
0

Jq 1.5 , 105 100 byte

def g(n):if n<2then. else map([0]+.)+(reverse|map([1]+.))|g(n-1)end;[[0],[1]]|g(N)[]|map("\(.)")|add

Asumsikan N memberikan input. misalnya

def N: 3 ;

Diperluas

def g(n):  # recursively compute gray code
  if n < 2
  then .
  else map([0]+.) + (reverse|map([1]+.)) | g(n-1)
  end;

  [[0],[1]]                 # initial state
| g(N)[]                    # for each element in array of gray codes
| map("\(.)")|add           # covert to a string

Cobalah online!

jq170727
sumber
-1

T-SQL 134

Tantangan ini meminta untuk mengembalikan kekuatan Cartesian dari {(0), (1)}. Cuplikan ini membangun kode yang akan mengeksekusi produk Cartesian sebanyak {(0), (1)} n kali.

DECLARE @ int=4,@s varchar(max)='SELECT*FROM's:set @s+='(VALUES(0),(1))t'+ltrim(@)+'(b)'if @>1set @s+=','set @-=1if @>0goto s exec(@s)
nyaman
sumber
Ia meminta kekuatan kartesius dalam urutan tertentu. Apakah akun kode Anda untuk itu?
ToonAlfrink