Wejście:
Dodatnia liczba całkowita n składająca się z cyfr z zakresu 0–9 .
Wyzwanie:
Jeśli d jest najwyższą cyfrą w liczbie całkowitej, załóż, że podstawą liczby jest d + 1 . Np. Jeśli liczba całkowita wynosi 1256 , to zakładasz, że jest ona w bazie-7 , jeśli jest to 10110, to założysz, że jest to podstawa-2 (binarna), a jeśli jest to 159, to jest dziesiętna.
Teraz wykonaj następujące czynności, aż albo: 1: osiągniesz liczbę całkowitą podstawową 10 , albo 2: osiągniesz jednocyfrową liczbę całkowitą.
- Przelicz liczbę całkowitą z base- (d + 1) na base-10
- Znajdź podstawę tej nowej liczby całkowitej (ponownie, base- (d + 1), gdzie d jest najwyższą cyfrą w nowym numerze)
- Przejdź do kroku 1 .
Przykłady:
Załóżmy, że dane wejściowe to n = 413574 . Najwyższa cyfra d = 7 , więc jest to podstawa-8 (ósemkowa). Konwertuj to na dziesiętne i otrzymaj 137084 . Najwyższa cyfra d = 8 , więc jest to podstawa-9 . Konwertuj to na dziesiętne i otrzymaj 83911 . Najwyższa cyfra to 9 , więc jest to liczba dziesiętna i przestajemy. Dane wyjściowe wynoszą 83911 .
Załóżmy, że dane wejściowe to n = 13552 . Najwyższą cyfrą jest d = 5 , więc jest to podstawa-6 . Przelicz to na dziesiętne i otrzymaj 2156 . Najwyższa cyfra d = 6 , więc jest to podstawa-7 . Przelicz to na dziesiętne i otrzymaj 776 . Najwyższą cyfrą jest d = 7 , więc jest to podstawa-8 . Przelicz to na dziesiętne i otrzymaj 510 . Najwyższą cyfrą jest d = 5, więc jest to podstawa-6 . Przelicz to na dziesiętne i uzyskaj 186 . Najwyższa cyfra to 8 , więc jest to podstawa-9 . Przelicz to na dziesiętne i otrzymaj 159. Najwyższa cyfra to 9 , więc jest to liczba dziesiętna i przestajemy. Dane wyjściowe wynoszą 159 .
Załóżmy, że dane wejściowe to n = 17 . To da nam 15 , następnie 11 , a następnie 3 , które wyprowadzimy, ponieważ jest to jedna cyfra.
Przypadki testowe:
5
5
17
3
999
999
87654321 (base-9 -> 42374116 in decimal -> base-7 -> 90419978 in decimal)
9041998
41253 (5505 -> 1265 -> 488 -> 404 -> 104 -> 29)
29
Uwagi:
- Standardowe zasady dotyczące We / Wy, luk itp. Dane wejściowe można traktować jako ciąg znaków
- Wyjaśnienia są zachęcane
- Możesz użyć wbudowanych poleceń konwersji bazy
- Rozwiązania, które nie używają wbudowanych funkcji konwersji języka (jeśli istnieją) są mile widziane, nawet jeśli kończą znacznie dłużej niż oczywiste podejście przy użyciu funkcji wbudowanych.
Najwyraźniej jest to OEIS A091047 .
źródło
Odpowiedzi:
Mathematica, 56 bajtów
Wypróbuj online! (Korzystanie z matematyki.)
Myślałem, że sprawdzę, jak wygląda sekwencja:
A oto wykres liczby kroków, które należy wykonać, aby znaleźć wynik:
(Kliknij, aby wyświetlić większe wersje. Zobacz historię zmian dla wykresów tylko do n = 1000 ).
Wygląda na bardzo interesującą mieszankę wielkoskalowej struktury i drobnego chaosu. Zastanawiam się, co słychać przy szerszych lukach między 30 000 a 60 000.
źródło
9
, więc są już w bazie 10. Ale dla 30k i 60k wydaje się, że liczby z 8 lub nawet 7 (musiałyby check) zamiast tego 9 zawsze staje się bazą 10 po co najwyżej jednym kroku.Java 8,
17216616315215114013811611499 bajtówPobiera dane wejściowe jako
String
.-64 bajty dzięki @ OlivierGrégoire . I tutaj myślałem, że mój początkowy 172 nie był taki zły ...;)
Wypróbuj tutaj.
Wyjaśnienie:
źródło
s->{for(Integer b=0;b<10&s.length()>1;)s=""+b.valueOf(s,b=s.chars().max().getAsInt()-47);return s;}
. Usunąłem także większość moich komentarzy, ponieważ są one całkowicie nieistotne (b
jest to podstawa, twojaa
is
liczba, nad którą pracujemy).Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c(""+b.valueOf(s,b));
(88), ale jestem zupełnie nowy w kodowaniu golfa. To jest fragment, prawda? Czy istnieje sposób zadeklarowania tego jako metody bez potrzeby dodawaniapublic String c(String s)
?public
, ale obawiam się, że rzeczywiście będziesz musiał go używaćString c(String s){}
do wywołań rekurencyjnych, nawet w Javie 8. Kiedy utworzysz lambda za pomocąjava.util.function.Function<String, String> c=s->{Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c.apply(""+b.valueOf(s,b));}
lub interfejsu używającegointerface N{String c(String s);}N n = s->{Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:n.c(""+b.valueOf(s,b));};
go, podasz inicjator błąd ”w obu przypadkach. Ale jednak bardzo miłe podejście!Pyth, 9 bajtów
Zestaw testowy
Wyjaśnienie:
źródło
Q
iQ
, rozumiem.u
bez trzeciego wejścia stosuje się do powtórzenia, podczas gdy przy trzecim wejściu stosuje się określoną liczbę razy.u
lambda maG
iH
, ale nie musisz jej używaćH
.G
goH
miałoby ten sam wynik ... zmienna domyślna btw jestG
?G
tak.H
zlicza od 0 przy każdej iteracji, więc jest zupełnie inna. Nie jestem do końca pewien, o czym mówisz. Oto przykładowy program pokazujący, co się dzieje: pyth.herokuapp.com/…JavaScript (ES6),
63 57 5453 bajtówZaoszczędź 8 bajtów dzięki Shaggy i Dom Hastings
źródło
+a>9||b<9
i odwrócić trójskładnik.f=n=>n>9&&(k=Math.max(...n+"")+1)<10?f(parseInt(n,k)):n
Python 3 ,
91 78 76 7573 bajtów@Emigna straciła 5 bajtów. @FelipeNardiBatista zapisał 1 bajt. @ RomanGräf zapisał 2 bajty
Wypróbuj online!
Wyjaśnienie
źródło
05AB1E ,
105 bajtów5 bajtów zaoszczędzonych dzięki Magic Octopus Urn
Ponieważ przy dużych nakładach szybkość ta rośnie bardzo szybko, zostawiam tutaj starszą, znacznie szybszą wersję do testowania. Algorytm jest taki sam, różni się tylko liczba iteracji.
Wypróbuj online!
Wyjaśnienie
źródło
тFZ>ö§
? Widzisz, jak liczba iteracji ( jak widać tutaj ) wydaje się plateau? Jeśli chcesz uzyskać techniczne, tempo, w którym iteracje rosną, jest prawdopodobnie logarytmiczne ... Więc możesz po prostu użyć czegoś takiego:DFZ>ö§
i stwierdzić, że nie będzie działać na dużą skalęn
. LUB może nawet:T.n>FZ>ö§
bezpośrednio obliczyć liczbę iteracji jakolog_10(n)
.F§Z>ö
powinna załatwić sprawę.§
.§
,Z
weźmie najwyższą liczbę na stosie zamiast najwyższej cyfry na górze stosu.APL (Dyalog) ,
2016 bajtówBierze i zwraca ciąg znaków
(
…)⍣≡
Zastosuj następującą funkcję, aż dwa kolejne terminy będą identyczne:⍎¨
wykonaj każdy znak (zamienia ciąg znaków na listę liczb)(
…)
Zastosuj do tego następującą milczącą funkcję:⌈/
znajdź maksimum argumentu1+
Dodaj jeden⊢⊥⍨
oceń argument w tej bazie⍕
format (stringify, w ramach przygotowań do kolejnego zastosowania funkcji zewnętrznej)Wypróbuj online!
źródło
Rubinowy ,
6056 bajtówWypróbuj online!
źródło
Mathematica, 52 bajty
Czysta funkcja przyjmująca nieujemną liczbę całkowitą jako dane wejściowe i zwracająca nieujemną liczbę całkowitą. Wykorzystuje tę samą podstawową mechanikę,
FromDigits[s=IntegerDigits@#,Max@s+1]
co odpowiedź Jenny_mathy , ale wykorzystuje sięFixedPoint
do wykonania iteracji.źródło
Perl 6 , 49 bajtów
Sprawdź to
Rozszerzony:
źródło
PHP , 71 bajtów
Wypróbuj online!
źródło
Pip , 17 bajtów
Pobiera dane wejściowe jako argument wiersza polecenia. Wypróbuj online!
Wyjaśnienie
To była zabawa - musiałem wyciągnąć operatory porównania łańcuchów.
Chcemy zapętlać, dopóki liczba nie będzie jednocyfrowa LUB zawiera 9. Równoważnie, chcemy zapętlać, gdy liczba jest wielocyfrowa ORAZ nie zawiera 9. Równoważnie, zapętlać, gdy liczba jest większa niż 9 ORAZ maksymalna cyfra to mniej niż 9:
a>9>MXa
.źródło
Python 2 ,
60595653 bajtówZaoszczędzono 4 bajty dzięki Felipe Nardi Batista
Zaoszczędzono 3 bajty dzięki ovs
Wypróbuj online!
Za pomocą rekurencyjnej lambda, porównując wynik konwersji podstawowej z poprzednią iteracją.
źródło
x==y and x or ...
jakx
nigdy nie będzie0
(baza 1). a nawet(x==y)*x or ...
x and x==y or ...
co nie zadziałało, ale nie jestem zbyt biegły w tych sztuczkach, więc nie zdawałem sobie sprawy, że mogę to odwrócić :)C #,
257244243244233222 bajtówC # zawsze zajmuje dużo bajtów, ale jest to po prostu śmieszne. Żadna z wbudowanych funkcji nie jest w stanie obsłużyć arbitralnej bazy, więc musiałem sam obliczyć konwersję. Nie golfowany:
źródło
Mathematica, 92 bajty
źródło
JavaScript (ES6) z funkcją strzałki 0, 74 bajty
źródło
f('11')
po funkcji? Chyba że brakuje mi czegoś, co wygląda tylko na wykorzystanie, a nie jest częścią zgłoszenia. Jeśli tak, wyjmij go z sekcji kodu i umieść w wyjaśnieniu (po dodaniu) i zaktualizuj liczbę bajtów do 67.K4 , 19 bajtów
Rozwiązanie:
Przykłady:
Wyjaśnienie:
Użyj
/:
wbudowanego do konwersji bazy.źródło
Kotlin , 97 bajtów
Upiększony
Test
TIO
TryItOnline
źródło
Japt , 25 bajtów
Wypróbuj online!
źródło
Galaretka , 9 bajtów
Wypróbuj online!
źródło
C,
159157 bajtówźródło
Scala , 119 bajtów
Wypróbuj online!
Scala , 119 bajtów
Wypróbuj online!
Obie metody działają w ten sam sposób, ale w pierwszej wstawiam
x.length-1
zmienną, aw drugiej nie.źródło