Znajdź najdłuższą cyfrę powtórzenia


17

Twoim zadaniem jest przyjmowanie liczby dodatniej jako wartości wejściowej, n i wyprowadzanie długości najdłuższej reprezentacji rep cyfry n w dowolnej bazie. Na przykład 7 można przedstawić jako jeden z poniższych

111_2
21_3
13_4
12_5
11_6
10_7
7_8

REP-cyfr 111_2i 11_6, 111_2jest już więc nasza odpowiedź jest 3.

To jest pytanie w więc odpowiedzi będą oceniane w bajtach, przy czym mniej bajtów będzie lepszych.

Przypadki testowe

1   -> 1
2   -> 1
3   -> 2
4   -> 2
5   -> 2
6   -> 2
7   -> 3
8   -> 2
9   -> 2
10  -> 2
11  -> 2
26 -> 3
63  -> 6
1023-> 10

Przykładowa implementacja

Oto implementacja w Haskell, której można użyć do wygenerowania większej liczby przypadków testowych.

f 0 y=[]
f x y=f(div x y)y++[mod x y]
s x=all(==x!!0)x
g x=maximum$map(length.f x)$filter(s.f x)[2..x+1]

Wypróbuj online!


1
Zakładasz base > 1?
H.PWiz,

2
możesz dodać przypadki testowe 63-> 6 i 1023-> 10, jeśli chcesz
J42161217

1
@WheatWizard Myślę, że 26 robi to na przykład, jest 222w bazie 3.
xnor

1
Czy zasady mogą przekroczyć 10? Jeśli tak, to w przypadku baz> 10, czy powinniśmy uwzględniać znaki az? Co z bazami> 36?
Rick Hitchcock,

6
@ RickHitchcock Bazy mogą iść dowolnie wysoko. Ponieważ nie musisz wyprowadzać żadnych liczb w żadnej bazie innej niż 10, nie dbam o to, jak reprezentujesz inne bazy, ale powinny one działać dla baz większych niż 36.
Post Rock Garf Hunter

Odpowiedzi:


9

Galaretka , 9 bajtów

b‘Ḋ$EÐfZL

Monadyczny link przyjmujący i zwracający liczby

Wypróbuj online! lub zobacz zestaw testowy (dane wejściowe od 1 do 32 włącznie).

W jaki sposób?

b‘Ḋ$EÐfZL - Link: number, n
   $      - last two links as a monad:
 ‘        -   increment = n+1
  Ḋ       -   dequeue (with implicit range build) = [2,3,4,...,n+1]
b         - convert to those bases
     Ðf   - filter keep if:
    E     -   all elements are equal
       Z  - transpose
        L - length (note:  length of the transpose of a list of lists is the length of the
          -                longest item in the original list, but shorter than L€Ṁ)

... a może powinienem był zrobić:

bḊEÐfZLo1

Dla Lo1z.


Więc ... Nie jestem jedynym, który ZLL€Ṁ
doszedł

8

JavaScript (ES6), 62 bajty

f=(n,b=2,l=0,d=n)=>d?n%b<1|n%b-d%b?f(n,b+1):f(n,b,l+1,d/b|0):l
<input oninput=o.textContent=f(this.value)><pre id=o>


2
Uwielbiam niepotrzebnie testowany test HTML
Jakob

6

Haskell , 86 81 79 bajtów

2 bajty zapisane dzięki Laikoni

0!y=[]
x!y=mod x y:div x y!y
length.head.filter(all=<<(==).head).(<$>[2..]).(!)

Wypróbuj online!

Ponieważ to trochę umarło, oto moje podejście. To golfowa wersja przykładowego kodu, który stworzyłam na to pytanie. Myślę, że zdecydowanie może być krótszy. Pomyślałem, że to tam opublikuję.


Pointfree jest nieco krótszy: length.head.filter(all=<<(==).head).(<$>[2..]).(!).
Laikoni,

@Laikoni Thanks! Z jakiegoś powodu nie byłem w stanie dowiedzieć się, jak wprowadzić go do notacji bez punktów.
Post Rock Garf Hunter

Mogę polecić pointfree.io, który jest oparty na darmowym konwerterze lambdabota.
Laikoni,

@Laikoni Używam pointfree.io dość często. Nie musiałem tego tutaj próbować. Zazwyczaj jednak uzyskuję całkiem dobre wyniki.
Post Rock Garf Hunter

5

Łuska , 13 lat 11 bajtów

-2 bajty dzięki zgarb

L←fȯ¬tuMBtN

Wypróbuj online!


mmmoże być Mi ṠoΛ=←może być ȯ¬tu. Nie ma jeszcze wbudowanej funkcji sprawdzania, czy wszystkie elementy listy są równe ...
Zgarb

M jeszcze nie ma na wiki :(
H.PWiz

ΓoΛ=działa również jako cztery bajty
H.PWiz

1
Ups, Mpowinniśmy być w dokumentach, skoro już to mamy. Powinienem to naprawić. Ale to w zasadzie dualność .
Zgarb,





1

Mathematica, 58 bajtów

FirstCase[#~IntegerDigits~Range[#+1],l:{a_ ..}:>Tr[1^l]]&

Zgłasza błąd (ponieważ baza-1 nie jest prawidłową bazą), ale można ją bezpiecznie zignorować.

Oczywiście, można przyjąć długość pierwszego repdigit ( FirstCase), ponieważ liczby w niższych bazach nie mogą być krótsze niż w wyższych bazach.


1

CJam (17 bajtów)

{_,2>3+fb{)-!}=,}

Zestaw testów online . Jest to anonimowy blok (funkcja), który przyjmuje liczbę całkowitą na stosie i pozostawia liczbę całkowitą na stosie.

Działa z brutalną siłą, wykorzystując 3jako bazę awaryjną do obsługi specjalnych przypadków (wejściowych 1lub 2).


1

Perl 6 , 49 bajtów

{+first {[==] $_},map {[.polymod($^b xx*)]},2..*}

Wypróbuj online!

Wyjaśnienie

{                                               }  # A lambda.
                  map {                   },2..*   # For each base from 2 to infinity...
                        .polymod($^b xx*)          #   represent the input in that base,
                       [                 ]         #   and store it as an array.
  first {[==] $_},                                 # Get the first array whose elements
                                                   # are all the same number.
 +                                                 # Return the length of that array.

Metoda polymod jest uogólnieniem Pythona divmod: wykonuje wielokrotne dzielenie liczb całkowitych przy użyciu danej listy dzielników i zwraca resztę pośrednią.
Można go użyć do rozłożenia ilości na wiele jednostek:

my ($sec, $min, $hrs, $days, $weeks) = $seconds.polymod(60, 60, 24, 7);

Gdy mija sekwencję leniwą jako listę dzielników, polymodzatrzymuje się, gdy iloraz osiągnie zero. Zatem, dając mu nieskończone powtórzenie tej samej liczby, rozkłada dane wejściowe na cyfry tej podstawy:

my @digits-in-base-37 = $number.polymod(37 xx *);

Używam tego tutaj, ponieważ pozwala na arbitralnie wysokie zasady, w przeciwieństwie do .basemetody opartej na łańcuchach , która obsługuje tylko do podstawy 36.


Można usunąć []wokół polymodzmieniając $_się@_
Jo Kinga

1

TI-BASIC, 37 bajtów

Input N
For(B,2,2N
int(log(NB)/log(B
If fPart(N(B-1)/(B^Ans-1
End

Monituje o N, zwraca dane wyjściowe w Ans.

Wyjaśnienie

Jako przegląd, dla każdej możliwej zasady B w sekwencji najpierw oblicza liczbę cyfr N, gdy jest reprezentowana w podstawie B, a następnie sprawdza, czy N jest podzielna przez wartość reprezentowaną przez tę samą liczbę 1 cyfr w podstawie B.

Input N            Ask the user for the value of N.
For(B,2,2N         Loop from base 2 to 2N. We are guaranteed a solution
                   at base N+1, and this suffices since N is at least 1.
int(log(NB)/log(B  Calculate the number of digits of N in base B,
                   placing the result in Ans.
                   This is equivalent to floor(log_B(N))+1.
          (B-1)/(B^Ans-1   The value represented by Ans consecutive
                           1-digits in base B, inverted.
If fpart(N         Check whether N is divisible by the value with Ans
                   consecutive 1-digits, by multiplying it by the inverse
                   and checking its fractional part.
                   Skips over the End if it was divisible.
End                Continue the For loop, only if it was not divisible.
                   The number of digits of N in base B is still in Ans.


0

Java 8, 111 bajtów

n->{int r=0,i=1,l;for(String t;++i<n+2;r=(l=t.length())>r&t.matches("(.)\\1*")?l:r)t=n.toString(n,i);return r;}

Liczba bajtów 111 jest również cyfrą rep. ;)

Wyjaśnienie:

Wypróbuj tutaj.

n->{                            // Method with Integer as parameter return-type
  int r=0,                      //  Result-integer
      i=1,                      //  Index-integer
      l;                        //  Length-integer
  for(String t;                 //  Temp-String
      ++i<n+2;                  //  Loop from 2 to `n+2` (exclusive)
      r=                        //    After every iteration, change `r` to:
        (l=t.length())>r        //     If the length of `t` is larger than the current `r`
        &t.matches("(.)\\1*")?  //     and the current `t` is a rep-digit:
         l                      //      Change `r` to `l` (the length of the rep-digit)
        :                       //     Else:
         r)                     //      Leave `r` as is
    t=n.toString(n,i);          //   Set String representation of `n` in base-`i` to `t`
                                //  End of loop (implicit / single-line body)
  return r;                     //  Return the result-integer
}                               // End of method

Lambdas zostały wprowadzone w Javie 8.
Jakob

1
@Jobob Woops .. Nie jestem pewien, dlaczego wpisałem 7 .. Albo dlatego, że ostatnio spojrzałem na moją odpowiedź Java 7, albo po prostu literówkę .. Dzięki za poprawkę w obu przypadkach, powinno być oczywiście 8 ...> .>
Kevin Cruijssen

0

Java 8, 79 bajtów

Lambda od Integerdo Integer.

n->{int m,b=2,l;for(;;b++){for(m=n,l=0;m>0&m%b==n%b;l++)m/=b;if(m<1)return l;}}

Niegolfowana lambda

n -> {
    int m, b = 2, l;
    for (; ; b++) {
        for (m = n, l = 0; m > 0 & m % b == n % b; l++)
            m /= b;
        if (m < 1)
            return l;
    }
}

Sprawdza radie w kolejności rosnącej od 2, aż do znalezienia cyfry rep cyfry. Opiera się na fakcie, że najmniejszy taki podstawa odpowiada reprezentacji z największą liczbą cyfr.

mjest kopią danych wejściowych, bjest podstawką i ljest liczbą sprawdzanych cyfr (i ostatecznie długością breprezentacji podstawki ).


0

Burleska, 24 bajty

(patrz poprawne rozwiązanie poniżej)

J2jr@jbcz[{dgL[}m^>]

Zobacz w akcji .

J2jr@ -- boiler plate to build a list from 2..N
jbcz[ -- zip in N
{dgL[}m^ -- calculate base n of everything and compute length
>]    -- find the maximum.

Przynajmniej jeśli moja intuicja ma rację, że powtórne przedstawienie zawsze będzie najdłuższe? W przeciwnym razie uhm ...

J2jr@jbcz[{dg}m^:sm)L[>]

:sm -- filter for "all elements are the same"

1
Reprezentacja Base-2 zawsze będzie najdłuższa, spróbuj na przykład z wejściem 26, a zobaczysz, że twoje pierwsze rozwiązanie jest nieprawidłowe
Leo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.