Konwertuj liczbę na sumę cyfr
Żadna suma: potrzebujemy najkrótszej sumy
Żadnych cyfr: możesz użyć tylko cyfr liczby
Przykład
Otrzymasz dane wejściowe jako liczbę całkowitąn>0
Powiedzmy Chodźmy n=27
. Musisz wyrazić 27
jako sumę , używając tylko cyfr [2,7]
, w możliwie najkrótszy sposób. Nie musisz używać wszystkich cyfr podanego numeru!
Tak 27=2+2+2+7+7+7
. Następnie wziąć te cyfry i liczyć je : [2,2,2,7,7,7]
.
Ostateczna odpowiedź na n=27
to pytanie to6
Jeszcze jeden przykład n=195
, aby uzyskać najkrótszą sumę, musimy użyć następujących cyfr:
[5,5,5,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9]
i odpowiedź brzmi23
Wyzwanie
Podając liczbę całkowitą n>0
, wypisz minimalną liczbę cyfr (zawartych w liczbie), które sumują się do tej liczby
Przypadki testowe
Input->Output
1->1
2->1
10->10
58->8
874->110
1259->142
12347->1765
123456->20576
3456789->384088
To jest golf golfowy. Najkrótsza odpowiedź w bajtach wygrywa!
Odpowiedzi:
Łuska , 12 bajtów
Bardzo szybko radzi sobie z cyframi dwucyfrowymi. Wypróbuj online!
Wyjaśnienie
źródło
Pyth , 12 bajtów
Wypróbuj online!
Niestety błędy pamięci na wejściach tak duże jak
58
.Wyjaśnienie
źródło
./
lef<.{TjQ;./
(filtr - odpowiedni podzbiór - cyfr wejściowych)Mathematica, 78 bajtów
znajduje ostatni przypadek testowy za 5 sekund
źródło
Length@IntegerPartitions[#, All, Sort@DeleteCases[0]@IntegerDigits@#, 1][[1]] &
R , 78 bajtów
Wypróbuj online! (wersja golfowa)
Algorytm czystej brutalnej siły, więc tak naprawdę nie rozwiązuje wszystkich przypadków testowych i myślę, że próbował przeznaczyć 40 000 GB na ostatni przypadek testowy ...
T
w R domyślnie,1
więc otrzymujemy błąd off-by-one, który naprawiamy na etapie powrotu, ale otrzymujemy również,F
które domyślne,0
które się opłacają.wyjaśnienie bez golfa:
Wypróbuj online! (mniej golfowa wersja)
źródło
Python 2,
168155144 bajtówTo nie jest najkrótszy, jaki może być, ale najlepiej na początku i nie jest tak naprawdę zły, jeśli chodzi o środowisko uruchomieniowe.
Chodzifilter(None...
o usunięcie 0 jako cyfry, co nauczyłem się, że mogę to zrobić.Największym problemem są ramki stosu Pythona, które realistycznie nie pozwalają mi uruchamiać tego na największych wejściach. Tak więc, to nie jest prawidłowe rozwiązanie, tak naprawdę, bawiłem się ze zwiększeniem limitu rekurencji, co właśnie doprowadziło do błędów seg. Trzeba to zrobić albo za pomocą pętli i stosu, albo ze znacznie większą sprytnością, aby pracować w Pythonie.
edycja: Podziękowania dla Cairna i Chasa Browna za 13 bajtów!
źródło
input
i wymagać, aby dane wejściowe były otoczone cudzysłowami.filter(None,sorted(map(int,set(n)))[::-1])
jesorted(set(map(int,n))-{0})[::-1]
(chociażNone
sprawa jest całkiem przyjemna).filter(len,...)
do list i ciągów orazfilter(abs,...)
do liczb całkowitych i liczb zmiennoprzecinkowych.Łuska , 13 bajtów
Całkiem nieefektywne
Wypróbuj online!
źródło
JavaScript (ES6), 82 bajty
Pobiera dane wejściowe jako ciąg.
źródło
1/0
?f=
początku jest duża wskazówka, ponieważ nie potrzebujesz jej do nierekurencyjnych lambdas.Rubinowy , 70 bajtów
Bardzo powoli, wypróbuj wszystkie możliwe kombinacje, zwiększając rozmiar, aż dojdziemy do rozwiązania.
Dzięki Dennis za Ruby 2.4 w TIO.
Wypróbuj online!
źródło
Galaretka , 23 bajty
Wypróbuj online!
Jest to tak nieefektywne, że nie działa dla przypadków testowych po trzecim w TIO ze względu na limit czasu> _ <
Wszelkie wskazówki dotyczące gry w golfa są mile widziane!
źródło
Python 2 ,
183176172166161 bajtówWypróbuj online!
Dłuższy niż druga odpowiedź w języku Python, ale wykonuje wszystkie przypadki testowe łącznie plus
987654321
w ciągu sekundy w TIO.Wykorzystuje fakt, że jeśli
d1<d2
są cyframi, tod2-1
d1
w sumie musi być co najwyżej ich liczba (ponieważd2
instancjed1
można zastąpićd1
instancjamid2
na krótszą sumę). Tak więc, sortując cyfry w porządku rosnącym, istnieją „tylko” co najwyżej9! = 362880
możliwe sumy do rozważenia; i maksymalna głębokość rekurencji9
(niezależnie od wartościn
).źródło
Haskell , 91 bajtów
Wypróbuj online! Przykładowe użycie:
f 58
daje8
. Szybkie dla liczb dwucyfrowych, strasznie wolne dla większych wejść.Funkcja
f
konwertuje liczbę wejściowąn
na listę cyfr podczas odfiltrowywania zer. Następnie ta lista in
sama są przekazywane do(#)
funkcji, która zwraca listę singletonów.!!0
zwraca element tej listy singletonów.(#)
używa singleton i pustych list jako typu opcji. Biorąc pod uwagę znak „n=58
i”s=[5,8]
, należy odjąć wszystkie cyfrys
odn
, a następnie zastosować rekurencyjnie(#)
i sprawdzić, która cyfra spowodowała minimalną liczbę kroków, i zwrócić jeden plus to minimum jako wynik. Pierwsza część jest obliczana przez(s#).(n-)=<<s
, który jest taki sam jakconcat(map(s#)(map(n-)s))
. Tak więc w naszym przykładzie najpierw[58-5,58-8]
jest obliczana, a następnie[[5,8]#53,[5,8]#50]
wyniki w[[7],[7]]
lub[7,7]
późniejconcat
. Wynik jest dopasowywany do wzorca,x:m
aby upewnić się, że lista zawiera co najmniej jeden element (minimum
inaczej kończy się niepowodzeniem), a następnie lista singletonów 1 plus minimum wyniku jest ponownie strojona. Jeślin
było mniejsze zero lub wywołanie rekurencyjne zwróciło pustą listę, znajdujemy się w niedziałającej gałęzi wyszukiwania i zwracana jest pusta lista. Jeślin==0
oddział się powiódł i[0]
jest zwracany.Haskell , 101 bajtów
Wypróbuj online! O wiele bardziej wydajne podejście, sprawdza wszystkie przypadki testowe w ciągu jednej sekundy.
Tym razem lista cyfr wejścia jest obliczana w kolejności malejącej, co pozwala
(#)
próbować używać największej cyfry tak często, jak to możliwe, a następnie drugiej największej, i tak, aż do znalezienia rozwiązania. Pierwsze znalezione w ten sposób rozwiązanie jest również zapewnione jako najmniejsze.źródło