Найменша нульова база


28

Враховуючи додатне ціле число n, виведіть найменшу базу, b >= 2де представлення nв базі bбез провідних нулів не містить a 0. Ви можете припустити, що b <= 256для всіх входів.

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

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])

1
Які значення для десяти, одинадцяти тощо у вищих базах, які ви використовуєте? Чи містять вони нулі?
Стівен

19
@Stephen Значення, вибрані для наведених вище цифр 9, не мають значення, оскільки вони не є 0.
Мего,


1
@Titus Це хороший момент. Я обмежу базу чимось розумним.
Мего

1
@Mego: Спробуйте 232792560. Це lcm 2,3, ..., 20, тому в кожній базі <= 20 він має 0 як найменш значущу цифру.
Нейт Елдредж

Відповіді:


15

Pyth , 6 байт

f*FjQT

Перевірте всі тестові випадки.

Як це працює

f * FjQT ~ Повна програма.

f ~ Перше додатне ціле число, де умова є правдою.
   jQT ~ Вхід, перетворений на базу поточного елемента.
 * F ~ Продукт. Якщо список містить 0, то це 0, інакше він суворо позитивний.
          0 -> Фальси; > 0 -> Трути.
        ~ Вивести результат неявно.

Хоча Pyth fпрацює на 1, 2, 3, 4, ...(починаючи з 1), Pyth розглядає числа в базі 1 (одинарні) як купу нулів, тому база 1 ігнорується.


Приємно зловживати тим фактом, що представлення Pyth base-1 - це нулі.
Erik the Outgolfer

@EriktheOutgolfer Дякую! Я додам пояснення щодо цього.
Містер Xcoder

Pyth - не єдина мова, чиє унарне представлення використовує нулі як підказку цифр : P
Mego

Ти написав 0 -> Falsy; > 0 -> Truthy. Це навмисне, що 0є Truthyі Falsyв цій ситуації?
Брайан J

@BrianJ Перед другою є >знак 0, що означає, що все, що перевищує 0, є правдою.
Містер Xcoder

11

C,  52  50 байт

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

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

C (gcc),  47  45 байт

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

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


Два байти збережено завдяки пропозиції @ Nevay щодо відповіді @Kevin Cruijssen!


2
Остання версія працює лише випадково, якщо ви наполягаєте на конкретному компіляторі. І, звичайно, жодна версія насправді не є C.
AnT

3
@AnT це C .. це дасть багато попереджень, але воно складе. поки ви знайдете компілятор, який працює для вашого коду, ви все добре
Феліпе Нарді Батіста,

1
@Blacksilver k%i- це потрійна перевірка тут. Більш читається варіант був би k=(k%i?k:n*++i);або навіть більш ясно: if(k%i){k=k;}else{k=n*++i;}.
Кевін Кройсейсен

1
Також ви можете грати в гольф як на 2 байти: i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;return i;}і i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;n=i;}. Вся заслуга належить @Nevay, який опублікував цю пропозицію на мою перенесену відповідь Java 8 .
Kevin Cruijssen

1
@Felipe Нарді Батіста: Я знаю про те, що правила CodeGolf говорять "до тих пір, поки вона складається" тощо. Однак той факт, що він "компілює", жодним чином не підтверджує, що це C. Це не C. Небезпечні декларації, як це було i, k;і f(n)існували в стародавніх версіях C (K&R), а лише в епоху, коли returnнавколо неї потрібні круглі дужки. аргумент. Якщо ви хочете використовувати K&R i,k;, ви також повинні використовувати return(i);. Сказане може бути gnuc, але не C.
ANT

8

Haskell , 56 52 48 байт

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

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

Досить базовий, але не можна придумати жодних хороших способів його скоротити

EDIT: Дякую Лайконі, що врятував мені 4 байти! Не знаю, чому я ніколи не думав про це !!0. Я, мабуть, мав би спробувати видалити ці круглі дужки, але у мене нечіткі спогади про якусь дивну помилку, коли ви намагаєтесь використовувати ||та &&разом. Можливо, я плутаю це з операторами рівності.

EDIT 2: Дякую @Lynn за гоління ще 4-х байт! Не знаю, як я ніколи untilраніше про це не знав .


1
Ти бив мене хвилиною майже таким самим рішенням. :) !!0коротше, headі я думаю, ви можете впустити круглі дужки #.
Laikoni

2
Кримінально недооцінений until :: (a → Bool) → (a → a) → a → aрятує чотири байти:f n=until(#n)(+1)2
Лінн







3

Java 8, 61 56 54 байт

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

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

Пояснення:

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

У мене є відчуття, що це можна пограти в гольф, використовуючи арифметичний підхід. Це дійсно може, за допомогою порту @Steadybox 'відповісти , а потім пограти в 2 байти завдяки @Nevay .

Старий ( 61 байт ) відповідь:

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

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

Пояснення:

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

2
54 байти:n->{int b=2,t=n;for(;t>0;)t=t%b++<1?n:t/--b;return b;}
Невай

2

Japt , 8 байт

@ìX e}a2

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

Пояснення

@    }a2

Поверніть перше число ( X) для проходження функції, починаючи з2

ìX

Перетворіть вхідний номер у масив базових Xцифр.

e

Перевірте, чи всі цифри є правдивими.


Невдало це, якщо масив містить численні кращі 10?
Shaggy

@Shaggy Моє розуміння полягало в тому, що, згідно з коментарем ОП, цифри для баз вище 9 не вважаються нулями.
Джастін Марінер

Ах, я це бачу зараз. Існує проблема з формулюванням виклику, тому (або я просто занадто втомився!).
Shaggy

2

JavaScript (ES6), 43 41 37 байт

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

Тестові справи



2

Python 2 , 57 байт

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

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

-1 завдяки Феліпе Нарді Батісті .
-2 спасибі Лінн (а тепер це є вмінням її рішення: D)


59 байт , змінившись a,b=a+c,dнаa+=c;b=d
Феліпе Нарді Батіста

Я думаю , ви можете замінити while m>1на while m(і тоді ми прив'язали!)
Lynn

@Lynn Тому я прокоментував ваше рішення, тоді було б точно таке саме.
Ерік Аутгольфер


1
@Lynn Я вже знав: p інакше я попросив би видалити своє.
Ерік Аутгольфер

2

APL (Dyalog) , 20 19 байт

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

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

Як завжди, завдяки @ Adám за допомогу у чаті та отримання коду для роботи в TIO. Також збереження 1 байта.

Це tradfn ( трад itional х unctio п ) тіло. Щоб використовувати його, потрібно призначити йому ім’я (яке знаходиться в полі заголовка TIO), укласти його в s (один перед ім'ям і один у полі нижнього колонтитулу TIO), а потім викликати його, використовуючи його ім'я. Оскільки він використовує quad ( ) для отримання даних користувача, він називається як f \n inputзвичайнийf input

Як?

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)

Потім функція повертає отриману базу.


1
Порада для гольфу: оскільки n←⎕це буде проста цифра і вам потрібен 1як початковий аргумент до решти коду, ви можете просто порахувати кількість елементів у n(що дорівнює 1), замінивши 1⊣на . Спробуйте в Інтернеті!
Адам


1

R , 79 71 66 63 65 байт

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

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

Ця відповідь ґрунтується на перестановці Джузеппе в один цикл.

Збережено 8 байт завдяки JDL та 6 байтів завдяки Джузеппе.


1
Ви можете суб bдля T, який починається визначається як TRUE == 1, усуваючи необхідність b=1. Точно так же ви можете суб Fдля k( Fце FALSE)
JDL

Я бачу, що ви там робили. Це корисне знати!
NofP

1
66 байт, використовуючи m%/%T(ціле ділення) замість(m-m%%T)/T
Джузеппе

65 байт . це було трохи безладно, але я підозрював, що позбавлення від вкладених петель щось врятує ; Я просто думав, що це буде більше 1 байта :(
Джузеппе

1

MATL , 13 12 байт

`G@Q_YAA~}@Q

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

-1 байт завдяки Луїсу Мендо. Ця програма не обробляє тестові корпуси, що перевищують 2 ^ 53 ( flintmax, максимальне послідовне ціле число, представлене типом з плаваючою комою), оскільки тип даних за замовчуванням знаходиться doubleв MATL. Однак він повинен мати можливість знайти будь-яку довільну нульову базу нижче цієї кількості.

`            % 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.

@LuisMendo Я дійсно повинен почати краще читати документи. Спасибі.
Санчіз

Здається, це не працює для великих тестових випадків, але я не знаю достатньо про MATL / Matlab, щоб знати, чи це викликано цілими обмеженнями чи ні.
Мего

@Mego Я протестував свою 13-байтну версію, яка повинна бути еквівалентною поточній версії до 1e6, на MATLAB R2017a. Які налаштування тесту призвели до проблем для вас?
Санчіз

Останні 2 тестових випадки викликають помилки.
Мего

@Mego Ах, я раніше не бачив цих тестів. Це пов'язано з реалізацією MATL, YAвикористовуючи внутрішньо парні подвійні, тому він може обробляти входи лише до максимального послідовного цілого числа, що може бути представлене подвійним (див. flintmax). Чи не відповідає це відповідь? В принципі алгоритм працює для довільної бази, я явно працював над іншою командою, яка би виконувалась лише до бази 36.
Санчіз

0

PHP, 59 + 1 байт

використовуючи вбудовані , максимум 36:

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

немає вбудованих файлів, 63 60 + 1 байт , будь-яка база:

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

Запустіть як трубу -nRабо спробуйте їх в Інтернеті .



0

J, 26 байт

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

Хочеться знати, чи можна це покращити.

Основне дієслово - це діадіальна фраза:

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

який задається входом зліва та постійною 2 праворуч. У цій головній дієслівній фразі використовується конструкція J's Do..While, збільшуючи правильний аргумент y до тих пір, поки 0 є елементом e.вихідного аргументу в базі y.

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



0

Чумацький Шлях , 38 байт

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

використання: ./mw base.mwg -i 3


Пояснення

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.

Я впевнений, що це можна скоротити за допомогою циклу while, а не для циклу, але я не міг змусити його працювати.



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