일반화 된 회색 코드


13

입력 : 어레이 I(K) 양수. 정수는 100보다 크지 않고 k ≤ 100 입니다.

출력 : 코드는 길이가 k 인 음이 아닌 정수의 가능한 모든 배열 O0 ≤ O i ≤ I i로 제한하여 출력해야합니다 . 한 배열에서 다음 배열로 가져 오려면 배열에서 1에서 하나의 값을 더하거나 뺄 수 있습니다. 코드는 동일한 배열을 두 번 출력해서는 안됩니다. 출력 할 여러 배열의 수가 매우 많은 경우 코드는 종료 될 때까지 계속 출력해야합니다.

  • 경우 내가 의 배열입니다 K의 사람이 다음이 바로 모든 반복의 문제 그레이 코드 폭 비트의 K 제 마지막 요소는 한 번에 연결할 수 필요가없는 것을 제외하고.

  • 그렇다면 I = [2,1]출력 배열의 가능한 순서는 다음과 같습니다.(0,0),(0,1),(1,1),(1,0),(2,0),(2,1)

  • 그렇다면 I = [2,1,3]출력 배열 중 하나의 가능한 순서는 (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),...입니다.

이것은 가장 짧은 길이의 소스 코드로 제출하면 코드 골프 도전입니다. 골프 언어로 된 짧은 답변이 다른 언어로 답변을 게시하지 못하게하지 마십시오. 어떤 언어로든 가장 짧은 대답을 생각해보십시오.

이것은 또한 복잡한 문제입니다. 모든 새로운 배열은 이전에 출력 된 배열 (또는 첫 번째 배열에 대한 프로그램의 시작 ) 이후 O (k) 시간이 경과 하여 출력되어야합니다 . 즉, 새 출력 배열 당 실행 시간 (각 길이는 k )이 O (k) 이하 여야합니다 . 즉 , 예를 들어 k 2 또는 2 k가 아닌 k에 비례하는 시간을 가져야합니다 . 이것은 출력 당 평균 시간이 아니라 출력 된 각 어레이에 대한 최악의 시간입니다.

64 비트 정수에 대한 모든 산술은 상수를 읽고 출력 할 수있을뿐만 아니라 배열에서 값을 할당하고 조회하고 변경할 수있는 일정한 시간에 수행 될 수 있다고 가정 할 수 있습니다.

복잡성이 제한된 결과 중 하나는 프로그램 종료시 출력 만 가능한 솔루션이 허용되지 않는다는 것입니다.


1
( "1을 더하거나 빼야합니다"모듈로 I_i+1??에서 0에 도달 할 수 있습니까 I_i?)
user202729

@ user202720 아니요 그런 의도는 없었습니다.
Anush

어떻게하면 복잡한 작업을 수행 n하고 k제한된다? 그들이 비트 폭이 무한대로 갈 가정하고 어떻게 이동
l4m2

@ l4m2 복잡도 분석을 위해 k는 무한대로 간다고 가정합니다.
Anush

@ Anush 그래서 비트 너비는 어떻게됩니까?
l4m2

답변:


4

파이썬 3 , 116 바이트

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]

온라인으로 사용해보십시오!

감사 니모닉 -1 바이트.

발전기 기능. 출력이 다음 표준 출력 사용하여 인쇄해야하는 경우 (감사 데니스 저를 생각 나게, 나는 기능이 존재 잊었) print(t,flush=1)파이썬이 호출되는 경우 (9) 추가 바이트, 또는 -u, print(t)1 바이트 접미사를.

오류 ( IndexError) 와 함께 중지합니다 . 이 함수를 호출 한 다음 프로그램을 계속하려면이를 잡아야합니다.


내부 while 루프는 얼마나 오래 실행됩니까?
Anush

기껏 @Anush k때문에 각각의 단계에서, 단계 i만큼 증가 1후의 k단계 i==kd[i]에러가 발생.
user202729

이것은 매우 좋은 해결책입니다.
Anush

당신은 대체하여 바이트를 저장할 수 있습니다 not 0<=not-1<.

1
yield t대신에 사용할 수 print(t,flush=1)있습니까?
Dennis

2

Stax , 22 바이트

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

실행 및 디버깅

다음은 점근 적 행동 Press run 을 보여주는 큰 것 입니다.

포장을 풀고 포장을 풀고 주석을 달았습니다.

,           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

이것을 실행


1
비트 복잡도를 측정 할 때 반복 인덱스는 O(k)비트이므로 분할 k시간이 O(k²)오래 걸릴 수 있습니다 .
user202729

1

자바 스크립트 (Node.js) , 114 바이트

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;}}

온라인으로 사용해보십시오! 언 골프 드 :

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

코 틀린 , 181 178 바이트

덕분에 Anush는 2 바이트를 절약하는 도전을 잘못 이해했다고 지적했습니다. ovs는 1 바이트 절약을 지적했습니다.

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]}}

온라인으로 사용해보십시오!


1
2 1 3 문제의 예에서 코드는 입력으로 3 2 4가 필요합니다.
Anush

1
while(true)할 수 있습니다while(1<2)
OVS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.