Надайте мені список сірого коду ширини біт n


11

Сірий код - це послідовність двійкових чисел бітової ширини, nде послідовні числа відрізняються лише одним бітом (див. Приклад виведення).

Довідково

Приклад введення:

3

Приклад виводу:

000
001
011
010
110
111
101
100

Примітки:

  • Це питання, здається, є дурпом, але це не так, оскільки це питання не є кодом-гольфом, і воно вимагає різного результату. Це допоможе перевірити відповіді.
  • Ви можете припустити змінну, nяка містить вхідні дані.

6
Враховуючи, що інше питання - це виклик коду з найшвидшим кодом без об'єктивного критерію виграшу (якнайшвидше виміряти?), Я пропоную закрити інше та повторно відкрити це.
Денніс

2
Я погоджуюся з @dennis, і тому я відхилив наступну непопулярну відповідь на оригінальне запитання. "Якщо відповідь, яку ви шукаєте, суворо швидкий результат, то якщо ви оголосите масив (із сірих кодів) ..." Однак у початковому запитанні є 7-символьний і 4-символьний відповідь, тому я не хочу не бачу багато можливостей для вдосконалення. Тому я зараз не голосую за повторне голосування.
Рівень річки Св.


Найдавніше питання про сірий код не є великим, але в ньому вже є відповіді, які принципово такі ж, як відповіді, яких хоче це питання, і які, швидше за все, не будуть вдосконалені. Я думаю, було б більше сенсу залишити цей закритим і змінити інший на кодовий гольф.
Пітер Тейлор

Відповіді:


2

JavaScript (77)

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

Більш зручна для браузера версія (console.log та prompt ()):

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

Можливо, цей масив ... приєднатися буде надмірноfor(i=0;i<(l=1<<n);i++)console.log((i^(i>>1)|l).toString(2).slice(1));
edc65

2

Пітон 2 (47)

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

Вираз i/2^iдля i'-го сірого кодового номера походить з цієї відповіді . Щоб додати ведучі нулі, що задають колоду по довжині n, я додаю 2**nперед перетворенням у двійковий рядок, створюючи рядок довжиною n+1. Потім я вкоротити провідний 1і введіть номер префікса 0bз [3:].



2

APL (Dyalog Classic) , 11 байт

2≠/0,↑,⍳n2

Спробуйте в Інтернеті!

n⍴2є 2 2...2- вектор nдвох

- це показники n-вимірного масиву з формою 2 2...2- тобто масиву 2 × 2 × ... × 2 вкладених векторів. Оскільки ми використовуємо 0-індексацію ( ⎕IO←0), це всі бінарні вектори довжини n.

,сплющуємо форму 2 × 2 × ... × 2, тому ми отримуємо вектор 2 n вкладених двійкових векторів

"змішати" - перетворити вектор векторів у тверду матрицю 2 n × n. Це виглядає приблизно так:

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, попередньо нулі зліва від матриці

2≠/обчислює попарно ( 2) xor ( ) уздовж останнього виміру ( /на відміну від ); Іншими словами, кожен елемент отримує xor-ed зі своїм правим сусідом, а останній стовпець зникає

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

Ви не проти додати швидке пояснення?
Йона

1
@Jonah впевнений, додано
ngn

дуже розумний, thx
Йона

2

Japt , 14 12 байт

2pU Ç^z)¤ùTU

Поголив два байти завдяки ETHproductions .

Спробуйте в Інтернеті!


Ідеальний приклад того, як ùвикористовується. Оскільки N.z(n)це ціле ділення за замовчуванням arg = 2, ви можете зберегти два байти за допомогою 2pU Ç^z)¤ùTU: Спробуйте в Інтернеті!
ETHproductions

@ETHproductions Спасибі, я все ще пропускаю аргументи за замовчуванням раз у раз. Дуже зручно, спасибі велике.
Ніт

1

Пітон - 54

На основі відключення алгоритму з посилання, наведеного в виклику:

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

Безголівки:

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

Amateur PowerShell'r повернувся з черговою спробою golF! Сподіваюся, ви не заперечуєте! Принаймні, ці питання цікаві та досвід навчання. Припускаючи, що введено n, ми маємо:

$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

Оскільки PowerShell, з яким я працюю, становить лише 2.0, я не можу використовувати командлети, що змінюють біт, які можуть створювати коротший код. Тому я скористався іншим методом, описаним у джерелі запитань , гортаючи масив та додаючи його до себе, додавши 0 до передньої частини верхньої половини та 1 до нижньої половини.


1

F # (86) (84) (80)

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

Це, можливо, може бути вдосконалено далі.

Також зауважте, що якщо працювати в FSI, вам потрібно open System;;спочатку. Якщо ви хочете уникнути імпорту цього (і якщо вам не байдуже порядок друку значень), ви можете використовувати цю версію з 82 символами:

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

1

Рубін - 42 39

Той самий алгоритм, інша мова:

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

Перехід від #mapдо #timesяк слід @voidpigeon зберігає 3 -х символів.


1
Замість [*0...2**n].mapвас можна використовувати (2**n).times.
невдалий


1

MATL , 10 байт

W:qt2/kZ~B

Спробуйте в Інтернеті!

Старий добрий метод "XOR n з n >> 2".

W- обчислити 2 ^ (введення) (отримує введення неявно)
:q- створити діапазон чисел від 0 до 2 ^ n - 1
t - дублювати цей діапазон
2/k- MATL не має бітшвидкісного зсуву, тому ділимо (кожне число) на 2 і підлогу
Z~ - елементарно XOR що призводить до вихідного масиву від 0 до 2 ^ n - 1
B - конвертуйте кожне число результату у бінарне
(невідповідно відображення виводу.)


1

K (нг / к) , 25 байт

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

Спробуйте в Інтернеті!


  • |:\x"зворотне сканування x". застосовується зворотне значення до x, поки вихід не дорівнює входу, і не відобразиться кожна ітерація. повертає (0 1; 1 0) при першому проході.
  • 0 1,''є "0 1 приєднуйтесь до кожного". приєднує 0 до кожного значення 1-го елема і 1 до кожного значення 2-го елема, даючи ((0 0; 0 1); (1 1; 1 0)) при першому проходженні
  • ,/ є "приєднатися" та сплющується до списку.
  • (x-1){...}/0 1є "застосувати {func} більше 0 1x-1 рази". приймає висновок останньої ітерації як вхідний

0

APL (22)

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

Це виводить матрицю n-by-2 ^ 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

Пояснення:

  • {... }⍣(n-1)⍪0 1: запустити функціюn-1 із початкового введення матриці (0 1)T(що є 1-бітним сірим кодом)

    • (0,⍵): кожен ряд із 0префіксом,
    • : на вершині,
    • 1,⊖⍵: кожен рядок із 1префіксом у зворотному порядку

0

Jq 1,5 , 105 100 байт

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

Припускає, що N забезпечує введення. напр

def N: 3 ;

Розширено

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

Спробуйте в Інтернеті!



-1

T-SQL 134

Цей виклик просить повернути декартову силу {(0), (1)}. Цей фрагмент будує код, який виконуватиме декартовий продукт {(0), (1)} 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)

Він просить декартової влади у визначеному порядку. Чи враховує це ваш код?
ToonAlfrink
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.