Дайте мне список кодов Грея битовой ширины n

11

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

Ссылка

Пример ввода:

3

Пример вывода:

000
001
011
010
110
111
101
100

Заметки:

  • Этот вопрос, кажется, имеет дурацкий характер, но это не так, поскольку этот вопрос не относится к коду-гольфу и требует другого выхода. Это поможет проверить его ответы, хотя.
  • Вы можете принять переменную, nкоторая содержит входные данные.
ToonAlfrink
источник
6
Учитывая, что другой вопрос является проблемой кода с быстрым кодом без объективного критерия выигрыша (наиболее быстро измеряемым как?), Я предлагаю закрыть другой и снова открыть этот.
Деннис
2
Я согласен с @dennis и поэтому проголосовал за следующий непопулярный ответ на оригинальный вопрос. «Если ответ, который вы ищете, является исключительно быстрым результатом, то если вы объявляете массив (из серых кодов) ...» Однако оригинальный вопросный вопрос имеет 7-символьный и 4-символьный ответ, поэтому я не не вижу много возможностей для улучшения. Поэтому в настоящее время я не голосую повторно.
Уровень Река St
3
Это ужасно похоже на Обход всех чисел только с одним переворотом за шаг, хотя ...
Деннис
Самый ранний вопрос кода Грея не очень хорош, но у него уже есть ответы, которые в основном совпадают с ответами, которые нужны этому вопросу, и которые вряд ли будут улучшены. Я думаю, что было бы больше смысла оставить этот закрытый и заменить другой на кодовый гольф.
Питер Тейлор

Ответы:

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

Python 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:].

XNOR
источник
2

APL (Dyalog Classic) , 11 байт

2≠/0,↑,⍳n2

Попробуйте онлайн!

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

это индексы n-мерного массива с формой, 2 2...2то есть массив вложенных векторов размером 2 × 2 × ... × 2. Поскольку мы используем 0-indexing ( ⎕IO←0), это все двоичные векторы длины n.

,выровнять форму 2 × 2 × ... × 2, чтобы мы получили вектор из 2 n вложенных двоичных векторов

«mix» - преобразовать вектор векторов в сплошную матрицу 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≠/вычисляет pairwise ( 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
@Джона, конечно, добавил
нгн
очень умно, спасибо
Иона
2

Japt , 14 12 байт

2pU Ç^z)¤ùTU

Срезал два байта благодаря ETHproductions .

Попробуйте онлайн!

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

Python - 54

Исходя из алгоритма из ссылки, указанной в задании:

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)
BeetDemGuise
источник
1

PowerShell (168)

Любитель PowerShell'r вернулся с очередной попыткой игры в гольф! Надеюсь, ты не возражаешь! По крайней мере, эти вопросы интересны, и опыт обучения для загрузки. Предполагая, что 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 к нижней половине.

fuandon
источник
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""
PSWG
источник
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.
afuous
1

J, 24 байта

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

Попробуйте онлайн!

Простая реализация алгоритма «XOR со своей половиной». Обратите внимание, что 22 b.это XOR.

Ион
источник
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 - преобразовать каждое число в результате в двоичный файл
(неявно отображать вывод.)

sundar - Восстановить Монику
источник
1

К (нгн / к) , 25 байтов

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

Попробуйте онлайн!


  • |:\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 1х-1 раз". принимает выходные данные последней итерации в качестве входных данных
каракули
источник
0

APL (22)

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

Это выводит матрицу n-на-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

Попробуйте онлайн!

jq170727
источник
-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)
comfortablydrei
источник
Он запрашивает декартову мощность в определенном порядке. Ваш кодовый счет для этого?
ToonAlfrink