Liczby kwadratowe to te, które przyjmują postać, n^2
gdzie n jest liczbą całkowitą. Są one również nazywane idealnymi kwadratami, ponieważ gdy weźmiesz ich pierwiastek kwadratowy, otrzymasz liczbę całkowitą.
Pierwsze 10 liczb kwadratowych to: ( OEIS )
0, 1, 4, 9, 16, 25, 36, 49, 64, 81
Liczby trójkątne to liczby, które mogą tworzyć trójkąt równoboczny. N-ty numer trójkąta jest równy sumie wszystkich liczb naturalnych od 1 do n.
Pierwsze 10 liczb trójkątnych to: ( OEIS )
0, 1, 3, 6, 10, 15, 21, 28, 36, 45
Kwadratowe liczby trójkątne to liczby zarówno kwadratowe, jak i trójkątne.
Pierwsze 10 kwadratowych liczb trójkątnych to: ( OEIS )
0, 1, 36, 1225, 41616, 1413721, 48024900, 1631432881, 55420693056, 1882672131025, 63955431761796
Istnieje nieskończona liczba liczb kwadratowych, liczb trójkątnych i kwadratowych liczb trójkątnych.
Napisz program lub nazwaną funkcję, która podała liczbę wejściową (parametr lub standard) n
, oblicza n
kwadratową liczbę trójkątną i wysyła / zwraca ją, gdzie n jest dodatnią liczbą niezerową. (Dla n = 1 zwraca 0)
Aby program / funkcja była poprawnym przesłaniem, powinna mieć możliwość zwrócenia co najmniej wszystkich liczb kwadratowych trójkątów mniejszych niż 2 ^ 31-1.
Premia
-4 bajty za możliwość wypisania wszystkich kwadratowych liczb trójkątnych mniejszych niż 2 ^ 63-1
-4 bajty umożliwiające teoretyczne wyprowadzenie kwadratowych liczb trójkątnych o dowolnym rozmiarze.
+8 bajtów kary za rozwiązania wymagające czasu niepolarnego.
Stos bonusów.
To wyzwanie dla golfa, więc wygrywa odpowiedź z najmniejszą liczbą bajtów.
n
kroki, a na każdym kroku arytmetyka zajmuje czas liniowy, ponieważ liczba cyfr rośnie liniowon
. Nie sądzę, żeby czas liniowy był możliwy. Chyba że mówisz, że operacje arytmetyczne to stały czas?Odpowiedzi:
CJam,
128 bajtówWykorzystuje relację powtarzalności z artykułu z Wikipedii.
Kod ma długość 16 bajtów i kwalifikuje się do obu bonusów.
Wypróbuj online w interpretatorze CJam .
Jak to działa
Mój kod okazał się być identyczny jak xnor w każdym aspekcie, z wyjątkiem tego, że używam stosu CJam zamiast zmiennych.
źródło
Python 2, 45-4-4 = 37
Iteruje przy użyciu reccurence
Teoretycznie obsługuje to liczby dowolnej wielkości, ale działa w czasie wykładniczym, więc nie powinno kwalifikować się do bonusów. Powinien działać dla liczb o dowolnym rozmiarze. Na przykład dla 100 daje
Rozwiązanie rekurencyjne wykorzystuje 41 znaków, ale nie powinno się kwalifikować, ponieważ zajmuje wykładniczy czas.
źródło
exec
rozwiązaniem. Jeśli możesz zmienić limit rekurencji, może on również obliczyć liczbę kwadratowych trójkątów o dowolnym rozmiarze, kwalifikując go do # 2. Nie jestem jednak pewien, czy to się kwalifikuje (@Rodolvertice).Pyth, 16 - 4 - 4 = 8 bajtów
Wykorzystuje rekurencyjną formułę z artykułu OEIS.
Używa polecenia post-przypisania, które jest całkiem nowe i wydaje się naprawdę fajne. Używa skrócenia
n-1
czasu iteracji z powodu indeksowania 1.Wydaje się być wielomianem, ponieważ zapętla się n razy i wykonuje matematykę i przypisuje każdą iterację, ale nie jestem informatykiem. Kończy n = 10000 prawie natychmiast.
Wypróbuj tutaj online .
źródło
b
.Oaza , 7 - 4 - 4 = -1 (nie konkuruje)
Wypróbuj online!
Używa
a(0) = 0, a(1) = 1; for n >= 2, a(n) = 34 * a(n-1) - a(n-2) + 2
Oasis obsługuje liczby całkowite o dowolnej precyzji, więc powinno być możliwe zwiększenie dowolnej liczby, o ile nie nastąpi przepełnienie stosu. Daj mi znać, jeśli nie liczy się to z powodu przepełnienia stosu. Możliwe jest również, że ten konkretny algorytm nie jest wielomianowy i daj mi znać, jeśli tak jest.
Niekonkurencyjny, ponieważ wyzwanie stanowi postdatowanie języka.
Wyjaśnienie:
Alternatywne rozwiązanie:
Zamiast tego używa
a(n) = 35*(a(n-1)-a(n-2)) + a(n-3)
źródło
For n=1 return 0
, ale zwraca 1. To można naprawić, dodając opcję -O .JavaScript (ES6), 29-4 = 25 bajtów
Zaoszczędź 5 bajtów dzięki @IsmaelMiguel !
Musiałem zakodować 0, 1 i negatywy, aby uniknąć nieskończonej rekurencji.
Konsolę nazwałem funkcją
f
:EDYCJA : okazuje się, że JavaScript zaokrągli liczby do 16 (15) cyfr (Spec), ponieważ te liczby są zbyt duże, co powoduje przepełnienie. Umieść 714341252076979033 W konsoli JavaScript i przekonaj się sam. To bardziej ograniczenie JavaScript
źródło
f(15)
powinien wrócić85170343853180456676
, nie85170343853180450000
.n=>n?n<2?0:34*f(n-1)-f(n-2)+2:1
(31 bajtów). Testowałem do piątej liczby.n=>n>1?34*f(n-1)-f(n-2)+2:!!n
. Zwracafalse
on0
,true
on1
i36
on2
. Jeśli chcesz, aby powrócić do numeru, można zastąpić!!n
z+!!n
.n=>n>1?34*f(n-1)-f(n-2)+2:n|0
(ta sama liczba bajtów, teraz zwraca zawsze cyfry)Excel VBA - 90 bajtów
Używając relacji rekurencji ze strony Wikipedii:
Po wykonaniu pojawi się monit o n, następnie sekwencja do n włącznie włącznie jest wyprowadzana do kolumny A:
Można go uruchomić do wartości n = 202 włącznie, zanim wystąpi błąd przepełnienia.
źródło
[Nie konkuruje] Pyth (14 - 4 - 4 = 6 bajtów)
Użyłem pierwszego wznowienia z OEIS , że po 0,1,36 można znaleźć A n = (A n-1 -1) 2 / A n-2 . A Nie konkuruje, ponieważ to rozwiązanie zaczyna się od 36, jeśli zejdziesz niżej, dzielisz przez zero (więc wejście 0 daje 36). Musiałem także zakodować na stałe 36.
Wypróbuj tutaj
źródło
Java, 53–4 = 49 bajtów
To kolejna prosta rekurencja, ale często nie publikuję Java z wynikiem <50, więc ...
Teraz coś dla -recursive, robi się trochę dłużej. Ten jest zarówno dłuższy (112-4 = 108) - i wolniejszy, więc nie jestem pewien, dlaczego go publikuję, z wyjątkiem tego, że mam coś iteracyjnego:
źródło
Julia, 51 bajtów - 4 - 4 = 43
Wykorzystuje pierwszą relację powtarzalności wymienioną na stronie Wikipedii dla kwadratowych liczb trójkątnych. Oblicza n = 1000 w 0,006 sekundy, a n = 100000 w 6,93 sekundy. Jest o kilka bajtów dłuższy niż rozwiązanie rekurencyjne, ale jest o wiele szybszy.
Niegolfowane + wyjaśnienie:
Przykłady:
źródło
PHP,
655956-4 = 52 bajtypowtarzaj, aż pierwiastek kwadratowy z
$s
∈ℤ: dodaj$f
do sumy$s
, zwiększaj$f
;powtarzać
$argv[1]
czasy.suma wyjściowa.
źródło
Prolog,
7074–4–4 = 66n(100,R)
Wyjścia bieżące :Uruchomienie zajmuje około 1 sekundy
n(10000,X)
na moim komputerze .Edycja : Wersja 66 jest rekurencyjna. Poprzednia nie rekurencyjna wersja jest następująca:
Mają tę samą długość w bajtach, ale nie rekurencyjny generuje przepełnienie stosu powyżej pewnego punktu (na moim komputerze około 20500).
źródło
JavaScript ES6,
777571 znakówTest:
źródło
C, 68 bajtów
To było zabawne wyzwanie z C.
main(o,k){o==1?k=0:0;k<9e9&&k>=0&&main(34*o-k+2,o,printf("%d,",k));}
Zobacz, jak działa tutaj: https://ideone.com/0ulGmM
źródło
Galareta , 13 - 8 = 5 bajtów
To kwalifikuje się do obu bonusów.
Wypróbuj online!
Sporządzono obok Cairna coinheringaahing na czacie .
Wyjaśnienie
źródło
Perl 6 , 25–8 = 17 bajtów
Wypróbuj online!
źródło
05AB1E , 10–8 = 2 bajty
Wypróbuj online!
źródło
APL (NARS), 67 znaków, 134 bajty
test:
f szukałby w kolejności kwadratowej również elementów, które są liczbą trójkątną, więc muszą przestrzegać wzoru trójkątnej kontroli w APL: 0 = 1∣√1 + 8 × m z liczbą m do sprawdzenia.
źródło