Знайдіть найдовшу цифру повтору


17

Ваше завдання - взяти додатне число як вхід, n та вивести довжину найдовшого репрезентативного представлення n у будь-якій базі. Наприклад, 7 може бути представлений як будь-яке з наведених нижче

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

Повторні цифри є 111_2і 11_6, 111_2довше, тому наша відповідь 3.

Це питання з тому відповіді будуть набиратись у байтах, менша кількість байтів - краща.

Випробування

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

Зразок реалізації

Ось реалізація в Haskell, яка може бути використана для генерації більше тестових випадків.

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]

Спробуйте в Інтернеті!


1
Припущення base > 1?
H.PWiz

2
ви можете додати тестові кейси 63-> 6 та 1023-> 10, якщо вам подобається
J42161217

1
@WheatWizard Я думаю, що 26 робить це, наприклад, 222у базі 3.
xnor

1
Чи можуть бази перевищувати 10? Якщо так, для основ> 10, чи слід включати символи az? Що з основами> 36?
Рік Хічкок

6
@RickHitchcock Бази можуть досягати довільно високих показників. Оскільки вам не доведеться виводити будь-які цифри в будь-яку базу, окрім 10, мені все одно, як ви представляєте інші бази, але вони повинні працювати для баз більше 36.
Post Rock Garf Hunter

Відповіді:


9

Желе , 9 байт

b‘Ḋ$EÐfZL

Монадійне посилання, що приймає та повертає номери

Спробуйте в Інтернеті! або перегляньте тестовий набір (входи від одного до 32 включно).

Як?

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€Ṁ)

... або, можливо, я повинен був би зробити:

bḊEÐfZLo1

Для Lo1z.


Тож ... Я не єдиний, хто зрозумів, що ZLкоротший за L€Ṁ...
Ерік Аутгольфер

8

JavaScript (ES6), 62 байти

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
Мені подобається зайвий тест HTML-гольфу
Якоб

6

Хаскелл , 86 81 79 байт

2 байти збережено завдяки Лайконі

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

Спробуйте в Інтернеті!

Оскільки це трохи притихло, ось мій підхід. Це гольф-версія зразкового коду, який я зробив для запитання. Я думаю, що це, безумовно, може бути коротшим. Я просто думав, що викладу його там.


Pointfree трохи коротше: length.head.filter(all=<<(==).head).(<$>[2..]).(!).
Лайконі

@Laikoni Дякую! Чомусь я так і не зміг зрозуміти, як ввести це в точкове позначення.
Опублікувати Rock Garf Hunter

Я можу порекомендувати pointfree.io, який базується на точковому перетворювачі лямбдаботу.
Лайконі

@Laikoni я досить багато використовую pointfree.io. Я, мабуть, не пробував це тут. Я, як правило, отримую досить хороші результати.
Опублікувати Rock Garf Hunter

5

Лушпиння , 13 11 байт

-2 байти завдяки zgarb

L←fȯ¬tuMBtN

Спробуйте в Інтернеті!


mmможе бути M, і ṠoΛ=←може бути ȯ¬tu. Ще немає вбудованої програми для перевірки рівності всіх елементів списку ...
Zgarb

M ще немає навіть у вікі :(
H.PWiz

ΓoΛ=також працює у чотирьох байтах
H.PWiz

1
На жаль, Mмає бути в документах, оскільки у нас це було деякий час. Я повинен це виправити. Але це в основному подвійне .
Згарб





1

Математика, 58 байт

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

Припускає помилку (адже base-1 не є дійсною базою), але її можна ігнорувати.

Звичайно, добре взяти довжину першого репдигіта ( FirstCase), оскільки число в нижчих базах не може бути коротшим, ніж у вищих основах.


1

CJam (17 байт)

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

Інтернет-тестовий набір . Це анонімний блок (функція), який бере ціле число на стек і залишає ціле число на стеку.

Працює з грубою силою, використовуючи 3як резервну базу для обробки спеціальних випадків (вхідних 1чи 2).


1

Perl 6 , 49 байт

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

Спробуйте в Інтернеті!

Пояснення

{                                               }  # 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.

Polymod метод є узагальненням мови Python divmod: Він виконує повторне цілочисельне ділення , використовуючи заданий список подільників, і повертає проміжні залишки.
Його можна використовувати для розкладання кількості на кілька одиниць:

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

При передачі ледачої послідовності як списку дільників polymodзупиняється, коли коефіцієнт досягає нуля. Таким чином, надаючи їй нескінченне повторення того ж числа, розкладає вхід на цифри цієї бази:

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

Я використовую це тут, тому що він дозволяє довільно високі бази, на відміну від рядкового .baseметоду, який підтримує лише до 36.


Ви можете видалити []навколо polymod, змінивши $_на@_
Jo King

1

TI-BASIC, 37 байт

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

Запрошує N, повертає висновок в Ans.

Пояснення

Як огляд, для кожної можливої ​​бази B в послідовності вона спочатку обчислює кількість цифр N, коли вони представлені в базі B, а потім перевіряє, чи N ділиться на значення, представлене тим самим числом одноцифрових знаків у базі 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 байт

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;}

Кількість байтів 111 - це також повторна цифра. ;)

Пояснення:

Спробуйте тут.

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

Лямбди були представлені на Java 8.
Якоб

1
@Jakob Woops .. Не впевнений, чому я набрав 7 .. Або тому, що нещодавно я оглянувся на мою відповідь на Java 7, або просто помилковий. Дякую за виправлення в будь-якому випадку, звичайно, повинно було бути 8 ...> .>
Кевін Круїссен

0

Java 8, 79 байт

Лямбда від Integerдо 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;}}

Незлітаюча лямбда

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;
    }
}

Перевіряє радікуси у збільшенні від 2 до тих пір, поки не буде знайдено повторний розряд. Покладається на те, що найменший такий радіус буде відповідати поданню з найбільшою кількістю цифр.

mє копією вхідного сигналу, bявляє собою радіакс, і lкількість перевірених цифр (і, в кінцевому рахунку, довжина рентгенівського bподання).


0

Бурлеск, 24 байти

(див. правильне рішення нижче)

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

Дивіться в дії .

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.

Принаймні, якщо моя інтуїція права, що повторнозначне представлення завжди буде найдовшим? В іншому випадку ...

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

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

1
Представлення Base-2 завжди буде найдовшим, спробуйте, наприклад, із введенням 26, і ви побачите, що ваше перше рішення неправильне
Лев
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.