볼링게임 점수계산 0 21 10,518

by 디케이 [2013.04.24 11:59:59]



타 사이트에 있는 문제데요

문제만 있고 답이 없어서 같이 풀어볼려고 복사해 왔어요.

 
WITH 
T(FRM, ORD, SCR) AS (
 SELECT 1 , 1, '9' FROM DUAL 
 UNION ALL SELECT 1 , 2, '/' FROM DUAL 
 UNION ALL SELECT 2 , 1, '8' FROM DUAL 
 UNION ALL SELECT 2 , 2, '0' FROM DUAL 
 UNION ALL SELECT 3 , 1, 'X' FROM DUAL 
 UNION ALL SELECT 3 , 2, '' FROM DUAL 
 UNION ALL SELECT 4 , 1, 'X' FROM DUAL 
 UNION ALL SELECT 4 , 2, '' FROM DUAL 
 UNION ALL SELECT 5 , 1, '8' FROM DUAL 
 UNION ALL SELECT 5 , 2, '0' FROM DUAL 
 UNION ALL SELECT 6 , 1, 'X' FROM DUAL 
 UNION ALL SELECT 6 , 2, '' FROM DUAL 
 UNION ALL SELECT 7 , 1, '8' FROM DUAL 
 UNION ALL SELECT 7 , 2, '1' FROM DUAL 
 UNION ALL SELECT 8 , 1, '9' FROM DUAL 
 UNION ALL SELECT 8 , 2, '/' FROM DUAL 
 UNION ALL SELECT 9 , 1, '8' FROM DUAL 
 UNION ALL SELECT 9 , 2, '1' FROM DUAL 
 UNION ALL SELECT 10, 1, 'X' FROM DUAL 
 UNION ALL SELECT 10, 2, '9' FROM DUAL 
 UNION ALL SELECT 10, 3, '/' FROM DUAL)

==========
볼링 점수 계산은 아시죠..

X : 스트라이크, / : 스페어 처리 인것 같네요.

이문제 계산해보니 155 점이 나오던데 쿼리로 계산이 가능할까요...

뭔가 복잡해보이는데 심심해서 한번해봐야 겠어요..

===================================================================
추가 사항 덧붙입니다.

@ 볼링점수계산요령 
  - 스트라이크시 다음공과 다다음공의 점수를 포함합니다.
  - 스페어처리시 다음공 점수 포함합니다.
  - 스트라이크나 스페이처리를 못했을 경우는 1, 2차 합계가 현재 프레임의 점수입니다.
  - 10 프레임은 해당 프레임 점수 합계를 구하면 됩니다.
----------------------------------------------------------------------
저는 다음과 같이 각 프레임의 점수를 계산했습니다.

 1frm 점수 = 1frm 1ord + 1frm 2ord + 2frm 1ord
 2frm 점수 = 2frm 1ord + 2frm 2ord
 3frm 점수 = 3frm 1ord + 4frm 1ord + 5frm 1ord
 4frm 점수 = 4frm 1ord + 5frm 1ord + 5frm 2ord
 5frm 점수 = 5frm 1ord + 5frm 2ord
 6frm 점수 = 6frm 1ord + 7frm 1ord + 7frm 2ord
 7frm 점수 = 7frm 1ord + 7frm 2ord
 8frm 점수 = 8frm 1ord + 8frm 2ord + 9frm 1ord
 9frm 점수 = 9frm 1ord + 9frm 2ord
10frm 점수 = 10frm 1ord + 10frm 2ord + 10frm 3ord
by 아발란체 [2013.04.24 12:13:32]
풀어보려고... 볼링을 몰라, 볼링 점수 계산 방법 찾아본 1人.... 콜록...
어째 배보다 배꼽이 더 큰 것 같음.. 점수 계산 방법이 단순한 덧셈이 아니군요.. OTL

by 디케이 [2013.04.24 12:42:51]

참고로 스트라이크(X)는 10점이고 다음공과 다다음공의 점수를 더해서 현재 프레임의 점수가 됩니다.
그리고, ORD 첫번째에 스트라이크면 두번째는 필요가 없습니다. 즉 가상데이터에서 scr가 null인 것은 제외해야 됩니다.

스페어 표시는 전체 10점에서 이전에 얻은 점수를 빼주면 구할수 있습니다.
그리고, 스페어 처리시 다음공점수를 더해서 현재 프레임의 점수를 얻을 수 있습니다.

나머지는 그냥 1,2차 점수를 더해주면 될것 같네요

일단 저는 X, / 등 표시를 모두 수치화해서 계산해볼려고 시도하고 있습니다. ^^

by 우리집아찌 [2013.04.24 13:02:26]
저도 계산방법 찾아봤는데..  헷갈린다는.. ㅋㅋ

by 아발란체 [2013.04.24 13:07:31]

그럼 프레임당 2번 던지는데,

질문1.
스페어 처리시 다음공 점수 포함이
다음 프레임의 첫번째 투구 점수를 의미하나요?
그렇다면 스트라이크는 다음 프레임 점수를 다 더하는게 맞나요?

질문2.
10번째 프레임은 3번 던지는데
9번째 프레임에서 스페어 처리면 10번째 3개 투구中 1번째 투구만 점수를 더하고
9번째 프레임에서 스트라이크 처리면 10번째 3번째 투구 점수를 제외 1, 2번째 투구 점수를 더하는게 맞나요?

질문3.
10번째 프레임에서는
1번을 투구하든, 2번을 투구하든, 3번을 투구하든 그냥 다 더하나요?
또한, 10번째 프레임에서는 스페어 처리든, 스트라이크 처리든 다음 프레임이 없기 때문에
가산 점수가 없나요?

@.@)/ 빙긍빙글빙글...


by 디케이 [2013.04.24 13:13:32]

 질문1. 스페이 처리시 다음프레임의 첫번째 투구 점수를 더해줍니다.
 
 질문2. 질문내용 모두 맞습니다.

 질문3. 10번쨰도 마찬가지로 스트라이크시 두번 더하고 스페어 처리시 한번,
    그리고 만약 스페어 처리 못하면 세번째 투구는 없습니다.(즉 세번째 점수가 null 이 되겠네요)


by 디케이 [2013.04.24 13:51:39]
1~9 프레임은 다음 혹은 다다음 투구를 계산식에 포함하는데 10 프레임은 투구 총합만 구하면 됩니다.

마지막 10 프레임은 두번 혹은 세번 투구를 할 수 있는데
예를 들면 다음과 같습니다.

XXX > 30점
X8/ => 20점
9/9 => 19점
81  => 9점

혹시 볼링 점수 계산이 잘 못 되었으면 태글 걸어주세요..

그리고 본 내용대로 점수를 다시 상정하니 점수가 155점 나오네요..

본문내용도 수정해 놓을께요.

by 아발란체 [2013.04.24 13:59:59]

10프레임만 가산 없이 점수 환산하면
20점인가요? (X + (9 + /) = 10 + 10


그럼 아무 가산 없이
1프레임부터 10프레임까지 순수 점수는 104점.
(10 + 8 + 10 + 10 + 8 + 10 + 9 + 10 + 9 + 20)

스페이 처리로 인한 가산 총점
(스페이 처리 총 3개이나 마지막 스페이 처리 제외)
2개 16점(8 + 8)

스트라이크 처리로 인한 가산점
스트라이크 처리 총 4개 36점(10 + 8 + 9 + 9)

총점 104 + 16 + 36 = 156점

만약 10프레임 순수 점수를 20점이 아닌 10 + 9 + 10으로 29점으로 보면
총점 113 + 16 + 36 = 165점


디케이님이 올려주신 예상 총점으로 올린 165점이 맞다면
10프레임 총합이 29점이라는 것인데,
3번 투구 했지만, 마지막은 스페어 처리해서 1개 잡은 것이라면 20점이라 총점이 156점이고.

10프레임 2번째 투구시 1개 남기고 9개 잡아도, 3번째 투구시 리셋해서 다시 10개 놓고 맞춰서
다 맞췄다는 것인가요? 그럼 스페어 처리 표시가 아닌 스트라이크 표시 아닌가요?

이 부분만 풀리면 일단 계산법은 마스터 하겠네요.. ㅋㅅㅋ)/




by 아발란체 [2013.04.24 14:01:25]
아.. 궁금했던 10프레임 산식 올리셨네요.
그럼 10프레임 점수가 20점인데, 총합산이 156점 아닌가요?

by 디케이 [2013.04.24 14:29:40]

스트라이크 처리시 가산점 계산이 잘 못되었네요.

3frm = 10 + 8
4frm = 8 + 0
6frm = 8 + 1

합계 35점입니다.

따라서 합계점수는 104 + 16 + 35 = 155점이 나와야 됩니다.


by 마농 [2013.04.24 14:10:05]
SELECT frm
     , SUBSTR(XMLAgg(XMLElement(x, '|', scr) ORDER BY ord).Extract('//text()'), 2) s
     , SUM(SUM(v)) OVER(ORDER BY frm) v
  FROM (SELECT frm, ord, scr
             , SUM(x) OVER(ORDER BY frm, ord ROWS BETWEEN CURRENT ROW AND y FOLLOWING) v
          FROM (SELECT frm, ord, scr
                     , DECODE(scr
                     , 'X', 10
                     , '/', 10 - LAG(scr) OVER(ORDER BY frm, ord)
                     , scr) x
                     , DECODE(frm, 10, 0, DECODE(scr, 'X', 2, '/', 1, 0)) y
                  FROM t
                 WHERE scr IS NOT NULL
                )
        )
 GROUP BY frm
;

by 디케이 [2013.04.24 14:31:36]
역시 마농님 이네요..

계산해보니 제가 생각하는대로 제대로 계산이 되네요...

근데 퀴즈는 답변채택이 없네요..

by 아발란체 [2013.04.24 14:24:57]
답 달렸다... ㅋㅋ
풀이를 보니... 이해한 산식과 다르네요.
3프레임에서 스트라이크 하고 다음 프레임거(2번 투구) 점수 더함 46이 나올거 같은데....
아아아아악... 골링 계산식이 더 어려움....

by 디케이 [2013.04.24 14:38:20]
 
-- 부끄럽지만 제가 만든것도 올려봅니다.
-- 만들면서 경우의 수가 계속 나와서 DECODE, CASE 문장을 많이 사용했어요.. 
 SELECT frm, ord, scr, score, next_link, SUM(c_score) OVER (ORDER BY frm, ord) sum_score
  FROM (
    SELECT frm, ord, scr, score, next_link,SUM(score) OVER (ORDER BY frm, ord ROWS BETWEEN CURRENT ROW AND next_link FOLLOWING ) c_score
     FROM (
         SELECT frm, ord, scr, score, DECODE(frm, 10, 0, DECODE(scr, 'X', 2, '/', 1, 0)) next_link
          FROM (SELECT frm, ord, scr, TO_NUMBER(DECODE(scr, 'X', '10', '/', 10-MAX(DECODE(scr, 'X', '10', scr)) OVER (PARTITION BY frm), scr)) score
              FROM t
             WHERE ord IN (1, 2)
              AND scr IS NOT NULL
             UNION ALL
             SELECT frm, 3 ord, scr
               , TO_NUMBER(
                CASE scr WHEN 'X' THEN 10
                     WHEN '/' THEN 10 -(SELECT decode(scr, 'X', 0, '/', 0, scr)
                               FROM t
                               WHERE frm = 10
                                AND ord =2) 
                     ELSE to_number(scr)
                END) score
              FROM t
             WHERE frm = 10
              AND ord = 3
             )
        )
    )

by 디케이 [2013.04.24 15:15:15]
스페어 처리성공시(/)  lag() 함수를 사용했네요.

함수를 알아도 적재적소에 사용못하니 소스가 저렇게 지저분해지네요.

아발란체님, 우리집아찌님, 마농님 관심가져주셔서 감사합니다.

많이 배웠습니다.


by 마농 [2013.04.24 15:15:29]
볼링을 치면서도 잘 몰랐던 볼림점수 계산법을(대충 스페어 치면 좋다고만 알고 있었음 ㅡ,.ㅡ)
이번 퀴즈를 풀면서 마스터 했습니다.
볼링점수 계산 완전정복. ㅎㅎ

by 아발란체 [2013.04.24 15:55:40]
3frm 점수 = 3frm 1ord + 4frm 1ord + 5frm 1ord  
위 부분이 이해가 안되는데용.

스트라이크 친 다른 프레임에서는 
Current Frame Score = Current Frame 1ord + Next Frame 1ord + Next Frame 2ord 인데

왜 3번째 프레임만
Current Frame Score = Current Frame 1ord + Next Frame 1ord + Next-Next Frame 1ord 인가요?

이것은
스트라이크를 연속으로 칠 때 생기는 산식 룰인가요?

by 마농 [2013.04.24 15:59:53]
프래임이나, 순서를 머리속에서 지우세요.
오직 공을 굴린 횟수만 생각하세요.
- 스패어 처리시 다음 1회 점수 합산
- 스트라이크 처리시 다음 1회, 2회 점수 합산
이렇게 생각하면 다른 모든 경우의 수가 사라지고 단 하나의 규칙만 남습니다.
- 단 10프레임은 예외...

by 아발란체 [2013.04.24 16:11:22]
감사합니다.... 이제야 이해했습니다.
프레임을 생각하다 보니... 절대 생각 할 수가 없었군요. ㅠ ㅁ ㅠ);;
디케이님과 마농님 덕분에 볼링 계산식 배웠습니다. ^ ㅁ ^)/

by 손님 [2013.04.29 15:04:03]

제가 낸 문제군요? ^^
시간이 없어서 못 풀고 있었는데, 시간나면 풀어봐야겠네요.
수고들 하셨습니다.


by 손님 [2017.01.11 08:19:44]
볼링게임~~

by 박군two [2017.06.29 17:19:55]

LAG, LEAD 배워 갑니다 ㅎㅎ

SELECT FRM, ORD, SCR, SCR2,
       SUM(얻은점수) OVER(ORDER BY FRM, ORD) AS TOTAL
FROM   (SELECT FRM, ORD, SCR, SCR2,
               CASE WHEN FRM <>10 AND SCR = '/' THEN SCR2 + LEAD(SCR2) OVER( ORDER BY FRM, ORD)
                    WHEN FRM <>10 AND SCR = 'X' THEN SCR2 + LEAD(SCR2, 1) OVER( ORDER BY FRM, ORD) + LEAD(SCR2, 2) OVER( ORDER BY FRM, ORD)
                    ELSE SCR2
               END AS 얻은점수
        FROM   (SELECT FRM, ORD, SCR,
                       DECODE(SCR, '/', 10 - LAG(SCR) OVER(ORDER BY FRM, ORD) , 'X', 10, SCR) AS SCR2
                FROM   T
                WHERE  T.SCR IS NOT NULL
                )
        )

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입