Najmniejsza baza bezerolowa

28

Biorąc pod uwagę dodatnią liczbę całkowitą n, wyprowadzaj najmniejszą bazę, w b >= 2której reprezentacja nw bazie bbez zer wiodących nie zawiera znaku 0. Możesz to założyćb <= 256 dla wszystkich danych wejściowych.

Przypadki testowe

1 -> 2 (1)
2 -> 3 (2)
3 -> 2 (11)
4 -> 3 (11)
5 -> 3 (12)
6 -> 4 (12)
7 -> 2 (111)
10 -> 4 (22)
17 -> 3 (122)
20 -> 6 (32)
50 -> 3 (1212)
100 -> 6 (244)
777 -> 6 (3333)
999 -> 4 (33213)
1000 -> 6 (4344)
1179360 -> 23 ([12, 9, 21, 4, 4])
232792560 -> 23 ([15, 12, 2, 20, 3, 13, 1])
2329089562800 -> 31 ([20, 3, 18, 2, 24, 9, 20, 22, 2])
69720375229712477164533808935312303556800 -> 101 ([37, 17, 10, 60, 39, 32, 21, 87, 80, 71, 82, 14, 68, 99, 95, 4, 53, 44, 10, 72, 5])
8337245403447921335829504375888192675135162254454825924977726845769444687965016467695833282339504042669808000 -> 256 ([128, 153, 236, 224, 97, 21, 177, 119, 159, 45, 133, 161, 113, 172, 138, 130, 229, 183, 58, 35, 99, 184, 186, 197, 207, 20, 183, 191, 181, 250, 130, 153, 230, 61, 136, 142, 35, 54, 199, 213, 170, 214, 139, 202, 140, 3])
Mego
źródło
1
Jakie są wartości dla dziesięciu, jedenastych itd. W wyższych bazach, których używasz? Czy zawierają zera?
Stephen
19
@Stephen Wartości wybrane dla powyższych cyfr 9nie mają znaczenia, ponieważ nie są 0.
Mego,
9
To jest OEIS A106370 .
Engineer Toast,
1
@Titus To dobra uwaga. Ograniczę bazę do czegoś rozsądnego.
Mego,
1
@Mego: Spróbuj 232792560. Jest to lcm 2,3, ..., 20, więc w każdej bazie <= 20 ma 0 jako najmniej znaczącą cyfrę.
Nate Eldredge

Odpowiedzi:

15

Pyth , 6 bajtów

f*FjQT

Sprawdź wszystkie przypadki testowe.

Jak to działa

f * FjQT ~ Pełny program.

f ~ Pierwsza dodatnia liczba całkowita, w której warunek jest prawdziwy.
   jQT ~ Dane wejściowe przekonwertowane na podstawę bieżącego elementu.
 * F ~ Produkt. Jeśli lista zawiera 0, to jest 0, w przeciwnym razie jest ściśle dodatnia.
          0 -> Falsy; > 0 -> Prawda.
        ~ Wynik należy podać domyślnie.

Chociaż Pyth's fdziała na 1, 2, 3, 4, ...(od 1), Pyth traktuje liczby w bazie 1 (jedne) jako wiązkę zer, więc podstawa 1 jest ignorowana.

Pan Xcoder
źródło
Fajne nadużycie tego, że reprezentacja base-1 Pytha jest zerowa.
Erik the Outgolfer,
@EriktheOutgolfer Thanks! Dodam wyjaśnienie na ten temat.
Pan Xcoder,
Pyth nie jest jedynym językiem, którego jednoznaczna reprezentacja używa zer jako cyfr podpowiedź : P
Mego
Napisałeś 0 -> Falsy; > 0 -> Truthy. Jest to celowe, które 0jest jednocześnie Truthyi Falsyw tej sytuacji?
Brian J
@BrianJ Przed sekundą znajduje się >znak 0, co oznacza, że ​​wszystko powyżej 0 jest prawdą.
Pan Xcoder
11

C,  52  50 bajtów

i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;return i;}

Wypróbuj online!

C (gcc),  47  45 bajtów

i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;n=i;}

Wypróbuj online!


Dwa bajty zaoszczędzone dzięki sugestii @ Nevay na odpowiedzi @Kevin Cruijssen!

Steadybox
źródło
2
Ta ostatnia wersja działa tylko przez przypadek, nawet jeśli nalegasz na określony kompilator. I, oczywiście, żadna wersja nie jest naprawdę C.
AnT
3
@To jest C .. da wiele ostrzeżeń, ale się skompiluje. dopóki znajdziesz kompilator, który działa dla twojego kodu, nic ci nie jest
Felipe Nardi Batista
1
@Blacksilver k%ijest tutaj testem trójstronnym . Bardziej czytelny wariant byłby k=(k%i?k:n*++i);nawet bardziej jasno: if(k%i){k=k;}else{k=n*++i;}.
Kevin Cruijssen
1
Możesz także grać w golfa zarówno o 2 bajty: jak i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;return i;}i i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;n=i;}. Wszystkie podziękowania należą się @Nevay, który opublikował tę sugestię w odpowiedzi na moją przeniesioną Javę 8 .
Kevin Cruijssen
1
@Felipe Nardi Batista: Zdaję sobie sprawę z tego, że zasady CodeGolf mówią „tak długo, jak się kompiluje” i tak dalej. Jednak fakt, że „kompiluje się”, nie dowodzi w żaden sposób, że jest to C. To nie jest C. Nietypowe deklaracje, takie jak i, k;i f(n)istniały w starożytnych wersjach C (K&R), ale tylko w erze, w której returnwymagane były okrągłe nawiasy wokół niego argument. Jeśli chcesz używać K&R i,k;, musisz także użyć return(i);. Powyższe może być gnuc, ale nie C.
AnT
8

Haskell , 56 52 48 bajtów

b#n=n<1||mod n b>0&&b#div n b
f n=until(#n)(+1)2

Wypróbuj online!

Całkiem proste, ale nie mogę wymyślić żadnego dobrego sposobu na jego skrócenie

EDYCJA: Podziękowania dla Laikoni za uratowanie mnie 4 bajtów! Nie wiem, dlaczego nigdy nie myślałem !!0. Chyba powinien Próbowaliśmy usunięcie tych nawiasów ale mam mgliste wspomnienia z jakimś dziwnym błędem przy próbie użycia ||i &&razem. Może mylę to z operatorami równości.

EDYCJA 2: Dzięki @Lynn za golenie kolejnych 4 bajtów! Nie wiem, o czym nigdy untilwcześniej nie wiedziałam .

użytkownik1472751
źródło
1
Pokonałeś mnie przez minutę z prawie dokładnie tym samym rozwiązaniem. :) !!0jest krótszy niż headi myślę, że możesz wstawić nawias #.
Laikoni
2
Niedoceniany kryminalnie until :: (a → Bool) → (a → a) → a → aoszczędza cztery bajty:f n=until(#n)(+1)2
Lynn
6

Łuska , 7 bajtów

→V▼MBtN

Wypróbuj online!

Wyjaśnienie

→V▼MBtN
     tN    list of natural numbers starting from 2
   MB      convert the (implicit) input to each of those bases
 V▼        find the (1-based) index of the first result where the minimum digit is truthy
→          add 1 to this index
Lew
źródło
5

Python 2 , 57 bajtów

n=x=input()
b=2
while x:z=x%b<1;b+=z;x=[x/b,n][z]
print b

Wypróbuj online!

Jest to jeden bajt krótszy niż funkcja rekurencyjna:

f=lambda n,b=1,x=1:b*(x<1)or f(n,b+(x%b<1),[x/b,n][x%b<1])
Lynn
źródło
1
BTW jest to dość podobne do mojego rozwiązania.
Erik the Outgolfer
3

05AB1E , 6 bajtów

-4 bajty dzięki Adnan

1µNвPĀ

Wypróbuj online!

Okx
źródło
10 bajtów:[¹NÌDŠвPĀ#
Neil,
2
1µNвPĀdziała na 6 bajtów
Adnan
@Adnan Wiedziałem, że to zdecydowanie za długo
Okx,
LB0.å0kjest inną metodą całkowicie> _>.
Magic Octopus Urn
3

Łuska , 9 bajtów

←foΠ`B⁰tN

Wypróbuj online!

Wyjaśnienie

            -- input N
        tN  -- tail of [1..] == [2..]
←f(    )    -- filter with the following:
    `B⁰     --   convert N to that base
   Π        --   product (0 if it contains 0)
←           -- only keep first element
ბიმო
źródło
3

Java 8, 61 56 54 bajtów

n->{int b=2,t=n;for(;t>0;)t=t%b++<1?n:t/--b;return b;}

Wypróbuj tutaj.

Wyjaśnienie:

n->{            // Method with integer as both parameter and return-type
  int b=2,      //  Base-integer, starting at 2
      t=n;      //  Temp-integer, copy of the input
  for(;t>0;)    //  Loop as long as `t` is not 0
    t=t%b++<1?  //   If `t` is divisible by the base `b`
                //   (and increase the base `b` by 1 afterwards with `b++`)
       n        //    Set `t` to the input `n`
      :         //   Else:
       t/--b;   //    Divide `t` by the `b-1`
                //    (by decreasing the base `b` by 1 first with `--b`)
                //  End of loop (implicit / single-line body)
  return b;     //  Return the resulting base
}               // End of method

Mam wrażenie, że można to pograć w golfa, stosując podejście arytmetyczne. Rzeczywiście może, z portem odpowiedzi @Steadybox C , a następnie golfem o 2 bajty dzięki @Nevay .

Stara ( 61 bajtów ) odpowiedź:

n->{int b=1;for(;n.toString(n,++b).contains("0"););return b;}

Wypróbuj tutaj.

Wyjaśnienie:

n->{         // Method with Integer as both parameter and return-type
  int b=1;   //  Base-integer, starting at 1
  for(;n.toString(n,++b).contains("0"););
             //  Loop as long as the input in base-`b` does contain a 0,
             //  after we've first increased `b` by 1 before every iteration with `++b`
  return b;  //  Return the resulting base
}            // End of method
Kevin Cruijssen
źródło
2
54 bajty:n->{int b=2,t=n;for(;t>0;)t=t%b++<1?n:t/--b;return b;}
Nevay
2

Japt , 8 bajtów

@ìX e}a2

Wypróbuj online!

Wyjaśnienie

@    }a2

Zwraca pierwszą liczbę ( X), aby przekazać funkcję, zaczynając od2

ìX

Konwertuj liczbę wejściową na tablicę Xcyfr podstawowych.

e

Sprawdź, czy wszystkie cyfry są prawdziwe.

Justin Mariner
źródło
Czy to nie zawiedzie, jeśli tablica zawiera dowolną wielokrotność 10?
Kudłaty
@Shaggy Zrozumiałem, że zgodnie z komentarzem PO, cyfry dla baz powyżej 9 nie liczą się jako zero.
Justin Mariner,
Ach, teraz to widzę. Występuje problem ze sformułowaniem wyzwania, więc (lub jestem po prostu zbyt zmęczony!).
Kudłaty
2

JavaScript (ES6), 43 41 37 bajtów

n=>(g=x=>x?g(x%b++?x/--b|0:n):b)(b=1)

Przypadki testowe

Arnauld
źródło
2

Brachylog , 11 bajtów

;.≜ḃ₎¬∋0∧1¬

Wypróbuj online!

Wyjaśnienie

;.≜ḃ₎           The Input represented in base Output…
     ¬∋0        …contains no 0
        ∧1¬     And Output ≠ 1
Fatalizować
źródło
2

Python 2 , 57 bajtów

n=m=input()
b=2
while m:c=m%b<1;b+=c;m=(m/b,n)[c]
print b

Wypróbuj online!

-1 dzięki Felipe Nardi Batista .
-2 dzięki Lynn (a teraz jest to duplikat jej rozwiązania: D)

Erik the Outgolfer
źródło
59 bajtów , zmieniając a,b=a+c,dnaa+=c;b=d
Felipe Nardi Batista
Myślę, że można zastąpić while m>1przez while m(i wtedy jesteśmy przywiązane!)
Lynn
@ Lynn Właśnie dlatego skomentowałem twoje rozwiązanie, byłoby dokładnie tak samo.
Erik the Outgolfer
1
@ Lynn Już wiedziałem: p inaczej poprosiłbym cię o usunięcie twojego.
Erik the Outgolfer
2

APL (Dyalog) , 20 19 bajtów

1+⍣{~0∊⍺⊥⍣¯1n}≢n←⎕

Wypróbuj online!

Jak zwykle dzięki @ Adám za pomoc na czacie i przygotowanie kodu do pracy w TIO. Ponadto oszczędzasz 1 bajt.

To tradfn ( upr itional F unctio n ) ciała. Aby go użyć, musisz przypisać mu nazwę (która znajduje się w polu nagłówka TIO), ująć w s (jeden przed nazwą i jeden w polu stopki TIO), a następnie wywołać ją, używając jego nazwy. Ponieważ używa quad ( ) do wprowadzania danych użytkownika, jest nazywany jakof \n input zamiast zwykłegof input

W jaki sposób?

1+⍣{~0∊⍺⊥⍣¯1n}≢n←⎕   Main function.
                  n←⎕  Assigns the input to the variable n
1+⍣{           }≢      Starting with 1, add 1 until the expression in braces is truthy
    ~0                returns falsy if 0 "is in"
                      convert
            n         the input
         ⍣¯1           to base
                      left argument (which starts at 1 and increments by 1)

Następnie funkcja zwraca wynikową bazę.

J. Sallé
źródło
1
Wskazówka do gry w golfa: ponieważ n←⎕będzie to prosta liczba i potrzebujesz 1jako początkowego argumentu do reszty kodu, możesz po prostu policzyć liczbę elementów n((1), zastępując 1⊣. Wypróbuj online!
Adám
1

Proton , 40 bajtów

x=>filter(y=>all(digits(y,x)),2..x+3)[0]

Wypróbuj online!

HyperNeutrino
źródło
1
To jest nieprawidłowe 2..xsprawdza podstawy w interwale [2, x), stąd nie udaje się dla przypadków testowych 1i 2.
Pan Xcoder,
1

R , 79 71 66 63 65 bajtów

function(n){while(!{T=T+1;all(n%/%T^(0:floor(log(n,T)))%%T)})T
T}

Wypróbuj online!

Ta odpowiedź opiera się na zmianie aranżacji Giuseppe w jednej pętli.

Zaoszczędzono 8 bajtów dzięki JDL i 6 bajtów dzięki Giuseppe.

Nie dotyczy
źródło
1
Można sub bdla T, który rozpoczyna się zdefiniowano jako TRUE == 1, eliminując potrzebę b=1. Podobnie można sub Fdo k( Fjest FALSE)
JDL
Widzę, co tu zrobiłeś. Warto wiedzieć!
NofP
1
66 bajtów przy użyciu m%/%T(dzielenie liczb całkowitych) zamiast(m-m%%T)/T
Giuseppe
65 bajtów . było trochę niechlujnie, ale podejrzewałem, że pozbycie się zagnieżdżonych pętli coś uratuje ; Pomyślałem, że będzie to więcej niż 1 bajt :(
Giuseppe
1

MATL , 13 12 bajtów

`G@Q_YAA~}@Q

Wypróbuj online!

-1 bajt dzięki Luis Mendo. Ten program nie obsługuje przypadków testowych większych niż 2 ^ 53 ( flintmaxmaksymalna kolejna liczba całkowita reprezentowana przez typ zmiennoprzecinkowy), ponieważ domyślnym typem danych jest doubleMATL. Jednak powinna być w stanie znaleźć dowolną dowolną bazę zerową poniżej tej liczby.

`            % Do while
 G           %  Push input
  @ _        %  Outputs the iteration number, negate.
     YA      %  Convert input to base given by the iteration number, the negative number is to instruct MATL we want an arbitrary high base with a integer vector rather than the default character vector we know from hexadecimal
       A~    %  If they're not all ones, repeat
         }   % But if they are equal, we finally
          @  %  Push the last base
   Q       Q %  As base 1 makes no sense, to prevent MATL from errors we always increase the iteration number by one.
Sanchises
źródło
@LuisMendo Powinienem naprawdę zacząć czytać dokumenty lepiej. Dzięki.
Sanchises
Wydaje się, że nie działa to w przypadku większych przypadków testowych, ale nie wiem wystarczająco dużo o MATL / Matlab, aby wiedzieć, czy jest to spowodowane limitami liczb całkowitych, czy nie.
Mego
@Mego Przetestowałem moją 13-bajtową wersję, która powinna być odpowiednikiem bieżącej wersji do 1e6, na MATLAB R2017a. Jaka konfiguracja testu spowodowała problemy?
Sanchises
Ostatnie 2 przypadki testowe powodują błędy.
Mego
@Mego Ah Nie widziałem wcześniej tych testów. Wynika to z implementacji MATL-ów YAprzy użyciu podwójnych wewnętrznie, więc może obsługiwać dane wejściowe do maksymalnej liczby całkowitej reprezentowanej przez podwójną (patrz flintmax). Czy to unieważnia odpowiedź? Zasadniczo algorytm działa dla dowolnej bazy, jawnie
obejrzałem
0

PHP, 59 + 1 bajtów

przy użyciu wbudowanych , maks. podstawa 36:

for($b=1;strpos(_.base_convert($argn,10,++$b),48););echo$b;

brak wbudowanych, 63 60 + 1 bajtów , dowolna baza:

for($n=$b=1;$n&&++$b;)for($n=$argn;$n%$b;$n=$n/$b|0);echo$b;

Uruchom jako potok z -nRlub wypróbuj je online .

Tytus
źródło
0

J, 26 bajtów

]>:@]^:(0 e.]#.inv[)^:_ 2:

Chciałbym wiedzieć, czy można to poprawić.

Główny czasownik to dyadyczna fraza:

>:@]^:(0 e.]#.inv[)^:_

który otrzymuje dane wejściowe po lewej stronie i stałą 2 po prawej stronie. Ta główna fraza czasownika następnie korzysta z konstrukcji Do..While J., inkrementując odpowiedni argument y, o ile 0 jest elementem e.pierwotnego argumentu w bazie y.

Wypróbuj online!

Jonasz
źródło
0

Lua , 77 76 bajtów

b=2n=...N=n
while~~N>0 do
if N%b<1then
b=b+1N=n
else
N=N//b
end
end
print(b)

Wypróbuj online!

Felipe Nardi Batista
źródło
0

Droga Mleczna , 38 bajtów

^^'%{255£2+>:>R&{~^?{_>:<;m_+¡}}^^^}

stosowanie: ./mw base.mwg -i 3


Wyjaśnienie

code                                 explanation                    stack layout

^^                                   clear the preinitialized stack []
  '                                  push the input                 [input]
   %{                              } for loop
     255£                             push next value from 0..254   [input, base-2]
         2+                           add 2 to the get the base     [input, base]
           >                          rotate stack right            [base, input]
            :                         duplicate ToS                 [base, input, input]
             >                        rotate stack right            [input, base, input]
              R                       push 1                        [input, base, input, 1]
               &{~             }      while ToS (=remainder) is true ...
                  ^                    pop ToS                      [input, base, number]
                   ?{         }        if ToS (=quotient) ...
                     _>:<;              modify stack                [input, base, number, base]
                           m            divmod                      [input, base, quotient, remainder]
                           _+¡         else: output ToS (0) + SoS and exit
                                ^^^   pop everything but the input.

Jestem pewien, że można to skrócić za pomocą pętli while zamiast pętli for, ale nie udało mi się tego uruchomić.

ovs
źródło
0

Skumulowane , 23 bajty

{!2[1+][n\tb all]until}

Wypróbuj online!

To zwiększa ( [1+]) J, zaczynając od dwóch ( 2), podczas gdy podstawowa reprezentacja J wejścia nie ma zer ( alli until).

Conor O'Brien
źródło