Introdução (pode ser ignorado)
Colocar todos os números positivos em sua ordem regular (1, 2, 3, ...) é um pouco chato, não é? Então, aqui está uma série de desafios em torno de permutações (reorganizações) de todos os números positivos. Este é o segundo desafio desta série. O primeiro desafio pode ser encontrado aqui .
Neste desafio, usamos os códigos Gray para reorganizar os números naturais. Um código Gray ou "código binário refletido" é uma codificação binária de tal maneira que dois valores sucessivos diferem em apenas um bit. Uma aplicação prática dessa codificação é usá-la em codificadores rotativos , daí a minha referência a "Turn My Way" .
Observe que essa codificação deixa algum grau de liberdade. Por exemplo, após o binário 1100, existem quatro códigos possíveis: 1101, 1110, 1000 e 0100. É por isso que definirei como o menor valor não usado anteriormente que difere apenas um caractere na codificação binária. Esta sequência corresponde a A163252 .
Como esse é um desafio de "sequência pura", a tarefa é gerar para um dado como entrada, onde é A163252 .
Tarefa
Dada uma entrada inteira , produza no formato inteiro ( não no formato binário).
é definido como o número inteiro menos positivo que não ocorre anteriormente na sequência, de modo que e diferem em apenas um bit quando escritos em binário.
Nota: a indexação baseada em 1 é assumida aqui; você pode usar a indexação baseada em 0; portanto, , etc. Por favor mencione isso na sua resposta se você optar por usá-lo.
Casos de teste
Input | Output
--------------
1 | 1
5 | 4
20 | 18
50 | 48
123 | 121
1234 | 1333
3000 | 3030
9999 | 9997
Regras
- Entrada e saída são números inteiros (seu programa deve, pelo menos, suportar entrada e saída no intervalo de 1 a 32767)
- Entrada inválida (0, valores flutuantes, seqüências de caracteres, valores negativos etc.) pode levar a resultados imprevisíveis, erros ou comportamento (não) definido. No A163252 , é definido como 0. Para esse desafio, ignoraremos isso.
- Padrão Aplicam- se as regras de E / S .
- As brechas padrão são proibidas.
- Isso é código-golfe , então as respostas mais curtas em bytes ganham
Nota final
Consulte as seguintes perguntas relacionadas (mas não iguais) a PP&CG:
JavaScript (ES6), 65 bytes
1 indexado.
Experimente online!
Comentado
fonte
Geléia ,
2620 bytesExperimente online!
Um programa completo que aceita n como argumento único. Funciona para todos os casos de teste. Observe também que, embora não seja obrigatório, ele lida com n = 0.
Explicação
Link auxiliar: encontre o próximo termo e adicione-o
Link principal
fonte
Java (JDK) ,
14213812412313213098 bytesExperimente online!
fonte
import java.util.*;
+Set s=new HashSet();
paravar s=new java.util.HashSet();
. Além disso, o resto pode ser golfed a:Integer i=0,j,k=0;for(;i++<n;s.add(k=j))for(j=0;s.contains(++j)|i.bitCount(j^k)>1;);return k;
. Boa resposta, no entanto, então +1 de mim. :)Stack
vez deHashSet
. Muito mais lento, mas funciona!Python 2 , 81 bytes
Indexação baseada em 1
Experimente online!
Python 2 , 79 bytes
Isso leva muito tempo (o 9999 não foi concluído após a execução local por 7 minutos)
Experimente online!
fonte
Wolfram Language (Mathematica) , 74 bytes
Experimente online!
fonte
APL (Dyalog Extended) , 46 bytes
Experimente online!
fonte
Carvão vegetal , 65 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Inicialize o resultado para 0.
n
Tempos de loop .Salve o resultado anterior para não usá-lo novamente.
Encontre o bit mais alto no resultado anterior.
Enquanto esse bit for maior que 1, se o bit estiver definido no resultado anterior, tente subtrair esse bit para ver se o resultado é um resultado invisível. Isso garante que os resultados potenciais sejam tentados em ordem crescente de valor.
Agora tente XORing esse bit com o resultado anterior, dobrando o bit até encontrar um resultado invisível. Isso lida com os casos em que um bit precisa ser definido, novamente em ordem crescente de valor, mas também o caso em que o bit menos significativo precisa ser alternado, que o loop anterior não se preocupa em testar (porque é mais experiente em testar isso aqui). Se o loop anterior encontrou um resultado invisível, ele nunca será executado; caso contrário, esse loop testará inutilmente esses resultados.
Atualize o resultado, na verdade, XORing the bit with it.
Saída do resultado final no final do loop.
fonte
05AB1E ,
212018 bytesBastante ineficiente, portanto, quanto maior a entrada, mais tempo leva para obter o resultado. Funciona para entrada
0
Também , no entanto.Experimente online ou verifique o primeiron termos .
Explicação:
fonte
Haskell , 101 bytes
Experimente online!
Parece uma pena incorrer em uma importação apenas por
xor
, mas ainda não encontrei uma boa solução alternativa. Também me pergunto se existe uma maneira melhor de expressar o loop.fonte
R , 90 bytes
Experimente online!
fonte