Bana bit genişliği n Gri Kod listesini ver


11

Gri Kod, nardışık sayıların yalnızca bir bitte farklılık gösterdiği ikili sayıdaki bit genişliğidir (örnek çıktıya bakın).

Referans

Örnek girdi:

3

Örnek çıktı:

000
001
011
010
110
111
101
100

Notlar:

  • Bu soruda bir dupe var gibi görünüyor, ama değil, çünkü bu soru bir kod golf değildir ve farklı çıktılar gerektirir. Yine de cevaplarını kontrol etmenize yardımcı olacaktır.
  • nGirdiyi içeren bir değişken olduğunu varsayabilirsiniz .

6
Diğer sorunun objektif bir kazanma ölçütü olmadan en hızlı kod kodu meydan okuması olduğunu göz önünde bulundurarak (en hızlı nasıl ölçülür?), Diğerini kapatmayı ve yeniden açmayı öneriyorum.
Dennis

2
@ Dennis'e katılıyorum ve bu nedenle orijinal soru üzerine şu popüler olmayan cevabı iptal ettim. "Aradığınız cevap kesinlikle hızlı bir sonuçsa, o zaman bir dizi (gri kodların) ilan ederseniz ..." Ancak orijinal soruya 7 karakterli ve 4 karakterli bir cevap var, bu yüzden t İyileştirme için fazla yer göremiyorum. Bu yüzden şu anda yeniden oy vermiyorum.
Level River St


En eski Gray kod sorusu harika değildir, ancak bu sorunun istediği cevaplarla temel olarak aynı olan ve geliştirilmesi muhtemel olmayan cevapları zaten vardır. Bu bir kapalı bırakmak ve diğeri bir kod golf değiştirmek daha anlamlı olurdu düşünüyorum.
Peter Taylor

Yanıtlar:


2

JavaScript (77)

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

Daha tarayıcı dostu sürüm (console.log ve istemi ()):

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

Belki bu dizi ... katılmak overkillfor(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:]

İfadesi i/2^iiçin i'inci gri kod numarasından olan bu cevap . Uzunluğa yastık önde gelen sıfırlar neklemek 2**niçin, bir ikili dize dönüştürmeden önce bir uzunluk dizesi oluşturmak önce ekleyin n+1. Sonra, önde gelen 1ve sayı türü önek 0bile kısaltmak [3:].



2

APL (Dyalog Klasik) , 11 bayt

2≠/0,↑,⍳n2

Çevrimiçi deneyin!

n⍴2olduğunu 2 2...2- nikişer ikişer

nşekilli boyutlu bir dizinin indeksleridir 2 2...2- yani, iç içe vektörlerin 2 × 2 × ... × 2 dizisi. 0-indexing ( ⎕IO←0) kullandığımızdan, bunların tümü ikili uzunluk vektörleridir n.

,2 × 2 × ... × 2 şeklini düzleştirin, böylece 2 n iç içe ikili vektörden bir vektör elde ederiz

"mix" - vektörlerin vektörünü katı bir 2 n × n matrisine dönüştürün. Şöyle görünüyor:

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, matrisin soluna sıfır ekler

2≠/( aksine ) son boyut boyunca çift ​​( 2) xor ( ) /değerini hesaplar ; başka bir deyişle, her öğe sağ komşusu ile xored edilir ve son sütun kaybolur

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

hızlı bir açıklama eklemek ister misiniz?
Jonah

1
@Jonah sure, added
ngn

çok zeki, thx
Jonah


1

Python - 54

Meydan okumada verilen referanstan bir algoritmaya dayanarak:

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

Ungolfed:

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

Amatör PowerShell'r geri başka bir girişim ile golF! Umursamıyorsun! En azından bu sorular eğlenceli ve önyükleme için bir öğrenme deneyimi. N girildiğini varsayarsak:

$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

Birlikte çalıştığım PowerShell sadece 2.0 olduğundan, daha kısa kodlar için herhangi bir bit kaydırma cmdlet'i kullanamıyorum. Bu yüzden, soru kaynağında açıklanan farklı bir yöntemden yararlandım , diziyi çevirdim ve kendine ekledim, üst yarının önüne 0 ve alt yarısına 1 ekledim.


1

F # (86) (84) (80)

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

Bu muhtemelen daha da geliştirilebilir.

Ayrıca, FSI'de çalıştırılırsa, önce yapmanız gerektiğini unutmayın open System;;. Bunu içe aktarmaktan kaçınmak istiyorsanız (ve değerlerin yazdırılma sırasını umursamıyorsanız) bu 82 karakterlik sürümü kullanabilirsiniz:

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

1

Yakut - 42 39

Aynı algoritma, farklı dil:

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

@Voidpigeon olarak geçiş #mapyapmak #times3 karakter kazandırmanızı önerir.


1
Bunun yerine [*0...2**n].mapkullanabilirsiniz (2**n).times.
afuous

1

J, 24 bayt

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

Çevrimiçi deneyin!

"XOR kendi zeminli yarıya sahip" algoritmasının doğrudan uygulanması. Bunun 22 b.XOR olduğunu unutmayın .


1

MATL , 10 bayt

W:qt2/kZ~B

Çevrimiçi deneyin!

Eski güzel "XOR n with n >> 2" yöntemi.

W- hesaplama 2 ^ (giriş) (örtük olarak girdi alır)
:q- 0 ile 2 arasında bir sayı aralığı oluşturun ^ n - 1
t - bu aralığı çoğaltın
2/k- MATL'de bit kaydırma yok, bu nedenle (her bir sayıyı) 2'ye bölün ve
Z~ öğeye göre XOR orijinal 0 - 2 ^ n - 1 dizisi
B ile sonuç - sonuçtaki her sayıyı ikilik
biçime dönüştür (Çıktıyı dolaylı olarak görüntüler.)


1

K (ngn / k) , 25 bayt

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

Çevrimiçi deneyin!


  • |:\x"ters tarama x" dir. çıktı girişe eşit oluncaya ve her yinelemeyi gösterene kadar x'e ters uygulanır. ilk geçişte (0 1; 1 0) döndürür.
  • 0 1,''"her birine 0 1 katıl". ilk elemede ((0 0; 0 1); (1 1; 1 0)) vererek 1. elem'in her bir değerine 0 ve 2. elem'in her bir değerine 1 ekler
  • ,/ "birleştirme" dir ve listelemek için düzleşir.
  • (x-1){...}/0 1" 0 1x-1 kereden fazla {func} uygulayın ". son yinelemenin çıktısını girdi olarak alır

0

APL (22)

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

Bu, bitleri satır olarak içeren bir n-2 ^ n matrisi çıkarır:

      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

Açıklama:

  • {... }⍣(n-1)⍪0 1: n-1matris (0 1)T(1 bitlik gri kod olan) ilk giriş ile fonksiyon sürelerini çalıştırır

    • (0,⍵): Her satır , bir ile 0öneki,
    • : üstüne,
    • 1,⊖⍵: Her satır , bir ile 1ters sırayla, önceden sabitlenmiş

0

JQ 1.5 , 105 , 100 bayt

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

N'nin girdi sağladığı varsayılmaktadır. Örneğin

def N: 3 ;

Expanded

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

Çevrimiçi deneyin!



-1

T-SQL 134

Bu zorluk {(0), (1)} 'in Kartezyen gücünü geri döndürmeyi istiyor. Bu snippet, {(0), (1)} kartezyen ürününü n kez çalıştıracak kodu oluşturur.

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)

Belli bir düzende kartezyen gücü istiyor. Kodunuz bunun hesabını veriyor mu?
ToonAlfrink
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.