피보나치가 여왕을 만날 때


18

( 채팅에서 "chess"와 "Fibonacci"태그를 무작위로 페어링 한 Helka의 답변 에서 영감을 얻었습니다 )


피보나치

피보나치 수열는 각 번호 함께 두 이전 번호를 추가하여 구성되어 수학 더 잘 알려진 서열 중 하나이다. 아래는 제로 인덱스 시퀀스의 정의입니다.

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, ...0) 색인을 생성하지 않거나 색인을 생성 할 수는 있지만 제출할 내용을 명시하십시오.

피보나치 수는 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%.


도전

위에서 설명한 피보나치 타일링을이 도전을위한 체스 판으로 사용할 것입니다. 당신은 입력으로 두 개의 양의 정수를 주어됩니다 nx:

  • n타일링이 얼마나 큰 의미한다. 21왼쪽에 정사각형이있는 위의 타일링 예제 는 n = 8이후 크기 f(8) = 21가 0 인 인덱스 보드입니다 .
  • x커버리지를 계산, 퀸 (S) 배치를 위해 사용된다 피보나치 사각형 중 어느 나타낸다. 여왕은 특정 피보나치 정사각형 타일의 각 정사각형에 한 번에 하나씩 배치되며 총 적용 범위는 개별 (고유 한) 적용 범위의 요약입니다.

예를 들어, 여기에 n = 8(위와 동일한 타일링) 및 x = 4( f(4) = 3사각형에 해당하는 파란색 음영) 이미지가 있습니다. 9 개의 파란색 사각형 각각에 한 번에 여왕을 배치하면 여왕은 주황색으로 표시된 모든 사각형을 (결합) 덮을 수 있습니다. 따라서이 예의 전체 적용 범위는 309/714 = 43.28%입니다.

n = 8, x = 4

분명히, n = x적용 범위가 될 때마다 100%(예를 들어, n=8x=8을 사용하면 전체 보드의 모든 정사각형이 적어도 한 번 포함됨을 알 수 있습니다). 반대로, 적당히 큰 nx=1/ 또는 x=2범위를 사용하면 범위가 접근 할 수는 있지만 도달하지는 않습니다 0%(예 : n=8x=1범위를 가진 경우 범위는 paltry입니다 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

"피보나치 여왕을 만났을 때 "? 아니면 "피보나치가 여왕을 만난다"?
Jonathan Allan


@JonathanAllan 제목은 그대로 정확합니다. "이것은 X가 일어날 때 일어나는 일"에서와 같이 현재 시제입니다. "헨리는 점심으로 샐리를 만나면 항상 햄버거를 먹습니다."
AdmBorkBork

아, "피보나치가 여왕을 만날 때 ..."를 의미합니다!
Jonathan Allan

답변:


2

VB.NET, (.NET 4.5), 1238 1229 바이트

@totallyhuman 덕분에 -9 바이트

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

문제 설명의 시뮬레이션. 먼저 그리드를 생성하고 각 새로운 피보나치 수를 반복하여 사각형 크기를 늘립니다. 각 셀에 색인을 저장하여 다음 단계에서 여왕이 어디로 갈지 쉽게 찾을 수 있습니다.

그런 다음 여왕이 들어있는 모든 세포를 찾아서 위협 한 사각형을 0으로 표시합니다. 나는 여왕이있는 세포를 건너 뛰어 역 추적에 대해 걱정할 필요가 없다.

마지막으로, 나는 지워진 세포와 여왕이있는 세포를 세고 총 공간 수로 나눕니다. 백분율을 구하려면 100을 곱하고 가장 가까운 소수점 이하 두 자리로 반올림합니다.


hits더 짧은 변수 이름으로 변경할 수 없습니까 ? VB.NET을 모르지만 변수라고 가정합니다.
완전히 인간적인

@totallyhuman 그렇습니다, 맞습니다. 나는 손으로 갔고 그 중 하나를 놓쳤을 것입니다. 감사!
브라이언 J

2

파이썬 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는 시작되는 보드 정보를 포함하는 2 차원 배열 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

결과

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.