Пошук базового репдигіта


21

Репдігіти це натуральне число , яке можна записати тільки повторюючи ту ж цифру. Наприклад, 777є репдигітом, оскільки складається виключно з цифри, 7повтореної три рази.

Однак це не обмежується лише десятковими (базовими 10) числами:

  • Кожне число Мерсена (виду M n = 2 n -1 ) є повторним знаком при написанні у двійковій формі (основа 2).
  • Кожне число є тривіальним відспівом, коли воно пишеться уніарно (база 1).
  • Кожне число nтакож може тривіально записуватися як повторний знак 11у базі n-1(наприклад, 17коли він пишеться шістнадцятковим (основа 16) 11, а також, 3коли пишеться у двійковій (також база 2 11).

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

Вхідні дані

Позитивне ціле число x > 3в будь-якому зручному форматі.

Вихідні дані

Позитивне ціле число bз , (x-1) > b > 1де поданням xв базі bє репдігітамі.

  • Якщо такого не bіснує, виведіть 0або якесь значення фальси .
  • Якщо таких bіснує декілька , ви можете вивести будь-які або всі з них.

Правила

  • (x-1) > b > 1Обмеження , щоб запобігти тривіальні перетворення в Унарний або «вичитати одну» базу. Вихідна число може бути записано в одинарної або будь-якому зручному базі, але сама база не повинна бути однією з тривіальних перетворень.
  • Введення / виведення можна за допомогою будь-якого відповідного способу .
  • Застосовуються стандартні обмеження лазівки .

Приклади

In --> Out
11 --> 0            (or other falsey value)
23 --> 0            (or other falsey value)
55 --> 10           (since 55 is 55 in base 10)
90 --> 14           (since 90 is 66 in base 14 ... 17, 29, 44 also allowed)
91 --> 9            (since 91 is 111 in base 9 ... 12 also allowed)

Чи можна припустити b ≤ 36(багато вбудованих функцій перетворення базової мови не виходять вище)?
Дверна ручка

2
@Doorknob Припускаючи, що b ≤ 36 сильно обмежує сферу цієї проблеми, і всі існуючі відповіді правильно обробляють більші основи, тому я хочу сказати «ні», ви не можете вважати верхню межу bпоза межами того, що задано.
AdmBorkBork

Більшість номерів є редігітами в якійсь базі. Наприклад, 91 = 13 * 7, так що це 77 в базі 12.
Ніл

@Neil ... Це майже як ви на щось, там ...
AdmBorkBork

Відповіді:


11

Желе, 11 9 байт

bRI¬P€TḊṖ

Повертає список баз, який порожній (хибний), якщо його немає. Спробуйте в Інтернеті!

Як це працює

bRI¬P€TḊṖ  Main link. Argument: x (number)

 R         Range; yield [1, ..., x].
b          Base; convert x to base n, for each n in the range.
  I        Compute the increment (differences of successive values) of each array
           of base-n digits. This yields only 0's for a repdigit.
   ¬       Apply logical NOT to each increment.
    P€     Compute the product of all lists of increments.
      T    Get the indices of all truthy products.
       Ḋ   Discard the first index (1).
        Ṗ  Discard the last index (x - 1).

9

Pyth, 11 10

fqjQT)r2tQ

Мабуть, уніатський Pyth qперевіряє список, який має всі унікальні значення приблизно 10 днів тому. Мабуть, розслідування помилок Pyth покращує показники гольфу.

Фільтрує список [2..input-1)у тому випадку, якщо унікальний набір цифр вводу в цій базі дорівнює 1.

Тестовий сюїт

Пояснення:

r2tQ     ##  generate the python range from 2 to the input (Q) - 1
         ##  python range meaning inclusive lower and exclusive upper bounds
f        ##  filter that list with lambda T:
  jQT    ##  convert the input to base T
 q    )  ##  true if the resulting list digits has all equal elements

5

Рубі, 87 69 63 байт

->x{(2..x-2).find{|b|y=x;a=y%b;a=0if a!=y%b while(y/=b)>0;a>0}}

Мені довелося здійснити перетворення бази вручну, оскільки вбудовані Ruby піднімаються лише до бази 36 ...

Повернення nilдля не знайдено.

->x{      # anonymous lambda that takes one argument
(2..x-2)  # range of the possible bases to search over
.find{    # return the first element that satisfies the block, or nil if none
|b|       # b represents the base currently being tested
y=x;      # a temporary value to avoid mutating the original value of x
a=y%b;    # the first (well, last) digit in base b, which will be compared to

                   y/=b      # divide the number by the base
   if a!=y%b                 # if this digit does not match (is different)...
a=0                          # set a to a value representing "failure"
             while(    )>0;  # keep doing this until we get zero (no digits left)

a>0       # return whether a has maintained its original value (no digit change)
}}        # find then returns the first element for which this is true (or nil)

5

Пітон, 71 72 78 байт

lambda x:{b for b in range(2,x-1)for d in range(x)if x*~-b==x%b*~-b**d}

Рекурсії немає, просто випробовує всі бази та виводить набір тих, що працюють.

Заманливо кодувати bі dв одне число, але для їх витягування потрібно занадто багато круглих виразів. 77 байт:

lambda x:{k/x for k in range(2*x,x*x-x))if x*~-(k/x)==x%(k/x)*~-(k/x)**(k%x)}

72 байти:

f=lambda x,b=2:b*any(x*~-b==x%b*~-b**d for d in range(x))or f(x,b+1)%~-x

Виводить перше, bщо працює, або 0якщо його немає.

Респ-блок xз dцифр cв базі bмає значення x==c*(b**d-1)/(b-1). Рівнозначно , x*(b-1)==c*(b**d-1).

Значення cповинно бути x%bостанньою цифрою. Я не бачу способу, як визначити dарифметично, тому код намагається всі можливості перевірити, чи працює який-небудь з них.

Збережено 5 байт, скопіювавши фокус Денніса щодо надання фальсийного виходу при bдосягненні x-1, взявши модуль виводу x-1. Ще один байт, врятований від Денніса, нагадує мені, що експоненція незрозуміло має вищий пріоритет перед цим ~.

Рішення рівної довжини з inзамість any.

f=lambda x,b=2:b*(x*~-b in[x%b*~-b**d for d in range(x)])or f(x,b+1)%~-x

4

Рубін, 50 байт

->n{(2..n-2).find{|b,i=n|i%b==(i/=b)%b ?redo:i<1}}

Мені б дуже хотілося прибрати цей набридлий простір, але, як новачок у рубіні, мені все ще незнайомі його синтаксичні примхи.


У цьому випадку вигадка, яка є кривдною, полягає в тому, що це b?було б дійсною назвою методу, тому ви не зможете позбутися місця.
Йордан

4

Еможикод , 214 байт

(77 символів):

🐇🐹🍇🐇🐖🏁➡🚂🍇🍦b🍺🔲🗞🔷🔡😯🔤🔤🚂🍮i 2🍮n 0🔁◀i➖b 1🍇🍦v🔷🔡🚂b i🍊▶🐔🔫v🔪v 0 1📏v🍇🍮n i🍉🍫i🍉😀🔷🔡🚂n 9🍎0🍉🍉

Друкує результати в базі 9.

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

Ungolfed (👴 - рядовий коментар у смайликоді)

🐇🐹🍇         👴 define main class "🐹"
  🐇🐖🏁➡🚂🍇  👴 define main method

    👴 read an integer from stdin, store it in frozen variable "b"
    🍦 b 🍺 🔲 🗞 🔷🔡😯🔤🔤 🚂

    🍮 i 2  👴 i = 2
    🍮 n 0  👴 n = 0

    🔁◀i➖b 1🍇     👴 while i < b - 1
      🍦 v 🔷🔡🚂b i  👴 v = the string representation of b in base i

      👴 Split v on every instance of the first character of v.
      👴 If the length of that list is greater than the actual length of v,
      👴 n = i
      🍊▶🐔🔫v🔪v 0 1📏v🍇
        🍮 n i
      🍉

      🍫 i  👴 increment i
    🍉
    😀 🔷🔡🚂 n 9  👴 represent n in base 9 instead of 10, to save a byte 😜
    🍎 0          👴 return error code 0
  🍉
🍉

4

Python 2, 79 байт

f=lambda x,b=2:~-b*x in[i%b*~-b**(i/b)for i in range(b*x)]and b or f(x,-~b)%~-x

Спробуйте це на Ideone .

Ідея

Будь-яке повторне позначення x базису b> 1 і цифри d <b задовольняє наступному.

стан

Оскільки d <b , то карта (b, d) ↦ cb + d є ін'єктивною.

Також, оскільки b, x> 1 , маємо c <x , тому cb + d <cb + b = (c + 1) b ≤ xb .

Це означає, що, щоб знайти відповідні значення c і d для даної бази b , ми можемо перебрати всі i в [0,…, bx) і перевірити, чи (b - 1) x == (i% b) (b i / b - 1) .

Код

Названа лямбда f перевіряє, чи є (b - 1) x у множині {(i% b) (b i / b - 1) | 0 ≤ i <bx} , починаючи зі значення b = 2 .

  • Якщо тест був успішним, повертаємо b .

  • В іншому випадку ми знову називаємо f , з тим самим x і b, збільшеним на 1 .

Оскільки b зрештою може досягати x - 1 , ми приймаємо кінцевий результат по модулю x - 1, щоб повернути 0 у цьому випадку. Зауважте, що це не відбудеться, якщо b = 2 задовольняє умові, оскільки воно повертається без повторного повторення. Однак питання гарантує, що b = 2 <x - 1 в цьому випадку.


3

Perl 6, 45 43 42 байт

{grep 2..$^x-2: {[==] $x.polymod($_ xx*)}}

Пояснено (начебто)

Для довідки, змінна $^xв { ... }- це те саме, що робити-> $x { ... }

{grep 2..$^x-2: {[==] $x.polymod($_ xx*)}}
{                                          # Anonymous function taking $x
 grep                                      # Return the all values in
      2..$^x-2: {                          # Range from 2 to $x - 2 satisfying:
                 [==]                      #     Reduce with ==:
                      $x.polymod(          #         (See below for polymod)
                                 $_ xx*    #         An infinite list containing
                                           #         the current value
                                       )}}

Полімод (TL; DR): $n.polymod($b xx *)дає вам перевернутий список цифр / 'цифр' для $nбази$b

Полімод (по-справжньому): Метод полімоду майже нагадує більш потужну версію функції пітона divmod. $n.polymod(*@args)ділить $ n на кожне значення у * args, додаючи решту ( $n mod $x) до списку, який він повертає, і використовуючи коефіцієнт для наступного поділу. Я відчуваю, що я пояснив це погано, ось ось декілька прикладів (написані в perl 6, але досить чисті, щоб зрозуміти більшість я сподіваюся):

12.polymod(7)    # returns (5, 1)
# Roughly equivalent to:
(12 mod 7, 12 div 7)

86400.polymod(60,60,24) # returns (0, 0, 0, 1)
# Roughly equivalent to (this will give you an array rather than a list):
my $n = 86400;
my @remainders; # Here lies the end result
for (60, 60, 24) -> $divisor {
    @remainders.push( $n mod $divisor );
    $n div= $divisor;
}
@remainders.push($n)

# This is essentially the base conversion algorithm everyone
# knows and loves rolled into a method.
# Given an infinite list of divisors, polymod keeps going until
# the remainder given is 0.     
0xDEADBEEF.polymod(16 xx *) # returns (15 14 14 11 13 10 14 13)
# Roughly equivalent to (but gives an array rather than a list):
my $n = 0xDEADBEEF;
my @remainders; # Here lies the end result
while $n > 0 {
    @remainders.push( $n mod 16 );
    $n div= 16;
}

1
Насправді, оскільки вам дозволяється виводити " будь-які або всі " дійсних значень, ви можете використовувати grepметод замість firstметоду.
Бред Гілберт b2gills

О гарний улов, я пропустив це
Hotkeys

3

Діалог APL , 28 байт

 {b/⍨⍵{1=≢∪⍵⊥⍣¯1⊢⍺}¨b←1+⍳⍵-3}

{... ... }анонімні функції , які будуть застосовані до x(представлено )
b←1+⍳⍵-3цілих чисел від 2 - ⍵-2 зберігаються в вигляді b
⍵{... для кожного елемента в Ь ( ), застосувати функцію {... }з ї як лівий аргументом
⍵⊥⍣¯1⊢⍺конвертувати й до цієї бази
1=≢∪1 дорівнює бирці унікальної цифри?
b/⍨елементи b, де вірно (що існує лише одна унікальна цифра).

Приклади випадків

Якщо немає бази, вихід порожній (що є фальсією), як це може продемонструвати ця програма:

 WhatIsEmpty
 →''/TRUE ⍝ goto (→) TRUE: if (/) emptystring ('')
 'False'
 →END       
TRUE:       
 'True'     
END:        

Це друкує "Неправдиве"


2

Pyth, 26 19 байт

hMfql{eT1m,djQdr2tQ

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

Додамо пояснення після того, як я переграв це. Подивіться на цю відповідь для більш короткої реалізації та пояснення.


1
Дякую, що нагадали, що я забув додаткові основи для 90та 91в своїх прикладах!
AdmBorkBork

2

MATL , 15 14 байт

3-:Q"G@:YAd~?@

Це працює з поточною версією (14.0.0) мови / компілятора.

Якщо бази не існує, вихід порожній (що є фальсією).

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

3-:Q    % take input x implicitly. Generate range of possible bases: [2,3,...,x-2]
"       % for each base b
  G     %   push input again
  @:    %   generate vector of (1-based) digits in base b: [1,2,...,b]
  YA    %   convert to that base
  d~    %   differences between consecutive digits; negate
  ?     %   if all values are true (that is, if all digits were equal)
    @   %     push that base
        %   end if implicitly
        % end for each implicitly
        % display implicitly

2

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

Cases[4~Range~#-2,a_/;Equal@@#~IntegerDigits~a]/.{}->0&

Анонімна функція, не надто складна. Просто фільтрує бази на основі репдигіту.


2

Python 2, 75 байт

n=input()
b=1
while b<n-2:
 i=n;b+=1
 while i%b==i/b%b:i/=b
 if i<b:print b

Порт моєї рубінової відповіді. Друкує всі дійсні бази, якщо такі є.


2

Джулія, 45 байт

n->filter(b->endof(∪(digits(n,b)))<2,2:n-2)

Це анонімна функція, яка приймає ціле число і повертає цілий масив. Щоб викликати його, призначте його змінній. Він поверне всі застосовні бази або порожній масив. Немає проблем з великими основами.

Спочатку формуємо інклюзивний діапазон [2, n - 2], де n - вхід. Потім ми filterперераховуємо лише цілі числа b, для яких n в базі b має менше 2-х унікальних цифр. Для цього для кожного цілого числа b в діапазоні ми отримуємо цифри n в базі b як масив з використанням digits, отримуємо унікальні елементи за допомогою та отримуємо індекс останнього елемента (тобто довжини) з використанням endof.


1

Брахілог , 12 байт

>>.ℕ₂≜&ḃ↙.=∧

Спробуйте в Інтернеті! (як генератор!)

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

В ідеалі це може виглядати приблизно так ḃ↙.=&>> , можливо, приносячи в жертву функціональність генератора в такому вигляді або подібному (оскільки він врешті-решт потрапить урядно), але на сьогодні 12 байт - це найкоротший, з якого я знаю, як його отримати.

     ≜          Assign an integer value to
  .             the output variable
   ℕ₂           which is greater than or equal to 2
 >              and less than a number
>               which is less than the input.
      &         The input
       ḃ↙.      in base-(the output)
          =     is a repdigit.
           ∧    (which is not necessarily the output)


0

05AB1E , 7 байт

ÍL¦ʒвÙg

Виводить усі можливі значення або порожній список як значення фальси (хоча технічно достовірні результати також є фальсі, оскільки тільки 1 05751E є тримати, а все інше - фальси).

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

Í        # Decrease the (implicit) input-integer by 2
 L       # Create a list in the range [1, input-2]
  ¦      # Remove the first value to make the range [2, input-2]
   ʒ     # Filter this list by:
    в    #  Convert the (implicit) input to the base of the number we're filtering
     Ù   #  Uniquify it, leaving only distinct digits
      g  #  Get the length of this, which is truthy (1) if all digits were the same
         # (and then output the filtered list implicitly as result)

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