Biorąc pod uwagę całkowitą N , rozłożyć go na sumę liczb ilość trójkątnych (gdzie T m reprezentuje m th liczby trójkątny, lub suma liczb całkowitych od 1 do m ), jak następuje:
podczas gdy n> 0 ,
znajdź największą możliwą liczbę trójkątną T m taką, że T m ≤ n .
dołącz m do trójkątnej reprezentacji rozkładu n .
odejmij T m od n .
Na przykład wartość wejściowa 44 dałaby wynik 8311 , ponieważ:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36 <44, ale 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45> 44.
- pierwsza cyfra to 8 ; odejmij 36 od 44, aby pozostało 8 .
1 + 2 + 3 = 6 <8, ale 1 + 2 + 3 + 4 = 10> 8.
- druga cyfra to 3 ; odejmij 6 z 8, aby pozostały 2 .
1 <2, ale 1 + 2 = 3> 2.
- trzecia i czwarta cyfra muszą mieć 1 i 1 .
Użyj cyfr od 1 do 9, aby przedstawić pierwsze 9 liczb trójkątnych, a następnie użyj liter od a do z (może być pisane wielkimi lub małymi literami), aby reprezentować 10 do 35 numer trójkąta. Nigdy nie otrzymasz danych wejściowych, które wymagałyby użycia większej „cyfry”.
Granice na wejściu wynoszą 1 ≤ n <666 i zawsze będzie to liczba całkowita.
Wszystkie możliwe dane wejściowe i wyjściowe oraz niektóre wybrane przypadki testowe (wymienione jako dane wejściowe, a następnie dane wyjściowe):
1 1
2 11
3 2
4 21
5 211
6 3
100 d32
230 k5211
435 t
665 z731
Wyjście ∞ dla wejścia -1/12 nie jest wymagane. :)
Odpowiedzi:
JavaScript (ES6), 52 bajty
W jaki sposób?
Zamiast jawnie obliczać T i = 1 + 2 + 3 +… + i , zaczynamy od t = 0 i iteracyjnie odejmujemy t + 1 od n, podczas gdy t <n , zwiększając t przy każdej iteracji. Gdy warunek nie jest spełniony już w sumie T t została odjęta od n i wyjście jest odpowiednio aktualizowany. Powtarzamy ten proces, aż n = 0 .
Poniżej znajduje się podsumowanie wszystkich operacji dla n = 100 .
Przypadki testowe
Pokaż fragment kodu
źródło
Galaretka ,
1817 bajtówJest to monadyczny link, który drukuje do STDOUT. Zwracana jest wartość 0 i należy ją zignorować.
Wypróbuj online!
źródło
dc, 74 bajty
To okropne.
źródło
JavaScript (ES6),
6157 bajtówZaoszczędzono 4 bajty dzięki @Arnauld
źródło
f=(n,t=0)=>n?t+1>n?t.toString(36)+f(n):f(n-++t,t):1
f=(n,p=q=0)
if(n,++q+p)
?Java 7, 81 bajtów
Prześlij z niesamowitej odpowiedzi JavaScript (ES6) @Arnauld .
Moje własne podejście było prawie dwa razy dłuższe ..
Wypróbuj tutaj.
Wyjaśnienie:
źródło
Siatkówka ,
1151083834 bajtów[Wypróbuj online!] (Obejmuje pakiet testowy) Używa wielkich liter. Edycja: Zapisano
7074 bajtów, bezwstydnie dostosowując odpowiedź @ MartinEnder do Czy ta liczba jest trójkątna? Objaśnienie: Liczba jest konwertowana na liczbę pojedynczą, a następnie możliwie największą liczbę trójkątną dopasowuje się do momentu wyczerpania liczby. Każde dopasowanie jest następnie konwertowane na bazę 36.źródło
PHP, 74 bajty
Wersja online
źródło
R, 87 bajtów
Początkowo próbowałem wstępnie ustawić możliwe liczby trójkątne. Doprowadziło to do tego kodu o 105 bajtach:
Wymagało to więcej indeksowania, więc wypróbowałem metodologię z @Arnauld, aby zmniejszyć liczbę bajtów do 87.
Oba kody wykorzystywały ustawione litery, ponieważ nie mogłem znaleźć krótkiego sposobu na konwersję do bazy 36.
źródło