Цілісні логарифми


12

З огляду на цілі числа N , P > 1, знайдіть найбільше ціле Mтаке число P ^ M ≤ N.

I / O:

Введення задано у вигляді 2 цілих чисел Nта P. Виходом буде ціле число M.

Приклади:

4, 5 -> 0
33, 5 -> 2
40, 20 -> 1
242, 3 -> 4 
243, 3 -> 5 
400, 2 -> 8
1000, 10 -> 3

Примітки:

Вхід завжди буде дійсним, тобто завжди буде цілими числами більше 1.

Кредити:

Заслуга за ім’я припадає на @cairdcoinheringaahing. Останні 3 приклади - @Nitrodon, а заслуга за вдосконалення опису - @Giuseppe.


3
Я знаю, що ми (спільнота PPCG) може здатися занадто вибагливими щодо справді невеликих речей, але коментарі, такі як моя, справді мають намір добросовісно покращити виклик! Тепер, коли це було вирішено, я із задоволенням проголосував і видалив свої попередні коментарі.
Джузеппе

9
Це ще одна причина, чому ми пропонуємо опублікувати виклики в «Пісочниці» спочатку, щоб ви могли отримати корисні відгуки, поставити великий виклик та отримати багато якісних відповідей із значно меншою суєтою (на зразок голосів із близьким та нижчим голосом). :)
Джузеппе

2
Ви завжди можете розмістити повідомлення в загальній кімнаті для спілкування PPCG із проханням отримати зворотній зв'язок щодо ваших проблем із пісочницею, щоб привернути до них трохи уваги.
Джузеппе

12
Практично всі відповіді, що базуються на математиці з плаваючою комою, дають неправильні результати навіть для простих випадків, таких як (1000, 10) через помилку округлення, тому я додав ще один тестовий випадок.
nwellnhof

3
@MPW всі відповіді були видалені, і запропоновані мною пропозиції були відредаговані у публікації, тому вони вже не були актуальними.
Джузеппе

Відповіді:


8

Мозок-Флак , 74 байти

(({}<>)[()])({()<(({})<({([{}]()({}))([{}]({}))}{})>){<>({}[()])}{}>}[()])

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

Для цього використовується та сама концепція, що і стандартний алгоритм ділення на цілі числа з позитивним мозком-Flak.

# Push P and P-1 on other stack
(({}<>)[()])

# Count iterations until N reaches zero:
({()<

  # While keeping the current value (P-1)*(P^M) on the stack:
  (({})<

    # Multiply it by P for the next iteration
    ({([{}]()({}))([{}]({}))}{})

  >)

  # Subtract 1 from N and this (P-1)*(P^M) until one of these is zero
  {<>({}[()])}{}

# If (P-1)*(P^M) became zero, there is a nonzero value below it on the stack
>}

# Subtract 1 from number of iterations
[()])


6

Excel, 18 байт

=TRUNC(LOG(A1,A2))

Приймає вхід "n" на A1, а введення "p" на A2.


Я думаю, що ви можете використовувати INTфункцію замість того, TRUNCщоб зберегти 2 байти.
pajonk

4

Желе , 3 байти

bḊL

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

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

Як це працює

bḊL  Main link. Left argument: n. Right argument: p

b    Convert n to base p.
 Ḋ   Dequeue; remove the first base-p digit.
  L  Take the length.

3

Сітківка 0,8,2 , 35 байт

.+
$*
+r`1*(\2)+¶(1+)$
#$#1$*1¶$2
#

Спробуйте в Інтернеті! Пояснення:

.+
$*

Перетворіть аргументи в одинакові.

+r`1*(\2)+¶(1+)$
#$#1$*1¶$2

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

#

Порахуйте, скільки разів цикл пробіг.


3

Japt, 8 байт

@<Vp°X}a

Спробуй це


Це дуже акуратно, я ще не дуже добре бачив функції функцій у Japt, це хороший приклад.
Ніт

@Nit, мені також знадобилося багато часу, аби познайомитися з ними теж - лише нещодавно почав розбиратися у використанні F.g()- але вони неймовірно корисні.
Кудлатий


3

Perl 6 , 13 байт

&floor∘&log

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

Збірник журналу складання та підлоги, неявно має 2 аргументи, оскільки перший журнал функції очікує 2. Результат - це функція.


3
Для аргументів 1000, 10це повертається 2.
Шон

@Sean: Так, цікавий випуск точності там
Phil H


3

R , 25 байт

function(p,n)log(p,n)%/%1

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

Візьміть журнал Pбази Nі зробіть ціле ділення за допомогою 1, оскільки він коротший, ніжfloor() . Це трохи страждає від числової точності, тому я також подаю нижченаведену відповідь, що не повинно, окрім можливого цілого переповнення.

R , 31 байт

function(p,n)(x=p:0)[n^x<=p][1]

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


1
Я не знаю, наскільки суворий виклик вимагає від нас помилки округлення, але, наприклад, f (243,3) дорівнює 4, коли, ймовірно, потрібно 5.
JDL,

@JDL - це справедливий момент; Я вважаю, що абсолютно точною відповіддю було б ~ 31 байт.
Джузеппе

1
Я думаю, ви можете замінити на pвідповідь p+.1у 25 байт, і ви все одно будете добре, для 28 байт
JDL,

Ще 28-байтне рішення без чисельних питань щодо точності.
Робін Райдер


2

Рубін , 31 байт

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

->n,p{(0..n).find{|i|p**i>n}-1}

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

Але повернувшись до логарифмів, хоча незрозуміло, до якої точності ми повинні підтримувати вхід, але я думаю, що ця маленька хитрість вирішить проблему округлення для всіх більш-менш "реалістичних" чисел:

Рубін , 29 байт

->n,p{Math.log(n+0.1,p).to_i}

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


2

C (gcc) + -lm, 24 байти

f(n,m){n=log(n)/log(m);}

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


Я знаю про, long longале що таке bytes bytes? : P
абсолютнолюдський

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

5
Не працює для (1000, 10) через помилку округлення.
nwellnhof

f(n,m){n=(float)log(n)/log(m);}здається, працює @ 31 байт
GPS



2

це здається несправедливим для всіх інших
Флоріс,

1
@Floris Конкурси є між поданнями на кожній мові, а не між мовами?
користувач202729

@ user202729 так і ні. На мою думку, врешті-решт, "найкоротший код виграє". Але я помітив, що 2-байтове рішення далі вниз ... Ці мови для гольфу дують мені розум.
Флоріс

1
@Floris "Не дозволяйте мовам коду-гольфу не відштовхувати вас від публікації відповідей з мовами, що не кодують гольф. Спробуйте придумати якомога коротший відповідь на" будь-яку "мову програмування."
користувач202729

1
@Floris Також ... навіть Excel може це зробити в 2 вбудованих . Мови для гольфу можуть зробити це і в 2 вбудованих, просто вбудовані назви коротші. Нічого дивувати.
користувач202729

2

JavaScript , 40 33 байт

-3 байти завдяки DanielIndie

Здійснює введення в синтаксис currying.

a=>b=>(L=Math.log)(a)/L(b)+.001|0

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



1
28 байт і, можливо, вам потрібен метод каррі
DanielIndie,



4
toStringРішення працює тільки для баз до 36.
nwellnhof

2

Парі / GP, 6 байт

logint

(вбудовано додано у версії 2.7, березень 2014 р.) Бере два аргументи, з необов'язковим третім посиланням, яке, якщо воно є, встановлюється на базі піднятої до результату)


@StewieGriffin logint (x, y) від Pari / GP та Perl / ntheory дає правильні результати для 7 показаних на сьогодні прикладів, включаючи "3" для 1000,10.
DanaJ

+1, але я вважав би це 6 байтами.
Чарльз

2
Вам не дозволяється використовувати жорстко кодовані входи, тому це має бути функцією (наприклад, як лямбда або визначення). Однак ви можете просто скористатися logintверсією, яка налічує 5 байт менше.
ბიმო

2

Python 2, 3, 46 байт

-1 завдяки Джонатану

def A(a,b,i=1):
 while b**i<=a:i+=1
 return~-i

Пітон 1, 47 байт

def A(a,b,i=1):
 while b**i<=a:i=i+1
 return~-i

n~-iна один байт коротше, ніж n i-1.
Джонатан Фрех

Також, будь ласка, вкажіть версію вашого Python.
Джонатан Фрех

Буде працювати в будь-якій версії, чи не так?
Ведант Кандой

Це не буде працювати в Python 1.
Jonathan Frech

2

JavaScript (Node.js) , 22 байти

m=>f=n=>n<m?0:f(n/m)+1

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

Загорнута рекурсивна функція. Використовувати як g(P)(N). Менш схильний до помилок з плаваючою комою, ніж використанняMath.log , і (я вважаю) код дає правильні значення, якщо обидва входи є безпечними цілими числами (під 2**52).




1

Мова Вольфрама (Mathematica) 15 10 байт

Floor@*Log 

(вимагає зворотного порядку на вході)

Оригінальне подання

⌊#2~Log~#⌋&

⌊Log@##⌋&на один байт коротший
Лукас Ланг,

@ Mathe172, це один символ коротший, але я рахую 13 байт. Лівий і правий підлогу в UTF-8 рахуються по 3 байти.
Келлі Лоудер

@StewieGriffin% [10,1000] дає 3. Входи розглядаються як цілі числа, а не машинні числа, якщо ви не ставите після них десятковий знак.
Келлі Лоудер

1

Четвертий (gforth) , 35 байт

: f swap s>f flog s>f flog f/ f>s ;

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

Можна було зберегти 5 байтів, замінивши очікувані вхідні параметри, але питання вказує на N має бути спочатку (міг би бути зроблений аргумент, що в мові постфіксу "Спочатку" означає верхню частину стека, але я буду дотримуватися букви правил для зараз)

Пояснення

swap       \ swap the parameters to put N on top of the stack
s>f flog   \ move N to the floating-point stack and take the log(10) of N
s>f flog   \ move P to the floating-point stack and take the log(10) of P
f/         \ divide log10(N) by log10(P)
f>s        \ move the result back to the main (integer) stack, truncating in the process

1

Pyth, 6 4 байти

s.lF

Збережено 2 байти завдяки Mmenomic
Спробуйте в Інтернеті

Як це працює

.lце журнал B (A)
Якщо чесно, я не маю уявлення, як це Fпрацює. Але якщо це працює, воно працює.
sобрізає поплавок до int, щоб дати нам найбільше ціле число M.


2
1000,10 як вхід дає 2 як вихід
Стюі Гріффін

Ще одне подібне рішення/FlM
RK.

1

Диво , 9 байт

|_.sS log

Приклад використання:

(|_.sS log)[1000 10]

Пояснення

Докладна версія:

floor . sS log

Це написано точковим стилем. sSпередає елементи списку як аргументи функції (у цьому випадку log).


1

Гфорт , 31 байт

SWAP S>F FLOG S>F FLOG F/ F>S .

Використання

242 3 SWAP S>F FLOG S>F FLOG F/ F>S . 4 OK

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

Пояснення

На жаль, FORTH використовує виділений стек із плаваючою комою. Для цього мені потрібно SWAP(обміняти) вхідні значення, щоб вони дісталися до стека з плаваючою точкою в потрібному порядку. Я також повинен перемістити значення до цього стека S>F. При переміщенні результату з плаваючою комою назад до цілого числа (F>S ) я маю перевагу отримати усікання безкоштовно.

Коротша версія

Розтягуючи вимоги та забезпечуючи введення в плаваючому форматі та правильному порядку, є більш коротка версія з 24 байтами.

FLOG FSWAP FLOG F/ F>S .
3e0 242e0 FLOG FSWAP FLOG F/ F>S . 4 OK

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


Як правило, для відповідей CodeGolf фрагменти заборонені (якщо інше не вказано у виклику). Цю відповідь слід або обернути функцією (Word in Forth), : f .... ;або перетворити на програму, яка приймає введення, використовуючи KEYабоACCEPT
reffu

@reffu Що таке фрагмент? На мою думку, номер слів з невеликим кодом показує щось, що, однак, нічого не робить для себе. З іншого боку, код, який я надав, працює без змін на "Спробуйте в Інтернеті!". Чи варто йти мета?
Китана

У цьому конкретному випадку код, який ви опублікували, насправді буде кидати стек під потоком, якщо ви не розмістите параметри перед ним. Відповіді на код гольфу, як правило, повинні бути автономною програмою або функцією, яка дає очікуваний результат, якщо зателефонувати пізніше. Якщо ви переходите за посиланням на мета-пост у моєму попередньому коментарі, явно згадується, що стандартом відповіді є програма чи функція, з яких ваша ні одна. Щоб виправити це, знадобиться лише ще 4 байти
reffu



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