Considere o seguinte processo:
Pegue um número inteiro não negativo N.
por exemplo, N =
571
Expresse-o em binário sem zeros à esquerda. (Zero em si é a única exceção, tornar-se
0
.)por exemplo
571
=1000111011
em binárioDivida execuções consecutivas de uns e zeros nessa representação binária.
por exemplo
1000111011
→1
,000
,111
,0
,11
Classifique as execuções do maior para o menor.
por exemplo
1
,000
,111
,0
,11
→000
,111
,11
,1
,0
Sobrescreva todos os dígitos em cada execução com
1
's e0
' alternados , sempre começando com1
's.por exemplo
000
,111
,11
,1
,0
→111
,000
,11
,0
,1
Concatene o resultado para obter um novo número binário.
por exemplo
111
,000
,11
,0
,1
→1110001101
=909
em decimal
Ao plotar os valores produzidos por esse processo, você obtém um gráfico bem organizado:
E espero que fique claro por que estou chamando a sequência resultante de Temple Skyline :
Desafio
Escreva um programa ou função que receba um número inteiro não negativo N e imprima ou retorne o número de sequência correspondente do Skyline do Templo. Sua entrada e saída devem estar em decimal.
Por exemplo, se a entrada é 571
a saída deve ser 909
.
O código mais curto em bytes vence.
Para referência, aqui estão os termos na sequência de N = 0 a 20:
0 1
1 1
2 2
3 3
4 6
5 5
6 6
7 7
8 14
9 13
10 10
11 13
12 12
13 13
14 14
15 15
16 30
17 29
18 26
19 25
20 26
.BQ
vez dejQ2
, o que significa que pode perder o espaço entre o8
e o anterior2
.is*R`s=!Z_ShMr.BQ8 2
é uma solução interessante para o mesmo comprimento. Principalmente postando porque eu realmente não esperava que a atribuição em um argumento de mapa funcionasse.`s
por]
. Salva um byte.Python 2, 121 bytes
125121: Agradecimentos ao Sp3000 por remover 4 bytes!
125
fonte
n*`~i%2`for
vez de"10"[i%2]*n for
sorted(...,key=len)
vez de usar,map(len,...
mas eu não compreendo completamente o seu programa agora, então não tenho certeza de que isso os beneficiaria.len
porque essa é a única informação que preciso para replicar a quantidade de 1 e 0. Tentei sua sugestão e ela adiciona 2 bytes, pois terei que usarlen
duas vezes, mas obrigado pela sugestão!JavaScript ES6, 110 bytes
113116119120Guardado 3 bytes graças a @intrepidcoder
Guardado 3 bytes graças a @NinjaBearMonkey
Abordagem direta. Não gosto da duração da função de classificação, mas não consigo pensar em uma maneira de jogar golfe.
fonte
+
vez deeval
.split(/(0+)/g)
deve ser capaz de substituirmatch(/(.)\1*/g)
.+(s=0, ... .map(l=>l.replace(/./g,s^=1))...)
C ++,
535527 bytes(obrigado zereges por remover alguns bytes.)
Agora que nos livramos desses bytes, o programa agora é competitivo;)
Eu sou novo no golfe, por favor, me dê algumas dicas nos comentários .
Coisas como "você não precisa desses colchetes" ou "use printf" são úteis, mas também aprecio conselhos sobre a lógica. Desde já, obrigado!
Para facilitar a leitura, apresento a versão não destruída:
A versão EDIT golfed reduziu alguns bytes, a versão ungolfed inalterada
fonte
int a; int b;
usarint a,b;
. Também variáveis no escopo global são inicializadas com0
. Além disso, você não precisa usar colchetes quando houver apenas um comando a ser executado. Tambémones=!ones;
pode ser simplificado comoones ^= 1;
for
loop por1
, ou seja,for(int i=D;i;i--)
e use-opow(2,i-1)
dentro do loop.ones
também pode serint
. Talvez macroingint(pow(i))
emP(i)
. Eu recomendo que você leia a discussão aquiHaskell,
132131 bytesExemplo de uso:
Como funciona:
fonte
J - 30 bytes
Função tendo inteiro à direita. Lida corretamente com 0.
#:
- Pegue a representação binária.1,2~:/\]
- Entre cada dígito, relate True se forem diferentes. Anexe um True para que a lista tenha True no início de cada "execução".(#;.1~...)
- Usando o vetor booleano acima, calcule a duração de cada execução.\:~
- Classifique esses comprimentos do maior para o menor.2|#\
- Faça uma lista de alternâncias1 0 1 0 ...
, contanto que a lista de comprimentos.(...#...)
- Para cada número à esquerda (comprimentos classificados), use o item correspondente à direita (alternando 1 e 0)&.
- Converta essa nova representação binária de volta em um número.Exemplos:
fonte
Perl 5.10,
121101Eu acho que a parte de classificação pode ser mais curta.
Edit: -20 bytes, graças ao symbabque!
fonte
\n
em
não é necessário para a correspondência de expressões regulares. Na sua substituição, basta usar em.
vez do grupo de caracteres.grep
peça. O queoct
é arrumado :)Python 3,
146136 bytesfonte
map
com umlambda
, seria melhor fazer''.join(... for ... in ...)
?Mathematica, 83 bytes
Isso define uma função sem nome.
fonte
Ruby,
107104102 bytes(salvou 3 bytes graças a nimi )
Não vou vencer os gostos de CJam, mas eu tenho um tamanho pequeno para uma linguagem sã.
fonte
(i+=1)%2
éi=1-i
.Java 8,
179176 bytesEu usei duas importações estáticas:
java.util.Integer.highestOneBit
ejava.util.Arrays.sort
.Para facilitar a leitura, aqui está o código não-bloqueado:
fonte
Python 2, 170 bytes
fonte
t(0) = 0
quando1
é esperado et(4) = 1
quando é esperado 6