Zanim ktokolwiek powie coś podobnego i podobnego . Ale to nie jest dupek.
Niektóre dodatnie liczby całkowite można zapisać jako sumę co najmniej dwóch kolejnych liczb całkowitych dodatnich. Na przykład 9=2+3+4=4+5
. Napisz funkcję, która przyjmuje na wejściu dodatnią liczbę całkowitą i wypisuje jako wynik najdłuższą sekwencję rosnących kolejnych liczb całkowitych dodatnich, które się do niej sumują (dopuszczalny jest dowolny format, chociaż -5 bajtów, jeśli wynikiem jest sekwencja rosnąca oddzielona, +
jak pokazano powyżej Jeśli nie ma takiej sekwencji, należy wydrukować sam numer.
To jest kod golfowy. Obowiązują standardowe zasady. Najkrótszy kod w bajtach wygrywa.
Próbki (pamiętaj, że formatowanie jest różne)
Input: 9
Output: 2,3,4
Input: 8
Output: 8
Input: 25
Output: [3,4,5,6,7]
-n+1
don
)Odpowiedzi:
Python, 67 bajtów
Dziwnie prosta strategia: wyszukaj przedział R z właściwą sumą.
Ponieważ dolny koniec przedziału tylko się zwiększa, dłuższe przedziały znajdują się przed krótszymi.
źródło
Pyth,
1210 bajtówKod ma 15 bajtów i kwalifikuje się do premii -5 bajtów . Wypróbuj online w kompilatorze Pyth .
Dzięki @Jakube za grę w golfa z 2 bajtów!
Jak to działa
źródło
Mathematica,
7368655643 bajtyźródło
Tuples
wyrażenie infiksowe.Haskell,
4948 bajtówźródło
[...]!!0
zamiasthead[...]
.MATLAB,
8779 bajtówWiem, że jest już odpowiedź MATLAB, ale ta jest znacznie inna w podejściu.
Działa to również na Octave . Możesz spróbować online tutaj . Dodałem już kod do
consecutiveSum.m
połączonego obszaru roboczego, więc po prostu wpiszconsecutiveSum
w wierszu polecenia, a następnie wprowadź wartość (np. 25).Nadal pracuję nad zmniejszeniem go (być może nieco poprawionym stosowanym równaniem), ale w zasadzie znajduje największą wartość,
n
dla którejm
jest liczbą całkowitą, a następnie wyświetla pierwszem
liczby zaczynające się odn
.Dlaczego to działa? Zasadniczo istnieje matematyczne równanie rządzące tymi wszystkimi liczbami. Jeśli uważasz, że wszystkie są następujące po sobie i zaczynasz od pewnego momentu, możesz w zasadzie powiedzieć:
Teraz z tego wynika, że sekwencja jest w zasadzie tylko pierwszymi
p
numerami trójkątów (w tym 0), dodanymi dop+1
wielun
. Teraz, jeśli pozwolimym=p+1
, możemy powiedzieć:W rzeczywistości jest to całkiem możliwe do rozwiązania. Wciąż szukam najkrótszego sposobu na zrobienie tego, mam kilka pomysłów, aby spróbować zredukować powyższy kod.
Dla wejścia 25 wynik będzie:
źródło
1,3,6,10,...
zmaksymalizowane.Python 2, 94 bajty
Dane wejściowe są pobierane ze standardowego wejścia. To rozwiązanie jest odpowiednie dla bardzo dużych nakładów.
Powoduje to iterację możliwych długości rozwiązania, r , mających r ≤ √ (2n) , i wyraźnie sprawdza rozwiązanie. Aby istniało rozwiązanie, jeśli r jest nieparzyste, n mod r musi wynosić zero, a jeśli r jest parzyste, n mod r musi być r / 2 .
Przykładowe użycie
Celowo wybrałem przykłady o stosunkowo niewielkich wynikach.
źródło
Oktawa, 89 bajtów
To najlepsze, co mogłem zrobić w Octave. Algorytm jest taki sam jak xnor.
W MATLAB byłoby to 95 bajtów:
W MATLAB trwa to około 0,1 sekundy na wejście
2000000
i 1 sekundę na wejście1000002
.źródło
awk, 51 bajtów
Kod ma 56 bajtów, minus 5 bajtów dla formatu wyjściowego. Musiałem użyć 4 dodatkowych bajtów, aby wygenerować ten format, więc faktycznie zapisałem 1 bajt. Brawo! ;)
To naprawdę ciężka praca sumowania, zaczynając od 1, aż suma jest większa niż wkład. Następnie zaczyna odejmować liczby, zaczynając od 1, aż liczba będzie mniejsza niż wartość wejściowa. W ten sposób zmienia numer początkowy i końcowy do momentu znalezienia wyniku, który następnie drukuje.
Przykład użycia
Wyjście z przykładu
Próbowałem tego dla danych wejściowych
1e12
i464562+...+1488562
prawie natychmiast uzyskało prawidłowy wynik ( ). Chociaż wydrukowanie go zajęło trochę czasu ...źródło
{while($0!=s)s+=(s<$0) ? (++j) : -(++i); while(++i<j)r=r i"+"}$0=r j
i jest zawsze ostatnią liczbą całkowitą odejmowaną od początku łańcucha, j jest zawsze ostatnią liczbą całkowitą dodaną na końcu łańcuchaJapt , 33 bajty
Wykorzystuje technikę Pythona Dennisa , chociaż jest znacznie dłuższa ...
Wypróbuj online! Ostrzeżenie: w przypadku większych danych wejściowych (<= 20) zakończenie zajmuje trochę czasu i zawiesza przeglądarkę, aż to zrobi.
Bez golfa i wyjaśnienia
Wersja premiowa: (38 bajtów - 5 = 33)
źródło
Julia, 92 bajty
Jest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca tablicę. Aby to nazwać, nadaj mu nazwę, np
f=x->...
.Nie golfowany:
źródło
Ruby, 94 bajty
Nie golfowany:
Stosowanie:
źródło
Poważnie, 53-5 = 48 bajtów
Hex Dump
Wypróbuj online!
To podejście brutalnej siły, podobne do Pyth Dennisa.
Wszystko po
k
prostu odczytuje dane wejściowen
do rejestru 1, a następnie tworzy listę[[1],[2,2],[3,3,3],[4,4,4,4],...]
don
n
.Następny bit do
╗
to funkcja zapisana w rejestrze 0, która bierze parę, inkrementuje oba elementy, konwertuje je na zakres, znajduje sumę zakresu i sprawdza, czy suma ta jest wartością w rejestrze 1. Jeśli tak, zwraca odpowiedni zakres, a jeśli nie, zwraca pustą listę.Część do ostatniego wystąpienia
M
mapuje funkcję na fantazyjnej liście list opisanej powyżej, wykonującenumerate
każdą listę, a następnie mapując na niej zapisaną funkcję. Kiedy to nastąpi, mamy listę list, z których każda jest pusta lub zakres, który sumuje sięn
.;░
usuwa puste listy.p@X
pobiera pierwszą listę, która pozostaje (0@E
będzie również działać).'+j
umieszcza+
między każdą liczbą, gdy konwertuje listę na ciąg znaków premii.źródło
ES6, 72 bajty
Prosty port rozwiązania awk @ Cabbie407, ale bez premii za formatowanie, ponieważ tutaj jest to kara.
źródło
Python 3,
239236215203 bajtówTo trochę kłopotliwe. Później będę musiał zagrać w golfa.
WynikaDziękik
to z faktu, że jeśli zaznaczyszt[0]
pustet
, Python wydaje ci niegrzeczny dźwięk. To znowu wymaga gry w golfa.t[:1]
, nigdy więcej niegrzecznych dźwięków! Musisz tylko porównać z inną tablicą.źródło
Galaretka , 8 bajtów (niekonkurencyjna)
Wypróbuj online!
Jeśli dobrze rozumiem, może to być wersja (11-5 = 6) bajtów:
źródło
05AB1E , 11-5 = 6 bajtów (niekonkurujące)
Biorąc ten bonus oczywiście :)
Wypróbuj online!
źródło
PHP, 70 bajtów
Uruchom jako potok z
-nR
lub spróbuj online .zwiększa,
p
dopóki nie znajdzie rozwiązania dla liczby całkowitejargument==(p+q)*(q-p+1)/2
,a następnie drukuje zakres od
p
doq
.źródło
Excel VBA, 119-5 = 114 bajtów
Sub
procedura, która pobieran
liczbę całkowitą oczekiwanego typu i wysyła najdłuższą sekwencję kolejnych liczb, które sumują się do komórki[A1]
źródło