Jesteśmy przyzwyczajeni do terminu „kwadrat” n, co oznacza obliczanie n 2 . Jesteśmy przyzwyczajeni do terminu „kostkowanie” n, co oznacza n 3 . Biorąc to pod uwagę, dlaczego nie moglibyśmy również trójkątować liczby?
Jak trójkątować liczbę?
Po pierwsze, niech wybrać numer
53716
.Ustaw go na równoległoboku, którego długość boku jest równa liczbie cyfr liczby, i ma dwa boki ustawione po przekątnej, jak pokazano poniżej.
53716 53716 53716 53716 53716
Teraz chcemy to zrobić, prawda? Aby to zrobić, przytnij boki, które nie pasują do trójkąta prostokątnego:
5 53 537 5371 53716
Weź sumy z każdego wiersza, w tym przykładzie wynikiem jest
[5, 8, 15, 16, 22]
:5 -> 5 53 -> 8 537 -> 15 5371 -> 16 53716 -> 22
Zsumuj listę
[5, 8, 15, 16, 22]
, w wyniku czego66
. To jest trójkąt tej liczby!
Specyfikacje i zasady
Wejście będzie nieujemną liczbą całkowitą n ( n ≥ 0, n ∈ Z ).
Możesz przyjmować dane wejściowe i dostarczać dane wyjściowe dowolnymi dozwolonymi środkami .
Dane wejściowe mogą być sformatowane jako liczba całkowita, ciąg znaków reprezentujący liczbę całkowitą lub listę cyfr.
Domyślne luki zabronione.
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach!
Więcej przypadków testowych
Wejście -> Wyjście 0 -> 0 1 -> 1 12 -> 4 123 -> 10 999 -> 54 100000 -> 6 654321 -> 91
Inspiracja. Wyjaśnienia są zachęcane!
źródło
645321 -> 91
?645321
zamiast654321
.Odpowiedzi:
Haskell , 13 bajtów
Wypróbuj online!
Pobiera dane jako listę cyfr. Oblicza łączne sumy, a następnie je sumuje.
źródło
Łuski ,
42 bajtyDzięki @ H.PWiz za
-2
bajty!Wypróbuj online!
„Ungolfed” / Wyjaśnione
źródło
Brain-Flak ,
65, 50,36 bajtówWypróbuj online!
Po wielu poprawkach jestem teraz bardzo dumny z tej odpowiedzi. Podoba mi się algorytm i to, jak ładnie można go wyrazić w uderzeniu mózgu.
Większość bajtów pochodzi z obsługi zer na wejściu. W rzeczywistości, gdybyśmy mogli założyć, że na wejściu nie było zer, byłaby to pięknie krótka 20-bajtowa odpowiedź:
Wypróbuj online!
Niestety, atak mózgu jest znany z niewłaściwego postępowania z przypadkowymi przypadkami.
Wyjaśnienie
Najpierw moja obserwacja:
Jeśli wejście ma długość n cyfr, pierwsza cyfra pojawi się w trójkącie n razy, druga cyfra pojawi się n-1 razy i tak dalej na ostatniej cyfrze, która pojawi się raz. Możemy to wykorzystać, ponieważ naprawdę łatwo jest obliczyć, ile cyfr wejścia pozostało w wyładowaniach mózgu, a mianowicie
Oto jak działa kod.
źródło
Pyth -
64 bajtówWypróbuj online tutaj .
Ładny 6 bajtowy, który nie używa wbudowanego prefiksu:
źródło
s.e*bhk_
MATL , 3 bajty
Wypróbuj online!
Pobiera dane wejściowe jako listę cyfr.
źródło
Galaretka , 3 bajty
Wypróbuj online! Używa tej samej techniki, co moja odpowiedź Japt: sumowanie sumy, a następnie suma.
źródło
Haskell , 25 bajtów
Pobiera dane wejściowe jako listę cyfr
Wypróbuj online!
Haskell , 41 bajtów
Pobiera dane wejściowe jako ciąg znaków
Wypróbuj online!
źródło
Japt ,
764 bajtówWypróbuj online!
Wyjaśnienie
Stare rozwiązanie:
Wypróbuj online!
Wyjaśnienie
źródło
Brain-Flak , 28 bajtów
Wypróbuj online!
14 bajtów, jeśli nie musimy obsługiwać zer (co robimy)
Wypróbuj online!
DJMcMayhem ma fajną odpowiedź tutaj którą powinieneś sprawdzić. Niestety dla niego nie zamierzałem pozwolić mu wygrać we własnym języku: P.
Jak to działa?
Zacznijmy od prostej wersji.
Główna akcja polega na
({}<>{})<>
tym, że bierze górę lewego stosu i dodaje do góry prawego stosu. Poprzez zapętlenie tej operacji sumujemy bieżący stos (aż osiągnie zero), umieszczając sumę na stosie wyłączonym. To dość przyziemne, interesujące jest to, że podsumowujemy wyniki wszystkich tych biegów jako nasz wynik. To obliczy żądaną wartość. Czemu? Cóż, spójrzmy na przykład123
. Przy pierwszym chwycie otrzymujemy 1, więc nasza wartość wynosi 1Przy następnym chwycie zwracamy 1 plus 2
W ostatnim biegu mamy wszystkie trzy razem
Czy widzisz trójkąt? Suma wszystkich przebiegów to „trójkąt” listy.
Ok, ale teraz potrzebujemy go do zerowania, tutaj użyłem tej samej sztuczki co DJMcMayhem, a także trochę fantazyjnej pracy nóg. Zamiast zapętlać, aż osiągniemy zero, zapętlamy, aż stos będzie pusty.
Następnie użyłem tej wskazówki , napisanej przez nikogo innego, jak naprawdę, do gry w golfa na kolejne 2 bajty.
Mamy to. Byłbym zaskoczony, gdyby istniało krótsze rozwiązanie, ale z drugiej strony wydarzyły się dziwniejsze rzeczy.
źródło
Unfortunately for him I wasn't about to let him win at his own language :P
Nie oczekuję niczego od ciebie. : DJavaScript (ES6), 28 bajtów
Pobiera dane wejściowe jako listę cyfr.
źródło
Python 3 , 37 bajtów
Wypróbuj online!
źródło
len
, abysum
tak dobrze, choć nie wierzę, że pomaga nic.sum([])
jest to 0, ale nic się nie łączyło ... może być jednak jakiś sposóbC # (.NET Core) , 59 bajtów
Wypróbuj online!
Zasadniczo różni się od innych odpowiedzi w języku C #. Dane wejściowe to lista cyfr. Wszystkie przypadki testowe zawarte w łączu TIO.
Mógłby zapisać kilka bajtów, jeśli pozwoliłoby to na wejście jako wsteczną listę cyfr z wiodącymi 0.
źródło
number
, a nie lista cyfr?Python 3 , 35 bajtów
Właśnie zauważyłem, że to naprawdę niewielki golf odpowiedzi Business Cat !
Wypróbuj online!
źródło
J , 7 bajtów
Wypróbuj online! Pobiera listę cyfr, takich jak
f 6 5 4 3 2 1
.Wyjaśnienie
Nieco bardziej prawdziwy byłby pierwotny problem
[:+/@,]/
, którym są „suma” (+/
) spłaszczone (,
) przedrostki input (]\
).źródło
Vim ,
605932 naciśnięcia klawiszyWielkie dzięki @CowsQuack za wskazówkę z rekurencyjnym makrem i
h
podstępem, dzięki temu zaoszczędziłem 27 bajtów!Wypróbuj online!
Ungolfed / Explained
Spowoduje to zbudowanie trójkąta zgodnie z opisem (tylko, że będzie on wyrównany do lewej):
Bufor wygląda teraz tak:
Połącz wszystkie linie w jedną i zbuduj z niej wyrażenie, które można ocenić:
"
Rejestr zawiera teraz ciąg następujących (uwaga brakuje 0):Więc wszystko, co musimy zrobić, to dodać zero i ocenić to:
źródło
&
(cały mecz) zamiast\1
w poleceniu zastępczymqqYp$xq:exe"norm".col('.')."@q"⏎
może zostaćqqYp$xh@qq@q
. To rekurencyjne makro napotka błąd przełamania, gdy w linii będzie jeden znak, po którym się zatrzyma.:s/./&+/g
.:%j⏎
Może się również staćV{J
. IDi
może się staćC
(skomentowałem już to w innej odpowiedzi Vima). Wypróbuj online!Python 2 ,
4945 bajtów-4 bajty dzięki Mr. Xcoder.
Wypróbuj online!
Pobiera dane wejściowe jako listę cyfr.
źródło
Narzędzia Bash + GNU,
3224Wejście odczytane ze STDIN.
Aktualizacja: Widzę, że dane wejściowe mogą być podane jako lista cyfr. Moja lista wprowadzania jest rozdzielana znakiem nowej linii.
Wypróbuj online .
Wyjaśnienie
źródło
APL, 4 bajty
Pobiera to dane wejściowe jako listę cyfr, np .:
Wyjaśnienie
źródło
Taxi , 1478 bajtów
Wypróbuj online!
Bez golfa:
źródło
Perl 5 , 19 + 1 (
-p
) = 20 bajtówWypróbuj online!
W jaki sposób?
$ \ zawiera łączną sumę, $ p zawiera sumę cyfr w bieżącym wierszu. Każda linia równoległoboku jest po prostu poprzednią linią z dołączoną kolejną cyfrą liczby. Jest to zatem suma poprzedniego wiersza plus nowa cyfra. To iteruje wszystkie cyfry, obliczając sumy w miarę upływu czasu. Rzeczywiste zastąpienie jest nieistotne; to tylko sposób na iterację cyfr bez tworzenia rzeczywistej pętli. Na koniec $ \ jest wypisywane domyślnie przez
-p
opcję.źródło
Python 2 , 56 bajtów
Wypróbuj online!
źródło
Galaretka ,
54 bajtówMonadyczny link pobierający listę cyfr dziesiętnych i zwracający trójkąt liczby reprezentowanej przez tę listę.
Wypróbuj online!
W jaki sposób?
źródło
€
nadal będzie działać. Szkoda ...Siatkówka , 13 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Objaśnienie: Pierwszy etap generuje wszystkie prefiksy oryginalnej liczby, drugi etap konwertuje każdą cyfrę na unarną, a trzeci etap przyjmuje sumę.
źródło
Mathematica, 49 bajtów
źródło
#.Range[Length@#,1,-1]&
#.Range[Tr[1^#],1,-1]&
Tr@*Accumulate
Neim , 3 bajty
Wyjaśnienie:
Wypróbuj online!
Alternatywna odpowiedź:
Wyjaśnienie:
Wypróbuj online!
źródło
Java 8, 53 bajty
Zaimplementowałem lambda dla każdego akceptowalnego typu wejścia. Każda z nich iteruje cyfry numeru, dodając odpowiednią wielokrotność każdego z nich do akumulatora.
Liczba całkowita jako wejście (53 bajty)
Lambda od
Integer
doInteger
:Reprezentacja ciągu jako danych wejściowych (72 bajty)
Lambda od
String
doInteger
:Tablica cyfr jako dane wejściowe (54 bajty)
Lambda od
int[]
(cyfr, pierwsza największa wartość miejsca) doInteger
:źródło
Pyt ,
96 bajtówWyjaśnienie:
źródło
Python 3,
945854 bajtówDzięki panu Xcoderowi za pomoc w zaoszczędzeniu sporo bajtów!
Wypróbuj online!
Pobiera dane wejściowe jako ciąg. Po prostu mnoży każdą cyfrę przez liczbę razy, kiedy trzeba ją dodać, i zwraca ich sumę.
źródło
0
. Jeślip
zawsze musi tak być0
, powinieneś wymienićp
zep=0
wlambda
deklaracji. Możesz jednakp
całkowicie usunąć, aby uzyskać 54 bajtySNOBOL4 (CSNOBOL4) , 79 bajtów
Wypróbuj online!
Wejście ze standardowego wejścia, wyjście na standardowe wyjście.
źródło
Common Lisp,
5352 bajtyWprowadź jako listę cyfr.
Wypróbuj online!
-1 bajt dzięki @ceilingcat.
źródło
apply
zostaną zastosowane wobec bardzo długich list z powoducall-arguments-limit
.