Đưa cho tôi danh sách Mã màu xám của bit width n


11

Mã màu xám là một chuỗi các số nhị phân của băng thông n, trong đó các số liên tiếp chỉ khác nhau ở một bit (xem ví dụ đầu ra).

Tài liệu tham khảo

Ví dụ đầu vào:

3

Ví dụ đầu ra:

000
001
011
010
110
111
101
100

Ghi chú:

  • Câu hỏi này dường như có một bản dupe nhưng không, vì câu hỏi đó không phải là môn đánh gôn và nó đòi hỏi đầu ra khác nhau. Nó sẽ giúp kiểm tra câu trả lời của nó, mặc dù.
  • Bạn có thể giả sử một biến nchứa đầu vào.

6
Xem xét rằng câu hỏi khác là một thử thách mã nhanh nhất mà không có tiêu chí chiến thắng khách quan (được đo nhanh nhất như thế nào?), Tôi đề nghị đóng cái khác và mở lại cái này.
Dennis

2
Tôi đồng ý với @dennis và do đó tôi đã đưa ra câu trả lời không phổ biến sau đây cho câu hỏi ban đầu. "Nếu câu trả lời bạn đang tìm kiếm hoàn toàn là một kết quả nhanh, thì nếu bạn khai báo một mảng (trong các mã màu xám) ..." Tuy nhiên, câu hỏi ban đầu có một câu trả lời gồm 7 ký tự và 4 ký tự, vì vậy tôi không chọn t thấy nhiều chỗ để cải thiện Vì vậy, hiện tại tôi không bỏ phiếu mở lại.
Cấp sông St


Câu hỏi đầu tiên về mã Gray không phải là tuyệt vời, nhưng nó đã có câu trả lời về cơ bản giống như câu trả lời mà câu hỏi này muốn và không có khả năng được cải thiện. Tôi nghĩ rằng sẽ có ý nghĩa hơn khi để cái này đóng lại và thay đổi cái kia thành một mã golf.
Peter Taylor

Câu trả lời:


2

JavaScript (77)

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

Phiên bản thân thiện với trình duyệt hơn (console.log và prompt ()):

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

Có lẽ mảng này ... tham gia là quá mức cần thiếtfor(i=0;i<(l=1<<n);i++)console.log((i^(i>>1)|l).toString(2).slice(1));
edc65

2

Con trăn 2 (47)

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

Biểu thức i/2^icho isố mã màu xám là từ câu trả lời này . Để thêm các số 0 đứng đầu theo chiều dài n, tôi thêm 2**ntrước khi chuyển đổi thành chuỗi nhị phân, tạo chuỗi có độ dài n+1. Sau đó, tôi cắt bớt 1tiền tố hàng đầu và loại số 0bvới [3:].



2

APL (Dyalog Classic) , 11 byte

2≠/0,↑,⍳n2

Hãy thử trực tuyến!

n⍴22 2...2- một vectơ của ntwos

là các chỉ số của một nmảng hai chiều có hình dạng 2 2...2- nghĩa là một mảng 2 × 2 × ... × 2 của các vectơ lồng nhau. Khi chúng ta sử dụng 0-indexing ( ⎕IO←0), tất cả đều là các vectơ nhị phân có độ dài n.

,làm phẳng hình dạng 2 × 2 × ... × 2, vì vậy chúng ta có được một vectơ 2 n vectơ nhị phân lồng nhau

"Trộn" - chuyển đổi vectơ của vectơ thành ma trận 2 n × n rắn . Nó trông như thế này:

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, trả trước các số 0 ở bên trái của ma trận

2≠/tính toán cặp đôi ( 2) xor ( ) dọc theo chiều cuối cùng ( /trái ngược với ); nói cách khác, mọi phần tử đều được xor-ed với hàng xóm bên phải của nó và cột cuối cùng biến mất

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

bạn có phiền khi thêm một lời giải thích nhanh chóng?
Giô-na

1
@Jonah chắc chắn, đã thêm
ngn

rất thông minh, thx
Jonah

2

Japt , 14 12 byte

2pU Ç^z)¤ùTU

Cạo sạch hai byte nhờ vào ETHproductions .

Hãy thử trực tuyến!


Ví dụ hoàn hảo về cách ùsử dụng. Vì N.z(n)là phép chia số nguyên với mặc định arg = 2, bạn có thể lưu hai byte bằng 2pU Ç^z)¤ùTU: Dùng thử trực tuyến!
Sản xuất ETH

@ETHproductions Cảm ơn, tôi vẫn bỏ lỡ các đối số mặc định mọi lúc mọi nơi. Rất tiện dụng, cảm ơn rất nhiều.
Nit

1

Con trăn - 54

Dựa trên một thuật toán từ tham chiếu được đưa ra trong thử thách:

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

Ung dung:

# 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)

1

PowerShell (168)

PowerShell'r nghiệp dư trở lại với một nỗ lực khác tại golF! Hy vọng bạn không phiền! Ít nhất những câu hỏi này rất thú vị và kinh nghiệm học tập để khởi động. Giả sử n đã được nhập, chúng ta có:

$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

Vì PowerShell tôi đang làm việc chỉ có 2.0, tôi không thể sử dụng bất kỳ lệnh ghép ngắn bit nào có thể làm cho mã ngắn hơn. Vì vậy, tôi đã tận dụng một phương pháp khác được mô tả trong nguồn câu hỏi , lật mảng và thêm nó vào chính nó, nối 0 vào phía trước của nửa trên và 1 vào nửa dưới.


1

F # (86) (84) (80)

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

Điều này có lẽ có thể được cải thiện hơn nữa.

Cũng lưu ý, nếu chạy trong FSI, open System;;trước tiên bạn cần phải có . Nếu bạn muốn tránh nhập dữ liệu đó, (và nếu bạn không quan tâm đến thứ tự in các giá trị), bạn có thể sử dụng phiên bản 82 ký tự này:

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

1

Hồng ngọc - 42 39

Cùng một thuật toán, ngôn ngữ khác nhau:

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

Chuyển từ #mapthành #times@voidpigeon gợi ý lưu 3 ký tự.


1
Thay vì [*0...2**n].mapbạn có thể sử dụng (2**n).times.
ngày


1

MATL , 10 byte

W:qt2/kZ~B

Hãy thử trực tuyến!

Phương pháp "XOR n cũ với n >> 2" cũ.

W- tính 2 ^ (đầu vào) (nhận đầu vào ngầm)
:q- tạo phạm vi số từ 0 đến 2 ^ n - 1
t - nhân đôi phạm vi đó
2/k- MATL không có bithift, do đó chia (mỗi số) cho 2 và sàn
Z~ - theo chiều dọc kết quả đó với mảng 0 đến 2 ^ n - 1 ban đầu
B - chuyển đổi từng số trong kết quả thành nhị phân
(Hiển thị rõ ràng đầu ra.)


1

K (ngn / k) , 25 byte

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

Hãy thử trực tuyến!


  • |:\xlà "quét ngược x". áp dụng ngược lại cho x cho đến khi đầu ra bằng với đầu vào và hiển thị mỗi lần lặp. trả về (0 1; 1 0) trong lần đầu tiên.
  • 0 1,''là "0 1 tham gia mỗi cái". nối 0 với mỗi giá trị của elem thứ nhất và 1 cho mỗi giá trị của elem thứ 2, cho ((0 0; 0 1); (1 1; 1 0)) trên đường chuyền đầu tiên
  • ,/ là "tham gia" và làm phẳng danh sách.
  • (x-1){...}/0 1là "áp dụng {func} trên 0 1x-1 lần". lấy đầu ra của lần lặp cuối cùng làm đầu vào

0

APL (22)

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

Điều này tạo ra ma trận n-by-2 ^ n chứa các bit dưới dạng các hàng của nó:

      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

Giải trình:

  • {... }⍣(n-1)⍪0 1: Chạy n-1thời gian chức năng với ma trận đầu vào ban đầu (0 1)T(là mã màu xám 1 bit)

    • (0,⍵): mỗi hàng 0tiền tố,
    • : trên đỉnh,
    • 1,⊖⍵: mỗi hàng 1tiền tố, theo thứ tự đảo ngược

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

Giả sử N cung cấp đầu vào. ví dụ

def N: 3 ;

Mở rộng

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

Hãy thử trực tuyến!



-1

T-SQL 134

Thử thách này đang yêu cầu trả lại sức mạnh của Cartesian là {(0), (1)}. Đoạn mã này xây dựng mã sẽ thực thi sản phẩm của Cartesian là {(0), (1)} n lần.

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)

Đó là yêu cầu sức mạnh của cartesian theo một thứ tự cụ thể. Có mã của bạn cho điều đó?
ToonAlfrink
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.