Обчисліть A (N) / B (N) за допомогою цифр C (N)


15

Розглянемо три послідовності чисел A, Bта C:

  • A: Послідовність, заснована на рецидивних відносинах f(n) = f(n-1)+f(n-2), починаючи з f(1) = 3, f(2) = 4. Отже, послідовність починається так:3 4 7 11 18 29 47 76 ...
  • B: Складені числа , тобто всі цілі числа, які не є простими числами (або 1):4 6 8 9 10 12 14 15 16 ...
  • C: Цифри Pi: 3 1 4 1 5 9 2 6 5 ...

Давши додатне ціле число N < 50, або як аргумент функції, або STDIN, поверніть десяткове значення дробу A(N)/B(N)з C(N)цифрами після десяткової крапки. Застосовуються звичайні правила округлення (округлюйте, якщо N + 1'-я цифра дорівнює 5 або вище). Якщо N-та цифра piдорівнює нулю, слід надрукувати ціле число. наукове позначення / Стандартна форма приймається для чисел, що перевищують 1000.

Це кодовий гольф, тому найкоротша відповідь у байтах виграє.

Деякі приклади:

N = 1: 0.750
N = 2: 0.7
N = 3: 0.8750
N = 4: 1.2
N = 6: 2.416666667
N = 10: 11.056
N = 20: 764.8750

Звичайно, застосовуються стандартні правила гольфу.

Функція повинна припинитися менш ніж за дві хвилини на будь-якому сучасному ноутбуці.


Коли ви говорите C(n)цифри, чи потрібно включати проміжні 0?
Мальтісен

На який вхід застосовується обмеження часу?
Денніс

@Dennis, ти маєш на увазі до чого N? Якщо так, то до N = 49. Або щось інше?
Стюі Гріффін

У JavaScript обмежена точність з плаваючою точкою 16. Минуло, що ви почнете отримувати неточні результати. Це добре?
Пуховик

1
@vihan Моє рішення (неопублікований банкомат) зберігає перші 49 цифр pi в рядку. І вам не потрібно більше 9 цифр точності, якщо ви переживаєте з цього приводу.
ETHproductions

Відповіді:


9

Pyth, 60 57 58 байт

.[K`.Rchu,eGsGQjT7e.ftPZQ)Je/u+/*GHhyHy^TQr^T3ZZT\0+xK\.hJ

Тестовий джгут

Це досить просто - обчисліть pi, рядок полів і композити, круглі до C (n) цифри, pad до C (n) цифри плюс розташування цифр у десятковій крапці, зроблено.

A (n): hu,eGsGQjT7

B (n): e.ftPZQ)

C (n): e/u+/*GHhyHy^TQr99ZZT

60 -> 57: Очищено n = 1 спеціальний випадок при розрахунку pi.

57 -> 58: Не використовувався достатньо високий преціум для pi для всього вхідного діапазону - збільшив 99 ітерацій до 1000 ітерацій.

Примітка щодо округлення: тут використовується "найближча рівна" система округлення Python, а не визначена ОП система "до нескінченності". Однак різниця має значення лише в тому випадку, якщо цифри, що безпосередньо слідують за точкою округлення, є 5000..., наприклад, 1,25 округленими до однозначної. Я перевірив діапазон введення, і цього ніколи не відбувається, тому правильний результат завжди повертається.


2

PowerShell, 420 байт (ayyyyyyyy) 378 байт

param($n);[int[]]$p="03141592653589793238462643383279502884197169399375"-Split'';$a=@(0,3,4);for($i=3;$i-lt50;$i++){$a+=$a[$i-1]+$a[$i-2]};$c=[char[]]"00001010111010111010111011111010111110111010111011111011111010111110111";$b=@(0);for($i=4;$i-le70;$i++){if($c[$i]-eq'1'){$b+=$i}};[double]$r=$a[$n]/$b[$n];$q=$p[$n+1];$s="";(0..($q-1))|%{$s+="0"};([math]::Round($r,$q,[MidpointRounding]::AwayFromZero)).ToString("0.$s")

Завдяки isaacg за збереження 41 байта, для обчислення способу округлення питання. Значить, мені не довелося включати жахливі [MidpointRounding]::AwayFromZeroі мені не потрібно було чітко виступати як а [double].

Це було дуже весело!

Розширено:

# Take input N
param($n)

# First digits of pi, stored as integer array
[int[]]$p="03141592653589793238462643383279502884197169399375"-Split''

# Fibonacci sequence A(N)
$a=@(0,3,4)
for($i=3;$i-lt50;$i++){
  $a+=$a[$i-1]+$a[$i-2]
}

# Zero-indexed bitmask for if the n-th integer is composite (1) or not (0)
$c=[char[]]"00001010111010111010111011111010111110111010111011111011111010111110111"

# Populate B(N) as an array using the $c mask
$b=@(0)
for($i=4;$i-le70;$i++){
  if($c[$i]-eq'1'){
    $b+=$i
  }
}

# Calculation Time!
$r=(a($n))/$b[$n]

# A small golf, as $p[$n+1] gets used a couple times
$q=$p[$n+1]

# Need to generate a string of zeroes for padding
$s=""
(0..($q-1))|%{$s+="0"}

# Round the number, then send it to a string so we get the necessary number of zeroes
([math]::Round($r,$q)).ToString("0.$s")

Рекурсія в PowerShell - це повільно, якщо говорити, тому ми повинні побудувати A(N)інший напрямок і зберегти його в масив, а потім проіндексувати.


СТАРИЙ

Також, свята корова, чи це вбивство вирішило. PowerShell за замовчуванням здійснює округлення до найближчого a / k / заокруглення банкіра, що вимагає використання надзвичайно багатослівного [MidpointRounding]::AwayFromZeroдля переключення стилів округлення . Крім цього, тоді нам потрібно буде прокладати кінцеві нулі, якщо такі є. Ці дві вимоги поєднуються, щоб перетворити останні пару рядків з 20 байт [math]::Round($r,$q) на 102 байти (від $s=""до +$s)) ... вау.


Чудовий опис / коментування! 32 символи для [MidpointRounding]::AwayFromZeroсамої майже занадто добре / погано, щоб бути правдою ... =)
Стюі Гріффін

1
Дивіться мою примітку щодо округлення у моїй відповіді. Округлення за замовчуванням PowerShell має бути нормальним.
isaacg

1

Javascript (ES6), 302 байти

Одне слово: Незакінчене.

x=>{a=[0,3,4],b=[0],c='03141592653589793238462643383279502884197169399375';for(i=1;i<x;a[i+2]=a[i]+a[++i]);for(i=1,p=[];++i<70;v=p.every(x=>i%x),(v?p:b).push(i));r=''+Math.round(a[x]/b[x]*(l=Math.pow(10,c[x])))/l;if(x==33)return r;r.indexOf`.`<0&&(r+='.');while(!r[r.indexOf`.`+ +c[x]])r+='0';return r}

Перші 49 цифр пі зберігаються в рядку, а дві інші послідовності автоматично генеруються. Це було гольфу приблизно на півдорозі; Я (майже) впевнений, що міг би вичавити з нього ще 50 байт.

Працює для всіх тестових випадків і має працювати для решти. Збиває щось, що перевищує 49 або менше 0 (ніколи так і не повинно стикатися з цими ситуаціями). Особливо мені подобається його результат за 0:

NaN.

Чому це незакінчене?
Бета-розпад

@BetaDecay Я мав на увазі, що ще не закінчив гольф. Я буду, як тільки матиму час.
ETHproductions

1

Октава, 276 236 байт

Перш за все, я подумав, що було б здорово використовувати деяку необмежену точність у цих математичних інструментах (і оновити деякі знання про це), тому я почав писати деякі алгоритми, а потім закінчився, нарешті, з’ясував, що piзначення не таке точне, що я доведеться знову використовувати масив. Тож ще раз, жодного великого успіху:

function c(A)p="3141592653589793238462643383279502884197169399375";f=ones (1,50);f(1)=3;f(2)=4;for i=3:53f(i)=f(i-1)+f(i-2);end
i=0;x=1;while i<A
x++;for j=2:x/2
if mod(x,j)==0 i++;break;end end end
printf(["%." p(A) "f\n"],f(A)/x);end

Ще досить читабельно, чи не так?

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

функція копіювання та вставки в октаву, функція виклику cз аргументом необхідного значення:

>>> c(1)
0.750
>>> c(49)
407880480.04348

Оптимізація:

  • Що вийшов на заміну endif, endforі аналогічні з endякої працює таким же чином ,
  • зменшення змінної iна один зберегти один байт
  • зніміть num2str(str2num(p(A)))дурниці :)

Мені подобається, що ти розмістив рішення Octave (я сам хлопець MATLAB!). Зауважте, що цей код є лише Octave, а не MATLAB. MATLAB використовує endне endifтак багато байтів. Якщо ви пощастило мати символічний набір інструментів для MATLAB, ви можете використовувати , vpaщоб отримати достатню кількість десяткових точок для пі: vpa(sym(pi),49). У мене його немає на цьому ноутбуці, тому я не впевнений, чи symпотрібні там, але все-таки слід зберегти досить багато байтів =) І читабельність не обов'язково є хорошою справою в коді гольфу =)
Стюі Гріффін,

x ++ також не є командою MATLAB. Я не знав, що існують такі великі відмінності між двома ... ІМО, так не повинно бути. Я думаю, що весь код, написаний в Octave, повинен бути переносним на MATLAB (але не обов'язково навпаки, оскільки MATLAB має більше варіантів).
Стюі Гріффін

Затверджено вашу редакцію. У мене тут немає математики, тому я не зміг її перевірити. Я шукав рішення, щоб отримати більше пікселів пікселя в октаві, але, на жаль, нічого не було коротше, ніж просто масив. Але непомітна робота whileіз endwhileподібним і відмінно працює, тому я
оновлюю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.