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


11

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

Ссылка

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

3

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

000
001
011
010
110
111
101
100

Заметки:

  • Этот вопрос, кажется, имеет дурацкий характер, но это не так, поскольку этот вопрос не относится к коду-гольфу и требует другого выхода. Это поможет проверить его ответы, хотя.
  • Вы можете принять переменную, nкоторая содержит входные данные.

6
Учитывая, что другой вопрос является проблемой кода с быстрым кодом без объективного критерия выигрыша (наиболее быстро измеряемым как?), Я предлагаю закрыть другой и снова открыть этот.
Деннис

2
Я согласен с @dennis и поэтому проголосовал за следующий непопулярный ответ на оригинальный вопрос. «Если ответ, который вы ищете, является исключительно быстрым результатом, то если вы объявляете массив (из серых кодов) ...» Однако оригинальный вопросный вопрос имеет 7-символьный и 4-символьный ответ, поэтому я не не вижу много возможностей для улучшения. Поэтому в настоящее время я не голосую повторно.
Уровень Река St


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

Ответы:


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



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)

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 к нижней половине.


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.
afuous


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

К (нгн / к) , 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

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



-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.