Liczba trójkątna to liczba będąca sumą n
liczb naturalnych od 1 do n
. Przykładowo 1 + 2 + 3 + 4 = 10
więc 10
jest liczbą trójkątną.
Biorąc pod uwagę dodatnią liczbę całkowitą ( 0 < n <= 10000
) jako dane wejściowe (można ją traktować jako liczbę całkowitą lub ciąg), zwraca najmniejszą możliwą liczbę trójkątną, którą można dodać do wejścia, aby utworzyć kolejną liczbę trójkątną.
Na przykład dane wejściowe 26
, dodawanie 10
wyników 36
, który jest również liczbą trójkątną. Nie ma żadnych trójkątnych liczb mniejszych niż te, 10
które można dodać, aby 26
utworzyć kolejną liczbę trójkątną, więc 10
w tym przypadku jest prawidłowy wynik.
0
jest liczbą trójkątną, dlatego jeśli sam sygnał wejściowy jest liczbą trójkątną, wynik powinien wynosić 0
Przypadki testowe
Sprawy są podawane w formacie input -> output (resulting triangular number)
0 -> 0 (0)
4 -> 6 (10)
5 -> 1 (6)
7 -> 3 (10)
8 -> 28 (36)
10 -> 0 (10)
24 -> 21 (45)
25 -> 3 (28)
26 -> 10 (36)
34 -> 21 (55)
10000 -> 153 (10153)
Punktacja
To jest golf golfowy, więc wygrywa najmniej bajtów w każdym języku !
26 -> 2
?Odpowiedzi:
Java 8,
5857 bajtówZestaw testów online
Dzięki Dennis za 1-bajtową oszczędność.
źródło
return-~i*i/2;
zapisuje bajt.int[]
zamiast zamiastint
jako. Ale to oznacza późniejsze zajęcie się tablicami. Może to działać:x->{int i=0,m=0,n=x[0];while(n!=0)n+=n<0?++i:--m;x[0]=-~i*i/2;}
ale ma 63 bajty.MATL ,
1312 bajtów1 bajt usunięty przy użyciu pomysłu (ustaw przecięcie) z odpowiedzi Emigna 05AB1E
Wypróbuj online!
Wyjaśnienie
Niech
t(n) = 1 + 2 + ··· + n
oznaczan
-ty numer trójkątny.Kod wykorzystuje fakt, że dane
n
rozwiązanie jest ograniczonet(n-1)
. Aby to zobaczyć, zauważ, żet(n-1) + n
jest równy,t(n)
a więc jest to liczba trójkątna.Rozważ dane wejściowe
8
jako przykład.źródło
Q
argumenty dotyczące ograniczeń?8
. Gdy wynik równa się granicyt(n-1)
, kod otrzymuje ją jakot(n)-n
. Więct(n)
jest to konieczne. W każdym razie dzięki za pomysł!Java (OpenJDK 8) , 83 bajty
Wypróbuj online!
Kredyty
źródło
m
. Więc przechodzę oda
zera do0
. „ale jesteś przypisanie może 100 razy tę samą wartośća*a+a
, abym
wb
-loop” Tak, nie muszę robić to 100 razy, ale ja zyskuje bajtów, nie łamiącb
-loop wcześniej.Mathematica, 46 bajtów
źródło
Neim ,
129 bajtówObliczenie zajmuje zbyt dużo czasu (ale działa z nieskończonym czasem i pamięcią), więc w łączu generuję tylko pierwsze 143 trójkątne liczby - używając
£𝕖
, co wystarcza do obsługi wejścia 10 000, ale nie wystarcza do przekroczenia limitu czasu.Ostrzeżenie: może to nie działać w przyszłych wersjach. Jeśli tak, zamień 143 na £
Wyjaśnienie:
Spróbuj!
źródło
9998
oczekiwany wynik jest3118753
znacznie wyższy niż 143. numer trójkąta (czyli „10296).This takes too long to compute (but works given infinite time and memory)
£
PHP , 45 bajtów
Wypróbuj online!
Jest krótszym wariantem
for(;!$r[$t];$t+=++$i)$r[$argn+$t]=~+$t;echo~$r[$t];
Rozszerzony
PHP , 53 bajty
Wypróbuj online!
Użyj nowego operatora statku kosmicznego w PHP 7
Rozszerzony
PHP , 55 bajtów
Wypróbuj online!
źródło
Java 8,
1101021009392 bajty-2 bajty dzięki @PeterTaylor .
-7 bajtów dzięki @JollyJoker .
-1 bajt dzięki @ceilingcat .
Wyjaśnienie:
Wypróbuj online.
źródło
Brachylog ,
1715 bajtówWypróbuj online!
Wyjaśnienie
źródło
Python 2 , 59 bajtów
Wypróbuj online!
Wykorzystuje się następującą charakterystykę liczb trójkątnych, którą
t
można dodać,n
aby uzyskać liczbę trójkątną:Kod bierze minimum wszystkich takich liczb trójkątnych.
źródło
Galaretka , 8 bajtów
Wypróbuj online!
Jak to działa
źródło
Japt ,
24231615 bajtówSprawdź to
1 bajt zapisany dzięki ETH
Wyjaśnienie
źródło
æ!øV
. Poza tym wygląda świetnie :-)Oktawa ,
3836 bajtów2 bajty wyłączone dzięki @Giuseppe!
Anonimowa funkcja, która wykorzystuje prawie takie samo podejście jak moja odpowiedź MATL .
Wypróbuj online!
źródło
05AB1E , 12 bajtów
Wykorzystuje kodowanie 05AB1E . Wypróbuj online!
źródło
Mathematica, 62 bajty
źródło
Solve[2*#==m(m+1)-n(n+1)
krótszy (jeśli zadziała)?Python 2 ,
787170 bajtówZapisano siedem bajtów, dziękuję ovs i thespinosa
Jeden bajt zapisany powodu zaznaczeniem Neil ,
x+9
jest suffisant i sprawdzone dla wszystkich liczb naturalnych0 <= n <= 10000
. Zostało również zweryfikowane pod kątemx+1
zamiastx+9
, działa również.Wypróbuj online!
źródło
n*-~n/2
zamiastn*(n+1)/2
{n*(n+1)/2for n in range(999)}
zamiast jawnego,set
a także używać{}
zamiastset
w trzeciej liniiJavaScript (ES6),
4342 bajtyEdycja: Zapisano 1 bajt dzięki @PeterTaylor.
źródło
-++s
go--s
, tak jak to zrobiłem w mojej niezależnie wyprowadzonej, ale dość podobnej wersji Java. (Dodatek: musisz również zmienić test nan>0
).n>s
czek był cały czerwony śledź!node --stack_size=
aby zwiększyć jego rozmiar stosu.Python 3 ,
6044 bajtówDzięki @xnor za sugestię, która pozwoliła zaoszczędzić 16 bajtów!
Wypróbuj online!
tło
Niech n będzie liczbą całkowitą nieujemną. Jeśli n jest k- tą trójkątną liczbą, to mamy
co oznacza, że będzie naturalne rozwiązanie wtedy i tylko wtedy, gdy 1 + 8n jest nieparzystym, idealnym kwadratem. Oczywiście sprawdzanie parzystości 1 + 8n nie jest wymagane.
Jak to działa
Funkcja rekurencyjna n przyjmuje jako argument jedną pojedynczą, nieujemną liczbę całkowitą. W przypadku wywołania z jednym argumentem, k domyślnie wynosi 1 .
Najpierw
(8*n+1)**.5%1
sprawdza, czy n jest liczbą trójkątną: jeśli (i tylko jeśli) jest,(8*n+1)**.5
da liczbę całkowitą, więc reszta z dzielenia przez 1 da 0 .Jeśli moduł wynosi 0 ,
and
warunek zakończy się niepowodzeniem, co spowoduje, że f zwróci 0 . Jeśli tak się stanie w pierwszym wywołaniu f , zauważ, że jest to poprawny wynik, ponieważ n jest już trójkątny.Jeśli moduł jest dodatni,
and
warunekf(n+k,k+1)+k
zostaje zachowany i zostaje wykonany. To wywołuje ponownie f , zwiększając n o k i k o 1 , a następnie dodaje k do wyniku.Kiedy f (n 0 , k 0 ) ostatecznie zwraca 0 , wycofujemy się z rekurencji. Pierwszym argumentem w pierwszym wywołaniu było n , drugim n + 1 , trzecim n + 1 + 2 , aż w końcu n 0 = n + 1 +… k 0 -1 . Zauważ, że n 0 - n jest liczbą trójkątną.
Podobnie, wszystkie te liczby całkowite zostaną dodane do najbardziej wewnętrznej wartości zwracanej ( 0 ), więc wynik początkowego wywołania f (n) wynosi n 0 - n , zgodnie z potrzebą.
źródło
n
liczbę rekurencji, możesz pisaćn
zamiast(n+k)
.C # (.NET Core) ,
291281 bajtówWypróbuj online! Program, który pobiera ciąg znaków jako dane wejściowe i wyjściowe za pośrednictwem kodu wyjścia.
Uratował 10 bajtów dzięki Kevinowi Cruijssenowi
źródło
class p{static int Main(string[]I){string d="0",s=I[0];int c=1,j,k;for(;;){j=k=0;string[]D=d.Split(' '),S=s.Split(' ');for(;j<D.Length;j++)for(;k<S.Length;k++)if(D[j]==S[k])return int.Parse(D[k]);j=int.Parse(D[0])+c++;d=d.Insert(0,$"{j} ");s=s.Insert(0,$"{j+int.Parse(I[0])} ");}}}
for(;;)
do tworzenia nieskończonej pętli jest niezłym trudem, i upewnię się, czy użycie var jest w rzeczywistości bardziej wydajne niż użycie jawnego typu, ale łączenie deklaracji, i uważam, że dokładam starań, aby usunąć niepotrzebne nawiasy klamrowe. Jeśli chodzi o program kontra funkcja, zacząłem od lambda, ale nie mogłem uruchomić go w TIO. Wiem, że łącze TIO nie jest w rzeczywistości konieczne, ale lubię to widzieć w odpowiedziach innych, więc chciałem przynajmniej coś podobnego we własnym.JavaScript (ES7),
4644 bajtówSpróbuj
źródło
r=x=0
zadziała?05AB1E , 8 bajtów
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
Dyalog APL, 19 bajtów
6 bajtów zapisanych dzięki @KritixiLithos
Wypróbuj online!
W jaki sposób?
o←0,+\⍳⍵
- przypiszo
pierwsze⍵
trójkątne liczbyo/⍨
- filtrujo
wedługo∊⍨⍵+o
- liczby trójkątne, które zsumowane z⍵
produkują trójkąty⊃
- i weź pierwszyźródło
+\⍳⍵
powinien działać zamiast tego, którego używasz do generowania liczb trójkątnych.⊃
działa zamiast⌊/
Pari / GP , 54 bajty
Wypróbuj online!
źródło
Haskell , 56 bajtów
Wypróbuj online!
źródło
Dodaj ++ , 68 bajtów
Wypróbuj online! lub zobacz pakiet testowy !
Nawet Java mnie bije. Naprawdę muszę dodać kilka zestawów poleceń do Add ++
Jak to działa
źródło
R ,
46444341 bajtówWypróbuj online!
Anonimowa funkcja z jednym obowiązkowym argumentem
x
; oblicza pierwszex+1
liczby trójkątne jako opcjonalny argument do gry w golfa w kilku nawiasach klamrowych. Użyłem,choose
zanim zobaczyłem odpowiedź Octave Luisa Mendo .Wygoliłem kilka bajtów odpowiedzi Luisa Mendo, ale zapomniałem użyć tego samego pomysłu w mojej odpowiedzi.
źródło
Galaretka , 18 bajtów
Wypróbuj online!
źródło
Python 2 ,
8381 bajtówWypróbuj online!
źródło
APL (Dyalog Classic) ,
1614 bajtówWypróbuj online!
źródło
Clojure, 74 bajty
Wybierz swój ulubiony :) Pętle mogą być krótsze ...
źródło
Python 2 , 82 bajty
Wypróbuj online
Zostało to utworzone przez zmianę tej odpowiedzi na powiązane pytanie.
źródło