Biorąc pod uwagę dane wejściowe n
, napisz program lub funkcję, która wypisuje / zwraca sumę sum cyfrowych n
dla wszystkich baz 1 do n
.
Przykład:
n = 5
Utwórz zakres [1...n]
:[1,2,3,4,5]
Dla każdego elementu x
uzyskaj tablicę x
cyfr podstawowych n
: [[1,1,1,1,1],[1,0,1],[1,2],[1,1],[1,0]]
bijective base- 1
of 5
is[1,1,1,1,1]
base- 2
(binarny) z 5
jest[1,0,1]
Base- 3
o 5
Is[1,2]
Base- 4
o 5
Is[1,1]
Base- 5
o 5
Is[1,0]
Zsumuj cyfry: 13
Przypadki testowe:
1 1
2 3
3 6
4 8
5 13
6 16
7 23
8 25
9 30
10 35
36 297
37 334
64 883
65 932
Sekwencję można znaleźć w OEIS: A131383
Punktacja:
code-golf : Zgłoszenie z najniższą liczbą punktów wygrywa.
227 -> 9999
. A także:1383 -> 345678
.Odpowiedzi:
Płótno , 3 bajty
Wypróbuj tutaj!
Płótno bijące galaretkę?
źródło
Haskell , 46 bajtów
Wypróbuj online!
Wyjaśnienie
Funkcja[0…b]n porządku leksykograficznym. Na przykład:
\b n -> mapM(pure[0..b])[1..n]
generuje wszystkie ciągiIndeksując w nim za pomocą1 ), ale sumujemy wyniki. Możemy nawet zapisać niektóre bajty za (n+1) zamiast obejścia dla podstawy 1 ponieważ brakuje nam [1,…,1n times] co jest takie samo jak [n] podczas sumowania.
(!!n)
tego można użyć do konwersjin
na baseb+1
, jednak to nie zadziała dla unary (base-a <- [1..n]
pomocą base-Użycie
do
-notacji po prostu łączy wszystkie listy zamiast ich zagnieżdżania:źródło
APL (Dyalog Unicode) , 14 bajtów
Wypróbuj online!
Wyjaśnienie
Niektóre nawiasy są sugerowane i można je dodać (jaśniejsze niż „oficjalne” nawiasy):
To monadyczny szczyt. Biorąc pod uwagę argument
Y
, funkcja ta zachowuje się jak:Obie funkcje są stosowane w kolejności. Zaczniemy od właściwej:
W tym pociągu są trzy funkcje, więc jest to widelec. Podany argument
Y
działa jak:Możemy łatwo
⊢
sprowadzić się do tego (monadic zwraca swój argument, stąd nazywany tożsamością ):Teraz wiemy, że
Y
jest to liczba całkowita (prosty skalar, tj. Liczba lub znak), ponieważ otrzymaliśmy jeden. Dlatego⍳Y
z⎕IO=1
zwraca1 2 ... Y
.⍳Y
faktycznie zwraca tablicę o kształcieY
(Y
musi być wektorem), gdzie każdy skalar jest indeksem samej tablicy (dlatego monadyczny⍳
nazywany jest generatorem indeksu ). Wskaźniki te są wektorami, z wyjątkiem przypadku, gdy1≡⍴Y
, w którym są skalarami (tak jest w naszym przypadku).(⍴⊤⊣)¨
Następnie przeanalizujmy środkową funkcję .⍴⊤⊣
jest operandem¨
( każdego ), a funkcja jest dyadyczna, więc¨
operator najpierw przekształci każdy argument długości-1 na kształt drugiego (to znaczy weź element i użyje go, aby zastąpić każdy skalar w drugim argumencie) , a następnie zastosuj funkcję do każdej pary dwóch argumentów. W tym przypadku⍳Y
jest wektorem iY
jest skalarem, więc jeślin≡⍴⍳Y
, toY
zostanie przekonwertowany nan⍴Y
(⍴
reprezentuje funkcje kształtu (monadyczne) i przekształcenia (dyadyczne)). Innymi słowy,Y
zostanie przekonwertowany na tablicę zawierającąY
czasyY
.Teraz dla każdej pary nazwijmy lewy argument
X
i prawyZ
(abyśmy nie kolidowali z danymi wejściowymiY
).⍴⊤⊣
jest widmowym widelcem, więc rozszerzy się do:Zróbmy pierwszy prosty krok do zredukowania
X⊣Z
doX
( funkcja lewostronna⊣
to dyadic ):⍴
WX⍴Z
to, ponownie, Reshape funkcja, więcX⍴Z
, w naszym przypadku, to po prostuX
czasyZ
.⊤
jest funkcją kodowania . Biorąc pod uwagę dwie tablice liczb, gdzie lewa tablica jest podstawą każdej cyfry w wyniku (nie musi być liczbą całkowitą ani dodatnią), tj. Kodowanie, a prawa tablica liczb, zwraca transponowaną tablicę tych liczb liczby w określonym kodowaniu (transpozycja to odwrócenie wymiarów tablicy w stosunku do jej elementów). Reprezentacja cyfry opiera się na ilorazie podziału liczby i iloczynie mniej istotnych zasad. Jeśli jakakolwiek baza jest0
, działa jako baza + ∞. Skalary argumentów są proste. PonieważX
jest dodatnią liczbą całkowitą iX⍴Z
jest wektorem równych elementów, tak naprawdę jest to tylko przypadek konwersjiX
na bazę wystarczy do naszych celów.Z
i przekształcanieX
cyfr. DlaX⍴Z
Dlatego wynikY1=[1,1,...,1]Y , a więc po prostu sumąY×1=Y . Wynika z tego, że musimy dodać
Y(⍴⊤⊣)¨⍳Y
jestY
konwertowany na każdą bazę z 1 naY
, być może z wiodącymi zerami. Jest jednak jeden problem: w APL podstawa 1 nie jest specjalnym opakowaniem, podczas gdy to wyzwanie ma szczególny przypadek, więc musimy uwzględnić sumę cyfr podstawy 1Y
. Na szczęście, ta suma jest po prostuY
, ponieważY
gdzieś do tablicy. Tak to robimy:Włączyłem już tę część tutaj. Dwójkowym
,
jest catenate funkcja, to skleja swoje argumenty na ich ostatnie osi, a błędy, jeśli nie jest to możliwe. Tutaj po prostu łączymy skalarY
z wektoremY(⍴⊤⊣)¨⍳Y
, dzięki czemu zwiększamy sumę, którą będziemy obliczaćY
, jak wyjaśniono powyżej.Ostatnia część to lewa funkcja naszego na szczycie
+/∘∊
:∘
jest operatorem tworzenia .f∘g Y
jest taki sam jakf g Y
. Jednak używamy go tutaj, aby nasz pociąg nie rozwidlał się na∊
. Możemy więc zmniejszyć:Czas na sumę, ale poczekaj ... jest problem. Tablica nie jest płaska, więc nie możemy po prostu zsumować jej elementów przed spłaszczeniem jej w pierwszej kolejności. Zaciągnąć funkcja
∊
spłaszcza tablicę. Teraz, gdy tablica została spłaszczona, w końcu używamy jej+/
do podsumowania./
jest operatorem redukcji , stosuje funkcję dyadyczną między elementami tablicy na osi od drugiej do ostatniej, z priorytetem od prawej do lewej. Jeśli ranga (liczba wymiarów, tj. Długość kształtu) tablicy nie zmniejsza się, tablica jest wówczas zamknięta, chociaż tutaj tak nie jest. Zastosowana tutaj funkcja+
to plusfunkcja, która dodaje pary na ostatnich osiach dwóch tablic (i błędy, jeśli tablic nie można dodać w ten sposób). Tutaj po prostu dodaje dwie liczby wiele razy, aby redukcja została zakończona.Oto nasz pociąg:
źródło
+/∘∊⊢,⊢⊤¨⍨⊢⍴¨⍳
Ruby ,
3937Jedynym golfem tutaj jest usunięcie białych znaków. Wypróbuj online
źródło
n
(37b):->n{(2..n).sum{|b|n.digits(b).sum}+n}
Python 2 , 57 bajtów
Wypróbuj online!
źródło
Java 8,
7665 bajtów-11 bajtów dzięki @ OlivierGrégoire .
Wypróbuj online.
Wyjaśnienie:
źródło
i
, więc ... 65 bajtów.Desmos, 127 bajtów
Desmos, 56 bajtów
źródło
^n
.\sum_{b=2}^{n+1}
don+\sum_{b=2}^n
zapisywania kolejne 2 bajtySAS,
8174 bajtówDane wejściowe są wprowadzane po
cards;
wyrażeniu, w znakach nowej linii, tak:Wysyła zestaw danych zawierający odpowiedź
s
(wraz ze zmiennymi pomocniczymi) z wierszem dla każdej wartości wejściowejNie golfowany:
źródło
Japt
-x
, 6 bajtówSpróbuj
Spróbuj
źródło
J ,
2423 bajtyWypróbuj online!
źródło
05AB1E (starsza wersja) , 5 bajtów
Wypróbuj online!
Wyjaśnienie:
W 05AB1E (starsza wersja) podstawa 1 z 5 wynosi [0,0,0,0,0], a nie [1,1,1,1,1]. Dlatego po zsumowaniu zakresu dodaj dane wejściowe, aby uwzględnić brakującą bazę 1.
Używam 05AB1E (starsza wersja), ponieważ w bieżącym 05AB1E podstawa 1 z 5 to [1]. Aby to wyjaśnić, musiałbym albo zmniejszyć wynik o 1, albo usunąć pierwszy element zakresu, z których oba kosztowałyby 1 bajt.
źródło
Perl 6 ,
4541 bajtów-4 bajty dzięki Jo Kingowi
Wypróbuj online!
źródło
Biała spacja , 153 bajty
Litery
S
(spacja),T
(tab) iN
(nowa linia) dodane tylko jako wyróżnienia.[..._some_action]
dodano tylko jako wyjaśnienie.Wypróbuj online (tylko z surowymi spacjami, tabulatorami i nowymi wierszami).
Port mojej odpowiedzi w języku Java 8 , ponieważ Whitespace nie ma żadnych wbudowanych konwersji bazowych.
Przykładowy przebieg:
input = 3
Program zatrzymuje się z błędem: nie znaleziono wyjścia. (Chociaż mógłbym dodać trzy końcowe znaki nowej linii,
NNN
aby pozbyć się tego błędu).źródło
R , 60 bajtów
Wypróbuj online!
Zawiedziony,
n>143
ponieważ144^144
jest większy niżdouble
można uzyskać. Dzięki Joshowi Ellerowi za zasugerowanie zamiany nalog(n,i)
po prostun
.Poniższe będzie działać dla
n>143
; nie jestem pewien, w którym momencie przestanie działać.R , 67 bajtów
Wypróbuj online!
Używa klasycznej
n%/%i^(0:log(n,i))%%i
metody do wyodrębnieniai
cyfrn
podstawowych dla każdej bazyb>1
, a następnie sumuje je i gromadzi sumęF
, która jest inicjowana0
, a następnie dodawanan
(podstawowa1
reprezentacjan
)F
i zwracana jest wynik. Zan=1
to przeskakuje podstaw i po prostu dodajen
się doF
.źródło
0:log(n,i)
, nie możesz użyć0:n
? Zawsze będzie co najwyżej n cyfr w reprezentacji podstawowej n, a wszystko po pierwszychlog(n,i)
cyfrach powinno wynosić 0, więc nie wpłynie to na sumę.n=144
, ponieważ143^143
jest w pobliżu1.6e308
i144^144
oceniaInf
. Dzięki!Python 2 , 61 bajtów
Wypróbuj online!
Chociaż jest to dłuższe rozwiązanie Dennisa, na którym jest oparte, uważam tę metodę za zbyt zabawną, aby się nią nie dzielić.
Celem jest powtórzenie zarówno po wykreśleniu ostatniej cyfry, jak
n->n/b
i zwiększeniu podstawyb->b+1
, ale chcemy zapobiec zwiększeniu podstawy po usunięciu jednej lub więcej cyfr. Osiąga się to poprzez uczynienie podstawyb
pływakiem, tak że po aktualizacjin->n//b
pływakb
infekujen
swoją pływalnością. W ten sposób, czyn
jest liczbą zmiennoprzecinkową, czy nie jest flagą bitową, czy usunęliśmy z niej jakieś cyfryn
.Wymagamy, aby warunek
1/n==0
został spełniony, aby powracał do inkrementacjib
, które liczby całkowiten
spełniają, ponieważ podział podłogi jest zakończony, ale liczba zmienna nie działa. (n=1
również się nie udaje, ale i tak nie chcemy się na nim powtarzać.) W przeciwnym razie zmiennoprzecinkowe działają tak jak liczby całkowite w funkcji, ponieważ staramy się dokonywać podziału podłogin//b
, a wynikiem jest liczba zmiennoprzecinkowa.źródło
C (gcc),
6756 bajtówPort mojej odpowiedzi Java 8 .
-11 bajtów dzięki golfowi @ OlivierGrégoire na mojej odpowiedzi Java.
Wypróbuj online.
Wyjaśnienie:
źródło
JavaScript (ES6), 42 bajty
Ta wersja jest prawie identyczna z moją główną odpowiedzią, ale polega na niedopełnieniu arytmetycznym, aby zatrzymać rekurencję. Najwyższa obsługiwana wartość zależy od wielkości stosu wywołań.
Wypróbuj online!
JavaScript (ES6),
51 4844 bajtówWypróbuj online!
Skomentował
źródło
APL (Dyalog Unicode) , 22 bajty
Wypróbuj online!
źródło
Łuska , 6 bajtów
Naprawdę chciałbym, że istnieje coś takiego jak
M
zacmap
:(Wypróbuj online lub przetestuj wszystko!
Wyjaśnienie
Alternatywnie 6 bajtów
Wypróbuj online lub przetestuj wszystko!
Wyjaśnienie
źródło
Pari / GP , 30 bajtów
Wypróbuj online!
źródło
Galaretka , 4 bajty
Wypróbuj online!
Jak to działa
źródło
Attache , 25 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Węgiel drzewny , 12 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Węgiel drzewny nie może przekonwertować na bazę 1, ale na szczęście suma cyfr jest taka sama jak konwersja na bazęn + 1 . Wyjaśnienie:
źródło
Retina 0.8.2 , 49 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Konwertuj na unary.
Wymień wszystkie liczby od 2 don + 1 (ponieważ jest to łatwiejsze niż konwersja podstawowa 1).
Użyj powtarzanego divmod, aby przekonwertować oryginalny numer na każdą bazę.
Usuń listę zasad, pozostawiając tylko podstawowe cyfry konwersji.
Weź sumę i przelicz na dziesiętne.
źródło
Desmos, 51 bajtów
Zainspirowany odpowiedzią Conora O'Briena i patrząc na wpis OEIS wymyśliłem własne rozwiązanie Desmos:
Wypróbuj online!
źródło
APL (NARS), 29 znaków, 58 bajtów
mały test jak używać:
źródło