Genelleştirilmiş Gri kodlar


13

Girdi: k pozitif tamsayılardan oluşan bir dizi I. Tamsayılar 100 ve k ≤ 100'den büyük olmayacaktır .

Çıktı: Kodunuz , 0 ≤ O i ≤ I i kısıtlamasıyla k uzunluğu olan negatif olmayan tamsayıların tüm olası dizilerini O vermelidir . Bir diziden diğerine almak için diziye 1'e bir değer ekleyebilir veya çıkarabilirsiniz. Kodunuz aynı diziyi iki kez çıkarmamalıdır. Çıktı yapılacak farklı dizilerin sayısı çok büyükse, kodunuz öldürülünceye kadar sonsuza kadar çıktı almaya devam etmelidir.

Örnekler

  • Eğer ben bir dizidir k olanlar o zaman bu tam olarak baştan yineleme sorunudur Gri kodları genişliği bit k ilk ve son eleman tek adımda ulaşılabilir olması gerekmez dışında.

  • Eğer I = [2,1]çıkış Dizilerin sonra olası bir sıralamadır(0,0),(0,1),(1,1),(1,0),(2,0),(2,1)

  • Eğer I = [2,1,3]öyleyse, çıkış dizilerinin olası bir sırası (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),....

Bu bir kod-golf meydan okuma, en kısa uzunlukta kaynak kodu ile gönderme kazanır. Golf dillerindeki kısa yanıtların diğer dillerde yanıt göndermenizi engellemesine izin vermeyin. Herhangi bir dilde en kısa cevabı bulmaya çalışın.

Bu aynı zamanda sınırlı karmaşıklık sorunudur. Her yeni dizi , önceki çıkış dizisinden (veya ilk çıkış dizisi için programın başlangıcından ) geçen O (k) süresi ile birlikte çıkarılmalıdır . Bu, yeni çıkış dizisi başına çalışma sürelerinin (her biri k uzunluğundadır ) O (k) değerinden fazla olmaması gerektiği anlamına gelir . Yani k ile orantılı olması zaman alır , örneğin k 2 veya 2 k . Bunun, çıktı başına ortalama süre değil, çıktı verilen her dizi için en kötü durum zamanı olduğuna dikkat edin.

64 bit tamsayılardaki tüm aritmetik işlemlerin, okuma ve çıktıların yanı sıra dizilerdeki değerleri atama ve arama ve değiştirme gibi sabit zamanda da gerçekleştirilebileceğini varsayabilirsiniz.

Kısıtlı karmaşıklığın bir sonucu, yalnızca program çıkışında çıkan çözümlerin kabul edilemez olmasıdır.


1
("1 ekleme veya çıkarma" I_i+1I_i
yapmalı

@ user202720 Hayır Bunu istemedim.
Anush

Sınırlılık ne zaman nve ksınırlıdır? bit genişliği ile sonsuzluğa gittiklerini
varsayalım

@ l4m2 Karmaşıklık analizi amacıyla, k'nin sonsuza gittiğini varsayalım.
Anush

@Anush, bit genişliği nasıl gidiyor?
l4m2

Yanıtlar:


4

Python 3 , 116 bayt

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]

Çevrimiçi deneyin!

-1 bayt için Mnemonic teşekkürler .

Jeneratör işlevi. (bana hatırlattığın için teşekkürler, özellik var olduğunu unuttum) Çıktı stdout'a basılması gerekiyorsa print(t,flush=1), 9 ek bayt için kullanın veya Python ile çağrılırsa -u, print(t)+1 bayt için yeterlidir.

Hatalı durur ( IndexError). Bu işlevi çağırmak ve sonra programa devam etmek istiyorsanız, onu yakalamanız gerekir.


İç while döngüsü ne kadar sürer?
Anush

En fazla @Anush kçünkü her bir aşama olarak, adımlar iile artar 1ve sonra kadım i==kve d[i]bir hataya neden olur.
user202729

Bu çok güzel bir çözüm.
Anush

Sen değiştirerek byte kaydedebilirsiniz not 0<=ile not-1<.

1
yield tBunun yerine kullanabilir misiniz print(t,flush=1)?
Dennis

2

Stax , 22 bayt

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

Çalıştır ve hata ayıkla

İşte asimptotik davranışı göstermek için büyük bir basın Run çalıştırın.

Ambalajından çıkarılmış, golf edilmemiş ve yorum yapılmış gibi görünüyor.

,           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

Bunu çalıştır


1
Bit karmaşıklığında ölçüm, yineleme endeksi O(k)bittir, bu nedenle bölüm ksüreleri O(k²)zaman alabilir ...
user202729

1

JavaScript (Node.js) , 114 bayt

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

Çevrimiçi deneyin! Ungolfed:

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 bayt

Teşekkürler: Anush, 2 bayt tasarruf mücadelesini yanlış anladığımı belirtti. ovs, 1 baytlık tasarruflara dikkat çekti.

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

Çevrimiçi deneyin!


1
2 1 3 ile ilgili soruda, kodunuzun girdi olarak göründüğü gibi 3 2 4 olması gerekir.
Anush

1
while(true)olabilirwhile(1<2)
ovs
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.