Dado um número inteiro n , decompor-se-a em uma soma de números triangulares máxima (onde T m representa o m th número triangular, ou a soma dos números inteiros de 1 a m ) como se segue:
enquanto n> 0 ,
Encontre o maior número triangular possível T m de modo que T m ≤ n .
anexa m à representação de decomposição triangular de n .
subtrair T m de n .
Por exemplo, uma entrada de 44 produziria uma saída de 8311 , porque:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36 <44, mas 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45> 44.
- o primeiro dígito é 8 ; subtraia 36 de 44 para sobrar 8 .
1 + 2 + 3 = 6 <8, mas 1 + 2 + 3 + 4 = 10> 8.
- o segundo dígito é 3 ; subtraia 6 de 8 para sobrar 2 .
1 <2, mas 1 + 2 = 3> 2.
- o terceiro e o quarto dígitos devem ser 1 e 1 .
Use os dígitos de 1 a 9 para representar os 9 primeiros números triangulares e, em seguida, use as letras de a a z (podem ser maiúsculas ou minúsculas) para representar o 10º a 35º número triangular. Você nunca receberá uma entrada que exigirá o uso de um "dígito" maior.
Os limites na entrada são 1 ≤ n <666 e sempre será um número inteiro.
Todas as entradas e saídas possíveis e alguns casos de teste selecionados (listados como entrada e saída):
1 1
2 11
3 2
4 21
5 211
6 3
100 d32
230 k5211
435 t
665 z731
Uma saída de ∞ para uma entrada de -1/12 não é necessária. :)
Respostas:
JavaScript (ES6), 52 bytes
Quão?
Em vez de computação explicitamente T i = 1 + 2 + 3 + ... + i , que começam com t = 0 e iterativamente subtraia t + 1 a partir de N , enquanto t <n , incrementando t em cada iteração. Quando a condição não é mais atendida, um total de T t foi subtraído de n e a saída é atualizada de acordo. Repetimos o processo até n = 0 .
Abaixo está um resumo de todas as operações para n = 100 .
Casos de teste
Mostrar snippet de código
fonte
Geléia ,
1817 bytesEste é um link monádico que imprime no STDOUT. Seu valor de retorno é 0 e deve ser ignorado.
Experimente online!
fonte
dc, 74 bytes
Isso é horrível.
fonte
JavaScript (ES6),
6157 bytesGuardado 4 bytes graças a @Arnauld
fonte
f=(n,t=0)=>n?t+1>n?t.toString(36)+f(n):f(n-++t,t):1
f=(n,p=q=0)
ef(n,++q+p)
?Java 7, 81 bytes
Porta da incrível resposta JavaScript (ES6) do @Arnauld .
Minha própria abordagem tinha quase o dobro do tempo ..
Experimente aqui.
Explicação:
fonte
Retina ,
1151083834 bytes[Experimente online!] (Inclui suíte de testes) Usa letras maiúsculas. Edit: Salvo
7074 bytes, adaptando descaradamente a resposta de @ MartinEnder para Este número é triangular? Explicação: O número é convertido em unário e, em seguida, o maior número triangular possível é correspondido repetidamente até que o número se esgote. Cada partida é então convertida na base 36.fonte
PHP, 74 bytes
Versão Online
fonte
R, 87 bytes
Originalmente, tentei predefinir os possíveis números triangulares. Isso levou a esse código com 105 bytes:
Isso exigiu mais indexação, então tentei a metodologia do @Arnauld para reduzir os bytes para 87.
Ambos os códigos usavam as letras predefinidas, pois não era possível encontrar uma maneira curta de converter para a base 36.
fonte