Bem-vindo ao moedor.
Sua tarefa é transformar pedras grandes em pedras pequenas, moendo-as.
Pegue uma entrada de uma pedra grande n > 3
e triture-a.
Continue a triturar as pedras, despejando-as no moedor até o tamanho de todas as rochas 2
.
pedras são sempre trituradas em partes iguais iguais. Se o resultado de uma retificação for ímpar, obtenha o resultado - 1.
Imprima a saída de cada retificação à medida que avança.
Exemplos
entrada: 5
saída: 22
O resultado são duas pedras do tamanho 2
entrada: 50
saída:
2424 //two rocks of size 24
12121212 //four rocks of size 12
66666666 //8 rocks of size 6
2222222222222222
o resultado são 16 pedras de tamanho 2
entrada: 30
saída:
1414
6666
22222222
o resultado são 8 pedras de tamanho 2
Isso é código-golfe, então o código mais curto vence! Divirta-se e boa sorte!
code-golf
math
arithmetic
jacksonecac
fonte
fonte
Respostas:
TSQL,
6159 bytesExperimente
fonte
VACA,
297291 bytesExperimente online!
O código imprime cada número em sua própria linha e separa as iterações com uma nova linha adicional. Ele também imprime a primeira iteração por si só, seguida por uma nova linha. Portanto, uma entrada 5 daria uma saída parecida,
5 2 2
exceto com novas linhas em vez de espaços. A saída de amostra para50
é fornecida abaixo.Árvore de explicação:
Saída de amostra para a entrada 50:
fonte
05AB1E ,
1211 bytesExperimente online!
Explicação
fonte
Python 2,
5553 bytesDivida por 4 e shift à esquerda por 1 para obter a divisão especial
fonte
Haskell,
75 71 60 5047 bytesExperimente online! Editar: Como a saída agora pode ser uma lista incluindo a entrada,
1013 bytes podem ser salvos.Uso:
Versão original de 60 bytes:
Experimente online! Agradecemos a Christian Sievers por apontar a fórmula mais curta.
Uso:
fonte
z<-2*div n 4
.JavaScript (ES6)
645957 bytesfonte
f=
, mas é apenas para a demoPython 2,
4847 bytesfonte
s=s/4*2
funcionará para salvar 1 byte.Java, 85 bytes
Testando e não-destruído
Nota: Não sei por que, o Ideone continua apresentando erros internos, portanto, testar é um problema. Para testar, basta copiar / colar e executar no seu Java IDE padrão. (Funciona lá, eu tenho certeza disso;))
fonte
n=n/4*2
truque. :)C #,
888683 bytesEconomizou 3 bytes graças ao Skorm
Salvo outro byte, alterando o
while
para umfor
loop que inclui declarações de variáveisGuardado 1 bytes graças a Yodle
Função anônima que retorna uma string composta pelo resultado de cada retificação.
Programa completo com método não destruído e casos de teste [antes da última edição!]:
fonte
for(i=0;i++<c;)
for (i = 0; i++ < c;)
n=>{var r="";for(int i,c=2;n>2;c*=2,r+="\n")for(i=0,n=n/4*2;i++<c;)r+=n;return r;}
CJam , 21 bytes
Experimente online! (Como uma suíte de teste.)
Explicação
fonte
Pitão,
181613 bytes*
\n
é uma nova linhaExplicação:
Experimente aqui
fonte
MATL , 13 bytes
Experimente online!
fonte
PHP,
726764 bytesRecebe argumento da linha de comando. Corra com
-r
.fonte
Geléia ,
13 1211 bytesTryItOnline!
Nota: o OP afirmou que a entrada também pode estar na saída.
Quão?
Versão sem a entrada exibida para 12 bytes:
:4Ḥḟ0x2µÐĿḊG
fonte
Perl,
403530 + 1 = 31 bytesCorra com a
-n
bandeira-4 bytes graças a @Dada
Experimente online!
O Perl lê automaticamente a entrada na variável
$_
quando-n
está definido.$.
é uma variável especial definida1
no início do programa pelo intérprete, para que eu possa usá-la como base para duplicação. A cada iteração dowhile
loop, ele muda$_
um pouco e executa um AND lógico contra o negativo de si mesmo menos um para cancelar os bits.fonte
perl -nE 'say$_ x($.*=2)while$_=$_>>1&~1'
(talvez isso possa ser jogado ainda mais, eu não gastei muito tempo nele).PowerShell 3 ou mais,
5854 bytesObrigado TimmyD por me salvar 4 bytes!
Ligeiramente não destruído (formatação)
Explicação
Estou usando a mesma divisão por 4, multiplique por 2, como muitas outras respostas, mas tive um problema. O PowerShell converte números em ponto flutuante, se necessário, durante a divisão e, para o golfe, isso é irritante porque
$v/4*2
se torna algo desagradável[int]($v/4)*2
. Eu contornei isso usando o deslocamento de bits para a divisão-shr
.Para calcular quantas vezes para imprimir uma iteração, basta usar o
(2^$i)-1
que funciona bem e tem o efeito adicional de deixar de fora o valor de entrada. Tentar apenas multiplicar por 2 era problemático, porque começar de 0 dificulta o aumento do valor com just$i*=2
e começar de 1 requer muita correção para acertar o número.Como o PowerShell não tem um operador para isso, e eu queria evitar
[Math]::Pow()
, contei com o deslocamento de bits novamente para meus poderes de 2.fonte
Python 2, 47 bytes
Como o OP disse que uma matriz 1D que incluía a entrada era boa, criei essa função recursiva, que infelizmente só se relaciona com o atual vencedor do Python.
fonte
f=lambda r,n=1:[r]*n+(r>3and f(r/4*2,n*2)or[])
para 46Perl, 47 bytes
Não há opções de linha de comando, desta vez (excepcionalmente para Perl). A idéia básica é que, como todas as rochas em uma determinada etapa são do mesmo tamanho, apenas registramos o tamanho (pol
$a
) e o número (pol$_
), em vez de gravar a lista inteira. Não consegui encontrar uma maneira de me livrar do espaço (ou+
) depoissay
; você pode mover o2*
mas não será analisado corretamente se for seguido por um parêntese de abertura.Não posso deixar de abalar a sensação de que isso é improvável, mas não vejo como.
fonte
die
claramente parece sub-ideal. Mas ainda precisamos de uma maneira de verificar se temos de parar ou não -> a solução é usar um tempo em vez dofor
:while$a>1
. Mas precisamos encontrar um substituto para$_
: qualquer variável unitializada pode fazê-lo: substituir1<<$_
por1<<++$x
. Portanto, agora que$_
é livre para ser usado, podemos usar-n
e substituir every$a
por a$_
, e a primeira instrução se torna$_>>=1
. Desde que temos-n
,$.
está definido, para que possamos substituir1<<++$l
por$.*=2
.perl -nE '$_>>=1;say 2*($_>>=1)x($.*=2)while$_>1'
(39 bytes). Então observe que isso$_>>=1
é feito duas vezes, para que possamos tentar nos livrar de um (o primeiro). Tentando me livrar disso, conseguisay$_ x($.*=2)while($_>>=1)/2>1
(coloquei os dois dentro dawhile
condição). Mas o resultado está errado ($_
pode ser estranho) e, tentando garantir que seja uniforme, acabo com issowhile$_=$_>>1&~1
. Então, o código é agorasay$_ x($.*=2)while($_=$_>>1&~1)
.Vim
6154 bytesTryItOnline!
Não imprimíveis:
Felizmente, o vim trunca automaticamente em x / 2.
fonte
JavaScript,
71635958 bytesBem, eu vim com esta solução javascript. Totalmente novo no golfe, mas eu sou um desafio divertido
Economizou 4 bytes graças à sugestão de Titus usando um loop for.
base não destruída:
Versão Golfed
Estou aberto a sugestões de como melhorá-lo / aprender golfe
testador de entrada
Mostrar snippet de código
fonte
for
loop:for(o=i=30;i>2;console.log(...)){...}
. E, combinando as duas atribuições de retificação em uma, é possível remover as chaves:i=i/4<<1;
(-5). Não tenho certeza sei=i/4*2;
fará o mesmo.BASH, 81 bytes
fonte
Swift, 84 bytes
Ungolfed
fonte
Befunge, 45 bytes
Experimente online!
Explicação
fonte
Javascript, 106 bytes
Primeiro código de golfe, pensei em tentar. (Não é muito bom).
Desminificado:
fonte