O Gray Code é uma sequência de números binários de largura de bits em n
que números sucessivos diferem apenas em um bit (veja exemplo de saída).
Exemplo de entrada:
3
Exemplo de saída:
000
001
011
010
110
111
101
100
Notas:
- Esta questão parece ter um engano, mas não é, pois essa pergunta não é um código-golfe e exige uma saída diferente. No entanto, ajudará a verificar as respostas.
- Você pode assumir uma variável
n
que contém a entrada.
Respostas:
JavaScript (77)
Versão mais amigável ao navegador (console.log e prompt ()):
fonte
for(i=0;i<(l=1<<n);i++)console.log((i^(i>>1)|l).toString(2).slice(1));
Python 2 (47)
A expressão
i/2^i
para oi
número do código de cinza é da resposta a esta . Para adicionar zeros à esquerda que preenchem o comprimenton
, adiciono2**n
antes de converter em uma sequência binária, criando uma sequência de comprimenton+1
. Em seguida, trunco o prefixo inicial1
e do tipo de número0b
com[3:]
.fonte
K (ngn / k) , 10 bytes
Experimente online!
fonte
!
me pegou de surpresa. muito legal !APL (Dyalog Classic) , 11 bytes
Experimente online!
n⍴2
is2 2...2
- um vetor den
dois⍳
são os índices de uman
matriz tridimensional com forma2 2...2
- ou seja, uma matriz 2 × 2 × ... × 2 de vetores aninhados. Como usamos 0-indexing (⎕IO←0
), esses são todos vetores binários de comprimenton
.,
achatar a 2 × 2 × ... × 2 forma, então temos um vector de 2 n aninhados vetores binários↑
"mix" - converte o vetor de vetores em uma matriz sólida 2 n × n. Se parece com isso:0,
precede zeros à esquerda da matriz2≠/
calcula o par (2
) xor (≠
) ao longo da última dimensão (/
em oposição a⌿
); em outras palavras, todo elemento é xorodado com seu vizinho direito e a última coluna desaparecefonte
Japonês ,
1412 bytesRaspou dois bytes graças a ETHproductions .
Experimente online!
fonte
ù
é usado. ComoN.z(n)
é a divisão inteira com o padrão arg = 2, você pode salvar dois bytes com2pU Ç^z)¤ùTU
: Experimente online!Python - 54
Baseado em um algoritmo a partir da referência fornecida no desafio:
Ungolfed:
fonte
PowerShell (168)
O PowerShell amador volta com mais uma tentativa de golF! Espero que você não se importe! No mínimo, essas perguntas são divertidas e uma experiência de aprendizado para começar. Assumindo que n foi inserido, temos:
Como o PowerShell com o qual estou trabalhando é de apenas 2,0, não posso usar nenhum cmdlets de mudança de bits que possam resultar em códigos mais curtos. Então, aproveitei um método diferente descrito na fonte da pergunta , invertendo o array e adicionando-o a ele mesmo, acrescentando um 0 na frente da metade superior e um 1 na metade inferior.
fonte
F #
(86)(84)(80)Provavelmente isso poderia ser melhorado ainda mais.
Observe também que, se for executado no FSI, você precisará
open System;;
primeiro. Se você deseja evitar a importação, (e se não se importa com a ordem em que os valores são impressos), pode usar esta versão de 82 caracteres:fonte
Ruby -
4239Mesmo algoritmo, idioma diferente:
Mudar de
#map
para#times
como sugere @voidpigeon salva 3 caracteres.fonte
[*0...2**n].map
você pode usar(2**n).times
.J, 24 bytes
Experimente online!
Implementação direta do algoritmo "XOR com sua própria metade do piso". Observe que
22 b.
é XOR.fonte
MATL , 10 bytes
Experimente online!
O bom e velho método "XOR n com n >> 2".
W
- calcular 2 ^ (entrada) (obtém entrada implicitamente):q
- criar intervalo de números de 0 a 2 ^ n - 1t
- duplicar esse intervalo2/k
- MATL não possui deslocamento de bits, portanto divida (cada número) por 2 e pisoZ~
- XOR elementwise esse resultado com a matriz original de 0 a 2 ^ n - 1B
- converta cada número no resultado em binário(exibir implicitamente a saída).
fonte
K (ngn / k) , 25 bytes
Experimente online!
|:\x
é "varredura reversa x". aplica reverso para x até que a saída seja igual à entrada e mostra cada iteração. retorna (0 1; 1 0) na primeira passagem.0 1,''
é "0 1 junte cada um". junta um 0 a cada valor do 1º elem e 1 a cada valor do 2º elem, dando ((0 0; 0 1); (1 1; 1 0)) na primeira passagem,/
é "junte-se" e nivela a lista.(x-1){...}/0 1
é "aplicar {func} mais de0 1
x-1 vezes". toma a saída da última iteração como entradafonte
APL (22)
Isso gera uma matriz n-por-2 ^ n contendo os bits como suas linhas:
Explicação:
{
...}⍣(n-1)⍪0 1
: executa osn-1
tempos de função com a entrada inicial da matriz(0 1)T
(que é o código cinza de 1 bit)(0,⍵)
: cada linha⍵
com um0
prefixo,⍪
: Em cima de,1,⊖⍵
: cada linha⍵
com um1
prefixo, em ordem inversafonte
Jq 1.5 ,
105100 bytesAssume que N fornece entrada. por exemplo
Expandido
Experimente online!
fonte
Japonês , 10 bytes
Experimente online!
fonte
T-SQL 134
Esse desafio está pedindo o retorno do poder cartesiano de {(0), (1)}. Esse trecho cria o código que executaria o produto cartesiano de {(0), (1)} n vezes.
fonte