Серый код - это последовательность двоичных чисел с n
битовой шириной, где последовательные числа отличаются только одним битом (см. Пример выходных данных).
Пример ввода:
3
Пример вывода:
000
001
011
010
110
111
101
100
Заметки:
- Этот вопрос, кажется, имеет дурацкий характер, но это не так, поскольку этот вопрос не относится к коду-гольфу и требует другого выхода. Это поможет проверить его ответы, хотя.
- Вы можете принять переменную,
n
которая содержит входные данные.
Ответы:
JavaScript (77)
Более удобная для браузера версия (console.log и prompt ()):
источник
for(i=0;i<(l=1<<n);i++)console.log((i^(i>>1)|l).toString(2).slice(1));
Python 2 (47)
Выражение
i/2^i
дляi
серого номера кода из этого ответа . Чтобы добавить ведущие нули, которые дополняют длинуn
, я добавляю2**n
перед преобразованием в двоичную строку, создавая строку длиныn+1
. Затем я усекаю1
префикс ведущего и числового типа0b
с помощью[3:]
.источник
K (нгн / к) , 10 байтов
Попробуйте онлайн!
источник
!
застала меня врасплох. очень круто !APL (Dyalog Classic) , 11 байт
Попробуйте онлайн!
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,
добавляет нули слева от матрицы2≠/
вычисляет pairwise (2
) xor (≠
) по последнему измерению (/
в отличие от⌿
); другими словами, каждый элемент получает xor-ed со своим правым соседом, а последний столбец исчезаетисточник
Japt ,
1412 байтСрезал два байта благодаря ETHproductions .
Попробуйте онлайн!
источник
ù
используется. ПосколькуN.z(n)
целочисленное деление со значением по умолчанию arg = 2, вы можете сохранить два байта с помощью2pU Ç^z)¤ùTU
: Попробуйте онлайн!Python - 54
Исходя из алгоритма из ссылки, указанной в задании:
Ungolfed:
источник
PowerShell (168)
Любитель PowerShell'r вернулся с очередной попыткой игры в гольф! Надеюсь, ты не возражаешь! По крайней мере, эти вопросы интересны, и опыт обучения для загрузки. Предполагая, что n было введено, мы имеем:
Поскольку PowerShell, с которым я работаю, - только 2.0, я не могу использовать какие-либо командлеты с переключением битов, которые могли бы сделать для более короткого кода. Поэтому я воспользовался другим методом, описанным в источнике вопроса , перевернув массив и добавив его к себе, добавив 0 к передней части верхней половины и 1 к нижней половине.
источник
F #
(86)(84)(80)Это может быть улучшено в дальнейшем.
Также обратите внимание, что если вы запустите в FSI, вам нужно будет
open System;;
сначала. Если вы не хотите импортировать это (и если вас не волнует порядок печати значений), вы можете использовать эту версию из 82 символов:источник
Рубин -
4239Тот же алгоритм, другой язык:
Переход от
#map
к#times
как следует @voidpigeon сохраняет 3 -х символов.источник
[*0...2**n].map
тебя можно использовать(2**n).times
.J, 24 байта
Попробуйте онлайн!
Простая реализация алгоритма «XOR со своей половиной». Обратите внимание, что
22 b.
это XOR.источник
MATL , 10 байт
Попробуйте онлайн!
Старый добрый метод "XOR n с n >> 2".
W
- вычислить 2 ^ (ввод) (получает ввод неявно):q
- создать диапазон чисел от 0 до 2 ^ n - 1t
- продублировать этот диапазон2/k
- MATL не имеет сдвига битов, поэтому разделите (каждое число) на 2 и полZ~
- поэлементно XOR этот результат с исходным массивом от 0 до 2 ^ n - 1B
- преобразовать каждое число в результате в двоичный файл(неявно отображать вывод.)
источник
К (нгн / к) , 25 байтов
Попробуйте онлайн!
|:\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 раз". принимает выходные данные последней итерации в качестве входных данныхисточник
APL (22)
Это выводит матрицу n-на-2 ^ n, содержащую биты в качестве строк:
Объяснение:
{
...}⍣(n-1)⍪0 1
: запустить функциюn-1
раз с начальным вводом матрицы(0 1)T
(1-битный серый код)(0,⍵)
: каждый ряд⍵
с0
префиксом,⍪
: на вершине,1,⊖⍵
: каждый ряд⍵
с1
префиксом, в обратном порядкеисточник
Jq 1,5 ,
105100 байтПредполагается, что N обеспечивает ввод. например
расширенный
Попробуйте онлайн!
источник
Japt , 10 байт
Попробуйте онлайн!
источник
T-SQL 134
Эта задача просит вернуть декартову силу {(0), (1)}. Этот фрагмент создает код, который будет выполнять декартово произведение {(0), (1)} n раз.
источник