Dado un número entero n , descomponerlo en una suma de números triangulares máximos (donde T m representa el número triangular número m , o la suma de los números enteros de 1 a m ) de la siguiente manera:
mientras n> 0 ,
encuentre el número triangular más grande posible T m tal que T m ≤ n .
agregue m a la representación de descomposición triangular de n .
restar T m de n .
Por ejemplo, una entrada de 44 produciría una salida de 8311 , porque:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36 <44, pero 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45> 44.
- el primer dígito es 8 ; reste 36 de 44 para obtener 8 sobrantes.
1 + 2 + 3 = 6 <8, pero 1 + 2 + 3 + 4 = 10> 8.
- el segundo dígito es 3 ; reste 6 de 8 para obtener 2 sobrantes.
1 <2, pero 1 + 2 = 3> 2.
- los dígitos tercero y cuarto deben ser 1 y 1 .
Use los dígitos del 1 al 9 para representar los primeros 9 números triangulares, luego use las letras de la a a la z (pueden escribirse en mayúsculas o minúsculas) para representar el número triangular del 10 al 35. Nunca se le dará una entrada que requerirá el uso de un "dígito" más grande.
Los límites en la entrada son 1 ≤ n <666 , y siempre será un número entero.
Todas las entradas y salidas posibles , y algunos casos de prueba seleccionados (listados como entrada, luego salida):
1 1
2 11
3 2
4 21
5 211
6 3
100 d32
230 k5211
435 t
665 z731
No se requiere una salida de ∞ para una entrada de -1/12 . :)
Respuestas:
JavaScript (ES6), 52 bytes
¿Cómo?
En lugar de calcular explícitamente T i = 1 + 2 + 3 + ... + i , comenzamos con t = 0 y restamos iterativamente t + 1 de n mientras t <n , incrementando t en cada iteración. Cuando la condición ya no se cumple, un total de T t se resta de n y la salida se actualiza en consecuencia. Repetimos el proceso hasta n = 0 .
A continuación se muestra un resumen de todas las operaciones para n = 100 .
Casos de prueba
Mostrar fragmento de código
fuente
Jalea ,
1817 bytesEste es un enlace monádico que se imprime en STDOUT. Su valor de retorno es 0 y debe ignorarse.
Pruébalo en línea!
fuente
cc, 74 bytes
Esto es horrible
fuente
JavaScript (ES6),
6157 bytesGuardado 4 bytes gracias a @Arnauld
fuente
f=(n,t=0)=>n?t+1>n?t.toString(36)+f(n):f(n-++t,t):1
f=(n,p=q=0)
yf(n,++q+p)
?Java 7, 81 bytes
Puerto de la sorprendente respuesta JavaScript (ES6) de @Arnauld .
Mi propio enfoque fue casi el doble de largo ...
Pruébalo aquí.
Explicación:
fuente
Retina ,
1151083834 bytes[¡Pruébelo en línea!] (Incluye paquete de prueba) Utiliza letras mayúsculas. Editar: ahorró
7074 bytes adaptando descaradamente la respuesta de @ MartinEnder a ¿Es este número triangular? Explicación: El número se convierte en unario, luego el número triangular más grande posible se empareja repetidamente hasta que se agota el número. Cada partido se convierte en la base 36.fuente
PHP, 74 bytes
Versión en línea
fuente
R, 87 bytes
Originalmente, traté de preestablecer los posibles números triangulares. Esto llevó a este código con 105 bytes:
Esto requirió más indexación, así que probé la metodología de @Arnauld para reducir los bytes a 87.
Ambos códigos hicieron uso de las letras preestablecidas, ya que no pude encontrar una forma corta de convertir a la base 36.
fuente