Коли Фібоначчі зустрічається з королевами


18

(натхненний відповіддю Гелки на моє випадкове сполучення тегів "шахи" та "Фібоначчі" в чаті)


Фібоначчі

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

f(0) = 0
f(1) = 1
f(n) = f(n-1) + f(n-2)

Це призводить до послідовності 0, 1, 1, 2, 3, 5, 8, 13, 21, ...( посилання OEIS ). У цьому виклику ми зосередимось лише на строго позитивних значеннях (так 1, 1, 2, 3, ...), і ви можете вибрати нульову індексацію або одноіндексацію, але, будь ласка, зазначте, що у вашій заяві.

Числа Фібоначчі можуть бути використані для плитки площини, використовуючи квадрати, що мають послідовні f(n)розміри, і вирівнюючи їх краї між собою. Черепиця робиться за годинниковою стрілкою, розміщуючи квадрати за схемою "вправо-вліво-вниз" від поточного квадрата. Приклад цього часткового облицювання для f(8)=21, з початковим квадратом, виділеним синім кольором, є наступним:
Квадрати Фібоначчі

Ви можете бачити , що в f(1)=1якості вихідного квадрата (виділено синім кольором), на f(2)=1площі вміщеній на право його, то f(3)=2квадрат поміщається вгору від там, f(4)=3квадрат , зроблені наліво і так далі. Наступний квадрат був би f(9)=21+13=34і був би розміщений донизу. Це метод часткового облицювання, який ми будемо використовувати у цій проблемі.


Королеви

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

Ми визначимо термін покриття як

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

Для прикладу, що рухається вище, покриття королеви таке 28/64 = 43.75%. Якби королева була у правому верхньому h8квадраті, покриття було б 22/64 = 34.375%. Якби королева була e7, покриття було б 24/64 = 37.5%.


Змагання

Ми будемо використовувати плитку Фібоначчі, продемонстровану вище, як нашу шахівну дошку для цього завдання. Вам буде дано два позитивних цілих чисел в якості вхідних даних, nі x:

  • nПредставляє , наскільки великий замощення. Приклад плитки вгорі, з 21квадратом ліворуч, - це дошка розміром n = 8з f(8) = 21(коли нульова індексація).
  • xЯвляє який з квадратів Фібоначчі використовується для розміщення Королева (и), для розрахунку покриття. Цариці розміщуються по одному на кожному квадраті у цій конкретній квадратній плитці Фібоначчі, а загальне покриття - це підсумок індивідуального (унікального) покриття.

Наприклад, тут зображено зображення n = 8(те саме плитка, що і вище) та x = 4(відповідне f(4) = 3квадрату, затінене синім кольором). Помістивши королеву по одному в кожен із цих дев'яти синіх квадратів, королеви можуть (комбіновано) покривати кожен квадрат, помаранчевий помаранчевим кольором. Таким чином, загальне покриття в цьому прикладі 309/714 = 43.28%.

n = 8, x = 4

Цілком очевидно, що в будь-який час це n = xбуде покриття 100%(наприклад, з n=8і x=8, ви можете бачити, що кожен квадрат на всій дошці буде покритий хоча б один раз). І навпаки, при відповідно великому nі, x=1або x=2, покриття збирається наближатися (але ніколи не охоплюватиметься) 0%(наприклад, з n=8і x=1, покриття є мізерним 88/714 = 12.32%).

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


Правила

  • Введення та вихід можуть бути задані у будь-якому зручному форматі , але повинні бути точними до двох знаків після коми. Вкажіть, будь ласка, як ваш код обробляє округлення.
  • Припустимо, що на дошці відсутні інші шматки або іншим чином не заважають рухам.
  • Прийнятна або повна програма, або функція. Якщо функція, ви можете повернути вихід, а не надрукувати його.
  • Якщо можливо, додайте посилання на онлайн-тестувальне середовище, щоб інші люди могли спробувати ваш код!
  • Стандартні лазівки заборонені.
  • Це тому застосовуються всі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

Приклади

n = 8, x = 4
43.28

n = 8, x = 8
100 or 100.00

n = 8, x = 1
12.32

n = 4, x = 1
66.67

n = 4, x = 2
60 or 60.00

n = 5, x = 3
75 or 75.00

n = 5, x = 1
47.5 or 47.50

Фотографія мого профілю є напіврелевантною
Stephen

"Коли Фібоначчі зустрів королеву"? Або "Фібоначчі зустрічається з королевами"?
Джонатан Аллан


@JonathanAllan Заголовок правильний як є. Це показовий час, як у "це те, що відбувається, коли відбувається X". Порівняйте "Коли Генрі зустрічає Саллі на обід, вони завжди їдять гамбургери".
AdmBorkBork

А, ти маєш на увазі "Коли Фібоначчі зустріне королеви ..."!
Джонатан Аллан

Відповіді:


2

VB.NET, (.NET 4.5), 1238 1229 байт

-9 байт завдяки @totallyhuman

Function A(n,x)
Dim g=New List(Of List(Of Long))
g.Add(New List(Of Long))
g(0).Add(1)
For i=2To n
Dim b=1
If i>2Then 
Dim w=0,y=1
b=w+y
For j=3To i
w=y
y=b
b=w+y
Next
End If
Select Case i Mod 4
Case 1
For j=1To b
Dim l=New List(Of Long)
For k=1To b
l.Add(i)
Next
g.Add(l)
Next
Case 2
For Each r In g
For j=1To b
r.Add(i)
Next
Next
Case 3
For j=1To b
g.Insert(0,New List(Of Long))
For k=1To b
g(0).Add(i)
Next
Next
Case 0
For Each r In g
For j=1To b
r.Insert(0,i)
Next
Next
End Select
Next
For i=0To g.Count-1
Dim c=g(i)
For j=0To c.Count-1
Dim e=c(j)
If e=x Then
For k=1To Math.Max(g.Count,g(0).Count)
If j-k>=0AndAlso c(j-k)<>x Then c(j-k)=0
If i-k>=0AndAlso g(i-k)(j)<>x Then g(i-k)(j)=0
If j+k<c.Count AndAlso c(j+k)<>x Then c(j+k)=0
If i+k<g.Count AndAlso g(i+k)(j)<>x Then g(i+k)(j)=0
If i-k>=0AndAlso j-k>=0AndAlso g(i-k)(j-k)<>x Then g(i-k)(j-k)=0
If i-k>=0AndAlso j+k<c.Count AndAlso g(i-k)(j+k)<>x Then g(i-k)(j+k)=0
If i+k<g.Count AndAlso j-k>=0AndAlso g(i+k)(j-k)<>x Then g(i+k)(j-k)=0
If i+k<g.Count AndAlso j+k<c.Count AndAlso g(i+k)(j+k)<>x Then g(i+k)(j+k)=0
Next
End If
Next
Next
Dim hits=0
For Each r In g
For Each c In r
If c=x Or c=0Then hits+=1
Next
Next
Return Math.Round(hits*100/(g.Count*g(0).Count),2)
End Function

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

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

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


Ви не можете змінити hitsназву коротшої змінної? Я не знаю VB.NET, але я припускаю, що це змінна.
повністюлюдський

@totallyhuman так, це правильно. Я пройшов через руку і, мабуть, пропустив цю. Спасибі!
Брайан J

2

Python 2 , 524 499 байт

def Q(n,x):
 global w,h,f;f,R,L=0,range,len
 for d in R(n):s=x-1==d;f=f or[[s]];w=L(f[0]);W,H=R(w),R(L(f));exec"for j in "+("W:f.append([s]*w)","f:\n\tfor k in H:j.append(s)","W:f.insert(0,[s]*w)","f:\n\tfor k in H:j.insert(0,s)","f:0")[d%4-(d==0)]
 w,h=L(f[0]),L(f);l=0,1,-1
 for Y in R(h):
	for X in R(w):exec("""def F(u,v,x,y):
 while(u==v==0)==0<=x<w!=0<=y<h:f[y][x]=1+(f[y][x]!=1);x+=u;y+=v
for s in l:
 for t in l:F(s,t,X,Y)""","")[f[Y][X]!=1]
 q=w*h;return(q-sum(j.count(0)for j in f))*100./q

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

Визначення функції, яка займає як розмір плитки, так nі номер квадратного поля королевиx . Відсоток відхилення попутно округляється до двох знаків після коми (у нижньому колонтитулі, де відбувається весь вихід).

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


1

Mathematica 11,1, 336 байт, 1-основа

R=Rectangle[#,+##]&;f=Fibonacci;o=Join@@Outer[##,1]&;r=RegionUnion;s=RegionMeasure;p[1]={0,0};p[i_]:=p[i-1]+{{-f@i,-f[i-2]},{0,-f@i},{f[i-1],0},{f[i-1]-f@i,f[i-1]}}[[i~Mod~4+1]];t[i_]:=r[R[p@#,f@#]&/@Range@i];k[n_,x_]:=Round[100s@RegionIntersection[r[R[#,f@x]&/@((#+p@x)&/@o[1##&,o[List,{-1,0,1},{-1,0,1}],Range[2f@n]])],t@i]/s@t@i,.01]

Використання: k[n, x]. Зверніть увагу, що функція заснована на 1. Округлення досягається шляхомRound[100x,0.01]

В основному, p[i]це функція визначення положення кожного квадрата. А площа розраховується верхнього рівня функції , такі як RegionIntersection, RegionUnion,RegionMeasure

результат

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