Kierunki
Napisz program, który podając liczbę całkowitą wejściową n ( n >= 0
), wypisuje najmniejszą dodatnią liczbę całkowitą m, gdzie:
n = a[1]^b[1] + a[2]^b[2] + a[3]^b[3] + ... + a[k]^b[k]
a
ib
są skończonymi sekwencjami o tej samej długości- wszystkie elementy
a
są mniejsze niżm
- wszystkie elementy
b
są mniejsze niżm
- wszystkie elementy
a
są różne i liczb całkowitycha[x] >= 0
- wszystkie elementy
b
są różne i liczb całkowitychb[x] >= 0
a[x]
ib[x]
oba nie są równe 0 (ponieważ 0 ^ 0 jest nieokreślone)
To jest golf golfowy , więc wygrywa najmniej bajtów.
Przykłady
In 0 -> Out 1
Possible Sum:
In 1 -> Out 2
Possible Sum: 1^0
In 2 -> Out 3
Possible Sum: 2^1
In 3 -> Out 3
Possible Sum: 2^1 + 1^0
In 6 -> Out 4
Possible Sum: 2^2 + 3^0 + 1^1
In 16 -> Out 5
Possible Sum: 2^4
In 17 -> Out 4
Possible Sum: 3^2 + 2^3
In 23 -> Out 6
Possible Sum: 5^1 + 3^0 + 2^4 + 1^3
In 24 -> Out 5
Possible Sum: 4^2 + 2^3
In 27 -> Out 4
Possible Sum: 3^3
In 330 -> Out 7
Possible Sum: 6^1 + 4^3 + 3^5 + 2^4 + 1^0
code-golf
number
arithmetic
kukac67
źródło
źródło
m<2
następniem<3
następniem<4
itd aż znajdę pewną sumę, która jest równan
. Pomyślałem też o tym, żeby suma0
nie zawierała żadnych terminów, ale jaka jest wynik? m>?n = a[1]^b[1] + a[2]^b[2] + ... + a[k]^b[k]
.a
ib
są skończonymi sekwencjami długości0
, więc nie ma liczby całkowitej,m
która nie spełnia ograniczeń, a ponieważ nie ma najmniejszej liczby całkowitej, odpowiedź nie jest zdefiniowana. Możliwe poprawki polegałyby na zapytaniu o najmniejszą liczbę naturalnąm
(w takim przypadku powinieneś zmienić tam oczekiwaną odpowiedź0
) lub o najmniejszą dodatnią liczbę całkowitąm
.Odpowiedzi:
GolfScript (59 znaków)
Demo online
Używa rekurencji, aby wyliczyć wartości osiągalne dla danej
m
i szuka pierwszej,m
która działa. Jest lekko inspirowany odpowiedzią xnor, ale różni się implementacją.Sekcja
źródło
Python, 120
Ta funkcja
f
jest funkcją pomocniczą, która sprawdza, czy nien
może być wyrażona jako suma mocy o odrębnych podstawach i wykładnikach . Wykorzystuje naturalną strategię rekurencyjną: musi być niezerowa, a my próbujemy każdego możliwego wyboru podstawy i wykładnika i wszystkie one muszą zawieść. Usuwamy je z dozwolonych list i zmniejszamyA
B
n
n
o odpowiednią kwotę.Ta funkcja
g
jest główną funkcją. Szuka tego,m
który działa.M
to zestaw dozwolonych wartości dom-1
. Usuwamy0
z dozwolonych wykładników, aby zatrzymać0**0
(które Python ocenia na 1) przed użyciem. To nic nie boli, ponieważ0**x
jest bezużyteczne0
dla wszystkich innychx
.źródło
n and all()
nan*all()
.Python 2, 138 bajtów
(Dzięki @Jakube za wszystkie wskazówki)
Nigdy się tak dużo nie nauczyłem
itertools
module, jak z tego jednego pytania. Ostatni przypadek zajmuje około minuty.Zaczynamy od wyszukiwania
m = 1
i zwiększania, aż do uzyskania rozwiązania. Aby sprawdzić rozwiązanie, powtarzamy:k = 0 to m-1
, gdziek
jest liczba terminów w rozwiązaniu[0, 1, ... m-1]
rozmiarzek
), a następnie zsumowanie i sprawdzenie, czy mamyn
Pamiętaj, że iterujemy
k
dom-1
- nawet jeśli techniczniem
warunki są w sumie możliwe, zawsze istnieje rozwiązanie zm-1
warunkami, które0^0
są niedozwolone i0^b
nic nie wnoszą. Jest to w rzeczywistości ważne, ponieważ0^0
Python traktuje je jako 1, co wydaje się problemem, ale okazuje się, że nie ma to znaczenia!Dlatego.
Załóżmy, że rozwiązanie znalezione błędnie używa
0^0
jako 1, np3^2 + 1^1 + 0^0 = 11
. Ponieważ generujemy tylko dom-1
warunków, muszą istnieć takiej
, których nie używamy jako podstawy (tutajj = 2
). Możemy zamienić podstawową 0 na,j
aby uzyskać prawidłowe rozwiązanie tutaj3^2 + 1^1 + 2^0 = 11
.Gdybyśmy powtórzyć do wszystkich
m
kategoriach, a następnie możemy zdobyć niewłaściwych rozwiązań jakm = 2
dlan = 2
pośrednictwem0^0 + 1^1 = 2
.źródło
imap(pow,C,D) ... for C,D in
itertools
w trakcie, gdy mówimy: PI już ma kolejny zapis -tee
.imap
, skoro jestmap
? -1 bajttee
to jużn=2
. Oszczędza 2 bajty.map
więcej niż jednej iteracji, a tak naprawdę to pytanie przyniosło mi wiele nowości.GolfScript (
9084 bajtów)Demo online
Sekcja
Najbardziej elegancką sztuczką jest obsługa specjalnego etui
0
.źródło
Haskell,
143130Przykład użycia:
p 23
->6
.Jest to proste wyszukiwanie brutalnej siły. Dla każdej listy
[0..0], [0..1], [0..2] ... [0..∞]
weź wszystkie początkowe segmenty permutacji (np. [0..2]: permutacje:,[012], [102], [210], [120], [201], [021]
początkowe segmenty dla 1. permutacji:,[0], [01], [012]
2.:[1], [10], [102]
itd.). Dla każdej kombinacji 2 z tych list oblicz sumę mocy. Zatrzymaj się, gdy pierwszy będzie równy n.źródło
>>=
raczej użyć niżconcatMap
. są takie same, ale z odrzuconymi argumentami.Python: 166 znaków
Wyjaśnienie
Funkcja
f
tworzy wszystkie możliwe liczby całkowite, które można wyrazić jako sumę potęg liczb wr
. Jeśli zaczyna się odr = [0]
. Jeśli którakolwiek z tych liczb całkowitych jest równan
, zwraca długośćr
, w przeciwnym razie wywołuje się rekurencyjnie z rozszerzeniemr
.Obliczanie wszystkich liczb całkowitych, które można wyrazić jako sumę, odbywa się za pomocą dwóch pętli. Pierwsza pętla to ta
for j in r
, która mówi nam o długości wyrażenia (2 ^ 3 + 1 ^ 2 ma długość 2). Wewnętrzna pętla przechodzi przez wszystkie kombinacje permutacjir
długościj
. Dla każdego obliczam sumę mocy.źródło
JavaScript (ES6) 219
224Funkcja rekurencyjna. Zaczynając od m = 1, wypróbowuję wszystkie kombinacje liczb całkowitych 1..m dla zasad i 0..m dla wykładników (0 podstawa jest bezużyteczna, biorąc pod uwagę 0 ^ 0 == niezdefiniowany).
Jeśli nie znaleziono rozwiązania, zwiększ m i spróbuj ponownie.
Specjalny przypadek dla wejścia 0 (moim zdaniem i tak jest to błąd w specyfikacji)
Funkcja C rekurencyjnie generuje wszystkie kombinacje z tablicy o podanej długości, dzięki czemu
Trzeci poziom
every
służy do skompresowania tablicy a podstaw i b wykładników (zip
w JavaScript nie ma żadnej funkcji). Używanie,every
aby zatrzymać wcześnie, gdy istnieje rozwiązanie nie wykorzystujące wszystkich elementów w dwóch tablicach.Testuj w konsoli FireFox / FireBug
Wynik
źródło