[checkio] Counting Tiles

11625 단어 JavaScript
이번 주제는 정사각형 타일이 8x8로 깔린 전장에서 둥근 반경 니키가 출정해 반경 니키의 폭발 중심 구역에 휘말린 불쌍한 타일들을 완전히 사라진 부분과 완전히 사라진 부분으로 나눠 계산하는 것이다.
이미지:

뭐랄까!처음에는 어떻게 풀어야 할지 몰라서 수학을 싫어하는 고등학교 생활을 저주했다.
그러나 아래의 계시는 하늘에서 떨어졌다
엔화를 네 부분으로 나누어 생각하다.
・왼쪽 위쪽의 원만 본다.
● 반지름과 슬라이스의 왼쪽 위 모서리와 오른쪽 아래 모서리의 중심 사이의 거리를 비교합니다. 전자는 트림일 때 전체 슬라이스이고 후자는 트림일 때 부분적으로 슬라이스를 포함합니다.
이렇게 하면 풀리고 무사히 살아날 수 있다.

자신의 대답

function countingTiles(radius){

    //variables
    let peT = 0;
    let paT = 0;
    let bigRad = Math.ceil(radius);

    countTiles(bigRad, radius);
    peT*=4;
    paT*=4;

    //counting up mates
    function countTiles(a, b) {
        for (let x=0; x<a; x++) {
            for (let y=0; y<a; y++) {
                if ((x==0&&b>=y)||(y==0&&b>=x)) {
                    if (b>=Math.sqrt((x+1)**2+(y+1)**2)) peT++;
                    else if (b>=x||b>=y) paT++;
                }
                else if (b>=Math.sqrt((x+1)**2+(y+1)**2)) peT++;
                else if (b>=Math.sqrt(x**2+y**2)) paT++;
            }
        }
    }

    return [peT, paT]
}
상당히 간결하게 쓴 것 같다.
3제곱의 정리는 적용되지 않으며 x축, y축 중 임의로 0의 도안을 분리한 곳은 약간 불필요하다.무슨 방법이 있습니까?

놀라운 성과

function countingTiles(radius) {
  var d = (x, y) => Math.sqrt(x * x + y * y),
      a = Math.ceil(radius), i = 0, x, y, f = 0, p = 0;
  while (i < a * a)
    d((x = i % a) + 1, (y = ~~(i++/a))+1) <= radius ? f++ : d(x, y) <= radius &&  p++
  return [4 * f, 4 * p];
}
나는 그것이 어떻게 된 일인지 전혀 모른다.
2-3 줄에 몇 개의 변수를 정의했다
d...두 매개변수에서 점 중심에서 떨어진 거리를 계산합니다.
a...반지름 값을 저장합니다.
i...몰라.계수기의
x...몰라.타일의 오른쪽 아래 위치 x 좌표
y...몰라.타일의 오른쪽 아래 위치 y 좌표
f...완전 한쪽 타일.
p...부분 타일.
5-6줄의while 블록은 90도의 원 속의 타일 같다
첫 번째 삼원 연산자의 첫 번째 표현식.
d((x = i % a) + 1, (y = ~~(i++/a))+1) <= radius ?
예, 예를 들면radius=1.6,a=2로 생각해보면
첫 주...i=0
d(0+1, 0+1) <= 1.6 ?//왼쪽 위 위치가 [1,1]인 타일
다음 주...i=1
d(1+1, 0+1) <= 1.6 ?//왼쪽 위가 [2,1]인 타일
셋째 주...i=2
d(0+1, 1+1) <= 1.6 ?//왼쪽 위 위치가 [1,2]인 타일
넷째 주...i=3
d(1+1, 1+1) <= 1.6 ?//왼쪽 위 [2,2] 타일
그렇구나, 확실히 순서대로 온전한 타일을 하나하나 보았다
위의 공식이 정확하지 않으면 다음 공식을 수행합니다.
d(x, y) <= radius &&  p++
이것은 논리 연산자의 동작으로 보는 것이다!
참조: JavaScript의 &&&&&|에 대한 오해가 큰 일 - Qita
오른쪽 아래 위치는 제1식의 x, y로 정의되어 있기 때문에 이를 대입d()하고 반경보다 짧은 상황에서 집행p++한다.
대단하다.

배우다


~~number
  • number의 소수점 부분을 버려라.number는 마이너스인 경우 Math입니다.플로어 기능과 달리 소수점 이하의 부분만 제거하고 정수 부분을 되돌려줍니다.
    (참조: JavaScript를 사용하여 소수점을 정수로 변환하는 열광적인 방법 및 실행 속도-q-az)
  • Math.floor(number)
  • number의 소수점 이하를 버려라.number가 음수이면 정수 부분이 1 떨어진다.
    예) Math.floor(-4.25)...-5
  • % (남음)
  • 왼쪽 조작수를 오른쪽 조작수로 나누어 얻은 나머지 수치를 되돌려줍니다.왼쪽의 작업 수가 시간보다 많으면 왼쪽의 작업 수를 그대로 되돌려줍니다.
  • ++aa++의 차이
  • 이 변수를 다른 변수에 대입한 경우incredent의 정시에 변화가 발생한다.앞에는 대입 전에 a+1을 추가하고, 뒤에는 a를 다른 변수에 대입한 후에 a를 추가한다.엄밀히 말하면 집행행 전에 가산한 구별이 아닌가.
    참고: 전면 및 후면-ajaxtower,
    참고:JavaScript(2) 전면 및 후면 연산자-천천히인일기
  • 반성하다.


    나는 압도적인 느낌을 느꼈다.
    그런 다음 선행, 후행, 논리 연산자 등의 상세한 방법을 무시하지 말고 계속 공부해라.

    좋은 웹페이지 즐겨찾기