Opis
Przed tymi liczbami było jeszcze wiele innych wyzwań i mam nadzieję, że nie ma ich wśród nich.
N th liczby trójkątnego jest równa sumie wszystkich liczb naturalnych aż do n , proste rzeczy. Istnieje strona wikipedia i wpis w OEIS , dla tych, którzy chcą się lepiej dowiedzieć.
Teraz Gauss odkrył, że każda liczba naturalna może być wyrażona jako suma trzech liczb trójkątnych (w tym 0
), i dobrze jest mieć jedną liczbę więcej niż raz, np 0 + 1 + 1 = 2
.
Wyzwanie
Twoim zadaniem jest napisanie programu lub funkcji, z podaniem liczby naturalnej (w tym 0
), wypisuje trzy liczby trójkątne, które sumują się do argumentu. Możesz wydrukować liczby rozdzielone spacjami, tablicą lub inną metodą, którą lubisz. Jednakże, jest zakazane używać jakichkolwiek funkcji Builtin bezpośrednio uzyskać układ, zakres lub dowolną inną formę zbioru zawierającą listę numerów trójkątnych (na przykład pojedynczy atom, który otrzymuje się zakres).
Przypadki testowe
9 -> 6 + 3 + 0 or 3 + 3 + 3
12 -> 6 + 6 + 0 or 6 + 3 + 3 or 10 + 1 + 1
13 -> 6 + 6 + 1
1 -> 1 + 0 + 0
0 -> 0 + 0 + 0
Uwaga: Jeśli istnieje więcej niż jedna możliwa kombinacja, możesz wydrukować dowolną lub wszystkie, ale musisz wydrukować dowolną kombinację tylko raz, eliminując wszystkie kombinacje wynikające z zmiany kolejności innych kombinacji. Byłbym wdzięczny za link do wypróbowania i wyjaśnienie. Naprawdę uwielbiam patrzeć, jak rozwiązujesz problem;)
To jest golf golfowy , więc obowiązują standardowe luki. Niech wygra najkrótsza odpowiedź w bajtach!
źródło
a
nie zawsze będzie liczbą trójkątnąn
i zwracają listę pierwszychn
numerów trójkątów ? To wydaje się raczej skierowane przeciwko konkretnemu językowi, chociaż nie wiem który.Odpowiedzi:
05AB1E , 10 bajtów
Kod:
Wyjaśnienie:
Wykorzystuje kodowanie 05AB1E . Wypróbuj online!
źródło
Python 2 , 99 bajtów
Wypróbuj online!
Jestem bardzo zaskoczony, że to jest krótsze niż
itertools
lub potrójne rozumienie listy! (Ostatecznie) wyrzuca losową odpowiedź za każdym razem, gdy ją uruchomisz.Dwa 102:
itertools wygląda na 106:
źródło
Galaretka , 12 bajtów
Wypróbuj online!
Jak to działa
źródło
Brachylog , 13 bajtów
Wypróbuj online!
Jak to działa
źródło
MATL , 18 bajtów
Daje to pierwszy wynik w porządku leksykograficznym.
Wypróbuj w MATL Online!
Wyjaśnienie
źródło
Haskell,
6659 bajtówDziękujemy za umożliwienie przedstawienia wszystkich rozwiązań, co było fascynującą rozrywką! Byłem tak szczęśliwy, że nie muszę wyodrębniać jednego rozwiązania i mogłem po prostu dać im wszystko, że nie zauważyłem kosztów związanych z unikaniem permutowanych rozwiązań. Uwaga Lynn wyjaśniła mi to i pozwól mi zaoszczędzić 7 bajtów.
Wiąże to więcej niż wystarczającą liczbę trójkątną
l
i sprawdza wszystkie kombinacje.źródło
a>=b,b>=c
warunków i dodanie sufiksu!!0
do kodu również nie jest prawidłową odpowiedzią? Opracowanie wszystkich rozwiązań tak naprawdę nie pomaga tutaj.Siatkówka ,
6359 bajtówWypróbuj online! Link zawiera przypadki testowe.
(1(?(1)\1))*
jest uogólnionym dopasowaniem liczb trójkątnych, ale dla pierwszej liczby trójkątnej możemy zapisać kilka bajtów, używając^
do początkowego dopasowania.źródło
PHP , 351 bajtów
Wypróbuj online!
źródło
Python 3 , 119 bajtów
Wypróbuj online!
Dzięki @WheatWizard za zapisanie 12 bajtów!
źródło
map
(i być może twój filtr) może być krótszy jako lista.map
[*filter(...)]
(x,y,z) for x,y,z in...
dłuższe niż twoje,l for l in...
co prawdopodobnie tłumaczy tę różnicę.C / C ++ - 197 bajtów
Cios przez cios:
Potrzebny do printf. Można pominąć w przypadku niektórych wersji C.
Oszczędność miejsca dla pętli.
Oceniający rekurencyjny trójkąt.
Ten facet wykonuje ciężkie podnoszenie. Trzy zagnieżdżone dla pętli iterują a, b, c od 0 do n, zauważ, że każdy b i c iteruje od poprzedniej wartości do n. Od tego czasu nie jest absolutnie konieczne przycinanie iteracji
return
pojawienie się w ciągu minuty rozwiązuje problem „duplikowania”.Na poziomie wewnętrznym, jeśli suma trzech liczb trójkątów
==
żądaną wartość, wydrukuj trójkąty i wróć.Możesz legalnie usunąć
return
słowo kluczowe i przekonwertować zwrócony typ c na void, aby zaoszczędzić jeszcze kilka bajtów i wydrukować wszystkie możliwe rozwiązania. To z tego powodu, że iteracje są ograniczone, jeżeli wszystkie pętle trwał od0
don
niego spowodowałoby duplikatów.źródło
Mathematica, 63 bajty
źródło
First
że oszczędza aż o 2 bajty ,(t=#;#&@@Select[Table[i(i+1)/2,{i,0,t}]~Tuples~{3},Tr@#==t&])&
za 62 bajtów.CJam , 26 bajtów
Port mojej odpowiedzi MATL. Jest to anonimowy blok, który oczekuje danych wejściowych na stosie i zastępuje je tablicą wyjściową.
Wypróbuj online!
źródło
R , 66 bajtów
Algorytm siły brutalnej; odczytuje
n
ze standardowego wejścia i zwraca ramkę danych, w której każdy wiersz jest kombinacją 3 liczb trójkątnych, które się sumująn
. W razie potrzeby mogę zwrócić tylko pierwszy wiersz dla +4 bajtów.Wypróbuj online!
źródło
Java 8, 164 bajty
Wyjaśnienie:
Wypróbuj tutaj.
źródło
JavaScript, 108 bajtów
Wyjaśnienie
x
reprezentuje dane wejściowewhile(a<=x)r.push(a=i++*i/2)
Tworzy tablicę wszystkich liczb trójkątnych do xfor
Pętli drukuje najwięcej trójkątny poniżejx
, a następnie odjęcie od tej liczbyx
, dla trzech powtórzeń. (w zasadzie chciwy algorytm)źródło
x = 103
:91 + 10 + 1 = 102
Pyth, 19 bajtów
Tak bardzo nie ćwiczę z Pyth, to nieprawda: /
Wypróbuj tutaj .
źródło
J , 36 bajtów
Wypróbuj online!
źródło
Ruby
615755 bajtówZainspirowany Lynn Python odpowiedź . Generuje losowe trojaczki, aż do osiągnięcia żądanej sumy:
Wymaga Ruby 2.4. W Ruby 2.3 i starszych jest to błąd składniowy i
Range#sum
nie jest zdefiniowany. Ta dłuższa wersja (64 bajty) jest potrzebna dla Ruby 2.3:Oto mały test:
Wypróbuj online z Ruby 2.3!
źródło
JavaScript (ES6), 108 bajtów - naprawione
Pobiera na wejściu liczbę całkowitą, wyprowadza tablicę
[a, b, c]
zawierającą posortowaną listę liczb trójkątówa + b + c = x
, gdziea
największa liczba trójkątów jest mniejsza lub równa wartości wejściowej ib
jest największą liczbą trójkątów mniejszą lub równą minusowi wejściaa
.Wyjaśnienie
Pokaż fragment kodu
źródło
x-m-n
liczba trójkątna, tj. Dlaczego to działa?