Mã màu xám tổng quát


13

Dữ liệu vào: Một mảng I gồm k số nguyên dương. Các số nguyên sẽ không lớn hơn 100 và k 100 .

Đầu ra: Mã của bạn phải xuất tất cả các mảng O có thể có số nguyên không âm có độ dài k với giới hạn là 0 ≤ O i I i . Để lấy từ một mảng sang mảng tiếp theo, bạn có thể thêm hoặc trừ 1 đến một giá trị trong mảng. Mã của bạn không được xuất ra cùng một mảng hai lần. Nếu số lượng các mảng khác nhau được xuất ra rất lớn, mã của bạn sẽ chỉ tiếp tục xuất ra mãi mãi cho đến khi nó bị giết.

Ví dụ

  • Nếu tôi là một mảng gồm k thì đây chính xác là vấn đề lặp lại trên tất cả các mã Gray có độ rộng bit k , ngoại trừ phần tử đầu tiên và phần tử cuối cùng không cần phải tiếp cận trong một bước.

  • Nếu I = [2,1]sau đó một thứ tự có thể của các mảng đầu ra là(0,0),(0,1),(1,1),(1,0),(2,0),(2,1)

  • Nếu I = [2,1,3]sau đó một thứ tự có thể của các mảng đầu ra là (0,0,0),(0,0,1),(0,0,2),(0,0,3),(0,1,3),(0,1,2),(0,1,1),(0,1,0),(1,1,0),(1,1,1),(1,1,2),(1,1,3),(2,1,3),(2,1,2),(2,1,1),(2,1,0),....

Đây là một thử thách chơi gôn mã, bài nộp với mã nguồn có độ dài ngắn nhất sẽ thắng. Đừng để những câu trả lời ngắn trong ngôn ngữ chơi gôn ngăn cản bạn đăng câu trả lời bằng các ngôn ngữ khác. Cố gắng đưa ra câu trả lời ngắn nhất bằng bất kỳ ngôn ngữ nào.

Đây cũng là một thách thức phức tạp hạn chế. Mỗi mảng mới phải được xuất với thời gian trôi qua O (k) kể từ khi mảng được xuất ra trước đó (hoặc bắt đầu chương trình cho mảng đầu tiên được xuất ra). Điều này có nghĩa là thời gian chạy trên mỗi mảng đầu ra mới (chúng là mỗi chiều dài k ) không được lớn hơn O (k) . Đó là cần có tỷ lệ thời gian cho k và không, ví dụ k 2 hoặc 2 k . Lưu ý đây không phải là thời gian trung bình trên mỗi đầu ra mà là thời gian trường hợp xấu nhất cho mỗi và mọi mảng xuất ra.

Bạn có thể giả sử rằng tất cả số học trên số nguyên 64 bit có thể được thực hiện trong thời gian không đổi cũng như có thể đọc và xuất chúng cũng như gán và tra cứu và thay đổi giá trị trong mảng.

Một hậu quả của sự phức tạp hạn chế là các giải pháp chỉ xuất ra khi thoát khỏi chương trình không được chấp nhận.


1
(nên "cộng hoặc trừ 1" modulo đã thực hiện I_i+1? Bạn có thể đạt 0 từ I_ikhông?)
user202729

@ user202720 Không, tôi không có ý định đó.
Anush

Làm thế nào để sự phức tạp làm việc khi nkbị hạn chế? giả sử họ đi đến vô cùng với chiều rộng bit làm thế nào để đi
l4m2

@ l4m2 Với mục đích phân tích độ phức tạp giả sử k đi đến vô cùng.
Anush

@Anush vậy làm thế nào để chiều rộng bit đi?
l4m2

Câu trả lời:


4

Python 3 , 116 byte

def f(a):
 l=len(a);t=[0]*l;d=[1]*l
 while 1:
  i=0;yield t
  while not-1<t[i]+d[i]<=a[i]:d[i]*=-1;i+=1
  t[i]+=d[i]

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

Cảm ơn Mnemonic cho -1 byte.

Chức năng máy phát điện. (cảm ơn Dennis đã nhắc nhở tôi, tôi đã quên tính năng tồn tại) Nếu đầu ra nên được in ra thiết bị xuất chuẩn, sau đó sử dụng print(t,flush=1)cho 9 byte bổ sung hoặc nếu Python được gọi với -u, print(t)đủ cho 1 byte.

Dừng với một lỗi ( IndexError). Nếu bạn muốn gọi chức năng này và sau đó tiếp tục chương trình, bạn phải bắt nó.


Bao lâu thì vòng lặp while chạy trong bao lâu?
Anush

@Anush Tại hầu hết kcác bước, bởi vì tại mỗi bước ităng theo 1và sau kcác bước i==kd[i]gây ra lỗi.
dùng202729

Đây là một giải pháp rất tốt đẹp.
Anush

Bạn có thể lưu một byte bằng cách thay thế not 0<=bằng not-1<.

1
Bạn có thể sử dụng yield tthay vì print(t,flush=1)?
Dennis

2

Stax , 22 byte

▒)∙ñ╚▀NK♀F☺S(A#P`░]╪Db

Chạy và gỡ lỗi nó

Đây là một cái lớn để hiển thị hành vi tiệm cận Nhấn chạy.

Giải nén, không được chỉnh sửa và nhận xét, nó trông như thế này.

,           pop from input to main stack
W           run the rest of the program repeatedly until explicitly cancelled
  cJP       copy top of stack and print, delimited by spaces
            get the index to mutate
  i^            iteration index + 1
  x{^|%}I       repeatedly apply divmod using l[k]+1 from input
                get the index of the first value that returns modulus >0
  cU=C      if the result is -1 (no match), then terminate the program
            get the direction to mutate
  s             get the "div" part of the last div operation called "d"
  ^|1           -1 ^ (d+1)
  ~{+}&     increment element in array at the index by the calculated amount

Chạy cái này


1
Đo độ phức tạp của bit, chỉ số lặp là O(k)bit, do đó kthời gian phân chia có thể mất O(k²)thời gian ...
user202729

1

JavaScript (Node.js) , 114 byte

a=>{b=a.map(_=>0);c=a.map(_=>1);for(i=0;a[i];b[i]+=c[i]||-1){console.log(b);for(i=0;b[i]==a[i]*c[i];i++)c[i]^=1;}}

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

function ggray(maxima) {
    var current = Array(maxima.length).fill(0);
    var flag = Array(maxima.length).fill(1);
    for (;;) {
        console.log(current);
        for (var i = 0; ; i++) {
            if (i == maxima.length) return;
            if (current[i] != maxima[i] * flag[i]) break;
            flag[i] = 1 - flag[i];
        }
        if (flag[i]) current[i]++;
        else current[i]--;
    }
}

1

Kotlin , 181 178 byte

Nhờ: Anush chỉ ra tôi đã hiểu nhầm thử thách tiết kiệm 2 byte. ovs chỉ ra một tiết kiệm 1 byte.

val p={a:List<Int>->var l=a.size
val v=Array(l,{0})
val i=Array(l,{1})
l-=1
o@while(0<1){println(v)
var p=l
while(v[p]+i[p]!in 0..a[p]){i[p]*=-1
p-=1
if(p<0)break@o}
v[p]+=i[p]}}

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


1
Đối với ví dụ trong câu hỏi với 2 1 3, mã của bạn cần 3 2 4 như đầu vào.
Anush

1
while(true)có thểwhile(1<2)
OVS
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.