From 52e84951488f9607d902f38c8015fc5afb2042c9 Mon Sep 17 00:00:00 2001 From: dsyoon Date: Wed, 8 Apr 2026 19:29:10 +0900 Subject: [PATCH] Add final BallFilter, train/valid scripts, train-derived sum filters - final_BallFilter: CSV history loader, TRAIN_ALLOW for 6-sum and week diff, fix filterOneDigitPattern ball overwrite bug, drop socket call - final_filter_params: build sum6 and abs_sum_diff from rounds 1-800 - filter_model re-exports BallFilter; train/valid evaluate pass-through counts - final_filterTest aligned with 1_FilterTest_25 plus optional MC survivors - README and scripts/run_with_ncue.sh for ncue workflow Made-with: Cursor --- README.md | 358 +-- filter_model.py | 8 + final_BallFilter.py | 4523 ++++++++++++++++++++++++++++++++++++-- final_filterTest.py | 177 +- final_filter_params.py | 177 +- scripts/run_with_ncue.sh | 22 +- train.py | 50 + valid.py | 49 + 8 files changed, 4639 insertions(+), 725 deletions(-) create mode 100644 filter_model.py create mode 100644 train.py create mode 100644 valid.py diff --git a/README.md b/README.md index a14b5a3..f685195 100644 --- a/README.md +++ b/README.md @@ -1,343 +1,45 @@ -# 실행 순서 +# deeplottery -## final_BallFilter · `final_filterTest.py` (miniconda **ncue**) +## 데이터 구간 -임계값은 `tools/compute_final_filter_params.py`가 학습 구간(1~800회) 분포에서 생성하며, 결과는 `final_filter_params.py`에 기록됩니다. +| 구간 | 회차 | +|------|------| +| 학습 | `lotto_history.txt` 1~800 | +| 검증 | 801~1000 | +| 테스트 | 1001~이후 | + +## 핵심 파일 + +- **`final_BallFilter.py`** — 필터 로직 (`BallFilter_25` 기반, `lotto_history.txt` CSV 로드, `socket` 제거). +- **`final_filter_params.py`** — 학습 구간(1~800회)에서만 집계한 **6개 합**·**전주 합 차이** 허용 집합. +- **`filter_model.py`** — `from final_BallFilter import BallFilter` 재노출. +- **`train.py` / `valid.py`** — 구간별로 당첨 6개가 모든 필터를 통과한 회차 수 집계. +- **`final_filterTest.py`** — `1_FilterTest_25.py`와 동일한 분석·(선택) MC 생존 추정. + +## 실행 (miniconda **ncue**) ```bash conda activate ncue -python tools/compute_final_filter_params.py +python train.py +python valid.py python final_filterTest.py +# 특정 회차 생존 조합 수 Monte Carlo 근사 +python final_filterTest.py --mc-no 900 --mc-samples 12000 ``` -conda 경로를 쓰기 어려우면 프로젝트의 `scripts/run_with_ncue.sh`로 동일하게 실행할 수 있습니다. +동일 환경을 셸 스크립트로: ```bash -./scripts/run_with_ncue.sh tools/compute_final_filter_params.py -./scripts/run_with_ncue.sh final_filterTest.py +./scripts/run_with_ncue.sh train.py +./scripts/run_with_ncue.sh valid.py ``` -* FilterFeature.py를 실행한다. - * lotto_history.json을 읽어서 all_filter_[1-100].[cluster,csv,feature] 파일을 생성한다. +## 설계 요약 +- **6개 합 / 전주 합 차이**는 `final_filter_params.TRAIN_ALLOW`로 학습 구간 분포에 맞춤. +- 그 외 통계·배수·용지 패턴·쌍/3조합 등은 `BallFilter_25`와 동일한 고정 규칙을 유지해 과도하게 느슨해지지 않도록 함. +- `filterOneDigitPattern`에서 인자 `ball`이 예시 배열로 덮어쓰이던 버그를 수정함. -* FilterFeatureCluster.py를 실행한다. - * 첫수는 1~10까지만 허용한다. - * random_state 전체 내 각 cluster에 대해서 당첨 회수를 파악하여 ./resources/cluster_win_info.csv 파일을 생성한다. - * 생성 파일 - * filtertest_1.csv: random_state 내 cluster 개수를 파악한다. - * filtertest_2.csv: random_state 내 cluster 개수 별 전체 당첨 회수를 파악한다. - * filtertest_3.csv: random_state 내 cluster 개수 별 최초 당첨 번호만 파악한다. +## 참고 - -* 실행할 random_state와 cluster 번호 파악 - * filtertest_2.csv과 answer_pattern_analsys.xlsx을 이용하여 선별한다. - - -* cluster_info.json 파일 업데이트 - * 실행할 random_state와 cluster 번호를 json 형태로 등록한다. - - -* Util_filegen.py 실행 - * m1, amd, intel 컴퓨터에서 실행할 sh, bat 파일을 생성한다. - * 파이썬 내에서 아래 두 부분만 수정하면 된다. - * m1_file_max, amd_file_max, intel_file_max = 8,12,7 - * m1_proc_limit, amd_proc_limit, intel_proc_limit = 124,125,110 - - -* 각 장비에서 sh와 bat 파일 실행 - - -## Ruleset(임계값 설정) 기반으로 운영하기 - -`filter_model.BallFilter`의 주요 임계값(합/평균/앞3합/뒤3합/간격 등)을 **JSON ruleset**으로 외부화했습니다. -이제 “코드 수정 없이” ruleset 파일만 바꿔서 실험/튜닝을 자동화할 수 있습니다. - -- **기본 ruleset 경로**: `resources/rulesets/default.json` -- **주의/한계**: 로또는 본질적으로 랜덤(독립/균등 가설)이며, ruleset은 “구매 조합 수를 줄이기 위한 필터”입니다. **당첨 보장/예측을 주장하지 않습니다.** - -### valid 성능 확인 예시 - -```bash -python scripts/eval_filters.py \ - --data valid \ - --resources resources \ - --ruleset resources/rulesets/default.json \ - --start-no 801 --end-no 1000 \ - --survivors-samples 0 -``` - -### survivors(생존 조합 수) 근사 포함 예시 - -```bash -python scripts/eval_filters.py \ - --data valid \ - --resources resources \ - --ruleset resources/rulesets/default.json \ - --start-no 801 --end-no 1000 \ - --survivors-samples 3000 -``` - -## 자동 튜닝 → ruleset 생성 → 일괄 평가 파이프라인 - -### 1) train 기반 자동 튜닝(후보 ruleset 생성) - -아래 스크립트는 **train 구간에서만** 임계값을 랜덤 탐색으로 튜닝한 뒤, -`resources/rulesets/`에 `Balanced.json`, `Coverage-First.json`을 저장합니다. - -```bash -python scripts/tune_ruleset.py \ - --resources resources \ - --base-ruleset resources/rulesets/default.json \ - --out-dir resources/rulesets \ - --train-start 21 --train-end 800 \ - --hit-rate-min 0.01 \ - --iters 200 \ - --mc-samples 40000 -``` - -- **Coverage-First**: survivors(생존 조합 수) 최소화를 우선 -- **Balanced**: survivors를 줄이되 hit-rate도 함께 고려 - -> 주의: survivors는 전수(8,145,060조합) 대신 **풀링 Monte Carlo**로 근사하므로 오차가 있습니다. - -### 2) valid/train 구간에서 ruleset 일괄 평가 - -```bash -python scripts/eval_rulesets.py \ - --resources resources \ - --rulesets-dir resources/rulesets \ - --data valid \ - --start-no 801 --end-no 1000 \ - --survivors-samples 0 -``` - -# Query -```SQL -##### 전체 진행 확인 ##### - -with source_count as ( - select source, count(*) as source_count - from cluster_info - where priority not in (99) - and source in (1,3) - group by 1 -), -ball_count as ( - # 1) random_state, cluster 별 추천볼 개수 - select source, random_state, cluster, ball_cnt - from ( - SELECT source, random_state, cluster, count(*) - as ball_cnt - from recommend_ball - where no=1136 - and b1 > 0 - group by 1,2,3 - union all - SELECT source, random_state, cluster, 0 as ball_cnt - from recommend_ball - where no=1136 - and b1 = 0 - group by 1,2,3 - ) lj -), -source_rc_cluster_list as ( - select ci.source, ci.random_state, ci.cluster, ci.cluster_count, ci.win_count, ci.priority, rc.source_count, bc.ball_cnt - from cluster_info ci - left join source_count rc on ci.source = rc.source - left join ball_count bc on ci.source = bc.source and ci.random_state = bc.random_state and ci.cluster = bc.cluster - where ci.priority not in (99) - and ci.source in (1,3) -), -source_process as ( - select source, "done" as type, count(*) as cnt from source_rc_cluster_list - where ball_cnt is not NULL - group by 1,2 - union all - select source, "yet" as type, count(*) as cnt from source_rc_cluster_list - where ball_cnt is NULL - group by 1,2 -) -select source, type, cnt, - case when source=1 then concat(round(100.0 * cnt / (select source_count from source_count where source=1),2), '%') - when source=3 then concat(round(100.0 * cnt / (select source_count from source_count where source=3),2), '%') - end as rate from source_process order by 1,2 -; - -### 미진행 클러스터 확인 ### -SELECT ci.source, ci.random_state, ci.cluster, lj.cnt - from cluster_info ci - left join (select source, random_state, cluster, count(*) as cnt from recommend_ball rb where no=1136 group by 1,2,3) lj on ci.source=lj.source and ci.random_state=lj.random_state and ci.cluster=lj.cluster - where priority not in (99) - and lj.cnt is null - order by 1,2,3 - ; - - - - -##### 전체 cluster 확인 ##### - -with raw_data as ( - select rb.source, ci.priority, rb.random_state, rb.cluster, ci.cluster_count, ci.win_count, b1, count(*) as ball_cnt - from recommend_ball rb left join cluster_info ci on rb.source=ci.source and rb.random_state = ci.random_state and rb.cluster = ci.cluster - where no=1136 - group by 1,2,3,4,5,6,7 -), -all_cluster as ( - select source, priority, random_state, cluster, ball_cnt - from raw_data - where ( - (source = 1 and priority in (1,2)) or - (source = 3 and priority in (1,2)) - ) - group by 1,2,3,4 -), -valid_total_cluster as ( - select source, priority, random_state, cluster, ball_cnt - from raw_data - where ( - (source = 1 and priority = 1 and - ball_cnt BETWEEN 50 and 80 - ) or - (source = 1 and priority = 2 and ( - win_count = 12 and ball_cnt BETWEEN 50 and 80) - ) or - (source = 3 and priority = 1 and - (ball_cnt BETWEEN 1 and 30 or ball_cnt BETWEEN 50 and 100) - ) or - (source = 3 and priority = 2 and ( - win_count=13 and (ball_cnt BETWEEN 1 and 30 or ball_cnt BETWEEN 50 and 100)) - ) or - (source = 1 and - ((win_count between 5 and 10) and ball_cnt BETWEEN 1 and 20) - ) - ) - group by 1,2,3,4 -), -valid_none_0_cluster as ( - select source, priority, random_state, cluster, ball_cnt - from raw_data - where b1 <> 0 AND - ( - (source = 1 and priority = 1 and - ball_cnt BETWEEN 50 and 80 - ) or - (source = 1 and priority = 2 and ( - win_count = 12 and ball_cnt BETWEEN 50 and 80) - ) or - (source = 3 and priority = 1 and - (ball_cnt BETWEEN 1 and 30 or ball_cnt BETWEEN 50 and 100) - ) or - (source = 3 and priority = 2 and ( - win_count=13 and (ball_cnt BETWEEN 1 and 30 or ball_cnt BETWEEN 50 and 100)) - ) or - (source = 1 and - ((win_count between 5 and 10) and ball_cnt BETWEEN 1 and 20) - ) - ) - group by 1,2,3,4 -) -# 전체 클러스터 개수 -select 1 as col, count(*) from all_cluster -union all -# 조건에 해당하는 클러스터 개수 -select 2 as col, count(*) from valid_total_cluster -union all -# 조건에 해당하는 클러스터 중 추천이 0이 아닌 유효한 클러스터 개수 -select 3 as col, count(*) from valid_none_0_cluster -; - - - - - - - -##### 가장 많은 추천볼 ##### -select b1,b2,b3,b4,b5,b6,count(*) as ball_cnt - from recommend_ball - where no=1136 - and b1>0 - group by 1,2,3,4,5,6 -order by 7 desc; - - - - - - -##### 추천볼 분석 ##### - -with priority as ( - select source, random_state, cluster, cluster_count, win_count, priority - from cluster_info - where priority not in (99) -), -recommend as ( - select source, random_state, cluster, b1,b2,b3,b4,b5,b6 - from recommend_ball - where b1 > 0 - and no=1136 -), -recommend_count as ( - select source, random_state, cluster, count(*) as ball_cnt - from recommend_ball - where b1 > 0 - and no=1136 - group by 1,2,3 -), -raw_data as ( - select r.source, r.random_state, r.cluster, p.cluster_count, p.win_count, p.priority, r.b1,r.b2,r.b3,r.b4,r.b5,r.b6, rc.ball_cnt - from recommend r - left join priority p on r.source=p.source and r.random_state=p.random_state and r.cluster=p.cluster - left join recommend_count rc on r.source=rc.source and r.random_state=rc.random_state and r.cluster=rc.cluster -), -candidate as ( - select source, random_state, cluster, cluster_count, win_count, priority, b1,b2,b3,b4,b5,b6, ball_cnt - from raw_data - where ( - (source = 0 and b1=7) - or (source = 1 and priority=-1 and ball_cnt<=140 and ( - b1 not in (13, 19, 28) - and b2 not in (13, 19, 28) - and b3 not in (13, 19, 28) - and b4 not in (13, 19, 28) - and b5 not in (13, 19, 28) - and b6 not in (13, 19, 28) - ) - ) - or (source = 3 and priority=-1 and ball_cnt<=150 and ( - b1 not in (13, 19, 28) - and b2 not in (13, 19, 28) - and b3 not in (13, 19, 28) - and b4 not in (13, 19, 28) - and b5 not in (13, 19, 28) - and b6 not in (13, 19, 28) - ) - ) - ) -) -#select source, random_state,cluster,b1,b2,b3,b4,b5,b6 from candidate order by 4,5,6,7,8,9; -, duplication as ( - # 히스트업한 추천볼에서 중복을 제거함34 - select source, random_state, cluster, cluster_count, win_count, priority, b1,b2,b3,b4,b5,b6, ball_cnt - from ( - select source, random_state, cluster, cluster_count, win_count, priority, b1,b2,b3,b4,b5,b6, ball_cnt, - ROW_NUMBER() OVER(PARTITION BY b1,b2,b3,b4,b5,b6 ORDER BY b1,b2,b3,b4,b5,b6) AS rnk - from candidate - ) a - where rnk=1 - order by source,random_state,cluster,b1,b2,b3,b4,b5,b6 -) -select count(*) as cnt from duplication; -#select source, priority, random_state, cluster, win_count, count(*) as cnt from duplication group by 1,2,3; -#select b1, count(*) as ball_cnt from duplication group by 1 -#select b6, count(*) as ball_cnt from duplication group by 1 -#select source,random_state,cluster,b1,b2,b3,b4,b5,b6 from duplication order by 4,5,6,7,8,9; - - - - - -``` \ No newline at end of file +로또는 무작위에 가깝고, 본 저장소의 필터는 **구매 조합 수를 줄이기 위한 휴리스틱**이며 당첨을 보장하지 않습니다. diff --git a/filter_model.py b/filter_model.py new file mode 100644 index 0000000..283de23 --- /dev/null +++ b/filter_model.py @@ -0,0 +1,8 @@ +""" +로또 필터 로직은 `final_BallFilter.BallFilter`에 구현되어 있습니다. +학습·검증 스크립트와 동일한 클래스를 쓰도록 이 모듈에서 재노출합니다. +""" + +from final_BallFilter import BallFilter + +__all__ = ["BallFilter"] diff --git a/final_BallFilter.py b/final_BallFilter.py index 5fedf16..dae08c2 100644 --- a/final_BallFilter.py +++ b/final_BallFilter.py @@ -1,307 +1,4474 @@ -# -*- coding: utf-8 -*- -""" -학습 구간(1~800회)에서 산출한 final_filter_params 를 사용하는 BallFilter. -BallFilter_25 의 filterOneDigitPattern 버그(인자 덮어쓰기)를 수정했습니다. -""" -from __future__ import annotations +import json +from collections import Counter -import final_filter_params as P -from BallFilter_25 import BallFilter as BallFilter25 +import numpy as np +import pandas as pd -_MAX_CONT = max(P.ALLOW_CONTINUS_MAX) -_TRIPLE_FS = tuple(frozenset(t) for t in P.TRIPLE_BLOCKLIST) +from final_filter_params import TRAIN_ALLOW + +class BallFilter: + history_ball_dict = None + history_ball_no_dict = None + history_ball_date_dict = None + history_ball_list = None + + primeNumber = None + compositeNumber = None + + def __init__(self, lottoHistoryFileName=None): + if lottoHistoryFileName is None: + return + self.history_ball_list = [] + self.history_ball_no_ymd = {} + self.history_ball_no_dict = {} + self.history_ball_date_dict = {} + self.history_ball_dict = {} + path = str(lottoHistoryFileName) + + if path.endswith('.txt'): + rows = [] + with open(path, 'r', encoding='utf-8') as in_fp: + for line in in_fp: + line = line.strip() + if not line: + continue + parts = line.split(',') + drw_no = int(parts[0]) + balls = [int(parts[i]) for i in range(1, 7)] + rows.append((drw_no, balls)) + rows.sort(key=lambda x: x[0]) + for drw_no, balls in rows: + sb = sorted(balls) + self.history_ball_list.append(sb) + self.history_ball_no_dict[str(sb)] = drw_no + ymd_key = f'{drw_no:08d}' + self.history_ball_date_dict[ymd_key] = drw_no + self.history_ball_dict[drw_no] = {'date': '', 'ball': list(sb)} + self.history_ball_no_ymd[drw_no] = ymd_key + else: + in_fp = open(path, 'r', encoding='utf-8') + while True: + line = in_fp.readline() + if not line or line == '\n': + break + data = json.loads(line) + self.history_ball_list.append(sorted([data['drwtNo1'], data['drwtNo2'], data['drwtNo3'], data['drwtNo4'], data['drwtNo5'], data['drwtNo6']])) + self.history_ball_no_dict[str(self.history_ball_list[len(self.history_ball_list) - 1])] = data['drwNo'] + self.history_ball_date_dict[data['drwNoDate'].replace('-', '')] = data['drwNo'] + self.history_ball_dict[data['drwNo']] = {'date': data['drwNoDate'], 'ball': [data['drwtNo1'], data['drwtNo2'], data['drwtNo3'], data['drwtNo4'], data['drwtNo5'], data['drwtNo6']]} + self.history_ball_no_ymd[data['drwNo']] = data['drwNoDate'].replace('-', '') + in_fp.close() + + ball_avg = {} + ball_sum = {} + for i in range(len(self.history_ball_list)): + win_ball = list(self.history_ball_list[-i]) + avg = sum(win_ball) / 6 + if avg not in ball_avg: + ball_avg[avg] = 1 + else: + ball_avg[avg] += 1 + + s = sum(self.history_ball_list[-i]) + if s in ball_sum: + ball_sum[s] += 1 + else: + ball_sum[s] = 1 + + self.primeNumber = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43] + self.compositeNumber = [4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35, 36, 38, 39, 40, 42, 44, 45] + return + + def getBall(self, no): + if no in self.history_ball_dict: + return self.history_ball_dict[no]['ball'] + return [] + + def getLastNo(self, YMD): + if YMD in self.history_ball_date_dict: + return self.history_ball_date_dict[YMD] + return len(self.history_ball_no_dict) + + def getNextNo(self, YMD): + if YMD in self.history_ball_date_dict: + return self.history_ball_date_dict[YMD] + return len(self.history_ball_no_dict) + 1 + + def getYMD(self, no): + if no in self.history_ball_no_ymd: + return self.history_ball_no_ymd[no] + return self.history_ball_no_ymd[-1] + + def isInValidBall(self, ball): + for i, b in enumerate(ball): + if b < 1 or 45 < b: + return True + if i > 0: + if ball[i - 1] == b: + return True + + return False + + def hasWon(self, ball, NO=None): + # 기존 당첨 번호라면 + sorted_ball = sorted(ball) + if NO == None: + if str(sorted_ball) in self.history_ball_no_dict: + return True + else: + if str(sorted_ball) in self.history_ball_no_dict: + no = self.history_ball_no_dict[str(sorted_ball)] + if no == NO: + return False + return True + return False + + def filterFrequency3Windows(self, drwNo, ball, N, given_count): + """ + 24주간 당첨 번호들에 대해서 출현 빈도 순으로 정렬하고, 정렬된 리스트에서 상위 N개, 중간 N개, 하위 N개만 취함 + 예, N=10 이라면 1~10, 23-10/0~23+10/0 ,36~45 + 세 개 구간에 대해서 이번 회차의 번호와 겹치는 숫자의 개수를 구하고 given_count 이하 개수라면 filter + """ + if drwNo - 2 - 24 < 1: + return True + + fBall = [] + for j in range(drwNo - 2, drwNo - 2 - 24, -1): + for b in self.history_ball_list[j]: + fBall.append(b) + + ball_count = dict(Counter(fBall)) + ball_count_sort = sorted(ball_count.items(), key=lambda x: x[1], reverse=True) + + ball_sort = [b[0] for b in ball_count_sort] + + ball_set = set(ball) + match_check_ball = set(ball_set) & ( + set(ball_sort[:N]) | set(ball_sort[int(23 - N / 2):int(23 + N / 2)]) | set(ball_sort[45 - N:])) + + if len(match_check_ball) <= given_count: + return True + + return False + + def filterFirstBallUnderNumber(self, ball, N=5): + """ + 첫 숫자가 N 이하인 경우 + """ + + WIN_BALL = sorted(ball) + if WIN_BALL[0] <= N: + return True + + return False + + def filterLastBallOverNumber(self, ball, N=5): + """ + 마지막 숫자가 N 이상인 경우 + """ + + WIN_BALL = sorted(ball) + if WIN_BALL[5] >= N: + return True + + return False + + def filterLastBallUnderNumber(self, ball, N=20): + """ + 마지막 숫자가 N 이상인 경우 + """ + + WIN_BALL = sorted(ball) + if WIN_BALL[5] <= N: + return True + + return False -class BallFilter(BallFilter25): - """학습 데이터 기반 허용 집합을 쓰는 최종 필터.""" + def getEndNumberCount(self, ball): + return set([int(str(b).zfill(2)[1]) for b in ball]) + + def filterEndNumberCount(self, ball, N_list=None): + if N_list is None: + N_list = [4, 5] + + size = self.getEndNumberCount(ball) + if size in N_list: + return True + return False + + def getFirstBallOverNumber(self, ball, N=0): + """ + 첫 숫자가 N 이상은 버림 + """ + + WIN_BALL = sorted(ball) + return WIN_BALL[N] + + def isContinusFriendNumber(self, drwNo, ball): + """ + 이웃수 체크: 특정 번호에 대해서 다음 수나 이전 수가 나오는 경우 + 이전 당첨 번호 중 하나가 7이라면 이번에 6혹은 8이 없어야 함. + 이런 식의 이웃수가 있다면 True + """ + if drwNo <= 2: + return False + + P_WIN_BALL = list(self.history_ball_list[drwNo - 2]) + WIN_BALL_SET = set(ball) + isValid = False + for b in P_WIN_BALL: + if b - 1 in WIN_BALL_SET or b + 1 in WIN_BALL_SET: + isValid = True + break + return isValid + + def isOverlapNumber(self, drwNo, ball, N): + """ + 연속해서 겹치는 수가 출현하는지 체크 + """ + + if drwNo <= N: + return True + + WIN_BALL_SET = set(sorted(ball)) + overlapCount = [] + for i in range(N): + P_WIN_BALL_SET = set(sorted(self.history_ball_list[drwNo - (i + 2)])) + + if len(WIN_BALL_SET & P_WIN_BALL_SET) > 0: + overlapCount.append(1) + else: + overlapCount.append(0) + if sum(overlapCount) == N: + return True + + return False + + def filterContinusNumber(self, ball, N): + """ + 하나의 당첨 번호에서 N개 연속된 숫자인지 체크하여 필터링 + """ + + WIN_BALL = sorted(ball) + if N == 6: + if ( + WIN_BALL[0] + 5 == WIN_BALL[1] + 4 == WIN_BALL[2] + 3 == WIN_BALL[3] + 2 == WIN_BALL[4] + 1 == + WIN_BALL[5] + ): + return True + if N == 5: + if ( + WIN_BALL[0] + 4 == WIN_BALL[1] + 3 == WIN_BALL[2] + 2 == WIN_BALL[3] + 1 == WIN_BALL[4] + or WIN_BALL[1] + 4 == WIN_BALL[2] + 3 == WIN_BALL[3] + 2 == WIN_BALL[4] + 1 == WIN_BALL[5] + ): + return True + if N == 4: + if ( + WIN_BALL[0] + 3 == WIN_BALL[1] + 2 == WIN_BALL[2] + 1 == WIN_BALL[3] + or WIN_BALL[1] + 3 == WIN_BALL[2] + 2 == WIN_BALL[3] + 1 == WIN_BALL[4] + or WIN_BALL[2] + 3 == WIN_BALL[3] + 2 == WIN_BALL[4] + 1 == WIN_BALL[5] + ): + return True + if N == 3: + if ( + WIN_BALL[0] + 2 == WIN_BALL[1] + 1 == WIN_BALL[2] + or WIN_BALL[1] + 2 == WIN_BALL[2] + 1 == WIN_BALL[3] + or WIN_BALL[2] + 2 == WIN_BALL[3] + 1 == WIN_BALL[4] + or WIN_BALL[3] + 2 == WIN_BALL[4] + 1 == WIN_BALL[5] + ): + return True + if N == 2: + if ( + WIN_BALL[0] + 1 == WIN_BALL[1] + or WIN_BALL[1] + 1 == WIN_BALL[2] + or WIN_BALL[2] + 1 == WIN_BALL[3] + or WIN_BALL[3] + 1 == WIN_BALL[4] + or WIN_BALL[4] + 1 == WIN_BALL[5] + ): + return True + + return False + + def getContinusNumber(self, ball): + """ + 하나의 당첨 번호에서 N개 연속된 숫자인지 체크하여 필터링 + """ + + WIN_BALL = sorted(ball) + + if (WIN_BALL[0] + 5 == WIN_BALL[1] + 4 == WIN_BALL[2] + 3 == WIN_BALL[3] + 2 == WIN_BALL[4] + 1 == WIN_BALL[5]): + return 6 + if (WIN_BALL[0] + 4 == WIN_BALL[1] + 3 == WIN_BALL[2] + 2 == WIN_BALL[3] + 1 == WIN_BALL[4] + or WIN_BALL[1] + 4 == WIN_BALL[2] + 3 == WIN_BALL[3] + 2 == WIN_BALL[4] + 1 == WIN_BALL[5]): + return 5 + if (WIN_BALL[0] + 3 == WIN_BALL[1] + 2 == WIN_BALL[2] + 1 == WIN_BALL[3] + or WIN_BALL[1] + 3 == WIN_BALL[2] + 2 == WIN_BALL[3] + 1 == WIN_BALL[4] + or WIN_BALL[2] + 3 == WIN_BALL[3] + 2 == WIN_BALL[4] + 1 == WIN_BALL[5]): + return 4 + if (WIN_BALL[0] + 2 == WIN_BALL[1] + 1 == WIN_BALL[2] + or WIN_BALL[1] + 2 == WIN_BALL[2] + 1 == WIN_BALL[3] + or WIN_BALL[2] + 2 == WIN_BALL[3] + 1 == WIN_BALL[4] + or WIN_BALL[3] + 2 == WIN_BALL[4] + 1 == WIN_BALL[5]): + return 3 + if (WIN_BALL[0] + 1 == WIN_BALL[1] + or WIN_BALL[1] + 1 == WIN_BALL[2] + or WIN_BALL[2] + 1 == WIN_BALL[3] + or WIN_BALL[3] + 1 == WIN_BALL[4] + or WIN_BALL[4] + 1 == WIN_BALL[5]): + return 2 + + return 1 + + def filterContinusWinCount(self, drwNo, ball, N=3): + """ + 특정 한 번호가 이전 회차에서 N번 연속 당첨한 경우는 필터링 + """ + + if drwNo <= N: + return True + + section = self.history_ball_list[drwNo - N - 1:drwNo - 1] + + WIN_BALL_SET = set(sorted(ball)) + for b in WIN_BALL_SET: + overlapCount = [] + for i in range(len(section) - 1, -1, -1): + P_WIN_BALL_SET = set(sorted(section[i])) + + if b in P_WIN_BALL_SET: + overlapCount.append(1) + else: + overlapCount.append(0) + if sum(overlapCount) == N: + return True + + return False + + def filterBallAverage(self, ball): + # 6개 당첨 공들의 평균 + # if sum(ball)/6 not in self.VALID_AVG: + # if sum(ball)/6 < min(self.VALID_AVG.keys()) or max(self.VALID_AVG.keys()) < sum(ball)/6: + avg_value = sum(ball) / 6 + if not (19 < avg_value < 20 or 21 < avg_value < 22 or 28 < avg_value < 29): + return True + return False + + def getBallAverage(self, ball): + # 6개 당첨 공들의 평균 + return sum(ball) / 6 + + def filterTotalSum(self, ball): + # 6개 당첨 공들의 평균 + # if sum(ball) < min(self.VALID_SUM.keys()) or max(self.VALID_SUM.keys()) < sum(ball): + sum_value = sum(ball) + if not (115 < sum_value < 120 or 125 < sum_value < 130 or 170 < sum_value < 175): + return True + return False + + def getTotalSum(self, ball): + # 6개 당첨 공들의 평균 + return sum(ball) + + def getNonAppearances(self, drwNo, ball): + """ + 미출현 회수 + """ + + b0, b1, b2, b3, b4, b5 = 0, 0, 0, 0, 0, 0 + c0, c1, c2, c3, c4, c5 = 0, 0, 0, 0, 0, 0 + for idx in range(drwNo - 2, 0, -1): + h_ball = self.history_ball_list[idx] + if c0 == 0 and ball[0] not in h_ball: + b0 += 1 + if ball[0] in h_ball: + c0 = 1 + + if c1 == 0 and ball[1] not in h_ball: + b1 += 1 + if ball[1] in h_ball: + c1 = 1 + + if c2 == 0 and ball[2] not in h_ball: + b2 += 1 + if ball[2] in h_ball: + c2 = 1 + + if c3 == 0 and ball[3] not in h_ball: + b3 += 1 + if ball[3] in h_ball: + c3 = 1 + + if c4 == 0 and ball[4] not in h_ball: + b4 += 1 + if ball[4] in h_ball: + c4 = 1 + + if c5 == 0 and ball[5] not in h_ball: + b5 += 1 + if ball[5] in h_ball: + c5 = 1 + + if c0 == 1 and c1 == 1 and c2 == 1 and c3 == 1 and c4 == 1 and c5 == 1: + break + + return b0, b1, b2, b3, b4, b5 + + # 앞번호 숫자들의 합 + def getFrontDigitsSum(self, ball): + return sum([int(str(b).zfill(2)[0]) for b in ball]) + + # 뒷번호 숫자들의 합 + def getLastDigitsSum(self, ball): + return sum([int(str(b).zfill(2)[1]) for b in ball]) + + def filterEvenCount(self, ball): + """ + 모두 짝수이거나 홀수이면 필터 [0, 4, 6, 8, 10], [1, 2, 5, 7, 9, 11] + """ + + even_list = [b for b in ball if b % 2 == 0] + # odd_list = [b for b in ball if b % 0 == 1] + + return len(even_list) + + def getEvenCount(self, ball): + """ + 모두 짝수이거나 홀수이면 필터 [0, 4, 6, 8, 10], [1, 2, 5, 7, 9, 11] + """ + + return len([b for b in ball if b % 2 == 0]) + + def filterNTimesIn15UnitSections(self, ball, N=4): + # 같은 5단위 4개 이상인 경우 + # [1, 0, 2, 4, 15, 16] + # [15, 11, 11, 14, 25, 36] + # [15, 22, 23, 24, 25, 36] + # [15, 32, 33, 34, 25, 36] + # [41, 42, 43, 44, 15, 36] + + b1 = [b for b in ball if 1 <= b <= 15] + b2 = [b for b in ball if 16 <= b <= 30] + b3 = [b for b in ball if 31 <= b <= 45] + + if len(b1) >= N or len(b2) >= N or len(b3) >= N: + return True + + return False + + def filterNTimesIn10UnitSections(self, ball, N=4): + # 같은 10단위 4개 이상인 경우 + + b1 = [b for b in ball if 1 <= b <= 10] + b2 = [b for b in ball if 11 <= b <= 20] + b3 = [b for b in ball if 21 <= b <= 30] + b4 = [b for b in ball if 31 <= b <= 40] + b5 = [b for b in ball if 41 <= b <= 45] + + if len(b1) >= N or len(b2) >= N or len(b3) >= N or len(b4) >= N or len(b5) >= N: + return True + + return False + + def filterNTimesIn9UnitSections(self, ball, N=4): + # 같은 9단위 4개 이상인 경우 + # [1, 0, 2, 4, 15, 16] + # [15, 11, 11, 14, 25, 36] + # [15, 22, 23, 24, 25, 36] + # [15, 32, 33, 34, 25, 36] + # [41, 42, 43, 44, 15, 36] + + b1 = [b for b in ball if 1 <= b <= 9] + b2 = [b for b in ball if 10 <= b <= 18] + b3 = [b for b in ball if 19 <= b <= 27] + b4 = [b for b in ball if 28 <= b <= 36] + b5 = [b for b in ball if 37 <= b <= 45] + + if len(b1) >= N or len(b2) >= N or len(b3) >= N or len(b4) >= N or len(b5) >= N: + return True + + return False + + def filterNTimesIn7UnitSections(self, ball, N=4): + # 같은 5단위 4개 이상인 경우 + + b1 = [b for b in ball if 1 <= b <= 7] + b2 = [b for b in ball if 6 <= b <= 14] + b3 = [b for b in ball if 11 <= b <= 21] + b4 = [b for b in ball if 16 <= b <= 28] + b5 = [b for b in ball if 21 <= b <= 25] + b6 = [b for b in ball if 26 <= b <= 30] + b7 = [b for b in ball if 31 <= b <= 35] + b8 = [b for b in ball if 36 <= b <= 40] + b9 = [b for b in ball if 41 <= b <= 45] + + if ( + len(b1) >= N or len(b2) >= N or len(b3) >= N or len(b4) >= N or len(b5) >= N + or len(b6) >= N or len(b7) >= N or len(b8) >= N or len(b9) >= N + ): + return True + + return False + + def filterNTimesIn5UnitSections(self, ball, N=4): + # 같은 5단위 4개 이상인 경우 + + b1 = [b for b in ball if 1 <= b <= 5] + b2 = [b for b in ball if 6 <= b <= 10] + b3 = [b for b in ball if 11 <= b <= 15] + b4 = [b for b in ball if 16 <= b <= 20] + b5 = [b for b in ball if 21 <= b <= 25] + b6 = [b for b in ball if 26 <= b <= 30] + b7 = [b for b in ball if 31 <= b <= 35] + b8 = [b for b in ball if 36 <= b <= 40] + b9 = [b for b in ball if 41 <= b <= 45] + + if ( + len(b1) >= N or len(b2) >= N or len(b3) >= N or len(b4) >= N or len(b5) >= N + or len(b6) >= N or len(b7) >= N or len(b8) >= N or len(b9) >= N + ): + return True + + return False + + def filterGivenData(self, ball): + if not (ball[0] < 5 and ball[1] < 10 and 37 < ball[5]): + return True + + return False + + def filterPreviousNumber(self, ball, no): + previous_ball = self.getBall(no-1) + pb_set = set(previous_ball) + + if ( + ball[0] not in pb_set and ball[0] - 1 not in pb_set and ball[0] + 1 not in pb_set and + ball[1] not in pb_set and ball[1] - 1 not in pb_set and ball[1] + 1 not in pb_set and + ball[2] not in pb_set and ball[2] - 1 not in pb_set and ball[2] + 1 not in pb_set and + ball[3] not in pb_set and ball[3] - 1 not in pb_set and ball[3] + 1 not in pb_set and + ball[4] not in pb_set and ball[4] - 1 not in pb_set and ball[4] + 1 not in pb_set and + ball[5] not in pb_set and ball[5] - 1 not in pb_set and ball[5] + 1 not in pb_set + ): + return True + return False + + def getACValue(self, ball): + ac = set() + for i in range(5, -1, -1): + for j in range(i-1, -1, -1): + ac.add( ball[i] - ball[j]) + return len(ac) - (6-1) + + def getNumberOfAppearancesInSection10(self, ball): + section = set() + for b in ball: + v = int(b/10) + if v not in section: + section.add(v) + return len(section) + + def get_ball_interval(self, ball): + interval_sum = 0 + for i in range(1, len(ball)): + interval_sum += (ball[i] - ball[i-1]) + return interval_sum + + def getFirstLetterSumBall(self, ball): + acc = [str(b)[0] for b in ball if len(str(b))==2] + acc = [int(b) for b in acc] + return sum(acc) + + def getLastLetterSumBall(self, ball): + acc = [str(b)[1] for b in ball if len(str(b)) == 2] + [str(b) for b in ball if len(str(b)) == 1] + acc = [int(b) for b in acc] + return sum(acc) + + def getWeeksFrequency(self, answer, df=None, no=None, week=20): + if df is None: + df = pd.DataFrame(self.history_ball_list, columns=['b1','b2','b3','b4','b5','b6']) + + dic = {} + ball = [] + for w in range(1, week+1): + ball += df[df['no'] == no-w].values.tolist()[0][1:7] + + for b in ball: + if b not in dic: + dic[b] = 1 + else: + dic[b] += 1 + + exist_ball = set() + for b in answer: + if b in dic: + exist_ball.add(b) + + return len(exist_ball) + + def filterOverseas(self, ball, no): + if no in self.oversea_history_ball: + oversea_balls = self.oversea_history_ball[no] + match = [] + for b in ball: + if b in oversea_balls: + match.append(1) + if len(match) < 3: + return True + return False + + def filterAllPreivous7(self, ball, no): + pb_set = set() + for i in range(no-1, no-8, -1): + pb = self.getBall(i) + for b in pb: + if b not in pb_set: + pb_set.add(b) + if len(set(ball) & pb_set) == 6: + return True + return False + + def checkFilter_JapanMethod(self, df, week=26): + # https://xn--961bo7bg3gjne.com/menu_103.php + + all_balls = {} + pos = len(df) - 1 + try_num = 0 + for i in range(pos, pos - week, -1): + ball = [df['b1'].iloc[i], df['b2'].iloc[i], df['b3'].iloc[i], df['b4'].iloc[i], df['b5'].iloc[i], df['b6'].iloc[i]] + for b in ball: + if b not in all_balls: + all_balls[b] = 1 + else: + all_balls[b] += 1 + try_num += 1 + + all_balls_sorted = sorted(all_balls.items(), key=lambda x: x[1], reverse=True) + return set([bf[0] for bf in all_balls_sorted if bf[1] in [2,3]]) + + def filterPatternInPaper1(self, ball, log=False): + # https://www.9dantv.com/mobile/jump.do + # 모서리패턴 + filter_set = {1,2,8,9,6,7,13,14,29,30,36,37,43,44,45,34,35,41,42} + if len(set(ball) & filter_set) == 6: + return "용지영역: #1" + # 좌상 삼각 패턴 + filter_set = {1,2,3,4,5,6,7,8,9,10,11,12,13,25,16,17,18,19,22,23,24,25,29,30,31,36,37,43} + if len(set(ball) & filter_set) == 6: + return "용지영역: #0" + # 좌하 삼각 패턴 + filter_set = {1,8,9,15,16,17,22,23,24,25,29,30,31,32,33,36,37,38,39,40,41,43,44,45} + if len(set(ball) & filter_set) == 6: + return "용지영역: #2" + # 우상 삼각패턴 + filter_set = {1,2,3,4,5,6,7,9,10,11,12,13,14,17,18,19,20,21,25,26,27,28,33,34,35,41,42} + if len(set(ball) & filter_set) == 6: + return "용지영역: #4" + # 우하 삼각패턴 + filter_set = {7,13,14,19,20,21,25,26,27,28,31,32,33,34,35,37,38,39,40,41,42,43,44,45} + if len(set(ball) & filter_set) == 6: + return "용지영역: #5" + # 우하 삼각패턴 + filter_set = {7,13,14,19,20,21,25,26,27,28,31,32,33,34,35,37,38,39,40,41,42,43,44,45} + if len(set(ball) & filter_set) == 6: + return "용지영역: #6" + return None + + def filterPatternInPaper2(self, ball, log=False): + # 퐁당퐁당 패턴 #1 + filter_set = {1,2,4,5,8,9,11,12,15,16,18,19,22,23,25,26,29,30,32,33,36,37,39,40,43,44,8,15,22,29,36,43,2,9,16,23,30,37,44,4,11,18,25,32,39,5,12,19,26,33,40} + if len(set(ball) & filter_set) == 6: + return "용지영역: #7" + # 퐁당퐁당 패턴 #0 + filter_set = {3,10,17,24,31,38,45,4,11,18,25,32,39,6,13,20,27,34,41,7,14,21,28,35,42} + if len(set(ball) & filter_set) == 6: + return "용지영역: #8" + + # 좌우 2줄 패턴 + filter_set = {1,8,15,22,29,36,43,2,9,16,23,30,37,44,6,13,20,27,34,41,7,14,21,28,35,42} + if len(set(ball) & filter_set) == 6: + return "용지영역: #9" + return None + + def filterPatternInPaper3(self, ball, log=False): + # 가로 라인 1,0,2 + filter_set = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21} + if len(set(ball) & filter_set) == 6: + return "용지영역: #10" + # 가로 라인 0,2,4 + filter_set = {8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28} + if len(set(ball) & filter_set) == 6: + return "용지영역: #11" + # 가로 라인 2,4,5 + filter_set = {15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35} + if len(set(ball) & filter_set) == 6: + return "용지영역: #11" + # 가로 라인 4,5,6 + filter_set = {22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42} + if len(set(ball) & filter_set) == 6: + return "용지영역: #11" + # 가로 라인 5,6,7 + filter_set = {29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45} + if len(set(ball) & filter_set) == 6: + return "용지영역: #14" + return None + + def filterPatternInPaper4(self, ball, log=False): + # 가로 1라인부터 연속 6줄 #1 + filter_set = {1,2,3,4,5,6,7} + if len(set(ball) & filter_set) == 6: + return "용지영역: #15" + # 가로 1라인부터 연속 6줄 #0 + filter_set = {8,9,10,11,12,13,14} + if len(set(ball) & filter_set) == 6: + return "용지영역: #16" + # 가로 1라인부터 연속 6줄 #2 + filter_set = {15,16,17,18,19,20,21} + if len(set(ball) & filter_set) == 6: + return "용지영역: #17" + # 가로 1라인부터 연속 6줄 #4 + filter_set = {22,23,24,25,26,27,28} + if len(set(ball) & filter_set) == 6: + return "용지영역: #18" + # 가로 1라인부터 연속 6줄 #5 + filter_set = {29,30,31,32,33,34,35} + if len(set(ball) & filter_set) == 6: + return "용지영역: #19" + # 가로 1라인부터 연속 6줄 #6 + filter_set = {36,37,38,39,40,41,42} + if len(set(ball) & filter_set) == 6: + return "용지영역: #20" + # 가로 2라인부터 연속 6줄 + filter_set = {36,37,38,39,40,41,42} + if len(set(ball) & filter_set) == 6: + return "용지영역: #21" + return None + + def filterPatternInPaper5(self, ball, log=False): + # 세로 라인 1,0,2 + filter_set = {1,8,15,22,29,36,43,2,9,16,23,30,37,44,3,10,17,24,31,38,45} + if len(set(ball) & filter_set) == 6: + return "용지영역: #22" + # 세로 라인 0,2,4 + filter_set = {2,9,16,23,30,37,44,3,10,17,24,31,38,45,4,11,18,25,32,39} + if len(set(ball) & filter_set) == 6: + return "용지영역: #23" + # 세로 라인 2,4,5 + filter_set = {3,10,17,24,31,38,45,4,11,18,25,32,39,5,12,19,26,33,40} + if len(set(ball) & filter_set) == 6: + return "용지영역: #24" + # 세로 라인 4,5,6 + filter_set = {4,11,18,25,32,39,5,12,19,26,33,40,6,13,20,27,34,41} + if len(set(ball) & filter_set) == 6: + return "용지영역: #25" + # 세로 라인 5,6,7 + filter_set = {5,12,19,26,33,40,6,13,20,27,34,41,7,14,21,28,35,42} + if len(set(ball) & filter_set) == 6: + return "용지영역: #26" + return None + + def filterPatternInPaper6(self, ball, log=False): + # 세로 1라인부터 연속 6줄 + filter_set = {1,8,15,22,29,36,43} + if len(set(ball) & filter_set) == 6: + return "용지영역: #27" + # 세로 2라인부터 연속 6줄 + filter_set = {2,9,16,23,30,37,44} + if len(set(ball) & filter_set) == 6: + return "용지영역: #28" + # 세로 3라인부터 연속 6줄 + filter_set = {3,10,17,24,31,38,45} + if len(set(ball) & filter_set) == 6: + return "용지영역: #29" + # 세로 4라인부터 연속 6줄 + filter_set = {4,11,18,25,32,39} + if len(set(ball) & filter_set) == 6: + return "용지영역: #30" + # 세로 5라인부터 연속 6줄 + filter_set = {5,12,19,26,33,40} + if len(set(ball) & filter_set) == 6: + return "용지영역: #31" + # 세로 6라인부터 연속 6줄 + filter_set = {6,13,20,27,34,41} + if len(set(ball) & filter_set) == 6: + return "용지영역: #32" + # 세로 7라인부터 연속 6줄 + filter_set = {7,14,21,28,35,42} + if len(set(ball) & filter_set) == 6: + return "용지영역: #33" + return None + + def getHigLowRate(self, ball): + low = [] + high = [] + for b in ball: + if b < 23: + low.append(b) + if 23 < b: + high.append(b) + return len(low), len(high) def filterOneDigitPattern(self, ball): digit = set() for b in ball: - digit.add(b % 10) + if b % 10 not in digit: + digit.add(b % 10) return len(digit) + def filterPairBall(self, ball): + set_ball = set(ball) + if len(set_ball & {8, 12}) == 2: return 1 + if len(set_ball & {6, 29}) == 2: return 2 + if len(set_ball & {6, 33}) == 2: return 3 + if len(set_ball & {8, 26}) == 2: return 4 + if len(set_ball & {11, 40}) == 2: return 5 + if len(set_ball & {26, 32}) == 2: return 6 + if len(set_ball & {5, 40}) == 2: return 7 + if len(set_ball & {8, 9}) == 2: return 8 + if len(set_ball & {19, 29}) == 2: return 9 + if len(set_ball & {21, 28}) == 2: return 10 + if len(set_ball & {23, 41}) == 2: return 11 + if len(set_ball & {24, 43}) == 2: return 12 + if len(set_ball & {1, 22}) == 2: return 13 + if len(set_ball & {3, 25}) == 2: return 14 + if len(set_ball & {3, 28}) == 2: return 15 + if len(set_ball & {4, 30}) == 2: return 16 + if len(set_ball & {9, 19}) == 2: return 17 + if len(set_ball & {9, 45}) == 2: return 18 + if len(set_ball & {11, 34}) == 2: return 19 + if len(set_ball & {16, 22}) == 2: return 20 + if len(set_ball & {22, 29}) == 2: return 21 + if len(set_ball & {24, 28}) == 2: return 22 + if len(set_ball & {28, 31}) == 2: return 23 + if len(set_ball & {37, 44}) == 2: return 24 + if len(set_ball & {1, 31}) == 2: return 25 + if len(set_ball & {2, 23}) == 2: return 26 + if len(set_ball & {2, 35}) == 2: return 27 + if len(set_ball & {5, 10}) == 2: return 28 + if len(set_ball & {5, 33}) == 2: return 29 + if len(set_ball & {6, 23}) == 2: return 30 + if len(set_ball & {7, 32}) == 2: return 31 + if len(set_ball & {9, 20}) == 2: return 32 + if len(set_ball & {9, 44}) == 2: return 33 + if len(set_ball & {16, 32}) == 2: return 34 + if len(set_ball & {22, 45}) == 2: return 35 + if len(set_ball & {25, 30}) == 2: return 36 + if len(set_ball & {25, 41}) == 2: return 37 + if len(set_ball & {25, 42}) == 2: return 38 + if len(set_ball & {28, 29}) == 2: return 39 + if len(set_ball & {28, 32}) == 2: return 40 + if len(set_ball & {28, 33}) == 2: return 41 + if len(set_ball & {29, 30}) == 2: return 42 + if len(set_ball & {1, 30}) == 2: return 43 + if len(set_ball & {2, 9}) == 2: return 44 + if len(set_ball & {2, 38}) == 2: return 45 + if len(set_ball & {3, 21}) == 2: return 46 + if len(set_ball & {4, 21}) == 2: return 47 + if len(set_ball & {4, 36}) == 2: return 48 + if len(set_ball & {5, 8}) == 2: return 49 + if len(set_ball & {5, 28}) == 2: return 50 + if len(set_ball & {5, 36}) == 2: return 51 + if len(set_ball & {5, 38}) == 2: return 52 + if len(set_ball & {6, 8}) == 2: return 53 + if len(set_ball & {6, 9}) == 2: return 54 + if len(set_ball & {6, 45}) == 2: return 55 + if len(set_ball & {7, 21}) == 2: return 56 + if len(set_ball & {8, 10}) == 2: return 57 + if len(set_ball & {8, 22}) == 2: return 58 + if len(set_ball & {8, 41}) == 2: return 59 + if len(set_ball & {9, 22}) == 2: return 60 + if len(set_ball & {9, 32}) == 2: return 61 + if len(set_ball & {9, 42}) == 2: return 62 + if len(set_ball & {10, 17}) == 2: return 63 + if len(set_ball & {10, 26}) == 2: return 64 + if len(set_ball & {10, 30}) == 2: return 65 + if len(set_ball & {10, 45}) == 2: return 66 + if len(set_ball & {14, 29}) == 2: return 67 + if len(set_ball & {15, 31}) == 2: return 68 + if len(set_ball & {15, 32}) == 2: return 69 + if len(set_ball & {18, 41}) == 2: return 70 + if len(set_ball & {19, 37}) == 2: return 71 + if len(set_ball & {20, 29}) == 2: return 72 + if len(set_ball & {22, 41}) == 2: return 73 + if len(set_ball & {23, 32}) == 2: return 74 + if len(set_ball & {23, 33}) == 2: return 75 + if len(set_ball & {24, 26}) == 2: return 76 + if len(set_ball & {24, 31}) == 2: return 77 + if len(set_ball & {28, 35}) == 2: return 78 + if len(set_ball & {29, 41}) == 2: return 79 + if len(set_ball & {32, 35}) == 2: return 80 + if len(set_ball & {32, 38}) == 2: return 81 + if len(set_ball & {35, 41}) == 2: return 82 + if len(set_ball & {39, 42}) == 2: return 83 + return None + + def filterTriplePairBall(self, ball): - s = set(ball) - for t in _TRIPLE_FS: - if t <= s: - return 1 + set_ball = set(ball) + if len(set_ball & {1, 2, 32}) == 3: return 1 + if len(set_ball & {1, 2, 41}) == 3: return 2 + if len(set_ball & {1, 2, 43}) == 3: return 3 + if len(set_ball & {1, 3, 5}) == 3: return 4 + if len(set_ball & {1, 3, 13}) == 3: return 5 + if len(set_ball & {1, 3, 19}) == 3: return 6 + if len(set_ball & {1, 3, 38}) == 3: return 7 + if len(set_ball & {1, 4, 7}) == 3: return 8 + if len(set_ball & {1, 4, 11}) == 3: return 9 + if len(set_ball & {1, 4, 21}) == 3: return 10 + if len(set_ball & {1, 4, 22}) == 3: return 11 + if len(set_ball & {1, 4, 24}) == 3: return 12 + if len(set_ball & {1, 4, 25}) == 3: return 13 + if len(set_ball & {1, 4, 27}) == 3: return 14 + if len(set_ball & {1, 4, 30}) == 3: return 15 + if len(set_ball & {1, 4, 32}) == 3: return 16 + if len(set_ball & {1, 4, 36}) == 3: return 17 + if len(set_ball & {1, 4, 44}) == 3: return 18 + if len(set_ball & {1, 5, 7}) == 3: return 19 + if len(set_ball & {1, 5, 8}) == 3: return 20 + if len(set_ball & {1, 5, 15}) == 3: return 21 + if len(set_ball & {1, 5, 17}) == 3: return 22 + if len(set_ball & {1, 5, 22}) == 3: return 23 + if len(set_ball & {1, 5, 33}) == 3: return 24 + if len(set_ball & {1, 5, 43}) == 3: return 25 + if len(set_ball & {1, 5, 45}) == 3: return 26 + if len(set_ball & {1, 6, 7}) == 3: return 27 + if len(set_ball & {1, 6, 8}) == 3: return 28 + if len(set_ball & {1, 6, 10}) == 3: return 29 + if len(set_ball & {1, 6, 18}) == 3: return 30 + if len(set_ball & {1, 6, 21}) == 3: return 31 + if len(set_ball & {1, 6, 23}) == 3: return 32 + if len(set_ball & {1, 6, 26}) == 3: return 33 + if len(set_ball & {1, 6, 29}) == 3: return 34 + if len(set_ball & {1, 6, 30}) == 3: return 35 + if len(set_ball & {1, 6, 32}) == 3: return 36 + if len(set_ball & {1, 6, 35}) == 3: return 37 + if len(set_ball & {1, 6, 43}) == 3: return 38 + if len(set_ball & {1, 6, 44}) == 3: return 39 + if len(set_ball & {1, 7, 13}) == 3: return 40 + if len(set_ball & {1, 7, 17}) == 3: return 41 + if len(set_ball & {1, 7, 25}) == 3: return 42 + if len(set_ball & {1, 7, 28}) == 3: return 43 + if len(set_ball & {1, 7, 29}) == 3: return 44 + if len(set_ball & {1, 7, 31}) == 3: return 45 + if len(set_ball & {1, 7, 39}) == 3: return 46 + if len(set_ball & {1, 7, 43}) == 3: return 47 + if len(set_ball & {1, 7, 44}) == 3: return 48 + if len(set_ball & {1, 7, 45}) == 3: return 49 + if len(set_ball & {1, 8, 16}) == 3: return 50 + if len(set_ball & {1, 8, 20}) == 3: return 51 + if len(set_ball & {1, 8, 25}) == 3: return 52 + if len(set_ball & {1, 8, 30}) == 3: return 53 + if len(set_ball & {1, 8, 40}) == 3: return 54 + if len(set_ball & {1, 8, 41}) == 3: return 55 + if len(set_ball & {1, 9, 15}) == 3: return 56 + if len(set_ball & {1, 9, 22}) == 3: return 57 + if len(set_ball & {1, 9, 34}) == 3: return 58 + if len(set_ball & {1, 9, 37}) == 3: return 59 + if len(set_ball & {1, 9, 44}) == 3: return 60 + if len(set_ball & {1, 10, 11}) == 3: return 61 + if len(set_ball & {1, 10, 30}) == 3: return 62 + if len(set_ball & {1, 10, 34}) == 3: return 63 + if len(set_ball & {1, 10, 39}) == 3: return 64 + if len(set_ball & {1, 11, 19}) == 3: return 65 + if len(set_ball & {1, 11, 20}) == 3: return 66 + if len(set_ball & {1, 11, 29}) == 3: return 67 + if len(set_ball & {1, 11, 31}) == 3: return 68 + if len(set_ball & {1, 11, 33}) == 3: return 69 + if len(set_ball & {1, 11, 41}) == 3: return 70 + if len(set_ball & {1, 11, 43}) == 3: return 71 + if len(set_ball & {1, 12, 25}) == 3: return 72 + if len(set_ball & {1, 12, 30}) == 3: return 73 + if len(set_ball & {1, 12, 31}) == 3: return 74 + if len(set_ball & {1, 13, 15}) == 3: return 75 + if len(set_ball & {1, 13, 23}) == 3: return 76 + if len(set_ball & {1, 13, 27}) == 3: return 77 + if len(set_ball & {1, 13, 30}) == 3: return 78 + if len(set_ball & {1, 13, 31}) == 3: return 79 + if len(set_ball & {1, 13, 41}) == 3: return 80 + if len(set_ball & {1, 14, 17}) == 3: return 81 + if len(set_ball & {1, 14, 19}) == 3: return 82 + if len(set_ball & {1, 14, 22}) == 3: return 83 + if len(set_ball & {1, 14, 23}) == 3: return 84 + if len(set_ball & {1, 14, 25}) == 3: return 85 + if len(set_ball & {1, 14, 30}) == 3: return 86 + if len(set_ball & {1, 14, 31}) == 3: return 87 + if len(set_ball & {1, 14, 36}) == 3: return 88 + if len(set_ball & {1, 14, 38}) == 3: return 89 + if len(set_ball & {1, 14, 45}) == 3: return 90 + if len(set_ball & {1, 15, 21}) == 3: return 91 + if len(set_ball & {1, 15, 27}) == 3: return 92 + if len(set_ball & {1, 15, 29}) == 3: return 93 + if len(set_ball & {1, 15, 30}) == 3: return 94 + if len(set_ball & {1, 15, 31}) == 3: return 95 + if len(set_ball & {1, 15, 33}) == 3: return 96 + if len(set_ball & {1, 15, 43}) == 3: return 97 + if len(set_ball & {1, 16, 27}) == 3: return 98 + if len(set_ball & {1, 16, 31}) == 3: return 99 + if len(set_ball & {1, 17, 18}) == 3: return 100 + if len(set_ball & {1, 17, 38}) == 3: return 101 + if len(set_ball & {1, 18, 21}) == 3: return 102 + if len(set_ball & {1, 18, 25}) == 3: return 103 + if len(set_ball & {1, 18, 35}) == 3: return 104 + if len(set_ball & {1, 18, 39}) == 3: return 105 + if len(set_ball & {1, 19, 21}) == 3: return 106 + if len(set_ball & {1, 19, 22}) == 3: return 107 + if len(set_ball & {1, 19, 25}) == 3: return 108 + if len(set_ball & {1, 19, 29}) == 3: return 109 + if len(set_ball & {1, 19, 31}) == 3: return 110 + if len(set_ball & {1, 19, 32}) == 3: return 111 + if len(set_ball & {1, 19, 33}) == 3: return 112 + if len(set_ball & {1, 19, 37}) == 3: return 113 + if len(set_ball & {1, 19, 45}) == 3: return 114 + if len(set_ball & {1, 20, 21}) == 3: return 115 + if len(set_ball & {1, 20, 38}) == 3: return 116 + if len(set_ball & {1, 21, 28}) == 3: return 117 + if len(set_ball & {1, 21, 43}) == 3: return 118 + if len(set_ball & {1, 22, 23}) == 3: return 119 + if len(set_ball & {1, 22, 24}) == 3: return 120 + if len(set_ball & {1, 22, 26}) == 3: return 121 + if len(set_ball & {1, 22, 27}) == 3: return 122 + if len(set_ball & {1, 22, 29}) == 3: return 123 + if len(set_ball & {1, 22, 30}) == 3: return 124 + if len(set_ball & {1, 22, 34}) == 3: return 125 + if len(set_ball & {1, 22, 35}) == 3: return 126 + if len(set_ball & {1, 22, 36}) == 3: return 127 + if len(set_ball & {1, 22, 41}) == 3: return 128 + if len(set_ball & {1, 22, 43}) == 3: return 129 + if len(set_ball & {1, 22, 44}) == 3: return 130 + if len(set_ball & {1, 23, 32}) == 3: return 131 + if len(set_ball & {1, 23, 36}) == 3: return 132 + if len(set_ball & {1, 24, 37}) == 3: return 133 + if len(set_ball & {1, 25, 27}) == 3: return 134 + if len(set_ball & {1, 25, 30}) == 3: return 135 + if len(set_ball & {1, 25, 31}) == 3: return 136 + if len(set_ball & {1, 25, 32}) == 3: return 137 + if len(set_ball & {1, 25, 33}) == 3: return 138 + if len(set_ball & {1, 25, 42}) == 3: return 139 + if len(set_ball & {1, 25, 43}) == 3: return 140 + if len(set_ball & {1, 26, 39}) == 3: return 141 + if len(set_ball & {1, 26, 45}) == 3: return 142 + if len(set_ball & {1, 27, 31}) == 3: return 143 + if len(set_ball & {1, 27, 38}) == 3: return 144 + if len(set_ball & {1, 27, 44}) == 3: return 145 + if len(set_ball & {1, 28, 33}) == 3: return 146 + if len(set_ball & {1, 28, 38}) == 3: return 147 + if len(set_ball & {1, 28, 39}) == 3: return 148 + if len(set_ball & {1, 29, 30}) == 3: return 149 + if len(set_ball & {1, 29, 41}) == 3: return 150 + if len(set_ball & {1, 30, 31}) == 3: return 151 + if len(set_ball & {1, 30, 37}) == 3: return 152 + if len(set_ball & {1, 30, 40}) == 3: return 153 + if len(set_ball & {1, 30, 44}) == 3: return 154 + if len(set_ball & {1, 30, 45}) == 3: return 155 + if len(set_ball & {1, 31, 32}) == 3: return 156 + if len(set_ball & {1, 31, 33}) == 3: return 157 + if len(set_ball & {1, 31, 35}) == 3: return 158 + if len(set_ball & {1, 31, 36}) == 3: return 159 + if len(set_ball & {1, 31, 37}) == 3: return 160 + if len(set_ball & {1, 31, 38}) == 3: return 161 + if len(set_ball & {1, 31, 39}) == 3: return 162 + if len(set_ball & {1, 31, 41}) == 3: return 163 + if len(set_ball & {1, 31, 45}) == 3: return 164 + if len(set_ball & {1, 32, 38}) == 3: return 165 + if len(set_ball & {1, 32, 39}) == 3: return 166 + if len(set_ball & {1, 32, 43}) == 3: return 167 + if len(set_ball & {1, 32, 44}) == 3: return 168 + if len(set_ball & {1, 33, 38}) == 3: return 169 + if len(set_ball & {1, 33, 41}) == 3: return 170 + if len(set_ball & {1, 33, 44}) == 3: return 171 + if len(set_ball & {1, 35, 36}) == 3: return 172 + if len(set_ball & {1, 36, 43}) == 3: return 173 + if len(set_ball & {1, 37, 44}) == 3: return 174 + if len(set_ball & {1, 38, 42}) == 3: return 175 + if len(set_ball & {1, 38, 43}) == 3: return 176 + if len(set_ball & {1, 38, 44}) == 3: return 177 + if len(set_ball & {1, 39, 41}) == 3: return 178 + if len(set_ball & {1, 39, 42}) == 3: return 179 + if len(set_ball & {1, 41, 45}) == 3: return 180 + if len(set_ball & {2, 3, 8}) == 3: return 181 + if len(set_ball & {2, 3, 10}) == 3: return 182 + if len(set_ball & {2, 3, 18}) == 3: return 183 + if len(set_ball & {2, 3, 21}) == 3: return 184 + if len(set_ball & {2, 3, 28}) == 3: return 185 + if len(set_ball & {2, 3, 29}) == 3: return 186 + if len(set_ball & {2, 3, 31}) == 3: return 187 + if len(set_ball & {2, 3, 32}) == 3: return 188 + if len(set_ball & {2, 3, 35}) == 3: return 189 + if len(set_ball & {2, 3, 41}) == 3: return 190 + if len(set_ball & {2, 3, 45}) == 3: return 191 + if len(set_ball & {2, 4, 7}) == 3: return 192 + if len(set_ball & {2, 4, 9}) == 3: return 193 + if len(set_ball & {2, 4, 10}) == 3: return 194 + if len(set_ball & {2, 4, 12}) == 3: return 195 + if len(set_ball & {2, 4, 13}) == 3: return 196 + if len(set_ball & {2, 4, 14}) == 3: return 197 + if len(set_ball & {2, 4, 18}) == 3: return 198 + if len(set_ball & {2, 4, 22}) == 3: return 199 + if len(set_ball & {2, 4, 40}) == 3: return 200 + if len(set_ball & {2, 4, 41}) == 3: return 201 + if len(set_ball & {2, 4, 42}) == 3: return 202 + if len(set_ball & {2, 4, 45}) == 3: return 203 + if len(set_ball & {2, 5, 9}) == 3: return 204 + if len(set_ball & {2, 5, 21}) == 3: return 205 + if len(set_ball & {2, 5, 25}) == 3: return 206 + if len(set_ball & {2, 5, 26}) == 3: return 207 + if len(set_ball & {2, 5, 30}) == 3: return 208 + if len(set_ball & {2, 5, 35}) == 3: return 209 + if len(set_ball & {2, 5, 37}) == 3: return 210 + if len(set_ball & {2, 5, 38}) == 3: return 211 + if len(set_ball & {2, 5, 41}) == 3: return 212 + if len(set_ball & {2, 5, 42}) == 3: return 213 + if len(set_ball & {2, 5, 43}) == 3: return 214 + if len(set_ball & {2, 6, 10}) == 3: return 215 + if len(set_ball & {2, 6, 15}) == 3: return 216 + if len(set_ball & {2, 6, 23}) == 3: return 217 + if len(set_ball & {2, 6, 24}) == 3: return 218 + if len(set_ball & {2, 6, 32}) == 3: return 219 + if len(set_ball & {2, 6, 35}) == 3: return 220 + if len(set_ball & {2, 6, 38}) == 3: return 221 + if len(set_ball & {2, 6, 41}) == 3: return 222 + if len(set_ball & {2, 7, 11}) == 3: return 223 + if len(set_ball & {2, 7, 23}) == 3: return 224 + if len(set_ball & {2, 7, 31}) == 3: return 225 + if len(set_ball & {2, 7, 32}) == 3: return 226 + if len(set_ball & {2, 7, 35}) == 3: return 227 + if len(set_ball & {2, 7, 37}) == 3: return 228 + if len(set_ball & {2, 8, 10}) == 3: return 229 + if len(set_ball & {2, 8, 12}) == 3: return 230 + if len(set_ball & {2, 8, 16}) == 3: return 231 + if len(set_ball & {2, 8, 40}) == 3: return 232 + if len(set_ball & {2, 9, 11}) == 3: return 233 + if len(set_ball & {2, 9, 13}) == 3: return 234 + if len(set_ball & {2, 9, 18}) == 3: return 235 + if len(set_ball & {2, 9, 20}) == 3: return 236 + if len(set_ball & {2, 9, 21}) == 3: return 237 + if len(set_ball & {2, 9, 27}) == 3: return 238 + if len(set_ball & {2, 9, 29}) == 3: return 239 + if len(set_ball & {2, 9, 30}) == 3: return 240 + if len(set_ball & {2, 9, 32}) == 3: return 241 + if len(set_ball & {2, 9, 36}) == 3: return 242 + if len(set_ball & {2, 9, 39}) == 3: return 243 + if len(set_ball & {2, 10, 17}) == 3: return 244 + if len(set_ball & {2, 10, 20}) == 3: return 245 + if len(set_ball & {2, 10, 21}) == 3: return 246 + if len(set_ball & {2, 10, 23}) == 3: return 247 + if len(set_ball & {2, 10, 24}) == 3: return 248 + if len(set_ball & {2, 10, 27}) == 3: return 249 + if len(set_ball & {2, 10, 28}) == 3: return 250 + if len(set_ball & {2, 10, 30}) == 3: return 251 + if len(set_ball & {2, 10, 41}) == 3: return 252 + if len(set_ball & {2, 10, 43}) == 3: return 253 + if len(set_ball & {2, 11, 20}) == 3: return 254 + if len(set_ball & {2, 11, 38}) == 3: return 255 + if len(set_ball & {2, 11, 40}) == 3: return 256 + if len(set_ball & {2, 12, 13}) == 3: return 257 + if len(set_ball & {2, 12, 16}) == 3: return 258 + if len(set_ball & {2, 12, 18}) == 3: return 259 + if len(set_ball & {2, 12, 25}) == 3: return 260 + if len(set_ball & {2, 12, 29}) == 3: return 261 + if len(set_ball & {2, 12, 32}) == 3: return 262 + if len(set_ball & {2, 12, 35}) == 3: return 263 + if len(set_ball & {2, 12, 36}) == 3: return 264 + if len(set_ball & {2, 13, 21}) == 3: return 265 + if len(set_ball & {2, 13, 23}) == 3: return 266 + if len(set_ball & {2, 13, 24}) == 3: return 267 + if len(set_ball & {2, 13, 26}) == 3: return 268 + if len(set_ball & {2, 13, 35}) == 3: return 269 + if len(set_ball & {2, 13, 39}) == 3: return 270 + if len(set_ball & {2, 14, 18}) == 3: return 271 + if len(set_ball & {2, 14, 19}) == 3: return 272 + if len(set_ball & {2, 14, 20}) == 3: return 273 + if len(set_ball & {2, 14, 26}) == 3: return 274 + if len(set_ball & {2, 14, 34}) == 3: return 275 + if len(set_ball & {2, 14, 35}) == 3: return 276 + if len(set_ball & {2, 14, 37}) == 3: return 277 + if len(set_ball & {2, 14, 43}) == 3: return 278 + if len(set_ball & {2, 15, 17}) == 3: return 279 + if len(set_ball & {2, 15, 26}) == 3: return 280 + if len(set_ball & {2, 15, 32}) == 3: return 281 + if len(set_ball & {2, 15, 35}) == 3: return 282 + if len(set_ball & {2, 15, 39}) == 3: return 283 + if len(set_ball & {2, 16, 18}) == 3: return 284 + if len(set_ball & {2, 16, 23}) == 3: return 285 + if len(set_ball & {2, 16, 43}) == 3: return 286 + if len(set_ball & {2, 17, 23}) == 3: return 287 + if len(set_ball & {2, 17, 25}) == 3: return 288 + if len(set_ball & {2, 17, 35}) == 3: return 289 + if len(set_ball & {2, 17, 44}) == 3: return 290 + if len(set_ball & {2, 18, 22}) == 3: return 291 + if len(set_ball & {2, 18, 35}) == 3: return 292 + if len(set_ball & {2, 18, 41}) == 3: return 293 + if len(set_ball & {2, 19, 21}) == 3: return 294 + if len(set_ball & {2, 19, 30}) == 3: return 295 + if len(set_ball & {2, 19, 40}) == 3: return 296 + if len(set_ball & {2, 20, 22}) == 3: return 297 + if len(set_ball & {2, 20, 23}) == 3: return 298 + if len(set_ball & {2, 20, 26}) == 3: return 299 + if len(set_ball & {2, 20, 28}) == 3: return 300 + if len(set_ball & {2, 20, 32}) == 3: return 301 + if len(set_ball & {2, 20, 36}) == 3: return 302 + if len(set_ball & {2, 21, 23}) == 3: return 303 + if len(set_ball & {2, 21, 24}) == 3: return 304 + if len(set_ball & {2, 21, 31}) == 3: return 305 + if len(set_ball & {2, 21, 32}) == 3: return 306 + if len(set_ball & {2, 21, 37}) == 3: return 307 + if len(set_ball & {2, 21, 40}) == 3: return 308 + if len(set_ball & {2, 22, 26}) == 3: return 309 + if len(set_ball & {2, 22, 35}) == 3: return 310 + if len(set_ball & {2, 22, 43}) == 3: return 311 + if len(set_ball & {2, 23, 24}) == 3: return 312 + if len(set_ball & {2, 23, 28}) == 3: return 313 + if len(set_ball & {2, 23, 30}) == 3: return 314 + if len(set_ball & {2, 23, 32}) == 3: return 315 + if len(set_ball & {2, 23, 33}) == 3: return 316 + if len(set_ball & {2, 23, 35}) == 3: return 317 + if len(set_ball & {2, 23, 36}) == 3: return 318 + if len(set_ball & {2, 23, 39}) == 3: return 319 + if len(set_ball & {2, 23, 42}) == 3: return 320 + if len(set_ball & {2, 23, 45}) == 3: return 321 + if len(set_ball & {2, 24, 25}) == 3: return 322 + if len(set_ball & {2, 24, 26}) == 3: return 323 + if len(set_ball & {2, 24, 38}) == 3: return 324 + if len(set_ball & {2, 25, 35}) == 3: return 325 + if len(set_ball & {2, 26, 28}) == 3: return 326 + if len(set_ball & {2, 26, 31}) == 3: return 327 + if len(set_ball & {2, 26, 32}) == 3: return 328 + if len(set_ball & {2, 26, 35}) == 3: return 329 + if len(set_ball & {2, 26, 38}) == 3: return 330 + if len(set_ball & {2, 26, 39}) == 3: return 331 + if len(set_ball & {2, 26, 41}) == 3: return 332 + if len(set_ball & {2, 26, 42}) == 3: return 333 + if len(set_ball & {2, 27, 29}) == 3: return 334 + if len(set_ball & {2, 27, 31}) == 3: return 335 + if len(set_ball & {2, 27, 34}) == 3: return 336 + if len(set_ball & {2, 27, 45}) == 3: return 337 + if len(set_ball & {2, 28, 40}) == 3: return 338 + if len(set_ball & {2, 28, 41}) == 3: return 339 + if len(set_ball & {2, 29, 33}) == 3: return 340 + if len(set_ball & {2, 29, 35}) == 3: return 341 + if len(set_ball & {2, 29, 37}) == 3: return 342 + if len(set_ball & {2, 29, 41}) == 3: return 343 + if len(set_ball & {2, 29, 42}) == 3: return 344 + if len(set_ball & {2, 30, 37}) == 3: return 345 + if len(set_ball & {2, 30, 44}) == 3: return 346 + if len(set_ball & {2, 31, 36}) == 3: return 347 + if len(set_ball & {2, 31, 44}) == 3: return 348 + if len(set_ball & {2, 32, 37}) == 3: return 349 + if len(set_ball & {2, 32, 38}) == 3: return 350 + if len(set_ball & {2, 32, 40}) == 3: return 351 + if len(set_ball & {2, 32, 41}) == 3: return 352 + if len(set_ball & {2, 33, 38}) == 3: return 353 + if len(set_ball & {2, 34, 36}) == 3: return 354 + if len(set_ball & {2, 34, 39}) == 3: return 355 + if len(set_ball & {2, 35, 38}) == 3: return 356 + if len(set_ball & {2, 35, 44}) == 3: return 357 + if len(set_ball & {2, 35, 45}) == 3: return 358 + if len(set_ball & {2, 36, 38}) == 3: return 359 + if len(set_ball & {2, 36, 40}) == 3: return 360 + if len(set_ball & {2, 36, 43}) == 3: return 361 + if len(set_ball & {2, 36, 44}) == 3: return 362 + if len(set_ball & {2, 36, 45}) == 3: return 363 + if len(set_ball & {2, 37, 38}) == 3: return 364 + if len(set_ball & {2, 37, 42}) == 3: return 365 + if len(set_ball & {2, 37, 44}) == 3: return 366 + if len(set_ball & {2, 38, 41}) == 3: return 367 + if len(set_ball & {2, 38, 43}) == 3: return 368 + if len(set_ball & {2, 38, 44}) == 3: return 369 + if len(set_ball & {2, 39, 40}) == 3: return 370 + if len(set_ball & {2, 40, 45}) == 3: return 371 + if len(set_ball & {2, 42, 43}) == 3: return 372 + if len(set_ball & {2, 44, 45}) == 3: return 373 + if len(set_ball & {3, 4, 8}) == 3: return 374 + if len(set_ball & {3, 4, 13}) == 3: return 375 + if len(set_ball & {3, 4, 18}) == 3: return 376 + if len(set_ball & {3, 4, 21}) == 3: return 377 + if len(set_ball & {3, 4, 26}) == 3: return 378 + if len(set_ball & {3, 4, 35}) == 3: return 379 + if len(set_ball & {3, 4, 39}) == 3: return 380 + if len(set_ball & {3, 5, 9}) == 3: return 381 + if len(set_ball & {3, 5, 15}) == 3: return 382 + if len(set_ball & {3, 5, 16}) == 3: return 383 + if len(set_ball & {3, 5, 18}) == 3: return 384 + if len(set_ball & {3, 5, 23}) == 3: return 385 + if len(set_ball & {3, 5, 25}) == 3: return 386 + if len(set_ball & {3, 5, 28}) == 3: return 387 + if len(set_ball & {3, 5, 36}) == 3: return 388 + if len(set_ball & {3, 5, 40}) == 3: return 389 + if len(set_ball & {3, 5, 41}) == 3: return 390 + if len(set_ball & {3, 5, 45}) == 3: return 391 + if len(set_ball & {3, 6, 8}) == 3: return 392 + if len(set_ball & {3, 6, 11}) == 3: return 393 + if len(set_ball & {3, 6, 15}) == 3: return 394 + if len(set_ball & {3, 6, 16}) == 3: return 395 + if len(set_ball & {3, 6, 25}) == 3: return 396 + if len(set_ball & {3, 6, 26}) == 3: return 397 + if len(set_ball & {3, 6, 29}) == 3: return 398 + if len(set_ball & {3, 6, 31}) == 3: return 399 + if len(set_ball & {3, 6, 32}) == 3: return 400 + if len(set_ball & {3, 6, 33}) == 3: return 401 + if len(set_ball & {3, 6, 40}) == 3: return 402 + if len(set_ball & {3, 6, 42}) == 3: return 403 + if len(set_ball & {3, 6, 43}) == 3: return 404 + if len(set_ball & {3, 6, 45}) == 3: return 405 + if len(set_ball & {3, 7, 19}) == 3: return 406 + if len(set_ball & {3, 7, 28}) == 3: return 407 + if len(set_ball & {3, 7, 30}) == 3: return 408 + if len(set_ball & {3, 7, 35}) == 3: return 409 + if len(set_ball & {3, 7, 45}) == 3: return 410 + if len(set_ball & {3, 8, 10}) == 3: return 411 + if len(set_ball & {3, 8, 14}) == 3: return 412 + if len(set_ball & {3, 8, 25}) == 3: return 413 + if len(set_ball & {3, 8, 26}) == 3: return 414 + if len(set_ball & {3, 8, 28}) == 3: return 415 + if len(set_ball & {3, 8, 33}) == 3: return 416 + if len(set_ball & {3, 8, 37}) == 3: return 417 + if len(set_ball & {3, 9, 15}) == 3: return 418 + if len(set_ball & {3, 9, 16}) == 3: return 419 + if len(set_ball & {3, 9, 20}) == 3: return 420 + if len(set_ball & {3, 9, 21}) == 3: return 421 + if len(set_ball & {3, 9, 26}) == 3: return 422 + if len(set_ball & {3, 9, 31}) == 3: return 423 + if len(set_ball & {3, 9, 38}) == 3: return 424 + if len(set_ball & {3, 9, 39}) == 3: return 425 + if len(set_ball & {3, 9, 41}) == 3: return 426 + if len(set_ball & {3, 9, 44}) == 3: return 427 + if len(set_ball & {3, 10, 12}) == 3: return 428 + if len(set_ball & {3, 10, 18}) == 3: return 429 + if len(set_ball & {3, 10, 21}) == 3: return 430 + if len(set_ball & {3, 10, 41}) == 3: return 431 + if len(set_ball & {3, 11, 23}) == 3: return 432 + if len(set_ball & {3, 11, 25}) == 3: return 433 + if len(set_ball & {3, 11, 28}) == 3: return 434 + if len(set_ball & {3, 11, 29}) == 3: return 435 + if len(set_ball & {3, 11, 40}) == 3: return 436 + if len(set_ball & {3, 12, 17}) == 3: return 437 + if len(set_ball & {3, 12, 28}) == 3: return 438 + if len(set_ball & {3, 12, 29}) == 3: return 439 + if len(set_ball & {3, 12, 37}) == 3: return 440 + if len(set_ball & {3, 12, 44}) == 3: return 441 + if len(set_ball & {3, 14, 19}) == 3: return 442 + if len(set_ball & {3, 14, 29}) == 3: return 443 + if len(set_ball & {3, 14, 39}) == 3: return 444 + if len(set_ball & {3, 15, 16}) == 3: return 445 + if len(set_ball & {3, 15, 17}) == 3: return 446 + if len(set_ball & {3, 15, 18}) == 3: return 447 + if len(set_ball & {3, 15, 19}) == 3: return 448 + if len(set_ball & {3, 15, 21}) == 3: return 449 + if len(set_ball & {3, 15, 23}) == 3: return 450 + if len(set_ball & {3, 15, 26}) == 3: return 451 + if len(set_ball & {3, 15, 31}) == 3: return 452 + if len(set_ball & {3, 15, 39}) == 3: return 453 + if len(set_ball & {3, 15, 42}) == 3: return 454 + if len(set_ball & {3, 16, 25}) == 3: return 455 + if len(set_ball & {3, 16, 33}) == 3: return 456 + if len(set_ball & {3, 16, 41}) == 3: return 457 + if len(set_ball & {3, 16, 42}) == 3: return 458 + if len(set_ball & {3, 16, 45}) == 3: return 459 + if len(set_ball & {3, 17, 25}) == 3: return 460 + if len(set_ball & {3, 17, 26}) == 3: return 461 + if len(set_ball & {3, 17, 29}) == 3: return 462 + if len(set_ball & {3, 17, 33}) == 3: return 463 + if len(set_ball & {3, 17, 40}) == 3: return 464 + if len(set_ball & {3, 17, 42}) == 3: return 465 + if len(set_ball & {3, 17, 43}) == 3: return 466 + if len(set_ball & {3, 18, 21}) == 3: return 467 + if len(set_ball & {3, 18, 24}) == 3: return 468 + if len(set_ball & {3, 18, 25}) == 3: return 469 + if len(set_ball & {3, 18, 38}) == 3: return 470 + if len(set_ball & {3, 18, 39}) == 3: return 471 + if len(set_ball & {3, 18, 44}) == 3: return 472 + if len(set_ball & {3, 19, 26}) == 3: return 473 + if len(set_ball & {3, 19, 29}) == 3: return 474 + if len(set_ball & {3, 19, 33}) == 3: return 475 + if len(set_ball & {3, 19, 34}) == 3: return 476 + if len(set_ball & {3, 19, 40}) == 3: return 477 + if len(set_ball & {3, 19, 44}) == 3: return 478 + if len(set_ball & {3, 20, 29}) == 3: return 479 + if len(set_ball & {3, 20, 30}) == 3: return 480 + if len(set_ball & {3, 21, 24}) == 3: return 481 + if len(set_ball & {3, 21, 27}) == 3: return 482 + if len(set_ball & {3, 21, 28}) == 3: return 483 + if len(set_ball & {3, 21, 32}) == 3: return 484 + if len(set_ball & {3, 21, 34}) == 3: return 485 + if len(set_ball & {3, 21, 36}) == 3: return 486 + if len(set_ball & {3, 21, 40}) == 3: return 487 + if len(set_ball & {3, 21, 43}) == 3: return 488 + if len(set_ball & {3, 22, 34}) == 3: return 489 + if len(set_ball & {3, 23, 25}) == 3: return 490 + if len(set_ball & {3, 23, 30}) == 3: return 491 + if len(set_ball & {3, 23, 33}) == 3: return 492 + if len(set_ball & {3, 24, 28}) == 3: return 493 + if len(set_ball & {3, 24, 40}) == 3: return 494 + if len(set_ball & {3, 25, 26}) == 3: return 495 + if len(set_ball & {3, 25, 27}) == 3: return 496 + if len(set_ball & {3, 25, 28}) == 3: return 497 + if len(set_ball & {3, 25, 30}) == 3: return 498 + if len(set_ball & {3, 25, 31}) == 3: return 499 + if len(set_ball & {3, 25, 34}) == 3: return 500 + if len(set_ball & {3, 25, 35}) == 3: return 501 + if len(set_ball & {3, 25, 38}) == 3: return 502 + if len(set_ball & {3, 25, 39}) == 3: return 503 + if len(set_ball & {3, 25, 40}) == 3: return 504 + if len(set_ball & {3, 25, 41}) == 3: return 505 + if len(set_ball & {3, 25, 42}) == 3: return 506 + if len(set_ball & {3, 26, 28}) == 3: return 507 + if len(set_ball & {3, 26, 30}) == 3: return 508 + if len(set_ball & {3, 26, 32}) == 3: return 509 + if len(set_ball & {3, 26, 36}) == 3: return 510 + if len(set_ball & {3, 26, 39}) == 3: return 511 + if len(set_ball & {3, 26, 40}) == 3: return 512 + if len(set_ball & {3, 26, 45}) == 3: return 513 + if len(set_ball & {3, 27, 33}) == 3: return 514 + if len(set_ball & {3, 27, 34}) == 3: return 515 + if len(set_ball & {3, 27, 36}) == 3: return 516 + if len(set_ball & {3, 28, 29}) == 3: return 517 + if len(set_ball & {3, 28, 31}) == 3: return 518 + if len(set_ball & {3, 28, 33}) == 3: return 519 + if len(set_ball & {3, 28, 35}) == 3: return 520 + if len(set_ball & {3, 28, 36}) == 3: return 521 + if len(set_ball & {3, 28, 37}) == 3: return 522 + if len(set_ball & {3, 28, 41}) == 3: return 523 + if len(set_ball & {3, 29, 30}) == 3: return 524 + if len(set_ball & {3, 29, 31}) == 3: return 525 + if len(set_ball & {3, 29, 33}) == 3: return 526 + if len(set_ball & {3, 29, 34}) == 3: return 527 + if len(set_ball & {3, 30, 35}) == 3: return 528 + if len(set_ball & {3, 30, 42}) == 3: return 529 + if len(set_ball & {3, 30, 44}) == 3: return 530 + if len(set_ball & {3, 31, 33}) == 3: return 531 + if len(set_ball & {3, 31, 36}) == 3: return 532 + if len(set_ball & {3, 31, 45}) == 3: return 533 + if len(set_ball & {3, 32, 38}) == 3: return 534 + if len(set_ball & {3, 32, 39}) == 3: return 535 + if len(set_ball & {3, 33, 40}) == 3: return 536 + if len(set_ball & {3, 33, 44}) == 3: return 537 + if len(set_ball & {3, 34, 40}) == 3: return 538 + if len(set_ball & {3, 35, 38}) == 3: return 539 + if len(set_ball & {3, 35, 39}) == 3: return 540 + if len(set_ball & {3, 35, 41}) == 3: return 541 + if len(set_ball & {3, 35, 42}) == 3: return 542 + if len(set_ball & {3, 36, 43}) == 3: return 543 + if len(set_ball & {3, 36, 44}) == 3: return 544 + if len(set_ball & {3, 37, 40}) == 3: return 545 + if len(set_ball & {3, 38, 41}) == 3: return 546 + if len(set_ball & {3, 39, 40}) == 3: return 547 + if len(set_ball & {3, 44, 45}) == 3: return 548 + if len(set_ball & {4, 5, 10}) == 3: return 549 + if len(set_ball & {4, 5, 19}) == 3: return 550 + if len(set_ball & {4, 5, 28}) == 3: return 551 + if len(set_ball & {4, 5, 30}) == 3: return 552 + if len(set_ball & {4, 5, 33}) == 3: return 553 + if len(set_ball & {4, 5, 34}) == 3: return 554 + if len(set_ball & {4, 5, 36}) == 3: return 555 + if len(set_ball & {4, 5, 40}) == 3: return 556 + if len(set_ball & {4, 5, 44}) == 3: return 557 + if len(set_ball & {4, 6, 7}) == 3: return 558 + if len(set_ball & {4, 6, 16}) == 3: return 559 + if len(set_ball & {4, 6, 18}) == 3: return 560 + if len(set_ball & {4, 6, 22}) == 3: return 561 + if len(set_ball & {4, 6, 23}) == 3: return 562 + if len(set_ball & {4, 6, 24}) == 3: return 563 + if len(set_ball & {4, 6, 27}) == 3: return 564 + if len(set_ball & {4, 6, 29}) == 3: return 565 + if len(set_ball & {4, 6, 34}) == 3: return 566 + if len(set_ball & {4, 6, 35}) == 3: return 567 + if len(set_ball & {4, 6, 36}) == 3: return 568 + if len(set_ball & {4, 6, 38}) == 3: return 569 + if len(set_ball & {4, 6, 45}) == 3: return 570 + if len(set_ball & {4, 7, 8}) == 3: return 571 + if len(set_ball & {4, 7, 9}) == 3: return 572 + if len(set_ball & {4, 7, 21}) == 3: return 573 + if len(set_ball & {4, 7, 27}) == 3: return 574 + if len(set_ball & {4, 7, 28}) == 3: return 575 + if len(set_ball & {4, 7, 30}) == 3: return 576 + if len(set_ball & {4, 7, 34}) == 3: return 577 + if len(set_ball & {4, 7, 36}) == 3: return 578 + if len(set_ball & {4, 7, 37}) == 3: return 579 + if len(set_ball & {4, 7, 43}) == 3: return 580 + if len(set_ball & {4, 8, 12}) == 3: return 581 + if len(set_ball & {4, 8, 14}) == 3: return 582 + if len(set_ball & {4, 8, 22}) == 3: return 583 + if len(set_ball & {4, 8, 26}) == 3: return 584 + if len(set_ball & {4, 8, 28}) == 3: return 585 + if len(set_ball & {4, 8, 35}) == 3: return 586 + if len(set_ball & {4, 9, 12}) == 3: return 587 + if len(set_ball & {4, 9, 15}) == 3: return 588 + if len(set_ball & {4, 9, 20}) == 3: return 589 + if len(set_ball & {4, 9, 35}) == 3: return 590 + if len(set_ball & {4, 9, 41}) == 3: return 591 + if len(set_ball & {4, 9, 43}) == 3: return 592 + if len(set_ball & {4, 10, 39}) == 3: return 593 + if len(set_ball & {4, 10, 43}) == 3: return 594 + if len(set_ball & {4, 11, 15}) == 3: return 595 + if len(set_ball & {4, 11, 16}) == 3: return 596 + if len(set_ball & {4, 11, 19}) == 3: return 597 + if len(set_ball & {4, 11, 25}) == 3: return 598 + if len(set_ball & {4, 11, 30}) == 3: return 599 + if len(set_ball & {4, 11, 33}) == 3: return 600 + if len(set_ball & {4, 11, 34}) == 3: return 601 + if len(set_ball & {4, 11, 36}) == 3: return 602 + if len(set_ball & {4, 11, 40}) == 3: return 603 + if len(set_ball & {4, 11, 44}) == 3: return 604 + if len(set_ball & {4, 12, 13}) == 3: return 605 + if len(set_ball & {4, 12, 15}) == 3: return 606 + if len(set_ball & {4, 12, 17}) == 3: return 607 + if len(set_ball & {4, 12, 19}) == 3: return 608 + if len(set_ball & {4, 12, 21}) == 3: return 609 + if len(set_ball & {4, 12, 26}) == 3: return 610 + if len(set_ball & {4, 12, 29}) == 3: return 611 + if len(set_ball & {4, 12, 30}) == 3: return 612 + if len(set_ball & {4, 12, 31}) == 3: return 613 + if len(set_ball & {4, 12, 36}) == 3: return 614 + if len(set_ball & {4, 12, 39}) == 3: return 615 + if len(set_ball & {4, 12, 40}) == 3: return 616 + if len(set_ball & {4, 12, 44}) == 3: return 617 + if len(set_ball & {4, 13, 15}) == 3: return 618 + if len(set_ball & {4, 13, 16}) == 3: return 619 + if len(set_ball & {4, 13, 24}) == 3: return 620 + if len(set_ball & {4, 13, 25}) == 3: return 621 + if len(set_ball & {4, 13, 30}) == 3: return 622 + if len(set_ball & {4, 13, 35}) == 3: return 623 + if len(set_ball & {4, 14, 17}) == 3: return 624 + if len(set_ball & {4, 14, 27}) == 3: return 625 + if len(set_ball & {4, 14, 30}) == 3: return 626 + if len(set_ball & {4, 14, 34}) == 3: return 627 + if len(set_ball & {4, 14, 36}) == 3: return 628 + if len(set_ball & {4, 14, 38}) == 3: return 629 + if len(set_ball & {4, 14, 39}) == 3: return 630 + if len(set_ball & {4, 15, 19}) == 3: return 631 + if len(set_ball & {4, 15, 30}) == 3: return 632 + if len(set_ball & {4, 15, 32}) == 3: return 633 + if len(set_ball & {4, 15, 44}) == 3: return 634 + if len(set_ball & {4, 15, 45}) == 3: return 635 + if len(set_ball & {4, 16, 32}) == 3: return 636 + if len(set_ball & {4, 16, 45}) == 3: return 637 + if len(set_ball & {4, 17, 21}) == 3: return 638 + if len(set_ball & {4, 17, 23}) == 3: return 639 + if len(set_ball & {4, 17, 24}) == 3: return 640 + if len(set_ball & {4, 17, 25}) == 3: return 641 + if len(set_ball & {4, 17, 29}) == 3: return 642 + if len(set_ball & {4, 17, 35}) == 3: return 643 + if len(set_ball & {4, 17, 41}) == 3: return 644 + if len(set_ball & {4, 17, 45}) == 3: return 645 + if len(set_ball & {4, 18, 28}) == 3: return 646 + if len(set_ball & {4, 18, 35}) == 3: return 647 + if len(set_ball & {4, 18, 36}) == 3: return 648 + if len(set_ball & {4, 19, 23}) == 3: return 649 + if len(set_ball & {4, 19, 28}) == 3: return 650 + if len(set_ball & {4, 19, 36}) == 3: return 651 + if len(set_ball & {4, 19, 37}) == 3: return 652 + if len(set_ball & {4, 20, 42}) == 3: return 653 + if len(set_ball & {4, 21, 27}) == 3: return 654 + if len(set_ball & {4, 21, 28}) == 3: return 655 + if len(set_ball & {4, 21, 30}) == 3: return 656 + if len(set_ball & {4, 21, 31}) == 3: return 657 + if len(set_ball & {4, 21, 35}) == 3: return 658 + if len(set_ball & {4, 22, 23}) == 3: return 659 + if len(set_ball & {4, 22, 25}) == 3: return 660 + if len(set_ball & {4, 22, 26}) == 3: return 661 + if len(set_ball & {4, 22, 29}) == 3: return 662 + if len(set_ball & {4, 22, 30}) == 3: return 663 + if len(set_ball & {4, 22, 31}) == 3: return 664 + if len(set_ball & {4, 22, 32}) == 3: return 665 + if len(set_ball & {4, 22, 35}) == 3: return 666 + if len(set_ball & {4, 22, 36}) == 3: return 667 + if len(set_ball & {4, 22, 39}) == 3: return 668 + if len(set_ball & {4, 22, 45}) == 3: return 669 + if len(set_ball & {4, 23, 24}) == 3: return 670 + if len(set_ball & {4, 23, 27}) == 3: return 671 + if len(set_ball & {4, 23, 36}) == 3: return 672 + if len(set_ball & {4, 24, 29}) == 3: return 673 + if len(set_ball & {4, 24, 30}) == 3: return 674 + if len(set_ball & {4, 24, 31}) == 3: return 675 + if len(set_ball & {4, 24, 39}) == 3: return 676 + if len(set_ball & {4, 24, 43}) == 3: return 677 + if len(set_ball & {4, 25, 28}) == 3: return 678 + if len(set_ball & {4, 25, 30}) == 3: return 679 + if len(set_ball & {4, 25, 38}) == 3: return 680 + if len(set_ball & {4, 25, 39}) == 3: return 681 + if len(set_ball & {4, 25, 44}) == 3: return 682 + if len(set_ball & {4, 26, 39}) == 3: return 683 + if len(set_ball & {4, 26, 45}) == 3: return 684 + if len(set_ball & {4, 27, 29}) == 3: return 685 + if len(set_ball & {4, 27, 31}) == 3: return 686 + if len(set_ball & {4, 27, 33}) == 3: return 687 + if len(set_ball & {4, 27, 36}) == 3: return 688 + if len(set_ball & {4, 28, 41}) == 3: return 689 + if len(set_ball & {4, 29, 30}) == 3: return 690 + if len(set_ball & {4, 29, 44}) == 3: return 691 + if len(set_ball & {4, 30, 38}) == 3: return 692 + if len(set_ball & {4, 30, 39}) == 3: return 693 + if len(set_ball & {4, 30, 44}) == 3: return 694 + if len(set_ball & {4, 30, 45}) == 3: return 695 + if len(set_ball & {4, 31, 32}) == 3: return 696 + if len(set_ball & {4, 31, 38}) == 3: return 697 + if len(set_ball & {4, 32, 35}) == 3: return 698 + if len(set_ball & {4, 32, 45}) == 3: return 699 + if len(set_ball & {4, 34, 36}) == 3: return 700 + if len(set_ball & {4, 34, 42}) == 3: return 701 + if len(set_ball & {4, 34, 45}) == 3: return 702 + if len(set_ball & {4, 35, 38}) == 3: return 703 + if len(set_ball & {4, 35, 39}) == 3: return 704 + if len(set_ball & {4, 35, 41}) == 3: return 705 + if len(set_ball & {4, 35, 44}) == 3: return 706 + if len(set_ball & {4, 36, 38}) == 3: return 707 + if len(set_ball & {4, 36, 42}) == 3: return 708 + if len(set_ball & {4, 36, 44}) == 3: return 709 + if len(set_ball & {4, 37, 44}) == 3: return 710 + if len(set_ball & {4, 38, 42}) == 3: return 711 + if len(set_ball & {4, 40, 44}) == 3: return 712 + if len(set_ball & {4, 41, 44}) == 3: return 713 + if len(set_ball & {4, 42, 44}) == 3: return 714 + if len(set_ball & {4, 44, 45}) == 3: return 715 + if len(set_ball & {5, 6, 7}) == 3: return 716 + if len(set_ball & {5, 6, 10}) == 3: return 717 + if len(set_ball & {5, 6, 23}) == 3: return 718 + if len(set_ball & {5, 6, 30}) == 3: return 719 + if len(set_ball & {5, 6, 33}) == 3: return 720 + if len(set_ball & {5, 6, 34}) == 3: return 721 + if len(set_ball & {5, 6, 35}) == 3: return 722 + if len(set_ball & {5, 6, 36}) == 3: return 723 + if len(set_ball & {5, 6, 40}) == 3: return 724 + if len(set_ball & {5, 7, 10}) == 3: return 725 + if len(set_ball & {5, 7, 17}) == 3: return 726 + if len(set_ball & {5, 7, 19}) == 3: return 727 + if len(set_ball & {5, 7, 23}) == 3: return 728 + if len(set_ball & {5, 7, 24}) == 3: return 729 + if len(set_ball & {5, 7, 27}) == 3: return 730 + if len(set_ball & {5, 7, 31}) == 3: return 731 + if len(set_ball & {5, 7, 36}) == 3: return 732 + if len(set_ball & {5, 7, 38}) == 3: return 733 + if len(set_ball & {5, 8, 9}) == 3: return 734 + if len(set_ball & {5, 8, 10}) == 3: return 735 + if len(set_ball & {5, 8, 12}) == 3: return 736 + if len(set_ball & {5, 8, 13}) == 3: return 737 + if len(set_ball & {5, 8, 20}) == 3: return 738 + if len(set_ball & {5, 8, 24}) == 3: return 739 + if len(set_ball & {5, 8, 25}) == 3: return 740 + if len(set_ball & {5, 8, 31}) == 3: return 741 + if len(set_ball & {5, 8, 32}) == 3: return 742 + if len(set_ball & {5, 8, 34}) == 3: return 743 + if len(set_ball & {5, 8, 36}) == 3: return 744 + if len(set_ball & {5, 8, 37}) == 3: return 745 + if len(set_ball & {5, 8, 40}) == 3: return 746 + if len(set_ball & {5, 8, 41}) == 3: return 747 + if len(set_ball & {5, 8, 45}) == 3: return 748 + if len(set_ball & {5, 9, 10}) == 3: return 749 + if len(set_ball & {5, 9, 18}) == 3: return 750 + if len(set_ball & {5, 9, 24}) == 3: return 751 + if len(set_ball & {5, 9, 28}) == 3: return 752 + if len(set_ball & {5, 9, 33}) == 3: return 753 + if len(set_ball & {5, 9, 42}) == 3: return 754 + if len(set_ball & {5, 9, 44}) == 3: return 755 + if len(set_ball & {5, 10, 11}) == 3: return 756 + if len(set_ball & {5, 10, 14}) == 3: return 757 + if len(set_ball & {5, 10, 15}) == 3: return 758 + if len(set_ball & {5, 10, 23}) == 3: return 759 + if len(set_ball & {5, 10, 25}) == 3: return 760 + if len(set_ball & {5, 10, 26}) == 3: return 761 + if len(set_ball & {5, 10, 28}) == 3: return 762 + if len(set_ball & {5, 10, 33}) == 3: return 763 + if len(set_ball & {5, 10, 38}) == 3: return 764 + if len(set_ball & {5, 10, 40}) == 3: return 765 + if len(set_ball & {5, 10, 42}) == 3: return 766 + if len(set_ball & {5, 11, 25}) == 3: return 767 + if len(set_ball & {5, 11, 28}) == 3: return 768 + if len(set_ball & {5, 11, 40}) == 3: return 769 + if len(set_ball & {5, 12, 15}) == 3: return 770 + if len(set_ball & {5, 12, 36}) == 3: return 771 + if len(set_ball & {5, 12, 40}) == 3: return 772 + if len(set_ball & {5, 13, 15}) == 3: return 773 + if len(set_ball & {5, 13, 30}) == 3: return 774 + if len(set_ball & {5, 13, 38}) == 3: return 775 + if len(set_ball & {5, 15, 17}) == 3: return 776 + if len(set_ball & {5, 15, 24}) == 3: return 777 + if len(set_ball & {5, 15, 28}) == 3: return 778 + if len(set_ball & {5, 15, 29}) == 3: return 779 + if len(set_ball & {5, 15, 32}) == 3: return 780 + if len(set_ball & {5, 15, 33}) == 3: return 781 + if len(set_ball & {5, 15, 38}) == 3: return 782 + if len(set_ball & {5, 15, 40}) == 3: return 783 + if len(set_ball & {5, 15, 41}) == 3: return 784 + if len(set_ball & {5, 15, 44}) == 3: return 785 + if len(set_ball & {5, 16, 19}) == 3: return 786 + if len(set_ball & {5, 16, 25}) == 3: return 787 + if len(set_ball & {5, 16, 33}) == 3: return 788 + if len(set_ball & {5, 16, 36}) == 3: return 789 + if len(set_ball & {5, 16, 39}) == 3: return 790 + if len(set_ball & {5, 16, 43}) == 3: return 791 + if len(set_ball & {5, 16, 44}) == 3: return 792 + if len(set_ball & {5, 17, 19}) == 3: return 793 + if len(set_ball & {5, 17, 37}) == 3: return 794 + if len(set_ball & {5, 17, 45}) == 3: return 795 + if len(set_ball & {5, 18, 24}) == 3: return 796 + if len(set_ball & {5, 18, 26}) == 3: return 797 + if len(set_ball & {5, 18, 27}) == 3: return 798 + if len(set_ball & {5, 18, 29}) == 3: return 799 + if len(set_ball & {5, 18, 39}) == 3: return 800 + if len(set_ball & {5, 18, 44}) == 3: return 801 + if len(set_ball & {5, 19, 29}) == 3: return 802 + if len(set_ball & {5, 19, 32}) == 3: return 803 + if len(set_ball & {5, 19, 33}) == 3: return 804 + if len(set_ball & {5, 19, 35}) == 3: return 805 + if len(set_ball & {5, 19, 37}) == 3: return 806 + if len(set_ball & {5, 19, 40}) == 3: return 807 + if len(set_ball & {5, 20, 29}) == 3: return 808 + if len(set_ball & {5, 20, 32}) == 3: return 809 + if len(set_ball & {5, 20, 38}) == 3: return 810 + if len(set_ball & {5, 21, 28}) == 3: return 811 + if len(set_ball & {5, 21, 31}) == 3: return 812 + if len(set_ball & {5, 21, 32}) == 3: return 813 + if len(set_ball & {5, 22, 24}) == 3: return 814 + if len(set_ball & {5, 22, 27}) == 3: return 815 + if len(set_ball & {5, 22, 30}) == 3: return 816 + if len(set_ball & {5, 22, 40}) == 3: return 817 + if len(set_ball & {5, 23, 29}) == 3: return 818 + if len(set_ball & {5, 23, 31}) == 3: return 819 + if len(set_ball & {5, 23, 32}) == 3: return 820 + if len(set_ball & {5, 23, 37}) == 3: return 821 + if len(set_ball & {5, 23, 39}) == 3: return 822 + if len(set_ball & {5, 23, 41}) == 3: return 823 + if len(set_ball & {5, 23, 42}) == 3: return 824 + if len(set_ball & {5, 23, 44}) == 3: return 825 + if len(set_ball & {5, 24, 26}) == 3: return 826 + if len(set_ball & {5, 24, 28}) == 3: return 827 + if len(set_ball & {5, 24, 31}) == 3: return 828 + if len(set_ball & {5, 24, 36}) == 3: return 829 + if len(set_ball & {5, 24, 38}) == 3: return 830 + if len(set_ball & {5, 24, 41}) == 3: return 831 + if len(set_ball & {5, 24, 43}) == 3: return 832 + if len(set_ball & {5, 24, 45}) == 3: return 833 + if len(set_ball & {5, 25, 33}) == 3: return 834 + if len(set_ball & {5, 25, 35}) == 3: return 835 + if len(set_ball & {5, 25, 42}) == 3: return 836 + if len(set_ball & {5, 26, 28}) == 3: return 837 + if len(set_ball & {5, 26, 32}) == 3: return 838 + if len(set_ball & {5, 26, 33}) == 3: return 839 + if len(set_ball & {5, 26, 36}) == 3: return 840 + if len(set_ball & {5, 26, 37}) == 3: return 841 + if len(set_ball & {5, 26, 40}) == 3: return 842 + if len(set_ball & {5, 28, 35}) == 3: return 843 + if len(set_ball & {5, 28, 38}) == 3: return 844 + if len(set_ball & {5, 28, 40}) == 3: return 845 + if len(set_ball & {5, 29, 38}) == 3: return 846 + if len(set_ball & {5, 30, 32}) == 3: return 847 + if len(set_ball & {5, 30, 37}) == 3: return 848 + if len(set_ball & {5, 30, 40}) == 3: return 849 + if len(set_ball & {5, 31, 33}) == 3: return 850 + if len(set_ball & {5, 31, 37}) == 3: return 851 + if len(set_ball & {5, 31, 38}) == 3: return 852 + if len(set_ball & {5, 32, 36}) == 3: return 853 + if len(set_ball & {5, 32, 38}) == 3: return 854 + if len(set_ball & {5, 33, 34}) == 3: return 855 + if len(set_ball & {5, 33, 35}) == 3: return 856 + if len(set_ball & {5, 33, 36}) == 3: return 857 + if len(set_ball & {5, 33, 37}) == 3: return 858 + if len(set_ball & {5, 33, 41}) == 3: return 859 + if len(set_ball & {5, 33, 43}) == 3: return 860 + if len(set_ball & {5, 33, 45}) == 3: return 861 + if len(set_ball & {5, 35, 36}) == 3: return 862 + if len(set_ball & {5, 35, 37}) == 3: return 863 + if len(set_ball & {5, 35, 39}) == 3: return 864 + if len(set_ball & {5, 35, 41}) == 3: return 865 + if len(set_ball & {5, 36, 37}) == 3: return 866 + if len(set_ball & {5, 36, 38}) == 3: return 867 + if len(set_ball & {5, 36, 39}) == 3: return 868 + if len(set_ball & {5, 36, 40}) == 3: return 869 + if len(set_ball & {5, 36, 41}) == 3: return 870 + if len(set_ball & {5, 36, 45}) == 3: return 871 + if len(set_ball & {5, 37, 43}) == 3: return 872 + if len(set_ball & {5, 37, 44}) == 3: return 873 + if len(set_ball & {5, 38, 40}) == 3: return 874 + if len(set_ball & {5, 38, 43}) == 3: return 875 + if len(set_ball & {5, 39, 41}) == 3: return 876 + if len(set_ball & {5, 39, 42}) == 3: return 877 + if len(set_ball & {5, 39, 44}) == 3: return 878 + if len(set_ball & {5, 40, 42}) == 3: return 879 + if len(set_ball & {5, 40, 43}) == 3: return 880 + if len(set_ball & {5, 40, 44}) == 3: return 881 + if len(set_ball & {5, 41, 42}) == 3: return 882 + if len(set_ball & {5, 41, 44}) == 3: return 883 + if len(set_ball & {5, 43, 44}) == 3: return 884 + if len(set_ball & {6, 7, 8}) == 3: return 885 + if len(set_ball & {6, 7, 23}) == 3: return 886 + if len(set_ball & {6, 7, 27}) == 3: return 887 + if len(set_ball & {6, 7, 29}) == 3: return 888 + if len(set_ball & {6, 8, 9}) == 3: return 889 + if len(set_ball & {6, 8, 10}) == 3: return 890 + if len(set_ball & {6, 8, 12}) == 3: return 891 + if len(set_ball & {6, 8, 15}) == 3: return 892 + if len(set_ball & {6, 8, 19}) == 3: return 893 + if len(set_ball & {6, 8, 20}) == 3: return 894 + if len(set_ball & {6, 8, 24}) == 3: return 895 + if len(set_ball & {6, 8, 25}) == 3: return 896 + if len(set_ball & {6, 8, 27}) == 3: return 897 + if len(set_ball & {6, 8, 29}) == 3: return 898 + if len(set_ball & {6, 8, 32}) == 3: return 899 + if len(set_ball & {6, 8, 34}) == 3: return 900 + if len(set_ball & {6, 8, 41}) == 3: return 901 + if len(set_ball & {6, 8, 44}) == 3: return 902 + if len(set_ball & {6, 9, 12}) == 3: return 903 + if len(set_ball & {6, 9, 13}) == 3: return 904 + if len(set_ball & {6, 9, 14}) == 3: return 905 + if len(set_ball & {6, 9, 20}) == 3: return 906 + if len(set_ball & {6, 9, 26}) == 3: return 907 + if len(set_ball & {6, 9, 27}) == 3: return 908 + if len(set_ball & {6, 9, 29}) == 3: return 909 + if len(set_ball & {6, 9, 34}) == 3: return 910 + if len(set_ball & {6, 9, 36}) == 3: return 911 + if len(set_ball & {6, 9, 38}) == 3: return 912 + if len(set_ball & {6, 9, 42}) == 3: return 913 + if len(set_ball & {6, 9, 43}) == 3: return 914 + if len(set_ball & {6, 9, 44}) == 3: return 915 + if len(set_ball & {6, 9, 45}) == 3: return 916 + if len(set_ball & {6, 10, 13}) == 3: return 917 + if len(set_ball & {6, 10, 23}) == 3: return 918 + if len(set_ball & {6, 10, 24}) == 3: return 919 + if len(set_ball & {6, 10, 27}) == 3: return 920 + if len(set_ball & {6, 10, 33}) == 3: return 921 + if len(set_ball & {6, 10, 45}) == 3: return 922 + if len(set_ball & {6, 11, 12}) == 3: return 923 + if len(set_ball & {6, 11, 35}) == 3: return 924 + if len(set_ball & {6, 12, 16}) == 3: return 925 + if len(set_ball & {6, 13, 18}) == 3: return 926 + if len(set_ball & {6, 13, 19}) == 3: return 927 + if len(set_ball & {6, 13, 26}) == 3: return 928 + if len(set_ball & {6, 13, 33}) == 3: return 929 + if len(set_ball & {6, 13, 34}) == 3: return 930 + if len(set_ball & {6, 13, 45}) == 3: return 931 + if len(set_ball & {6, 14, 29}) == 3: return 932 + if len(set_ball & {6, 14, 32}) == 3: return 933 + if len(set_ball & {6, 14, 33}) == 3: return 934 + if len(set_ball & {6, 14, 45}) == 3: return 935 + if len(set_ball & {6, 15, 27}) == 3: return 936 + if len(set_ball & {6, 15, 29}) == 3: return 937 + if len(set_ball & {6, 15, 45}) == 3: return 938 + if len(set_ball & {6, 16, 22}) == 3: return 939 + if len(set_ball & {6, 16, 26}) == 3: return 940 + if len(set_ball & {6, 16, 35}) == 3: return 941 + if len(set_ball & {6, 16, 36}) == 3: return 942 + if len(set_ball & {6, 16, 44}) == 3: return 943 + if len(set_ball & {6, 17, 24}) == 3: return 944 + if len(set_ball & {6, 17, 25}) == 3: return 945 + if len(set_ball & {6, 17, 36}) == 3: return 946 + if len(set_ball & {6, 17, 41}) == 3: return 947 + if len(set_ball & {6, 17, 42}) == 3: return 948 + if len(set_ball & {6, 18, 20}) == 3: return 949 + if len(set_ball & {6, 18, 23}) == 3: return 950 + if len(set_ball & {6, 18, 27}) == 3: return 951 + if len(set_ball & {6, 18, 41}) == 3: return 952 + if len(set_ball & {6, 18, 44}) == 3: return 953 + if len(set_ball & {6, 19, 22}) == 3: return 954 + if len(set_ball & {6, 19, 27}) == 3: return 955 + if len(set_ball & {6, 19, 29}) == 3: return 956 + if len(set_ball & {6, 19, 37}) == 3: return 957 + if len(set_ball & {6, 20, 22}) == 3: return 958 + if len(set_ball & {6, 20, 25}) == 3: return 959 + if len(set_ball & {6, 20, 34}) == 3: return 960 + if len(set_ball & {6, 20, 35}) == 3: return 961 + if len(set_ball & {6, 20, 43}) == 3: return 962 + if len(set_ball & {6, 20, 45}) == 3: return 963 + if len(set_ball & {6, 21, 24}) == 3: return 964 + if len(set_ball & {6, 21, 25}) == 3: return 965 + if len(set_ball & {6, 21, 28}) == 3: return 966 + if len(set_ball & {6, 21, 44}) == 3: return 967 + if len(set_ball & {6, 22, 27}) == 3: return 968 + if len(set_ball & {6, 22, 33}) == 3: return 969 + if len(set_ball & {6, 22, 42}) == 3: return 970 + if len(set_ball & {6, 23, 26}) == 3: return 971 + if len(set_ball & {6, 23, 27}) == 3: return 972 + if len(set_ball & {6, 23, 29}) == 3: return 973 + if len(set_ball & {6, 23, 33}) == 3: return 974 + if len(set_ball & {6, 23, 41}) == 3: return 975 + if len(set_ball & {6, 23, 43}) == 3: return 976 + if len(set_ball & {6, 23, 44}) == 3: return 977 + if len(set_ball & {6, 23, 45}) == 3: return 978 + if len(set_ball & {6, 24, 26}) == 3: return 979 + if len(set_ball & {6, 24, 29}) == 3: return 980 + if len(set_ball & {6, 24, 31}) == 3: return 981 + if len(set_ball & {6, 24, 33}) == 3: return 982 + if len(set_ball & {6, 24, 43}) == 3: return 983 + if len(set_ball & {6, 24, 45}) == 3: return 984 + if len(set_ball & {6, 25, 27}) == 3: return 985 + if len(set_ball & {6, 25, 29}) == 3: return 986 + if len(set_ball & {6, 25, 30}) == 3: return 987 + if len(set_ball & {6, 25, 36}) == 3: return 988 + if len(set_ball & {6, 25, 39}) == 3: return 989 + if len(set_ball & {6, 25, 41}) == 3: return 990 + if len(set_ball & {6, 25, 42}) == 3: return 991 + if len(set_ball & {6, 25, 45}) == 3: return 992 + if len(set_ball & {6, 26, 31}) == 3: return 993 + if len(set_ball & {6, 26, 32}) == 3: return 994 + if len(set_ball & {6, 26, 35}) == 3: return 995 + if len(set_ball & {6, 26, 42}) == 3: return 996 + if len(set_ball & {6, 27, 29}) == 3: return 997 + if len(set_ball & {6, 27, 30}) == 3: return 998 + if len(set_ball & {6, 27, 33}) == 3: return 999 + if len(set_ball & {6, 27, 34}) == 3: return 1000 + if len(set_ball & {6, 27, 36}) == 3: return 1001 + if len(set_ball & {6, 27, 45}) == 3: return 1002 + if len(set_ball & {6, 28, 29}) == 3: return 1003 + if len(set_ball & {6, 28, 31}) == 3: return 1004 + if len(set_ball & {6, 28, 37}) == 3: return 1005 + if len(set_ball & {6, 28, 43}) == 3: return 1006 + if len(set_ball & {6, 29, 31}) == 3: return 1007 + if len(set_ball & {6, 29, 32}) == 3: return 1008 + if len(set_ball & {6, 29, 33}) == 3: return 1009 + if len(set_ball & {6, 29, 34}) == 3: return 1010 + if len(set_ball & {6, 29, 35}) == 3: return 1011 + if len(set_ball & {6, 29, 40}) == 3: return 1012 + if len(set_ball & {6, 29, 44}) == 3: return 1013 + if len(set_ball & {6, 30, 33}) == 3: return 1014 + if len(set_ball & {6, 30, 36}) == 3: return 1015 + if len(set_ball & {6, 30, 42}) == 3: return 1016 + if len(set_ball & {6, 30, 44}) == 3: return 1017 + if len(set_ball & {6, 30, 45}) == 3: return 1018 + if len(set_ball & {6, 31, 42}) == 3: return 1019 + if len(set_ball & {6, 32, 33}) == 3: return 1020 + if len(set_ball & {6, 32, 41}) == 3: return 1021 + if len(set_ball & {6, 32, 42}) == 3: return 1022 + if len(set_ball & {6, 32, 43}) == 3: return 1023 + if len(set_ball & {6, 32, 45}) == 3: return 1024 + if len(set_ball & {6, 33, 35}) == 3: return 1025 + if len(set_ball & {6, 33, 36}) == 3: return 1026 + if len(set_ball & {6, 33, 37}) == 3: return 1027 + if len(set_ball & {6, 33, 41}) == 3: return 1028 + if len(set_ball & {6, 33, 42}) == 3: return 1029 + if len(set_ball & {6, 33, 43}) == 3: return 1030 + if len(set_ball & {6, 33, 45}) == 3: return 1031 + if len(set_ball & {6, 34, 36}) == 3: return 1032 + if len(set_ball & {6, 34, 43}) == 3: return 1033 + if len(set_ball & {6, 36, 40}) == 3: return 1034 + if len(set_ball & {6, 37, 42}) == 3: return 1035 + if len(set_ball & {6, 37, 44}) == 3: return 1036 + if len(set_ball & {6, 38, 42}) == 3: return 1037 + if len(set_ball & {6, 39, 42}) == 3: return 1038 + if len(set_ball & {6, 40, 44}) == 3: return 1039 + if len(set_ball & {6, 41, 42}) == 3: return 1040 + if len(set_ball & {6, 41, 44}) == 3: return 1041 + if len(set_ball & {6, 44, 45}) == 3: return 1042 + if len(set_ball & {7, 8, 12}) == 3: return 1043 + if len(set_ball & {7, 8, 25}) == 3: return 1044 + if len(set_ball & {7, 8, 26}) == 3: return 1045 + if len(set_ball & {7, 8, 28}) == 3: return 1046 + if len(set_ball & {7, 8, 35}) == 3: return 1047 + if len(set_ball & {7, 8, 40}) == 3: return 1048 + if len(set_ball & {7, 9, 16}) == 3: return 1049 + if len(set_ball & {7, 9, 21}) == 3: return 1050 + if len(set_ball & {7, 9, 30}) == 3: return 1051 + if len(set_ball & {7, 9, 40}) == 3: return 1052 + if len(set_ball & {7, 9, 41}) == 3: return 1053 + if len(set_ball & {7, 9, 44}) == 3: return 1054 + if len(set_ball & {7, 9, 45}) == 3: return 1055 + if len(set_ball & {7, 10, 11}) == 3: return 1056 + if len(set_ball & {7, 10, 14}) == 3: return 1057 + if len(set_ball & {7, 10, 18}) == 3: return 1058 + if len(set_ball & {7, 10, 20}) == 3: return 1059 + if len(set_ball & {7, 10, 24}) == 3: return 1060 + if len(set_ball & {7, 10, 27}) == 3: return 1061 + if len(set_ball & {7, 10, 30}) == 3: return 1062 + if len(set_ball & {7, 10, 32}) == 3: return 1063 + if len(set_ball & {7, 10, 37}) == 3: return 1064 + if len(set_ball & {7, 10, 39}) == 3: return 1065 + if len(set_ball & {7, 10, 43}) == 3: return 1066 + if len(set_ball & {7, 10, 45}) == 3: return 1067 + if len(set_ball & {7, 11, 14}) == 3: return 1068 + if len(set_ball & {7, 11, 15}) == 3: return 1069 + if len(set_ball & {7, 11, 19}) == 3: return 1070 + if len(set_ball & {7, 11, 25}) == 3: return 1071 + if len(set_ball & {7, 11, 30}) == 3: return 1072 + if len(set_ball & {7, 11, 34}) == 3: return 1073 + if len(set_ball & {7, 11, 36}) == 3: return 1074 + if len(set_ball & {7, 11, 39}) == 3: return 1075 + if len(set_ball & {7, 11, 40}) == 3: return 1076 + if len(set_ball & {7, 12, 17}) == 3: return 1077 + if len(set_ball & {7, 12, 20}) == 3: return 1078 + if len(set_ball & {7, 12, 30}) == 3: return 1079 + if len(set_ball & {7, 12, 44}) == 3: return 1080 + if len(set_ball & {7, 13, 14}) == 3: return 1081 + if len(set_ball & {7, 13, 22}) == 3: return 1082 + if len(set_ball & {7, 13, 23}) == 3: return 1083 + if len(set_ball & {7, 13, 32}) == 3: return 1084 + if len(set_ball & {7, 13, 34}) == 3: return 1085 + if len(set_ball & {7, 14, 18}) == 3: return 1086 + if len(set_ball & {7, 14, 19}) == 3: return 1087 + if len(set_ball & {7, 14, 21}) == 3: return 1088 + if len(set_ball & {7, 14, 25}) == 3: return 1089 + if len(set_ball & {7, 14, 27}) == 3: return 1090 + if len(set_ball & {7, 14, 29}) == 3: return 1091 + if len(set_ball & {7, 14, 30}) == 3: return 1092 + if len(set_ball & {7, 14, 41}) == 3: return 1093 + if len(set_ball & {7, 14, 43}) == 3: return 1094 + if len(set_ball & {7, 14, 45}) == 3: return 1095 + if len(set_ball & {7, 15, 17}) == 3: return 1096 + if len(set_ball & {7, 15, 29}) == 3: return 1097 + if len(set_ball & {7, 15, 35}) == 3: return 1098 + if len(set_ball & {7, 15, 41}) == 3: return 1099 + if len(set_ball & {7, 16, 22}) == 3: return 1100 + if len(set_ball & {7, 16, 30}) == 3: return 1101 + if len(set_ball & {7, 16, 32}) == 3: return 1102 + if len(set_ball & {7, 16, 39}) == 3: return 1103 + if len(set_ball & {7, 16, 43}) == 3: return 1104 + if len(set_ball & {7, 17, 21}) == 3: return 1105 + if len(set_ball & {7, 17, 25}) == 3: return 1106 + if len(set_ball & {7, 17, 27}) == 3: return 1107 + if len(set_ball & {7, 17, 31}) == 3: return 1108 + if len(set_ball & {7, 17, 34}) == 3: return 1109 + if len(set_ball & {7, 17, 37}) == 3: return 1110 + if len(set_ball & {7, 17, 41}) == 3: return 1111 + if len(set_ball & {7, 17, 42}) == 3: return 1112 + if len(set_ball & {7, 17, 43}) == 3: return 1113 + if len(set_ball & {7, 19, 20}) == 3: return 1114 + if len(set_ball & {7, 19, 34}) == 3: return 1115 + if len(set_ball & {7, 21, 22}) == 3: return 1116 + if len(set_ball & {7, 21, 25}) == 3: return 1117 + if len(set_ball & {7, 21, 26}) == 3: return 1118 + if len(set_ball & {7, 21, 28}) == 3: return 1119 + if len(set_ball & {7, 21, 37}) == 3: return 1120 + if len(set_ball & {7, 21, 40}) == 3: return 1121 + if len(set_ball & {7, 21, 42}) == 3: return 1122 + if len(set_ball & {7, 21, 45}) == 3: return 1123 + if len(set_ball & {7, 22, 30}) == 3: return 1124 + if len(set_ball & {7, 22, 45}) == 3: return 1125 + if len(set_ball & {7, 23, 25}) == 3: return 1126 + if len(set_ball & {7, 23, 30}) == 3: return 1127 + if len(set_ball & {7, 23, 31}) == 3: return 1128 + if len(set_ball & {7, 23, 38}) == 3: return 1129 + if len(set_ball & {7, 23, 40}) == 3: return 1130 + if len(set_ball & {7, 23, 41}) == 3: return 1131 + if len(set_ball & {7, 24, 26}) == 3: return 1132 + if len(set_ball & {7, 24, 32}) == 3: return 1133 + if len(set_ball & {7, 25, 27}) == 3: return 1134 + if len(set_ball & {7, 25, 30}) == 3: return 1135 + if len(set_ball & {7, 25, 31}) == 3: return 1136 + if len(set_ball & {7, 25, 32}) == 3: return 1137 + if len(set_ball & {7, 25, 41}) == 3: return 1138 + if len(set_ball & {7, 26, 31}) == 3: return 1139 + if len(set_ball & {7, 26, 32}) == 3: return 1140 + if len(set_ball & {7, 26, 41}) == 3: return 1141 + if len(set_ball & {7, 27, 28}) == 3: return 1142 + if len(set_ball & {7, 27, 31}) == 3: return 1143 + if len(set_ball & {7, 27, 32}) == 3: return 1144 + if len(set_ball & {7, 27, 34}) == 3: return 1145 + if len(set_ball & {7, 28, 31}) == 3: return 1146 + if len(set_ball & {7, 28, 32}) == 3: return 1147 + if len(set_ball & {7, 28, 34}) == 3: return 1148 + if len(set_ball & {7, 29, 37}) == 3: return 1149 + if len(set_ball & {7, 29, 41}) == 3: return 1150 + if len(set_ball & {7, 29, 45}) == 3: return 1151 + if len(set_ball & {7, 30, 31}) == 3: return 1152 + if len(set_ball & {7, 30, 32}) == 3: return 1153 + if len(set_ball & {7, 30, 42}) == 3: return 1154 + if len(set_ball & {7, 31, 32}) == 3: return 1155 + if len(set_ball & {7, 31, 42}) == 3: return 1156 + if len(set_ball & {7, 31, 43}) == 3: return 1157 + if len(set_ball & {7, 31, 44}) == 3: return 1158 + if len(set_ball & {7, 31, 45}) == 3: return 1159 + if len(set_ball & {7, 32, 38}) == 3: return 1160 + if len(set_ball & {7, 33, 42}) == 3: return 1161 + if len(set_ball & {7, 34, 43}) == 3: return 1162 + if len(set_ball & {7, 34, 44}) == 3: return 1163 + if len(set_ball & {7, 35, 41}) == 3: return 1164 + if len(set_ball & {7, 35, 42}) == 3: return 1165 + if len(set_ball & {7, 35, 43}) == 3: return 1166 + if len(set_ball & {7, 35, 44}) == 3: return 1167 + if len(set_ball & {7, 35, 45}) == 3: return 1168 + if len(set_ball & {7, 36, 44}) == 3: return 1169 + if len(set_ball & {7, 36, 45}) == 3: return 1170 + if len(set_ball & {7, 38, 42}) == 3: return 1171 + if len(set_ball & {7, 38, 43}) == 3: return 1172 + if len(set_ball & {7, 38, 45}) == 3: return 1173 + if len(set_ball & {7, 40, 42}) == 3: return 1174 + if len(set_ball & {7, 40, 45}) == 3: return 1175 + if len(set_ball & {7, 42, 43}) == 3: return 1176 + if len(set_ball & {7, 42, 44}) == 3: return 1177 + if len(set_ball & {7, 43, 45}) == 3: return 1178 + if len(set_ball & {8, 9, 11}) == 3: return 1179 + if len(set_ball & {8, 9, 13}) == 3: return 1180 + if len(set_ball & {8, 9, 14}) == 3: return 1181 + if len(set_ball & {8, 9, 15}) == 3: return 1182 + if len(set_ball & {8, 9, 23}) == 3: return 1183 + if len(set_ball & {8, 9, 26}) == 3: return 1184 + if len(set_ball & {8, 9, 30}) == 3: return 1185 + if len(set_ball & {8, 9, 31}) == 3: return 1186 + if len(set_ball & {8, 9, 34}) == 3: return 1187 + if len(set_ball & {8, 9, 35}) == 3: return 1188 + if len(set_ball & {8, 9, 36}) == 3: return 1189 + if len(set_ball & {8, 9, 37}) == 3: return 1190 + if len(set_ball & {8, 9, 38}) == 3: return 1191 + if len(set_ball & {8, 9, 39}) == 3: return 1192 + if len(set_ball & {8, 9, 41}) == 3: return 1193 + if len(set_ball & {8, 9, 42}) == 3: return 1194 + if len(set_ball & {8, 9, 43}) == 3: return 1195 + if len(set_ball & {8, 9, 45}) == 3: return 1196 + if len(set_ball & {8, 10, 17}) == 3: return 1197 + if len(set_ball & {8, 10, 22}) == 3: return 1198 + if len(set_ball & {8, 10, 25}) == 3: return 1199 + if len(set_ball & {8, 10, 26}) == 3: return 1200 + if len(set_ball & {8, 10, 29}) == 3: return 1201 + if len(set_ball & {8, 10, 39}) == 3: return 1202 + if len(set_ball & {8, 11, 20}) == 3: return 1203 + if len(set_ball & {8, 11, 23}) == 3: return 1204 + if len(set_ball & {8, 11, 24}) == 3: return 1205 + if len(set_ball & {8, 11, 27}) == 3: return 1206 + if len(set_ball & {8, 11, 29}) == 3: return 1207 + if len(set_ball & {8, 11, 31}) == 3: return 1208 + if len(set_ball & {8, 11, 32}) == 3: return 1209 + if len(set_ball & {8, 11, 34}) == 3: return 1210 + if len(set_ball & {8, 11, 35}) == 3: return 1211 + if len(set_ball & {8, 11, 40}) == 3: return 1212 + if len(set_ball & {8, 11, 42}) == 3: return 1213 + if len(set_ball & {8, 12, 14}) == 3: return 1214 + if len(set_ball & {8, 12, 15}) == 3: return 1215 + if len(set_ball & {8, 12, 16}) == 3: return 1216 + if len(set_ball & {8, 12, 17}) == 3: return 1217 + if len(set_ball & {8, 12, 18}) == 3: return 1218 + if len(set_ball & {8, 12, 20}) == 3: return 1219 + if len(set_ball & {8, 12, 22}) == 3: return 1220 + if len(set_ball & {8, 12, 23}) == 3: return 1221 + if len(set_ball & {8, 12, 25}) == 3: return 1222 + if len(set_ball & {8, 12, 26}) == 3: return 1223 + if len(set_ball & {8, 12, 27}) == 3: return 1224 + if len(set_ball & {8, 12, 28}) == 3: return 1225 + if len(set_ball & {8, 12, 30}) == 3: return 1226 + if len(set_ball & {8, 12, 32}) == 3: return 1227 + if len(set_ball & {8, 12, 34}) == 3: return 1228 + if len(set_ball & {8, 12, 37}) == 3: return 1229 + if len(set_ball & {8, 12, 38}) == 3: return 1230 + if len(set_ball & {8, 12, 39}) == 3: return 1231 + if len(set_ball & {8, 12, 40}) == 3: return 1232 + if len(set_ball & {8, 12, 41}) == 3: return 1233 + if len(set_ball & {8, 12, 45}) == 3: return 1234 + if len(set_ball & {8, 13, 17}) == 3: return 1235 + if len(set_ball & {8, 13, 21}) == 3: return 1236 + if len(set_ball & {8, 13, 41}) == 3: return 1237 + if len(set_ball & {8, 14, 20}) == 3: return 1238 + if len(set_ball & {8, 14, 24}) == 3: return 1239 + if len(set_ball & {8, 14, 26}) == 3: return 1240 + if len(set_ball & {8, 14, 41}) == 3: return 1241 + if len(set_ball & {8, 14, 42}) == 3: return 1242 + if len(set_ball & {8, 14, 43}) == 3: return 1243 + if len(set_ball & {8, 15, 24}) == 3: return 1244 + if len(set_ball & {8, 15, 26}) == 3: return 1245 + if len(set_ball & {8, 15, 32}) == 3: return 1246 + if len(set_ball & {8, 15, 36}) == 3: return 1247 + if len(set_ball & {8, 15, 40}) == 3: return 1248 + if len(set_ball & {8, 15, 42}) == 3: return 1249 + if len(set_ball & {8, 16, 20}) == 3: return 1250 + if len(set_ball & {8, 16, 22}) == 3: return 1251 + if len(set_ball & {8, 16, 23}) == 3: return 1252 + if len(set_ball & {8, 16, 24}) == 3: return 1253 + if len(set_ball & {8, 16, 27}) == 3: return 1254 + if len(set_ball & {8, 16, 28}) == 3: return 1255 + if len(set_ball & {8, 16, 33}) == 3: return 1256 + if len(set_ball & {8, 16, 35}) == 3: return 1257 + if len(set_ball & {8, 16, 39}) == 3: return 1258 + if len(set_ball & {8, 16, 40}) == 3: return 1259 + if len(set_ball & {8, 17, 25}) == 3: return 1260 + if len(set_ball & {8, 17, 28}) == 3: return 1261 + if len(set_ball & {8, 17, 41}) == 3: return 1262 + if len(set_ball & {8, 18, 26}) == 3: return 1263 + if len(set_ball & {8, 18, 36}) == 3: return 1264 + if len(set_ball & {8, 18, 41}) == 3: return 1265 + if len(set_ball & {8, 19, 23}) == 3: return 1266 + if len(set_ball & {8, 19, 24}) == 3: return 1267 + if len(set_ball & {8, 19, 26}) == 3: return 1268 + if len(set_ball & {8, 19, 29}) == 3: return 1269 + if len(set_ball & {8, 20, 24}) == 3: return 1270 + if len(set_ball & {8, 20, 26}) == 3: return 1271 + if len(set_ball & {8, 20, 28}) == 3: return 1272 + if len(set_ball & {8, 20, 31}) == 3: return 1273 + if len(set_ball & {8, 20, 32}) == 3: return 1274 + if len(set_ball & {8, 20, 40}) == 3: return 1275 + if len(set_ball & {8, 21, 26}) == 3: return 1276 + if len(set_ball & {8, 21, 32}) == 3: return 1277 + if len(set_ball & {8, 21, 41}) == 3: return 1278 + if len(set_ball & {8, 21, 42}) == 3: return 1279 + if len(set_ball & {8, 21, 43}) == 3: return 1280 + if len(set_ball & {8, 22, 27}) == 3: return 1281 + if len(set_ball & {8, 22, 29}) == 3: return 1282 + if len(set_ball & {8, 22, 30}) == 3: return 1283 + if len(set_ball & {8, 22, 34}) == 3: return 1284 + if len(set_ball & {8, 22, 37}) == 3: return 1285 + if len(set_ball & {8, 22, 40}) == 3: return 1286 + if len(set_ball & {8, 22, 43}) == 3: return 1287 + if len(set_ball & {8, 22, 44}) == 3: return 1288 + if len(set_ball & {8, 22, 45}) == 3: return 1289 + if len(set_ball & {8, 23, 28}) == 3: return 1290 + if len(set_ball & {8, 23, 29}) == 3: return 1291 + if len(set_ball & {8, 23, 30}) == 3: return 1292 + if len(set_ball & {8, 23, 32}) == 3: return 1293 + if len(set_ball & {8, 23, 34}) == 3: return 1294 + if len(set_ball & {8, 23, 37}) == 3: return 1295 + if len(set_ball & {8, 24, 25}) == 3: return 1296 + if len(set_ball & {8, 24, 26}) == 3: return 1297 + if len(set_ball & {8, 24, 30}) == 3: return 1298 + if len(set_ball & {8, 24, 32}) == 3: return 1299 + if len(set_ball & {8, 25, 26}) == 3: return 1300 + if len(set_ball & {8, 26, 33}) == 3: return 1301 + if len(set_ball & {8, 26, 35}) == 3: return 1302 + if len(set_ball & {8, 26, 39}) == 3: return 1303 + if len(set_ball & {8, 26, 40}) == 3: return 1304 + if len(set_ball & {8, 26, 41}) == 3: return 1305 + if len(set_ball & {8, 26, 42}) == 3: return 1306 + if len(set_ball & {8, 27, 28}) == 3: return 1307 + if len(set_ball & {8, 28, 41}) == 3: return 1308 + if len(set_ball & {8, 28, 44}) == 3: return 1309 + if len(set_ball & {8, 29, 37}) == 3: return 1310 + if len(set_ball & {8, 29, 39}) == 3: return 1311 + if len(set_ball & {8, 29, 41}) == 3: return 1312 + if len(set_ball & {8, 30, 36}) == 3: return 1313 + if len(set_ball & {8, 31, 32}) == 3: return 1314 + if len(set_ball & {8, 31, 37}) == 3: return 1315 + if len(set_ball & {8, 31, 39}) == 3: return 1316 + if len(set_ball & {8, 31, 40}) == 3: return 1317 + if len(set_ball & {8, 32, 38}) == 3: return 1318 + if len(set_ball & {8, 32, 40}) == 3: return 1319 + if len(set_ball & {8, 32, 41}) == 3: return 1320 + if len(set_ball & {8, 32, 44}) == 3: return 1321 + if len(set_ball & {8, 33, 43}) == 3: return 1322 + if len(set_ball & {8, 34, 35}) == 3: return 1323 + if len(set_ball & {8, 34, 38}) == 3: return 1324 + if len(set_ball & {8, 34, 42}) == 3: return 1325 + if len(set_ball & {8, 37, 38}) == 3: return 1326 + if len(set_ball & {8, 37, 42}) == 3: return 1327 + if len(set_ball & {8, 37, 44}) == 3: return 1328 + if len(set_ball & {8, 38, 43}) == 3: return 1329 + if len(set_ball & {8, 40, 41}) == 3: return 1330 + if len(set_ball & {8, 40, 42}) == 3: return 1331 + if len(set_ball & {8, 41, 42}) == 3: return 1332 + if len(set_ball & {8, 42, 44}) == 3: return 1333 + if len(set_ball & {8, 42, 45}) == 3: return 1334 + if len(set_ball & {9, 10, 17}) == 3: return 1335 + if len(set_ball & {9, 10, 18}) == 3: return 1336 + if len(set_ball & {9, 10, 19}) == 3: return 1337 + if len(set_ball & {9, 10, 20}) == 3: return 1338 + if len(set_ball & {9, 10, 23}) == 3: return 1339 + if len(set_ball & {9, 10, 42}) == 3: return 1340 + if len(set_ball & {9, 10, 43}) == 3: return 1341 + if len(set_ball & {9, 11, 25}) == 3: return 1342 + if len(set_ball & {9, 11, 29}) == 3: return 1343 + if len(set_ball & {9, 11, 33}) == 3: return 1344 + if len(set_ball & {9, 11, 34}) == 3: return 1345 + if len(set_ball & {9, 11, 40}) == 3: return 1346 + if len(set_ball & {9, 11, 45}) == 3: return 1347 + if len(set_ball & {9, 12, 17}) == 3: return 1348 + if len(set_ball & {9, 12, 18}) == 3: return 1349 + if len(set_ball & {9, 12, 22}) == 3: return 1350 + if len(set_ball & {9, 12, 32}) == 3: return 1351 + if len(set_ball & {9, 12, 33}) == 3: return 1352 + if len(set_ball & {9, 12, 42}) == 3: return 1353 + if len(set_ball & {9, 13, 14}) == 3: return 1354 + if len(set_ball & {9, 13, 16}) == 3: return 1355 + if len(set_ball & {9, 13, 17}) == 3: return 1356 + if len(set_ball & {9, 13, 22}) == 3: return 1357 + if len(set_ball & {9, 13, 23}) == 3: return 1358 + if len(set_ball & {9, 13, 29}) == 3: return 1359 + if len(set_ball & {9, 13, 30}) == 3: return 1360 + if len(set_ball & {9, 13, 36}) == 3: return 1361 + if len(set_ball & {9, 13, 40}) == 3: return 1362 + if len(set_ball & {9, 13, 44}) == 3: return 1363 + if len(set_ball & {9, 14, 19}) == 3: return 1364 + if len(set_ball & {9, 14, 24}) == 3: return 1365 + if len(set_ball & {9, 14, 32}) == 3: return 1366 + if len(set_ball & {9, 14, 37}) == 3: return 1367 + if len(set_ball & {9, 14, 39}) == 3: return 1368 + if len(set_ball & {9, 14, 40}) == 3: return 1369 + if len(set_ball & {9, 14, 45}) == 3: return 1370 + if len(set_ball & {9, 15, 18}) == 3: return 1371 + if len(set_ball & {9, 15, 24}) == 3: return 1372 + if len(set_ball & {9, 15, 32}) == 3: return 1373 + if len(set_ball & {9, 15, 35}) == 3: return 1374 + if len(set_ball & {9, 15, 41}) == 3: return 1375 + if len(set_ball & {9, 15, 44}) == 3: return 1376 + if len(set_ball & {9, 15, 45}) == 3: return 1377 + if len(set_ball & {9, 16, 18}) == 3: return 1378 + if len(set_ball & {9, 16, 20}) == 3: return 1379 + if len(set_ball & {9, 16, 22}) == 3: return 1380 + if len(set_ball & {9, 16, 30}) == 3: return 1381 + if len(set_ball & {9, 16, 31}) == 3: return 1382 + if len(set_ball & {9, 16, 33}) == 3: return 1383 + if len(set_ball & {9, 16, 39}) == 3: return 1384 + if len(set_ball & {9, 16, 42}) == 3: return 1385 + if len(set_ball & {9, 17, 20}) == 3: return 1386 + if len(set_ball & {9, 17, 23}) == 3: return 1387 + if len(set_ball & {9, 17, 27}) == 3: return 1388 + if len(set_ball & {9, 17, 40}) == 3: return 1389 + if len(set_ball & {9, 17, 41}) == 3: return 1390 + if len(set_ball & {9, 18, 31}) == 3: return 1391 + if len(set_ball & {9, 18, 39}) == 3: return 1392 + if len(set_ball & {9, 18, 41}) == 3: return 1393 + if len(set_ball & {9, 18, 45}) == 3: return 1394 + if len(set_ball & {9, 19, 21}) == 3: return 1395 + if len(set_ball & {9, 19, 24}) == 3: return 1396 + if len(set_ball & {9, 19, 26}) == 3: return 1397 + if len(set_ball & {9, 19, 27}) == 3: return 1398 + if len(set_ball & {9, 19, 28}) == 3: return 1399 + if len(set_ball & {9, 19, 29}) == 3: return 1400 + if len(set_ball & {9, 19, 31}) == 3: return 1401 + if len(set_ball & {9, 19, 32}) == 3: return 1402 + if len(set_ball & {9, 19, 37}) == 3: return 1403 + if len(set_ball & {9, 19, 38}) == 3: return 1404 + if len(set_ball & {9, 19, 43}) == 3: return 1405 + if len(set_ball & {9, 19, 44}) == 3: return 1406 + if len(set_ball & {9, 19, 45}) == 3: return 1407 + if len(set_ball & {9, 20, 23}) == 3: return 1408 + if len(set_ball & {9, 20, 31}) == 3: return 1409 + if len(set_ball & {9, 20, 32}) == 3: return 1410 + if len(set_ball & {9, 20, 35}) == 3: return 1411 + if len(set_ball & {9, 20, 40}) == 3: return 1412 + if len(set_ball & {9, 20, 42}) == 3: return 1413 + if len(set_ball & {9, 21, 23}) == 3: return 1414 + if len(set_ball & {9, 21, 24}) == 3: return 1415 + if len(set_ball & {9, 21, 38}) == 3: return 1416 + if len(set_ball & {9, 21, 39}) == 3: return 1417 + if len(set_ball & {9, 21, 44}) == 3: return 1418 + if len(set_ball & {9, 21, 45}) == 3: return 1419 + if len(set_ball & {9, 22, 23}) == 3: return 1420 + if len(set_ball & {9, 22, 26}) == 3: return 1421 + if len(set_ball & {9, 22, 28}) == 3: return 1422 + if len(set_ball & {9, 22, 29}) == 3: return 1423 + if len(set_ball & {9, 22, 32}) == 3: return 1424 + if len(set_ball & {9, 22, 39}) == 3: return 1425 + if len(set_ball & {9, 22, 40}) == 3: return 1426 + if len(set_ball & {9, 22, 41}) == 3: return 1427 + if len(set_ball & {9, 22, 43}) == 3: return 1428 + if len(set_ball & {9, 23, 27}) == 3: return 1429 + if len(set_ball & {9, 23, 30}) == 3: return 1430 + if len(set_ball & {9, 23, 31}) == 3: return 1431 + if len(set_ball & {9, 23, 36}) == 3: return 1432 + if len(set_ball & {9, 23, 41}) == 3: return 1433 + if len(set_ball & {9, 23, 42}) == 3: return 1434 + if len(set_ball & {9, 24, 26}) == 3: return 1435 + if len(set_ball & {9, 24, 28}) == 3: return 1436 + if len(set_ball & {9, 24, 35}) == 3: return 1437 + if len(set_ball & {9, 24, 37}) == 3: return 1438 + if len(set_ball & {9, 24, 39}) == 3: return 1439 + if len(set_ball & {9, 24, 40}) == 3: return 1440 + if len(set_ball & {9, 24, 42}) == 3: return 1441 + if len(set_ball & {9, 25, 38}) == 3: return 1442 + if len(set_ball & {9, 26, 32}) == 3: return 1443 + if len(set_ball & {9, 26, 34}) == 3: return 1444 + if len(set_ball & {9, 26, 36}) == 3: return 1445 + if len(set_ball & {9, 26, 39}) == 3: return 1446 + if len(set_ball & {9, 27, 28}) == 3: return 1447 + if len(set_ball & {9, 27, 30}) == 3: return 1448 + if len(set_ball & {9, 27, 33}) == 3: return 1449 + if len(set_ball & {9, 28, 29}) == 3: return 1450 + if len(set_ball & {9, 28, 32}) == 3: return 1451 + if len(set_ball & {9, 28, 37}) == 3: return 1452 + if len(set_ball & {9, 28, 42}) == 3: return 1453 + if len(set_ball & {9, 28, 44}) == 3: return 1454 + if len(set_ball & {9, 29, 30}) == 3: return 1455 + if len(set_ball & {9, 29, 35}) == 3: return 1456 + if len(set_ball & {9, 29, 36}) == 3: return 1457 + if len(set_ball & {9, 29, 42}) == 3: return 1458 + if len(set_ball & {9, 29, 44}) == 3: return 1459 + if len(set_ball & {9, 30, 32}) == 3: return 1460 + if len(set_ball & {9, 30, 38}) == 3: return 1461 + if len(set_ball & {9, 30, 45}) == 3: return 1462 + if len(set_ball & {9, 31, 36}) == 3: return 1463 + if len(set_ball & {9, 31, 37}) == 3: return 1464 + if len(set_ball & {9, 31, 42}) == 3: return 1465 + if len(set_ball & {9, 31, 43}) == 3: return 1466 + if len(set_ball & {9, 32, 34}) == 3: return 1467 + if len(set_ball & {9, 32, 41}) == 3: return 1468 + if len(set_ball & {9, 32, 45}) == 3: return 1469 + if len(set_ball & {9, 33, 35}) == 3: return 1470 + if len(set_ball & {9, 34, 44}) == 3: return 1471 + if len(set_ball & {9, 35, 36}) == 3: return 1472 + if len(set_ball & {9, 35, 44}) == 3: return 1473 + if len(set_ball & {9, 37, 41}) == 3: return 1474 + if len(set_ball & {9, 37, 43}) == 3: return 1475 + if len(set_ball & {9, 37, 45}) == 3: return 1476 + if len(set_ball & {9, 38, 40}) == 3: return 1477 + if len(set_ball & {9, 38, 41}) == 3: return 1478 + if len(set_ball & {9, 38, 42}) == 3: return 1479 + if len(set_ball & {9, 39, 40}) == 3: return 1480 + if len(set_ball & {9, 39, 42}) == 3: return 1481 + if len(set_ball & {9, 40, 44}) == 3: return 1482 + if len(set_ball & {9, 42, 45}) == 3: return 1483 + if len(set_ball & {9, 43, 44}) == 3: return 1484 + if len(set_ball & {9, 44, 45}) == 3: return 1485 + if len(set_ball & {10, 11, 13}) == 3: return 1486 + if len(set_ball & {10, 11, 16}) == 3: return 1487 + if len(set_ball & {10, 11, 17}) == 3: return 1488 + if len(set_ball & {10, 11, 30}) == 3: return 1489 + if len(set_ball & {10, 11, 33}) == 3: return 1490 + if len(set_ball & {10, 11, 40}) == 3: return 1491 + if len(set_ball & {10, 11, 43}) == 3: return 1492 + if len(set_ball & {10, 12, 17}) == 3: return 1493 + if len(set_ball & {10, 12, 23}) == 3: return 1494 + if len(set_ball & {10, 12, 30}) == 3: return 1495 + if len(set_ball & {10, 12, 32}) == 3: return 1496 + if len(set_ball & {10, 12, 34}) == 3: return 1497 + if len(set_ball & {10, 12, 36}) == 3: return 1498 + if len(set_ball & {10, 12, 37}) == 3: return 1499 + if len(set_ball & {10, 12, 41}) == 3: return 1500 + if len(set_ball & {10, 13, 14}) == 3: return 1501 + if len(set_ball & {10, 13, 17}) == 3: return 1502 + if len(set_ball & {10, 13, 20}) == 3: return 1503 + if len(set_ball & {10, 13, 30}) == 3: return 1504 + if len(set_ball & {10, 14, 17}) == 3: return 1505 + if len(set_ball & {10, 14, 26}) == 3: return 1506 + if len(set_ball & {10, 14, 34}) == 3: return 1507 + if len(set_ball & {10, 14, 41}) == 3: return 1508 + if len(set_ball & {10, 15, 28}) == 3: return 1509 + if len(set_ball & {10, 15, 31}) == 3: return 1510 + if len(set_ball & {10, 15, 40}) == 3: return 1511 + if len(set_ball & {10, 15, 45}) == 3: return 1512 + if len(set_ball & {10, 16, 21}) == 3: return 1513 + if len(set_ball & {10, 16, 22}) == 3: return 1514 + if len(set_ball & {10, 16, 23}) == 3: return 1515 + if len(set_ball & {10, 16, 30}) == 3: return 1516 + if len(set_ball & {10, 17, 20}) == 3: return 1517 + if len(set_ball & {10, 17, 24}) == 3: return 1518 + if len(set_ball & {10, 17, 25}) == 3: return 1519 + if len(set_ball & {10, 17, 26}) == 3: return 1520 + if len(set_ball & {10, 17, 28}) == 3: return 1521 + if len(set_ball & {10, 17, 36}) == 3: return 1522 + if len(set_ball & {10, 17, 39}) == 3: return 1523 + if len(set_ball & {10, 17, 40}) == 3: return 1524 + if len(set_ball & {10, 17, 41}) == 3: return 1525 + if len(set_ball & {10, 17, 45}) == 3: return 1526 + if len(set_ball & {10, 18, 33}) == 3: return 1527 + if len(set_ball & {10, 19, 26}) == 3: return 1528 + if len(set_ball & {10, 19, 30}) == 3: return 1529 + if len(set_ball & {10, 19, 36}) == 3: return 1530 + if len(set_ball & {10, 19, 41}) == 3: return 1531 + if len(set_ball & {10, 20, 22}) == 3: return 1532 + if len(set_ball & {10, 20, 29}) == 3: return 1533 + if len(set_ball & {10, 20, 37}) == 3: return 1534 + if len(set_ball & {10, 21, 23}) == 3: return 1535 + if len(set_ball & {10, 21, 24}) == 3: return 1536 + if len(set_ball & {10, 21, 26}) == 3: return 1537 + if len(set_ball & {10, 21, 28}) == 3: return 1538 + if len(set_ball & {10, 21, 32}) == 3: return 1539 + if len(set_ball & {10, 21, 33}) == 3: return 1540 + if len(set_ball & {10, 21, 44}) == 3: return 1541 + if len(set_ball & {10, 22, 26}) == 3: return 1542 + if len(set_ball & {10, 22, 38}) == 3: return 1543 + if len(set_ball & {10, 22, 41}) == 3: return 1544 + if len(set_ball & {10, 22, 45}) == 3: return 1545 + if len(set_ball & {10, 23, 34}) == 3: return 1546 + if len(set_ball & {10, 23, 38}) == 3: return 1547 + if len(set_ball & {10, 23, 41}) == 3: return 1548 + if len(set_ball & {10, 23, 45}) == 3: return 1549 + if len(set_ball & {10, 24, 30}) == 3: return 1550 + if len(set_ball & {10, 24, 34}) == 3: return 1551 + if len(set_ball & {10, 25, 28}) == 3: return 1552 + if len(set_ball & {10, 25, 30}) == 3: return 1553 + if len(set_ball & {10, 25, 32}) == 3: return 1554 + if len(set_ball & {10, 25, 38}) == 3: return 1555 + if len(set_ball & {10, 25, 39}) == 3: return 1556 + if len(set_ball & {10, 25, 42}) == 3: return 1557 + if len(set_ball & {10, 25, 43}) == 3: return 1558 + if len(set_ball & {10, 25, 45}) == 3: return 1559 + if len(set_ball & {10, 26, 27}) == 3: return 1560 + if len(set_ball & {10, 26, 30}) == 3: return 1561 + if len(set_ball & {10, 26, 42}) == 3: return 1562 + if len(set_ball & {10, 26, 45}) == 3: return 1563 + if len(set_ball & {10, 27, 30}) == 3: return 1564 + if len(set_ball & {10, 27, 32}) == 3: return 1565 + if len(set_ball & {10, 27, 34}) == 3: return 1566 + if len(set_ball & {10, 27, 36}) == 3: return 1567 + if len(set_ball & {10, 27, 44}) == 3: return 1568 + if len(set_ball & {10, 28, 29}) == 3: return 1569 + if len(set_ball & {10, 28, 32}) == 3: return 1570 + if len(set_ball & {10, 28, 35}) == 3: return 1571 + if len(set_ball & {10, 28, 43}) == 3: return 1572 + if len(set_ball & {10, 29, 30}) == 3: return 1573 + if len(set_ball & {10, 29, 36}) == 3: return 1574 + if len(set_ball & {10, 29, 39}) == 3: return 1575 + if len(set_ball & {10, 30, 40}) == 3: return 1576 + if len(set_ball & {10, 30, 41}) == 3: return 1577 + if len(set_ball & {10, 30, 45}) == 3: return 1578 + if len(set_ball & {10, 31, 38}) == 3: return 1579 + if len(set_ball & {10, 32, 39}) == 3: return 1580 + if len(set_ball & {10, 33, 34}) == 3: return 1581 + if len(set_ball & {10, 33, 39}) == 3: return 1582 + if len(set_ball & {10, 33, 43}) == 3: return 1583 + if len(set_ball & {10, 34, 39}) == 3: return 1584 + if len(set_ball & {10, 35, 44}) == 3: return 1585 + if len(set_ball & {10, 35, 45}) == 3: return 1586 + if len(set_ball & {10, 36, 43}) == 3: return 1587 + if len(set_ball & {10, 36, 45}) == 3: return 1588 + if len(set_ball & {10, 37, 42}) == 3: return 1589 + if len(set_ball & {10, 37, 44}) == 3: return 1590 + if len(set_ball & {10, 37, 45}) == 3: return 1591 + if len(set_ball & {10, 38, 39}) == 3: return 1592 + if len(set_ball & {10, 39, 45}) == 3: return 1593 + if len(set_ball & {10, 42, 45}) == 3: return 1594 + if len(set_ball & {10, 43, 45}) == 3: return 1595 + if len(set_ball & {11, 12, 17}) == 3: return 1596 + if len(set_ball & {11, 12, 22}) == 3: return 1597 + if len(set_ball & {11, 12, 28}) == 3: return 1598 + if len(set_ball & {11, 12, 30}) == 3: return 1599 + if len(set_ball & {11, 12, 34}) == 3: return 1600 + if len(set_ball & {11, 12, 40}) == 3: return 1601 + if len(set_ball & {11, 12, 41}) == 3: return 1602 + if len(set_ball & {11, 12, 43}) == 3: return 1603 + if len(set_ball & {11, 13, 27}) == 3: return 1604 + if len(set_ball & {11, 13, 39}) == 3: return 1605 + if len(set_ball & {11, 13, 41}) == 3: return 1606 + if len(set_ball & {11, 14, 20}) == 3: return 1607 + if len(set_ball & {11, 14, 24}) == 3: return 1608 + if len(set_ball & {11, 14, 25}) == 3: return 1609 + if len(set_ball & {11, 14, 34}) == 3: return 1610 + if len(set_ball & {11, 14, 40}) == 3: return 1611 + if len(set_ball & {11, 14, 42}) == 3: return 1612 + if len(set_ball & {11, 14, 44}) == 3: return 1613 + if len(set_ball & {11, 15, 19}) == 3: return 1614 + if len(set_ball & {11, 15, 22}) == 3: return 1615 + if len(set_ball & {11, 15, 27}) == 3: return 1616 + if len(set_ball & {11, 15, 29}) == 3: return 1617 + if len(set_ball & {11, 15, 30}) == 3: return 1618 + if len(set_ball & {11, 15, 33}) == 3: return 1619 + if len(set_ball & {11, 15, 38}) == 3: return 1620 + if len(set_ball & {11, 16, 20}) == 3: return 1621 + if len(set_ball & {11, 16, 23}) == 3: return 1622 + if len(set_ball & {11, 16, 30}) == 3: return 1623 + if len(set_ball & {11, 16, 34}) == 3: return 1624 + if len(set_ball & {11, 16, 42}) == 3: return 1625 + if len(set_ball & {11, 17, 32}) == 3: return 1626 + if len(set_ball & {11, 17, 41}) == 3: return 1627 + if len(set_ball & {11, 17, 42}) == 3: return 1628 + if len(set_ball & {11, 17, 43}) == 3: return 1629 + if len(set_ball & {11, 18, 25}) == 3: return 1630 + if len(set_ball & {11, 18, 30}) == 3: return 1631 + if len(set_ball & {11, 18, 32}) == 3: return 1632 + if len(set_ball & {11, 18, 33}) == 3: return 1633 + if len(set_ball & {11, 18, 34}) == 3: return 1634 + if len(set_ball & {11, 18, 44}) == 3: return 1635 + if len(set_ball & {11, 19, 23}) == 3: return 1636 + if len(set_ball & {11, 19, 30}) == 3: return 1637 + if len(set_ball & {11, 19, 33}) == 3: return 1638 + if len(set_ball & {11, 19, 37}) == 3: return 1639 + if len(set_ball & {11, 19, 38}) == 3: return 1640 + if len(set_ball & {11, 19, 40}) == 3: return 1641 + if len(set_ball & {11, 19, 42}) == 3: return 1642 + if len(set_ball & {11, 19, 44}) == 3: return 1643 + if len(set_ball & {11, 20, 24}) == 3: return 1644 + if len(set_ball & {11, 20, 30}) == 3: return 1645 + if len(set_ball & {11, 20, 34}) == 3: return 1646 + if len(set_ball & {11, 20, 36}) == 3: return 1647 + if len(set_ball & {11, 20, 38}) == 3: return 1648 + if len(set_ball & {11, 20, 40}) == 3: return 1649 + if len(set_ball & {11, 21, 29}) == 3: return 1650 + if len(set_ball & {11, 21, 40}) == 3: return 1651 + if len(set_ball & {11, 22, 23}) == 3: return 1652 + if len(set_ball & {11, 22, 27}) == 3: return 1653 + if len(set_ball & {11, 22, 31}) == 3: return 1654 + if len(set_ball & {11, 22, 33}) == 3: return 1655 + if len(set_ball & {11, 22, 34}) == 3: return 1656 + if len(set_ball & {11, 22, 40}) == 3: return 1657 + if len(set_ball & {11, 22, 43}) == 3: return 1658 + if len(set_ball & {11, 22, 45}) == 3: return 1659 + if len(set_ball & {11, 23, 27}) == 3: return 1660 + if len(set_ball & {11, 23, 31}) == 3: return 1661 + if len(set_ball & {11, 23, 33}) == 3: return 1662 + if len(set_ball & {11, 23, 41}) == 3: return 1663 + if len(set_ball & {11, 24, 25}) == 3: return 1664 + if len(set_ball & {11, 24, 31}) == 3: return 1665 + if len(set_ball & {11, 24, 34}) == 3: return 1666 + if len(set_ball & {11, 24, 43}) == 3: return 1667 + if len(set_ball & {11, 25, 37}) == 3: return 1668 + if len(set_ball & {11, 25, 38}) == 3: return 1669 + if len(set_ball & {11, 25, 42}) == 3: return 1670 + if len(set_ball & {11, 25, 43}) == 3: return 1671 + if len(set_ball & {11, 26, 30}) == 3: return 1672 + if len(set_ball & {11, 26, 32}) == 3: return 1673 + if len(set_ball & {11, 26, 42}) == 3: return 1674 + if len(set_ball & {11, 27, 30}) == 3: return 1675 + if len(set_ball & {11, 27, 34}) == 3: return 1676 + if len(set_ball & {11, 27, 42}) == 3: return 1677 + if len(set_ball & {11, 27, 43}) == 3: return 1678 + if len(set_ball & {11, 27, 45}) == 3: return 1679 + if len(set_ball & {11, 28, 31}) == 3: return 1680 + if len(set_ball & {11, 28, 38}) == 3: return 1681 + if len(set_ball & {11, 29, 34}) == 3: return 1682 + if len(set_ball & {11, 29, 35}) == 3: return 1683 + if len(set_ball & {11, 29, 37}) == 3: return 1684 + if len(set_ball & {11, 29, 40}) == 3: return 1685 + if len(set_ball & {11, 30, 36}) == 3: return 1686 + if len(set_ball & {11, 30, 37}) == 3: return 1687 + if len(set_ball & {11, 31, 45}) == 3: return 1688 + if len(set_ball & {11, 32, 34}) == 3: return 1689 + if len(set_ball & {11, 32, 41}) == 3: return 1690 + if len(set_ball & {11, 32, 42}) == 3: return 1691 + if len(set_ball & {11, 32, 43}) == 3: return 1692 + if len(set_ball & {11, 33, 34}) == 3: return 1693 + if len(set_ball & {11, 33, 36}) == 3: return 1694 + if len(set_ball & {11, 33, 41}) == 3: return 1695 + if len(set_ball & {11, 33, 45}) == 3: return 1696 + if len(set_ball & {11, 34, 36}) == 3: return 1697 + if len(set_ball & {11, 34, 37}) == 3: return 1698 + if len(set_ball & {11, 34, 38}) == 3: return 1699 + if len(set_ball & {11, 34, 39}) == 3: return 1700 + if len(set_ball & {11, 34, 40}) == 3: return 1701 + if len(set_ball & {11, 34, 45}) == 3: return 1702 + if len(set_ball & {11, 35, 38}) == 3: return 1703 + if len(set_ball & {11, 36, 41}) == 3: return 1704 + if len(set_ball & {11, 36, 42}) == 3: return 1705 + if len(set_ball & {11, 36, 44}) == 3: return 1706 + if len(set_ball & {11, 37, 38}) == 3: return 1707 + if len(set_ball & {11, 37, 44}) == 3: return 1708 + if len(set_ball & {11, 38, 40}) == 3: return 1709 + if len(set_ball & {11, 39, 40}) == 3: return 1710 + if len(set_ball & {11, 40, 42}) == 3: return 1711 + if len(set_ball & {11, 40, 43}) == 3: return 1712 + if len(set_ball & {11, 40, 44}) == 3: return 1713 + if len(set_ball & {11, 40, 45}) == 3: return 1714 + if len(set_ball & {12, 13, 14}) == 3: return 1715 + if len(set_ball & {12, 13, 16}) == 3: return 1716 + if len(set_ball & {12, 13, 23}) == 3: return 1717 + if len(set_ball & {12, 13, 26}) == 3: return 1718 + if len(set_ball & {12, 13, 27}) == 3: return 1719 + if len(set_ball & {12, 13, 28}) == 3: return 1720 + if len(set_ball & {12, 13, 30}) == 3: return 1721 + if len(set_ball & {12, 14, 19}) == 3: return 1722 + if len(set_ball & {12, 14, 29}) == 3: return 1723 + if len(set_ball & {12, 14, 31}) == 3: return 1724 + if len(set_ball & {12, 14, 36}) == 3: return 1725 + if len(set_ball & {12, 15, 31}) == 3: return 1726 + if len(set_ball & {12, 15, 33}) == 3: return 1727 + if len(set_ball & {12, 15, 35}) == 3: return 1728 + if len(set_ball & {12, 16, 17}) == 3: return 1729 + if len(set_ball & {12, 16, 25}) == 3: return 1730 + if len(set_ball & {12, 16, 27}) == 3: return 1731 + if len(set_ball & {12, 16, 31}) == 3: return 1732 + if len(set_ball & {12, 16, 32}) == 3: return 1733 + if len(set_ball & {12, 16, 33}) == 3: return 1734 + if len(set_ball & {12, 16, 35}) == 3: return 1735 + if len(set_ball & {12, 16, 36}) == 3: return 1736 + if len(set_ball & {12, 17, 27}) == 3: return 1737 + if len(set_ball & {12, 17, 30}) == 3: return 1738 + if len(set_ball & {12, 17, 38}) == 3: return 1739 + if len(set_ball & {12, 18, 33}) == 3: return 1740 + if len(set_ball & {12, 18, 36}) == 3: return 1741 + if len(set_ball & {12, 18, 37}) == 3: return 1742 + if len(set_ball & {12, 18, 44}) == 3: return 1743 + if len(set_ball & {12, 18, 45}) == 3: return 1744 + if len(set_ball & {12, 19, 30}) == 3: return 1745 + if len(set_ball & {12, 19, 38}) == 3: return 1746 + if len(set_ball & {12, 20, 22}) == 3: return 1747 + if len(set_ball & {12, 20, 32}) == 3: return 1748 + if len(set_ball & {12, 20, 37}) == 3: return 1749 + if len(set_ball & {12, 20, 40}) == 3: return 1750 + if len(set_ball & {12, 20, 43}) == 3: return 1751 + if len(set_ball & {12, 21, 22}) == 3: return 1752 + if len(set_ball & {12, 21, 23}) == 3: return 1753 + if len(set_ball & {12, 21, 28}) == 3: return 1754 + if len(set_ball & {12, 21, 33}) == 3: return 1755 + if len(set_ball & {12, 21, 42}) == 3: return 1756 + if len(set_ball & {12, 21, 44}) == 3: return 1757 + if len(set_ball & {12, 22, 27}) == 3: return 1758 + if len(set_ball & {12, 22, 29}) == 3: return 1759 + if len(set_ball & {12, 22, 35}) == 3: return 1760 + if len(set_ball & {12, 22, 38}) == 3: return 1761 + if len(set_ball & {12, 22, 39}) == 3: return 1762 + if len(set_ball & {12, 22, 43}) == 3: return 1763 + if len(set_ball & {12, 22, 45}) == 3: return 1764 + if len(set_ball & {12, 23, 24}) == 3: return 1765 + if len(set_ball & {12, 23, 25}) == 3: return 1766 + if len(set_ball & {12, 23, 29}) == 3: return 1767 + if len(set_ball & {12, 23, 33}) == 3: return 1768 + if len(set_ball & {12, 23, 38}) == 3: return 1769 + if len(set_ball & {12, 23, 40}) == 3: return 1770 + if len(set_ball & {12, 23, 41}) == 3: return 1771 + if len(set_ball & {12, 25, 28}) == 3: return 1772 + if len(set_ball & {12, 25, 30}) == 3: return 1773 + if len(set_ball & {12, 26, 32}) == 3: return 1774 + if len(set_ball & {12, 26, 37}) == 3: return 1775 + if len(set_ball & {12, 27, 31}) == 3: return 1776 + if len(set_ball & {12, 27, 34}) == 3: return 1777 + if len(set_ball & {12, 27, 42}) == 3: return 1778 + if len(set_ball & {12, 28, 29}) == 3: return 1779 + if len(set_ball & {12, 28, 31}) == 3: return 1780 + if len(set_ball & {12, 28, 33}) == 3: return 1781 + if len(set_ball & {12, 28, 37}) == 3: return 1782 + if len(set_ball & {12, 29, 30}) == 3: return 1783 + if len(set_ball & {12, 30, 33}) == 3: return 1784 + if len(set_ball & {12, 30, 35}) == 3: return 1785 + if len(set_ball & {12, 31, 36}) == 3: return 1786 + if len(set_ball & {12, 31, 37}) == 3: return 1787 + if len(set_ball & {12, 31, 45}) == 3: return 1788 + if len(set_ball & {12, 33, 34}) == 3: return 1789 + if len(set_ball & {12, 33, 35}) == 3: return 1790 + if len(set_ball & {12, 33, 37}) == 3: return 1791 + if len(set_ball & {12, 33, 43}) == 3: return 1792 + if len(set_ball & {12, 34, 39}) == 3: return 1793 + if len(set_ball & {12, 35, 36}) == 3: return 1794 + if len(set_ball & {12, 35, 39}) == 3: return 1795 + if len(set_ball & {12, 35, 44}) == 3: return 1796 + if len(set_ball & {12, 36, 38}) == 3: return 1797 + if len(set_ball & {12, 37, 42}) == 3: return 1798 + if len(set_ball & {12, 37, 43}) == 3: return 1799 + if len(set_ball & {12, 37, 44}) == 3: return 1800 + if len(set_ball & {12, 38, 39}) == 3: return 1801 + if len(set_ball & {12, 38, 44}) == 3: return 1802 + if len(set_ball & {12, 43, 45}) == 3: return 1803 + if len(set_ball & {13, 14, 23}) == 3: return 1804 + if len(set_ball & {13, 14, 29}) == 3: return 1805 + if len(set_ball & {13, 14, 31}) == 3: return 1806 + if len(set_ball & {13, 15, 19}) == 3: return 1807 + if len(set_ball & {13, 15, 20}) == 3: return 1808 + if len(set_ball & {13, 15, 22}) == 3: return 1809 + if len(set_ball & {13, 15, 30}) == 3: return 1810 + if len(set_ball & {13, 15, 32}) == 3: return 1811 + if len(set_ball & {13, 16, 17}) == 3: return 1812 + if len(set_ball & {13, 16, 20}) == 3: return 1813 + if len(set_ball & {13, 16, 21}) == 3: return 1814 + if len(set_ball & {13, 16, 22}) == 3: return 1815 + if len(set_ball & {13, 16, 34}) == 3: return 1816 + if len(set_ball & {13, 16, 39}) == 3: return 1817 + if len(set_ball & {13, 16, 40}) == 3: return 1818 + if len(set_ball & {13, 16, 41}) == 3: return 1819 + if len(set_ball & {13, 16, 42}) == 3: return 1820 + if len(set_ball & {13, 17, 24}) == 3: return 1821 + if len(set_ball & {13, 17, 26}) == 3: return 1822 + if len(set_ball & {13, 17, 30}) == 3: return 1823 + if len(set_ball & {13, 17, 35}) == 3: return 1824 + if len(set_ball & {13, 17, 37}) == 3: return 1825 + if len(set_ball & {13, 17, 38}) == 3: return 1826 + if len(set_ball & {13, 18, 36}) == 3: return 1827 + if len(set_ball & {13, 18, 43}) == 3: return 1828 + if len(set_ball & {13, 19, 21}) == 3: return 1829 + if len(set_ball & {13, 19, 23}) == 3: return 1830 + if len(set_ball & {13, 19, 24}) == 3: return 1831 + if len(set_ball & {13, 19, 29}) == 3: return 1832 + if len(set_ball & {13, 19, 30}) == 3: return 1833 + if len(set_ball & {13, 19, 34}) == 3: return 1834 + if len(set_ball & {13, 19, 39}) == 3: return 1835 + if len(set_ball & {13, 19, 41}) == 3: return 1836 + if len(set_ball & {13, 19, 44}) == 3: return 1837 + if len(set_ball & {13, 20, 26}) == 3: return 1838 + if len(set_ball & {13, 20, 34}) == 3: return 1839 + if len(set_ball & {13, 21, 27}) == 3: return 1840 + if len(set_ball & {13, 21, 28}) == 3: return 1841 + if len(set_ball & {13, 21, 31}) == 3: return 1842 + if len(set_ball & {13, 21, 35}) == 3: return 1843 + if len(set_ball & {13, 21, 36}) == 3: return 1844 + if len(set_ball & {13, 21, 38}) == 3: return 1845 + if len(set_ball & {13, 21, 41}) == 3: return 1846 + if len(set_ball & {13, 22, 41}) == 3: return 1847 + if len(set_ball & {13, 22, 43}) == 3: return 1848 + if len(set_ball & {13, 23, 25}) == 3: return 1849 + if len(set_ball & {13, 23, 27}) == 3: return 1850 + if len(set_ball & {13, 23, 29}) == 3: return 1851 + if len(set_ball & {13, 23, 30}) == 3: return 1852 + if len(set_ball & {13, 23, 33}) == 3: return 1853 + if len(set_ball & {13, 23, 34}) == 3: return 1854 + if len(set_ball & {13, 23, 37}) == 3: return 1855 + if len(set_ball & {13, 23, 41}) == 3: return 1856 + if len(set_ball & {13, 23, 42}) == 3: return 1857 + if len(set_ball & {13, 24, 30}) == 3: return 1858 + if len(set_ball & {13, 24, 31}) == 3: return 1859 + if len(set_ball & {13, 24, 43}) == 3: return 1860 + if len(set_ball & {13, 25, 30}) == 3: return 1861 + if len(set_ball & {13, 25, 39}) == 3: return 1862 + if len(set_ball & {13, 25, 40}) == 3: return 1863 + if len(set_ball & {13, 26, 41}) == 3: return 1864 + if len(set_ball & {13, 26, 42}) == 3: return 1865 + if len(set_ball & {13, 26, 45}) == 3: return 1866 + if len(set_ball & {13, 27, 33}) == 3: return 1867 + if len(set_ball & {13, 27, 35}) == 3: return 1868 + if len(set_ball & {13, 27, 36}) == 3: return 1869 + if len(set_ball & {13, 27, 39}) == 3: return 1870 + if len(set_ball & {13, 28, 33}) == 3: return 1871 + if len(set_ball & {13, 28, 35}) == 3: return 1872 + if len(set_ball & {13, 29, 32}) == 3: return 1873 + if len(set_ball & {13, 29, 45}) == 3: return 1874 + if len(set_ball & {13, 30, 32}) == 3: return 1875 + if len(set_ball & {13, 30, 34}) == 3: return 1876 + if len(set_ball & {13, 30, 37}) == 3: return 1877 + if len(set_ball & {13, 30, 42}) == 3: return 1878 + if len(set_ball & {13, 30, 44}) == 3: return 1879 + if len(set_ball & {13, 31, 40}) == 3: return 1880 + if len(set_ball & {13, 34, 35}) == 3: return 1881 + if len(set_ball & {13, 34, 37}) == 3: return 1882 + if len(set_ball & {13, 35, 36}) == 3: return 1883 + if len(set_ball & {13, 35, 37}) == 3: return 1884 + if len(set_ball & {13, 35, 41}) == 3: return 1885 + if len(set_ball & {13, 35, 42}) == 3: return 1886 + if len(set_ball & {13, 35, 44}) == 3: return 1887 + if len(set_ball & {13, 36, 39}) == 3: return 1888 + if len(set_ball & {13, 36, 43}) == 3: return 1889 + if len(set_ball & {13, 37, 42}) == 3: return 1890 + if len(set_ball & {13, 37, 44}) == 3: return 1891 + if len(set_ball & {13, 38, 44}) == 3: return 1892 + if len(set_ball & {13, 39, 44}) == 3: return 1893 + if len(set_ball & {13, 41, 43}) == 3: return 1894 + if len(set_ball & {13, 42, 43}) == 3: return 1895 + if len(set_ball & {13, 42, 44}) == 3: return 1896 + if len(set_ball & {13, 43, 44}) == 3: return 1897 + if len(set_ball & {14, 16, 20}) == 3: return 1898 + if len(set_ball & {14, 16, 22}) == 3: return 1899 + if len(set_ball & {14, 16, 23}) == 3: return 1900 + if len(set_ball & {14, 16, 26}) == 3: return 1901 + if len(set_ball & {14, 16, 30}) == 3: return 1902 + if len(set_ball & {14, 16, 32}) == 3: return 1903 + if len(set_ball & {14, 16, 33}) == 3: return 1904 + if len(set_ball & {14, 16, 34}) == 3: return 1905 + if len(set_ball & {14, 16, 41}) == 3: return 1906 + if len(set_ball & {14, 17, 23}) == 3: return 1907 + if len(set_ball & {14, 17, 25}) == 3: return 1908 + if len(set_ball & {14, 17, 28}) == 3: return 1909 + if len(set_ball & {14, 17, 29}) == 3: return 1910 + if len(set_ball & {14, 17, 34}) == 3: return 1911 + if len(set_ball & {14, 17, 43}) == 3: return 1912 + if len(set_ball & {14, 18, 19}) == 3: return 1913 + if len(set_ball & {14, 18, 25}) == 3: return 1914 + if len(set_ball & {14, 18, 33}) == 3: return 1915 + if len(set_ball & {14, 18, 38}) == 3: return 1916 + if len(set_ball & {14, 18, 40}) == 3: return 1917 + if len(set_ball & {14, 18, 41}) == 3: return 1918 + if len(set_ball & {14, 18, 43}) == 3: return 1919 + if len(set_ball & {14, 18, 45}) == 3: return 1920 + if len(set_ball & {14, 19, 29}) == 3: return 1921 + if len(set_ball & {14, 19, 32}) == 3: return 1922 + if len(set_ball & {14, 19, 33}) == 3: return 1923 + if len(set_ball & {14, 19, 42}) == 3: return 1924 + if len(set_ball & {14, 20, 21}) == 3: return 1925 + if len(set_ball & {14, 20, 26}) == 3: return 1926 + if len(set_ball & {14, 20, 27}) == 3: return 1927 + if len(set_ball & {14, 20, 29}) == 3: return 1928 + if len(set_ball & {14, 20, 32}) == 3: return 1929 + if len(set_ball & {14, 20, 41}) == 3: return 1930 + if len(set_ball & {14, 20, 45}) == 3: return 1931 + if len(set_ball & {14, 21, 24}) == 3: return 1932 + if len(set_ball & {14, 21, 28}) == 3: return 1933 + if len(set_ball & {14, 21, 33}) == 3: return 1934 + if len(set_ball & {14, 21, 42}) == 3: return 1935 + if len(set_ball & {14, 22, 29}) == 3: return 1936 + if len(set_ball & {14, 22, 42}) == 3: return 1937 + if len(set_ball & {14, 23, 24}) == 3: return 1938 + if len(set_ball & {14, 23, 27}) == 3: return 1939 + if len(set_ball & {14, 23, 29}) == 3: return 1940 + if len(set_ball & {14, 23, 41}) == 3: return 1941 + if len(set_ball & {14, 24, 29}) == 3: return 1942 + if len(set_ball & {14, 24, 30}) == 3: return 1943 + if len(set_ball & {14, 24, 38}) == 3: return 1944 + if len(set_ball & {14, 24, 43}) == 3: return 1945 + if len(set_ball & {14, 25, 38}) == 3: return 1946 + if len(set_ball & {14, 25, 41}) == 3: return 1947 + if len(set_ball & {14, 25, 42}) == 3: return 1948 + if len(set_ball & {14, 26, 29}) == 3: return 1949 + if len(set_ball & {14, 27, 41}) == 3: return 1950 + if len(set_ball & {14, 28, 33}) == 3: return 1951 + if len(set_ball & {14, 28, 38}) == 3: return 1952 + if len(set_ball & {14, 28, 42}) == 3: return 1953 + if len(set_ball & {14, 28, 43}) == 3: return 1954 + if len(set_ball & {14, 28, 44}) == 3: return 1955 + if len(set_ball & {14, 29, 38}) == 3: return 1956 + if len(set_ball & {14, 29, 39}) == 3: return 1957 + if len(set_ball & {14, 29, 41}) == 3: return 1958 + if len(set_ball & {14, 29, 42}) == 3: return 1959 + if len(set_ball & {14, 29, 43}) == 3: return 1960 + if len(set_ball & {14, 30, 35}) == 3: return 1961 + if len(set_ball & {14, 31, 35}) == 3: return 1962 + if len(set_ball & {14, 31, 43}) == 3: return 1963 + if len(set_ball & {14, 32, 43}) == 3: return 1964 + if len(set_ball & {14, 32, 44}) == 3: return 1965 + if len(set_ball & {14, 34, 36}) == 3: return 1966 + if len(set_ball & {14, 34, 39}) == 3: return 1967 + if len(set_ball & {14, 36, 41}) == 3: return 1968 + if len(set_ball & {14, 37, 43}) == 3: return 1969 + if len(set_ball & {14, 37, 44}) == 3: return 1970 + if len(set_ball & {14, 38, 41}) == 3: return 1971 + if len(set_ball & {14, 38, 44}) == 3: return 1972 + if len(set_ball & {14, 41, 43}) == 3: return 1973 + if len(set_ball & {14, 41, 44}) == 3: return 1974 + if len(set_ball & {14, 41, 45}) == 3: return 1975 + if len(set_ball & {14, 42, 43}) == 3: return 1976 + if len(set_ball & {15, 16, 18}) == 3: return 1977 + if len(set_ball & {15, 16, 23}) == 3: return 1978 + if len(set_ball & {15, 16, 27}) == 3: return 1979 + if len(set_ball & {15, 16, 33}) == 3: return 1980 + if len(set_ball & {15, 16, 35}) == 3: return 1981 + if len(set_ball & {15, 16, 36}) == 3: return 1982 + if len(set_ball & {15, 16, 40}) == 3: return 1983 + if len(set_ball & {15, 16, 44}) == 3: return 1984 + if len(set_ball & {15, 17, 20}) == 3: return 1985 + if len(set_ball & {15, 17, 22}) == 3: return 1986 + if len(set_ball & {15, 17, 28}) == 3: return 1987 + if len(set_ball & {15, 17, 32}) == 3: return 1988 + if len(set_ball & {15, 18, 20}) == 3: return 1989 + if len(set_ball & {15, 18, 25}) == 3: return 1990 + if len(set_ball & {15, 18, 29}) == 3: return 1991 + if len(set_ball & {15, 18, 30}) == 3: return 1992 + if len(set_ball & {15, 18, 31}) == 3: return 1993 + if len(set_ball & {15, 18, 33}) == 3: return 1994 + if len(set_ball & {15, 18, 37}) == 3: return 1995 + if len(set_ball & {15, 18, 38}) == 3: return 1996 + if len(set_ball & {15, 18, 43}) == 3: return 1997 + if len(set_ball & {15, 19, 20}) == 3: return 1998 + if len(set_ball & {15, 19, 29}) == 3: return 1999 + if len(set_ball & {15, 19, 31}) == 3: return 2000 + if len(set_ball & {15, 19, 32}) == 3: return 2001 + if len(set_ball & {15, 19, 33}) == 3: return 2002 + if len(set_ball & {15, 19, 35}) == 3: return 2003 + if len(set_ball & {15, 20, 32}) == 3: return 2004 + if len(set_ball & {15, 20, 37}) == 3: return 2005 + if len(set_ball & {15, 20, 40}) == 3: return 2006 + if len(set_ball & {15, 20, 45}) == 3: return 2007 + if len(set_ball & {15, 21, 24}) == 3: return 2008 + if len(set_ball & {15, 21, 37}) == 3: return 2009 + if len(set_ball & {15, 21, 40}) == 3: return 2010 + if len(set_ball & {15, 21, 42}) == 3: return 2011 + if len(set_ball & {15, 22, 29}) == 3: return 2012 + if len(set_ball & {15, 22, 30}) == 3: return 2013 + if len(set_ball & {15, 22, 31}) == 3: return 2014 + if len(set_ball & {15, 23, 24}) == 3: return 2015 + if len(set_ball & {15, 23, 27}) == 3: return 2016 + if len(set_ball & {15, 23, 30}) == 3: return 2017 + if len(set_ball & {15, 23, 33}) == 3: return 2018 + if len(set_ball & {15, 23, 36}) == 3: return 2019 + if len(set_ball & {15, 24, 26}) == 3: return 2020 + if len(set_ball & {15, 24, 34}) == 3: return 2021 + if len(set_ball & {15, 25, 27}) == 3: return 2022 + if len(set_ball & {15, 25, 38}) == 3: return 2023 + if len(set_ball & {15, 25, 40}) == 3: return 2024 + if len(set_ball & {15, 25, 44}) == 3: return 2025 + if len(set_ball & {15, 26, 29}) == 3: return 2026 + if len(set_ball & {15, 26, 32}) == 3: return 2027 + if len(set_ball & {15, 26, 38}) == 3: return 2028 + if len(set_ball & {15, 27, 28}) == 3: return 2029 + if len(set_ball & {15, 27, 31}) == 3: return 2030 + if len(set_ball & {15, 27, 36}) == 3: return 2031 + if len(set_ball & {15, 27, 37}) == 3: return 2032 + if len(set_ball & {15, 27, 38}) == 3: return 2033 + if len(set_ball & {15, 27, 39}) == 3: return 2034 + if len(set_ball & {15, 27, 44}) == 3: return 2035 + if len(set_ball & {15, 28, 32}) == 3: return 2036 + if len(set_ball & {15, 28, 35}) == 3: return 2037 + if len(set_ball & {15, 28, 38}) == 3: return 2038 + if len(set_ball & {15, 28, 44}) == 3: return 2039 + if len(set_ball & {15, 29, 31}) == 3: return 2040 + if len(set_ball & {15, 29, 32}) == 3: return 2041 + if len(set_ball & {15, 29, 33}) == 3: return 2042 + if len(set_ball & {15, 29, 36}) == 3: return 2043 + if len(set_ball & {15, 29, 41}) == 3: return 2044 + if len(set_ball & {15, 30, 32}) == 3: return 2045 + if len(set_ball & {15, 30, 34}) == 3: return 2046 + if len(set_ball & {15, 30, 35}) == 3: return 2047 + if len(set_ball & {15, 30, 36}) == 3: return 2048 + if len(set_ball & {15, 30, 40}) == 3: return 2049 + if len(set_ball & {15, 30, 41}) == 3: return 2050 + if len(set_ball & {15, 30, 42}) == 3: return 2051 + if len(set_ball & {15, 31, 36}) == 3: return 2052 + if len(set_ball & {15, 31, 37}) == 3: return 2053 + if len(set_ball & {15, 31, 39}) == 3: return 2054 + if len(set_ball & {15, 31, 44}) == 3: return 2055 + if len(set_ball & {15, 31, 45}) == 3: return 2056 + if len(set_ball & {15, 32, 37}) == 3: return 2057 + if len(set_ball & {15, 32, 38}) == 3: return 2058 + if len(set_ball & {15, 33, 34}) == 3: return 2059 + if len(set_ball & {15, 33, 36}) == 3: return 2060 + if len(set_ball & {15, 33, 42}) == 3: return 2061 + if len(set_ball & {15, 33, 44}) == 3: return 2062 + if len(set_ball & {15, 36, 43}) == 3: return 2063 + if len(set_ball & {15, 36, 45}) == 3: return 2064 + if len(set_ball & {15, 37, 41}) == 3: return 2065 + if len(set_ball & {15, 38, 39}) == 3: return 2066 + if len(set_ball & {15, 38, 40}) == 3: return 2067 + if len(set_ball & {15, 38, 42}) == 3: return 2068 + if len(set_ball & {15, 38, 44}) == 3: return 2069 + if len(set_ball & {15, 39, 45}) == 3: return 2070 + if len(set_ball & {15, 40, 45}) == 3: return 2071 + if len(set_ball & {15, 41, 45}) == 3: return 2072 + if len(set_ball & {15, 44, 45}) == 3: return 2073 + if len(set_ball & {16, 17, 18}) == 3: return 2074 + if len(set_ball & {16, 17, 21}) == 3: return 2075 + if len(set_ball & {16, 17, 27}) == 3: return 2076 + if len(set_ball & {16, 17, 35}) == 3: return 2077 + if len(set_ball & {16, 18, 22}) == 3: return 2078 + if len(set_ball & {16, 18, 33}) == 3: return 2079 + if len(set_ball & {16, 18, 36}) == 3: return 2080 + if len(set_ball & {16, 18, 40}) == 3: return 2081 + if len(set_ball & {16, 18, 41}) == 3: return 2082 + if len(set_ball & {16, 19, 26}) == 3: return 2083 + if len(set_ball & {16, 19, 28}) == 3: return 2084 + if len(set_ball & {16, 19, 30}) == 3: return 2085 + if len(set_ball & {16, 20, 21}) == 3: return 2086 + if len(set_ball & {16, 20, 22}) == 3: return 2087 + if len(set_ball & {16, 20, 34}) == 3: return 2088 + if len(set_ball & {16, 20, 37}) == 3: return 2089 + if len(set_ball & {16, 20, 38}) == 3: return 2090 + if len(set_ball & {16, 20, 45}) == 3: return 2091 + if len(set_ball & {16, 21, 38}) == 3: return 2092 + if len(set_ball & {16, 21, 40}) == 3: return 2093 + if len(set_ball & {16, 21, 45}) == 3: return 2094 + if len(set_ball & {16, 22, 24}) == 3: return 2095 + if len(set_ball & {16, 22, 25}) == 3: return 2096 + if len(set_ball & {16, 22, 26}) == 3: return 2097 + if len(set_ball & {16, 22, 27}) == 3: return 2098 + if len(set_ball & {16, 22, 32}) == 3: return 2099 + if len(set_ball & {16, 22, 33}) == 3: return 2100 + if len(set_ball & {16, 22, 35}) == 3: return 2101 + if len(set_ball & {16, 22, 41}) == 3: return 2102 + if len(set_ball & {16, 22, 45}) == 3: return 2103 + if len(set_ball & {16, 23, 28}) == 3: return 2104 + if len(set_ball & {16, 23, 37}) == 3: return 2105 + if len(set_ball & {16, 24, 31}) == 3: return 2106 + if len(set_ball & {16, 24, 34}) == 3: return 2107 + if len(set_ball & {16, 25, 28}) == 3: return 2108 + if len(set_ball & {16, 25, 32}) == 3: return 2109 + if len(set_ball & {16, 26, 27}) == 3: return 2110 + if len(set_ball & {16, 26, 32}) == 3: return 2111 + if len(set_ball & {16, 26, 35}) == 3: return 2112 + if len(set_ball & {16, 26, 37}) == 3: return 2113 + if len(set_ball & {16, 27, 30}) == 3: return 2114 + if len(set_ball & {16, 27, 32}) == 3: return 2115 + if len(set_ball & {16, 28, 29}) == 3: return 2116 + if len(set_ball & {16, 28, 31}) == 3: return 2117 + if len(set_ball & {16, 28, 32}) == 3: return 2118 + if len(set_ball & {16, 28, 33}) == 3: return 2119 + if len(set_ball & {16, 28, 45}) == 3: return 2120 + if len(set_ball & {16, 29, 32}) == 3: return 2121 + if len(set_ball & {16, 29, 37}) == 3: return 2122 + if len(set_ball & {16, 29, 39}) == 3: return 2123 + if len(set_ball & {16, 29, 43}) == 3: return 2124 + if len(set_ball & {16, 30, 32}) == 3: return 2125 + if len(set_ball & {16, 30, 33}) == 3: return 2126 + if len(set_ball & {16, 30, 35}) == 3: return 2127 + if len(set_ball & {16, 30, 39}) == 3: return 2128 + if len(set_ball & {16, 31, 33}) == 3: return 2129 + if len(set_ball & {16, 31, 42}) == 3: return 2130 + if len(set_ball & {16, 31, 45}) == 3: return 2131 + if len(set_ball & {16, 32, 35}) == 3: return 2132 + if len(set_ball & {16, 32, 36}) == 3: return 2133 + if len(set_ball & {16, 32, 37}) == 3: return 2134 + if len(set_ball & {16, 32, 40}) == 3: return 2135 + if len(set_ball & {16, 32, 42}) == 3: return 2136 + if len(set_ball & {16, 32, 44}) == 3: return 2137 + if len(set_ball & {16, 33, 34}) == 3: return 2138 + if len(set_ball & {16, 33, 37}) == 3: return 2139 + if len(set_ball & {16, 34, 41}) == 3: return 2140 + if len(set_ball & {16, 35, 41}) == 3: return 2141 + if len(set_ball & {16, 35, 42}) == 3: return 2142 + if len(set_ball & {16, 35, 44}) == 3: return 2143 + if len(set_ball & {16, 37, 42}) == 3: return 2144 + if len(set_ball & {16, 38, 42}) == 3: return 2145 + if len(set_ball & {16, 38, 43}) == 3: return 2146 + if len(set_ball & {16, 43, 44}) == 3: return 2147 + if len(set_ball & {17, 18, 37}) == 3: return 2148 + if len(set_ball & {17, 19, 26}) == 3: return 2149 + if len(set_ball & {17, 19, 29}) == 3: return 2150 + if len(set_ball & {17, 19, 31}) == 3: return 2151 + if len(set_ball & {17, 19, 33}) == 3: return 2152 + if len(set_ball & {17, 19, 39}) == 3: return 2153 + if len(set_ball & {17, 20, 21}) == 3: return 2154 + if len(set_ball & {17, 20, 22}) == 3: return 2155 + if len(set_ball & {17, 20, 23}) == 3: return 2156 + if len(set_ball & {17, 20, 25}) == 3: return 2157 + if len(set_ball & {17, 21, 28}) == 3: return 2158 + if len(set_ball & {17, 21, 35}) == 3: return 2159 + if len(set_ball & {17, 21, 38}) == 3: return 2160 + if len(set_ball & {17, 21, 41}) == 3: return 2161 + if len(set_ball & {17, 21, 42}) == 3: return 2162 + if len(set_ball & {17, 21, 43}) == 3: return 2163 + if len(set_ball & {17, 22, 29}) == 3: return 2164 + if len(set_ball & {17, 22, 32}) == 3: return 2165 + if len(set_ball & {17, 22, 38}) == 3: return 2166 + if len(set_ball & {17, 22, 41}) == 3: return 2167 + if len(set_ball & {17, 22, 42}) == 3: return 2168 + if len(set_ball & {17, 22, 44}) == 3: return 2169 + if len(set_ball & {17, 23, 26}) == 3: return 2170 + if len(set_ball & {17, 23, 31}) == 3: return 2171 + if len(set_ball & {17, 23, 33}) == 3: return 2172 + if len(set_ball & {17, 24, 28}) == 3: return 2173 + if len(set_ball & {17, 24, 32}) == 3: return 2174 + if len(set_ball & {17, 24, 33}) == 3: return 2175 + if len(set_ball & {17, 24, 34}) == 3: return 2176 + if len(set_ball & {17, 24, 38}) == 3: return 2177 + if len(set_ball & {17, 24, 42}) == 3: return 2178 + if len(set_ball & {17, 24, 43}) == 3: return 2179 + if len(set_ball & {17, 25, 29}) == 3: return 2180 + if len(set_ball & {17, 25, 32}) == 3: return 2181 + if len(set_ball & {17, 26, 32}) == 3: return 2182 + if len(set_ball & {17, 26, 33}) == 3: return 2183 + if len(set_ball & {17, 26, 34}) == 3: return 2184 + if len(set_ball & {17, 26, 44}) == 3: return 2185 + if len(set_ball & {17, 27, 30}) == 3: return 2186 + if len(set_ball & {17, 27, 41}) == 3: return 2187 + if len(set_ball & {17, 27, 42}) == 3: return 2188 + if len(set_ball & {17, 28, 31}) == 3: return 2189 + if len(set_ball & {17, 28, 32}) == 3: return 2190 + if len(set_ball & {17, 28, 34}) == 3: return 2191 + if len(set_ball & {17, 28, 38}) == 3: return 2192 + if len(set_ball & {17, 29, 36}) == 3: return 2193 + if len(set_ball & {17, 29, 37}) == 3: return 2194 + if len(set_ball & {17, 29, 41}) == 3: return 2195 + if len(set_ball & {17, 29, 42}) == 3: return 2196 + if len(set_ball & {17, 30, 39}) == 3: return 2197 + if len(set_ball & {17, 31, 35}) == 3: return 2198 + if len(set_ball & {17, 31, 41}) == 3: return 2199 + if len(set_ball & {17, 32, 36}) == 3: return 2200 + if len(set_ball & {17, 32, 38}) == 3: return 2201 + if len(set_ball & {17, 32, 40}) == 3: return 2202 + if len(set_ball & {17, 32, 43}) == 3: return 2203 + if len(set_ball & {17, 33, 37}) == 3: return 2204 + if len(set_ball & {17, 33, 39}) == 3: return 2205 + if len(set_ball & {17, 33, 43}) == 3: return 2206 + if len(set_ball & {17, 34, 40}) == 3: return 2207 + if len(set_ball & {17, 35, 37}) == 3: return 2208 + if len(set_ball & {17, 38, 39}) == 3: return 2209 + if len(set_ball & {17, 38, 40}) == 3: return 2210 + if len(set_ball & {17, 38, 42}) == 3: return 2211 + if len(set_ball & {17, 39, 41}) == 3: return 2212 + if len(set_ball & {17, 40, 41}) == 3: return 2213 + if len(set_ball & {17, 40, 42}) == 3: return 2214 + if len(set_ball & {17, 40, 45}) == 3: return 2215 + if len(set_ball & {18, 19, 20}) == 3: return 2216 + if len(set_ball & {18, 19, 35}) == 3: return 2217 + if len(set_ball & {18, 19, 36}) == 3: return 2218 + if len(set_ball & {18, 19, 37}) == 3: return 2219 + if len(set_ball & {18, 19, 41}) == 3: return 2220 + if len(set_ball & {18, 19, 43}) == 3: return 2221 + if len(set_ball & {18, 20, 29}) == 3: return 2222 + if len(set_ball & {18, 20, 37}) == 3: return 2223 + if len(set_ball & {18, 20, 39}) == 3: return 2224 + if len(set_ball & {18, 20, 41}) == 3: return 2225 + if len(set_ball & {18, 21, 24}) == 3: return 2226 + if len(set_ball & {18, 21, 30}) == 3: return 2227 + if len(set_ball & {18, 21, 45}) == 3: return 2228 + if len(set_ball & {18, 22, 27}) == 3: return 2229 + if len(set_ball & {18, 22, 32}) == 3: return 2230 + if len(set_ball & {18, 22, 33}) == 3: return 2231 + if len(set_ball & {18, 22, 36}) == 3: return 2232 + if len(set_ball & {18, 22, 37}) == 3: return 2233 + if len(set_ball & {18, 22, 40}) == 3: return 2234 + if len(set_ball & {18, 22, 41}) == 3: return 2235 + if len(set_ball & {18, 23, 24}) == 3: return 2236 + if len(set_ball & {18, 23, 31}) == 3: return 2237 + if len(set_ball & {18, 23, 33}) == 3: return 2238 + if len(set_ball & {18, 23, 38}) == 3: return 2239 + if len(set_ball & {18, 23, 42}) == 3: return 2240 + if len(set_ball & {18, 24, 28}) == 3: return 2241 + if len(set_ball & {18, 24, 35}) == 3: return 2242 + if len(set_ball & {18, 24, 43}) == 3: return 2243 + if len(set_ball & {18, 25, 29}) == 3: return 2244 + if len(set_ball & {18, 25, 36}) == 3: return 2245 + if len(set_ball & {18, 25, 40}) == 3: return 2246 + if len(set_ball & {18, 25, 41}) == 3: return 2247 + if len(set_ball & {18, 25, 42}) == 3: return 2248 + if len(set_ball & {18, 25, 43}) == 3: return 2249 + if len(set_ball & {18, 26, 28}) == 3: return 2250 + if len(set_ball & {18, 27, 30}) == 3: return 2251 + if len(set_ball & {18, 27, 34}) == 3: return 2252 + if len(set_ball & {18, 27, 35}) == 3: return 2253 + if len(set_ball & {18, 27, 37}) == 3: return 2254 + if len(set_ball & {18, 27, 38}) == 3: return 2255 + if len(set_ball & {18, 27, 44}) == 3: return 2256 + if len(set_ball & {18, 28, 29}) == 3: return 2257 + if len(set_ball & {18, 28, 33}) == 3: return 2258 + if len(set_ball & {18, 28, 41}) == 3: return 2259 + if len(set_ball & {18, 28, 44}) == 3: return 2260 + if len(set_ball & {18, 29, 40}) == 3: return 2261 + if len(set_ball & {18, 29, 41}) == 3: return 2262 + if len(set_ball & {18, 29, 45}) == 3: return 2263 + if len(set_ball & {18, 30, 33}) == 3: return 2264 + if len(set_ball & {18, 30, 35}) == 3: return 2265 + if len(set_ball & {18, 31, 35}) == 3: return 2266 + if len(set_ball & {18, 32, 42}) == 3: return 2267 + if len(set_ball & {18, 33, 35}) == 3: return 2268 + if len(set_ball & {18, 33, 39}) == 3: return 2269 + if len(set_ball & {18, 33, 41}) == 3: return 2270 + if len(set_ball & {18, 33, 43}) == 3: return 2271 + if len(set_ball & {18, 34, 36}) == 3: return 2272 + if len(set_ball & {18, 34, 37}) == 3: return 2273 + if len(set_ball & {18, 35, 36}) == 3: return 2274 + if len(set_ball & {18, 35, 41}) == 3: return 2275 + if len(set_ball & {18, 36, 38}) == 3: return 2276 + if len(set_ball & {18, 36, 45}) == 3: return 2277 + if len(set_ball & {18, 37, 41}) == 3: return 2278 + if len(set_ball & {18, 38, 39}) == 3: return 2279 + if len(set_ball & {18, 38, 40}) == 3: return 2280 + if len(set_ball & {18, 38, 42}) == 3: return 2281 + if len(set_ball & {18, 40, 44}) == 3: return 2282 + if len(set_ball & {18, 41, 44}) == 3: return 2283 + if len(set_ball & {19, 20, 22}) == 3: return 2284 + if len(set_ball & {19, 20, 27}) == 3: return 2285 + if len(set_ball & {19, 20, 29}) == 3: return 2286 + if len(set_ball & {19, 20, 31}) == 3: return 2287 + if len(set_ball & {19, 20, 36}) == 3: return 2288 + if len(set_ball & {19, 20, 37}) == 3: return 2289 + if len(set_ball & {19, 21, 28}) == 3: return 2290 + if len(set_ball & {19, 21, 38}) == 3: return 2291 + if len(set_ball & {19, 22, 26}) == 3: return 2292 + if len(set_ball & {19, 22, 27}) == 3: return 2293 + if len(set_ball & {19, 22, 33}) == 3: return 2294 + if len(set_ball & {19, 22, 38}) == 3: return 2295 + if len(set_ball & {19, 22, 41}) == 3: return 2296 + if len(set_ball & {19, 22, 45}) == 3: return 2297 + if len(set_ball & {19, 23, 26}) == 3: return 2298 + if len(set_ball & {19, 23, 40}) == 3: return 2299 + if len(set_ball & {19, 24, 25}) == 3: return 2300 + if len(set_ball & {19, 24, 28}) == 3: return 2301 + if len(set_ball & {19, 24, 29}) == 3: return 2302 + if len(set_ball & {19, 24, 35}) == 3: return 2303 + if len(set_ball & {19, 24, 38}) == 3: return 2304 + if len(set_ball & {19, 25, 30}) == 3: return 2305 + if len(set_ball & {19, 25, 35}) == 3: return 2306 + if len(set_ball & {19, 25, 40}) == 3: return 2307 + if len(set_ball & {19, 26, 29}) == 3: return 2308 + if len(set_ball & {19, 26, 32}) == 3: return 2309 + if len(set_ball & {19, 26, 38}) == 3: return 2310 + if len(set_ball & {19, 27, 32}) == 3: return 2311 + if len(set_ball & {19, 27, 33}) == 3: return 2312 + if len(set_ball & {19, 27, 36}) == 3: return 2313 + if len(set_ball & {19, 27, 37}) == 3: return 2314 + if len(set_ball & {19, 27, 38}) == 3: return 2315 + if len(set_ball & {19, 27, 39}) == 3: return 2316 + if len(set_ball & {19, 28, 29}) == 3: return 2317 + if len(set_ball & {19, 28, 35}) == 3: return 2318 + if len(set_ball & {19, 28, 39}) == 3: return 2319 + if len(set_ball & {19, 28, 40}) == 3: return 2320 + if len(set_ball & {19, 29, 30}) == 3: return 2321 + if len(set_ball & {19, 29, 34}) == 3: return 2322 + if len(set_ball & {19, 29, 37}) == 3: return 2323 + if len(set_ball & {19, 29, 38}) == 3: return 2324 + if len(set_ball & {19, 29, 41}) == 3: return 2325 + if len(set_ball & {19, 29, 44}) == 3: return 2326 + if len(set_ball & {19, 30, 32}) == 3: return 2327 + if len(set_ball & {19, 31, 32}) == 3: return 2328 + if len(set_ball & {19, 31, 37}) == 3: return 2329 + if len(set_ball & {19, 31, 41}) == 3: return 2330 + if len(set_ball & {19, 32, 39}) == 3: return 2331 + if len(set_ball & {19, 32, 44}) == 3: return 2332 + if len(set_ball & {19, 33, 37}) == 3: return 2333 + if len(set_ball & {19, 35, 36}) == 3: return 2334 + if len(set_ball & {19, 35, 37}) == 3: return 2335 + if len(set_ball & {19, 35, 44}) == 3: return 2336 + if len(set_ball & {19, 36, 37}) == 3: return 2337 + if len(set_ball & {19, 36, 40}) == 3: return 2338 + if len(set_ball & {19, 36, 41}) == 3: return 2339 + if len(set_ball & {19, 38, 39}) == 3: return 2340 + if len(set_ball & {19, 38, 45}) == 3: return 2341 + if len(set_ball & {19, 39, 42}) == 3: return 2342 + if len(set_ball & {19, 39, 45}) == 3: return 2343 + if len(set_ball & {20, 21, 23}) == 3: return 2344 + if len(set_ball & {20, 21, 27}) == 3: return 2345 + if len(set_ball & {20, 21, 28}) == 3: return 2346 + if len(set_ball & {20, 21, 31}) == 3: return 2347 + if len(set_ball & {20, 21, 35}) == 3: return 2348 + if len(set_ball & {20, 21, 36}) == 3: return 2349 + if len(set_ball & {20, 21, 38}) == 3: return 2350 + if len(set_ball & {20, 21, 42}) == 3: return 2351 + if len(set_ball & {20, 21, 43}) == 3: return 2352 + if len(set_ball & {20, 22, 31}) == 3: return 2353 + if len(set_ball & {20, 22, 32}) == 3: return 2354 + if len(set_ball & {20, 22, 35}) == 3: return 2355 + if len(set_ball & {20, 22, 39}) == 3: return 2356 + if len(set_ball & {20, 22, 45}) == 3: return 2357 + if len(set_ball & {20, 23, 25}) == 3: return 2358 + if len(set_ball & {20, 23, 33}) == 3: return 2359 + if len(set_ball & {20, 23, 41}) == 3: return 2360 + if len(set_ball & {20, 24, 26}) == 3: return 2361 + if len(set_ball & {20, 24, 29}) == 3: return 2362 + if len(set_ball & {20, 24, 35}) == 3: return 2363 + if len(set_ball & {20, 25, 26}) == 3: return 2364 + if len(set_ball & {20, 25, 27}) == 3: return 2365 + if len(set_ball & {20, 25, 30}) == 3: return 2366 + if len(set_ball & {20, 25, 35}) == 3: return 2367 + if len(set_ball & {20, 25, 42}) == 3: return 2368 + if len(set_ball & {20, 25, 44}) == 3: return 2369 + if len(set_ball & {20, 26, 34}) == 3: return 2370 + if len(set_ball & {20, 27, 29}) == 3: return 2371 + if len(set_ball & {20, 27, 30}) == 3: return 2372 + if len(set_ball & {20, 27, 34}) == 3: return 2373 + if len(set_ball & {20, 27, 45}) == 3: return 2374 + if len(set_ball & {20, 28, 29}) == 3: return 2375 + if len(set_ball & {20, 28, 31}) == 3: return 2376 + if len(set_ball & {20, 28, 33}) == 3: return 2377 + if len(set_ball & {20, 28, 34}) == 3: return 2378 + if len(set_ball & {20, 28, 42}) == 3: return 2379 + if len(set_ball & {20, 28, 45}) == 3: return 2380 + if len(set_ball & {20, 29, 30}) == 3: return 2381 + if len(set_ball & {20, 29, 32}) == 3: return 2382 + if len(set_ball & {20, 29, 37}) == 3: return 2383 + if len(set_ball & {20, 29, 40}) == 3: return 2384 + if len(set_ball & {20, 30, 32}) == 3: return 2385 + if len(set_ball & {20, 30, 42}) == 3: return 2386 + if len(set_ball & {20, 30, 43}) == 3: return 2387 + if len(set_ball & {20, 31, 39}) == 3: return 2388 + if len(set_ball & {20, 34, 36}) == 3: return 2389 + if len(set_ball & {20, 34, 38}) == 3: return 2390 + if len(set_ball & {20, 34, 39}) == 3: return 2391 + if len(set_ball & {20, 37, 41}) == 3: return 2392 + if len(set_ball & {20, 37, 44}) == 3: return 2393 + if len(set_ball & {20, 38, 39}) == 3: return 2394 + if len(set_ball & {20, 39, 40}) == 3: return 2395 + if len(set_ball & {20, 39, 43}) == 3: return 2396 + if len(set_ball & {20, 43, 45}) == 3: return 2397 + if len(set_ball & {21, 22, 29}) == 3: return 2398 + if len(set_ball & {21, 22, 40}) == 3: return 2399 + if len(set_ball & {21, 22, 43}) == 3: return 2400 + if len(set_ball & {21, 22, 45}) == 3: return 2401 + if len(set_ball & {21, 23, 28}) == 3: return 2402 + if len(set_ball & {21, 23, 29}) == 3: return 2403 + if len(set_ball & {21, 23, 35}) == 3: return 2404 + if len(set_ball & {21, 23, 36}) == 3: return 2405 + if len(set_ball & {21, 23, 37}) == 3: return 2406 + if len(set_ball & {21, 23, 38}) == 3: return 2407 + if len(set_ball & {21, 23, 41}) == 3: return 2408 + if len(set_ball & {21, 23, 42}) == 3: return 2409 + if len(set_ball & {21, 24, 25}) == 3: return 2410 + if len(set_ball & {21, 24, 28}) == 3: return 2411 + if len(set_ball & {21, 24, 32}) == 3: return 2412 + if len(set_ball & {21, 24, 34}) == 3: return 2413 + if len(set_ball & {21, 24, 35}) == 3: return 2414 + if len(set_ball & {21, 24, 38}) == 3: return 2415 + if len(set_ball & {21, 25, 28}) == 3: return 2416 + if len(set_ball & {21, 25, 31}) == 3: return 2417 + if len(set_ball & {21, 25, 43}) == 3: return 2418 + if len(set_ball & {21, 26, 28}) == 3: return 2419 + if len(set_ball & {21, 27, 28}) == 3: return 2420 + if len(set_ball & {21, 27, 30}) == 3: return 2421 + if len(set_ball & {21, 28, 29}) == 3: return 2422 + if len(set_ball & {21, 28, 30}) == 3: return 2423 + if len(set_ball & {21, 28, 32}) == 3: return 2424 + if len(set_ball & {21, 28, 33}) == 3: return 2425 + if len(set_ball & {21, 28, 41}) == 3: return 2426 + if len(set_ball & {21, 28, 44}) == 3: return 2427 + if len(set_ball & {21, 29, 30}) == 3: return 2428 + if len(set_ball & {21, 29, 36}) == 3: return 2429 + if len(set_ball & {21, 29, 41}) == 3: return 2430 + if len(set_ball & {21, 30, 31}) == 3: return 2431 + if len(set_ball & {21, 30, 41}) == 3: return 2432 + if len(set_ball & {21, 31, 34}) == 3: return 2433 + if len(set_ball & {21, 31, 42}) == 3: return 2434 + if len(set_ball & {21, 33, 43}) == 3: return 2435 + if len(set_ball & {21, 33, 44}) == 3: return 2436 + if len(set_ball & {21, 33, 45}) == 3: return 2437 + if len(set_ball & {21, 34, 39}) == 3: return 2438 + if len(set_ball & {21, 34, 40}) == 3: return 2439 + if len(set_ball & {21, 36, 42}) == 3: return 2440 + if len(set_ball & {21, 37, 39}) == 3: return 2441 + if len(set_ball & {21, 39, 42}) == 3: return 2442 + if len(set_ball & {21, 40, 43}) == 3: return 2443 + if len(set_ball & {21, 41, 45}) == 3: return 2444 + if len(set_ball & {21, 42, 43}) == 3: return 2445 + if len(set_ball & {21, 42, 44}) == 3: return 2446 + if len(set_ball & {21, 43, 45}) == 3: return 2447 + if len(set_ball & {22, 23, 26}) == 3: return 2448 + if len(set_ball & {22, 23, 27}) == 3: return 2449 + if len(set_ball & {22, 23, 28}) == 3: return 2450 + if len(set_ball & {22, 23, 31}) == 3: return 2451 + if len(set_ball & {22, 23, 33}) == 3: return 2452 + if len(set_ball & {22, 23, 39}) == 3: return 2453 + if len(set_ball & {22, 23, 40}) == 3: return 2454 + if len(set_ball & {22, 23, 41}) == 3: return 2455 + if len(set_ball & {22, 23, 45}) == 3: return 2456 + if len(set_ball & {22, 24, 25}) == 3: return 2457 + if len(set_ball & {22, 24, 29}) == 3: return 2458 + if len(set_ball & {22, 24, 39}) == 3: return 2459 + if len(set_ball & {22, 24, 43}) == 3: return 2460 + if len(set_ball & {22, 24, 45}) == 3: return 2461 + if len(set_ball & {22, 25, 26}) == 3: return 2462 + if len(set_ball & {22, 25, 27}) == 3: return 2463 + if len(set_ball & {22, 25, 35}) == 3: return 2464 + if len(set_ball & {22, 25, 39}) == 3: return 2465 + if len(set_ball & {22, 26, 28}) == 3: return 2466 + if len(set_ball & {22, 26, 32}) == 3: return 2467 + if len(set_ball & {22, 27, 29}) == 3: return 2468 + if len(set_ball & {22, 27, 32}) == 3: return 2469 + if len(set_ball & {22, 27, 41}) == 3: return 2470 + if len(set_ball & {22, 27, 45}) == 3: return 2471 + if len(set_ball & {22, 28, 29}) == 3: return 2472 + if len(set_ball & {22, 28, 30}) == 3: return 2473 + if len(set_ball & {22, 29, 38}) == 3: return 2474 + if len(set_ball & {22, 29, 41}) == 3: return 2475 + if len(set_ball & {22, 29, 42}) == 3: return 2476 + if len(set_ball & {22, 30, 31}) == 3: return 2477 + if len(set_ball & {22, 30, 32}) == 3: return 2478 + if len(set_ball & {22, 30, 33}) == 3: return 2479 + if len(set_ball & {22, 31, 33}) == 3: return 2480 + if len(set_ball & {22, 32, 37}) == 3: return 2481 + if len(set_ball & {22, 32, 41}) == 3: return 2482 + if len(set_ball & {22, 32, 43}) == 3: return 2483 + if len(set_ball & {22, 33, 38}) == 3: return 2484 + if len(set_ball & {22, 33, 39}) == 3: return 2485 + if len(set_ball & {22, 33, 43}) == 3: return 2486 + if len(set_ball & {22, 33, 44}) == 3: return 2487 + if len(set_ball & {22, 34, 43}) == 3: return 2488 + if len(set_ball & {22, 35, 44}) == 3: return 2489 + if len(set_ball & {22, 35, 45}) == 3: return 2490 + if len(set_ball & {22, 36, 43}) == 3: return 2491 + if len(set_ball & {22, 39, 40}) == 3: return 2492 + if len(set_ball & {22, 39, 42}) == 3: return 2493 + if len(set_ball & {22, 39, 43}) == 3: return 2494 + if len(set_ball & {22, 40, 41}) == 3: return 2495 + if len(set_ball & {22, 40, 44}) == 3: return 2496 + if len(set_ball & {22, 41, 44}) == 3: return 2497 + if len(set_ball & {22, 41, 45}) == 3: return 2498 + if len(set_ball & {22, 42, 44}) == 3: return 2499 + if len(set_ball & {23, 24, 25}) == 3: return 2500 + if len(set_ball & {23, 24, 26}) == 3: return 2501 + if len(set_ball & {23, 24, 33}) == 3: return 2502 + if len(set_ball & {23, 24, 34}) == 3: return 2503 + if len(set_ball & {23, 24, 40}) == 3: return 2504 + if len(set_ball & {23, 24, 41}) == 3: return 2505 + if len(set_ball & {23, 24, 42}) == 3: return 2506 + if len(set_ball & {23, 25, 26}) == 3: return 2507 + if len(set_ball & {23, 25, 31}) == 3: return 2508 + if len(set_ball & {23, 25, 34}) == 3: return 2509 + if len(set_ball & {23, 26, 32}) == 3: return 2510 + if len(set_ball & {23, 26, 34}) == 3: return 2511 + if len(set_ball & {23, 26, 37}) == 3: return 2512 + if len(set_ball & {23, 26, 38}) == 3: return 2513 + if len(set_ball & {23, 26, 41}) == 3: return 2514 + if len(set_ball & {23, 27, 30}) == 3: return 2515 + if len(set_ball & {23, 27, 32}) == 3: return 2516 + if len(set_ball & {23, 27, 37}) == 3: return 2517 + if len(set_ball & {23, 27, 39}) == 3: return 2518 + if len(set_ball & {23, 28, 31}) == 3: return 2519 + if len(set_ball & {23, 28, 32}) == 3: return 2520 + if len(set_ball & {23, 28, 41}) == 3: return 2521 + if len(set_ball & {23, 29, 32}) == 3: return 2522 + if len(set_ball & {23, 30, 31}) == 3: return 2523 + if len(set_ball & {23, 30, 33}) == 3: return 2524 + if len(set_ball & {23, 30, 39}) == 3: return 2525 + if len(set_ball & {23, 30, 42}) == 3: return 2526 + if len(set_ball & {23, 31, 32}) == 3: return 2527 + if len(set_ball & {23, 31, 41}) == 3: return 2528 + if len(set_ball & {23, 31, 42}) == 3: return 2529 + if len(set_ball & {23, 32, 33}) == 3: return 2530 + if len(set_ball & {23, 32, 35}) == 3: return 2531 + if len(set_ball & {23, 32, 37}) == 3: return 2532 + if len(set_ball & {23, 32, 41}) == 3: return 2533 + if len(set_ball & {23, 32, 42}) == 3: return 2534 + if len(set_ball & {23, 33, 38}) == 3: return 2535 + if len(set_ball & {23, 33, 45}) == 3: return 2536 + if len(set_ball & {23, 34, 37}) == 3: return 2537 + if len(set_ball & {23, 35, 39}) == 3: return 2538 + if len(set_ball & {23, 35, 41}) == 3: return 2539 + if len(set_ball & {23, 35, 42}) == 3: return 2540 + if len(set_ball & {23, 36, 42}) == 3: return 2541 + if len(set_ball & {23, 37, 41}) == 3: return 2542 + if len(set_ball & {23, 37, 44}) == 3: return 2543 + if len(set_ball & {23, 38, 41}) == 3: return 2544 + if len(set_ball & {23, 38, 44}) == 3: return 2545 + if len(set_ball & {23, 39, 40}) == 3: return 2546 + if len(set_ball & {23, 39, 41}) == 3: return 2547 + if len(set_ball & {23, 40, 42}) == 3: return 2548 + if len(set_ball & {23, 40, 43}) == 3: return 2549 + if len(set_ball & {23, 41, 42}) == 3: return 2550 + if len(set_ball & {24, 25, 28}) == 3: return 2551 + if len(set_ball & {24, 25, 41}) == 3: return 2552 + if len(set_ball & {24, 25, 42}) == 3: return 2553 + if len(set_ball & {24, 25, 45}) == 3: return 2554 + if len(set_ball & {24, 26, 27}) == 3: return 2555 + if len(set_ball & {24, 26, 28}) == 3: return 2556 + if len(set_ball & {24, 26, 31}) == 3: return 2557 + if len(set_ball & {24, 26, 32}) == 3: return 2558 + if len(set_ball & {24, 26, 33}) == 3: return 2559 + if len(set_ball & {24, 26, 43}) == 3: return 2560 + if len(set_ball & {24, 26, 44}) == 3: return 2561 + if len(set_ball & {24, 27, 33}) == 3: return 2562 + if len(set_ball & {24, 27, 38}) == 3: return 2563 + if len(set_ball & {24, 27, 40}) == 3: return 2564 + if len(set_ball & {24, 28, 29}) == 3: return 2565 + if len(set_ball & {24, 28, 31}) == 3: return 2566 + if len(set_ball & {24, 28, 33}) == 3: return 2567 + if len(set_ball & {24, 28, 34}) == 3: return 2568 + if len(set_ball & {24, 28, 41}) == 3: return 2569 + if len(set_ball & {24, 28, 42}) == 3: return 2570 + if len(set_ball & {24, 28, 43}) == 3: return 2571 + if len(set_ball & {24, 28, 44}) == 3: return 2572 + if len(set_ball & {24, 28, 45}) == 3: return 2573 + if len(set_ball & {24, 29, 32}) == 3: return 2574 + if len(set_ball & {24, 29, 36}) == 3: return 2575 + if len(set_ball & {24, 29, 39}) == 3: return 2576 + if len(set_ball & {24, 30, 37}) == 3: return 2577 + if len(set_ball & {24, 30, 40}) == 3: return 2578 + if len(set_ball & {24, 30, 42}) == 3: return 2579 + if len(set_ball & {24, 30, 43}) == 3: return 2580 + if len(set_ball & {24, 30, 44}) == 3: return 2581 + if len(set_ball & {24, 31, 35}) == 3: return 2582 + if len(set_ball & {24, 31, 37}) == 3: return 2583 + if len(set_ball & {24, 31, 38}) == 3: return 2584 + if len(set_ball & {24, 31, 41}) == 3: return 2585 + if len(set_ball & {24, 31, 43}) == 3: return 2586 + if len(set_ball & {24, 31, 45}) == 3: return 2587 + if len(set_ball & {24, 32, 43}) == 3: return 2588 + if len(set_ball & {24, 33, 43}) == 3: return 2589 + if len(set_ball & {24, 34, 37}) == 3: return 2590 + if len(set_ball & {24, 34, 43}) == 3: return 2591 + if len(set_ball & {24, 35, 39}) == 3: return 2592 + if len(set_ball & {24, 35, 41}) == 3: return 2593 + if len(set_ball & {24, 35, 42}) == 3: return 2594 + if len(set_ball & {24, 36, 42}) == 3: return 2595 + if len(set_ball & {24, 36, 43}) == 3: return 2596 + if len(set_ball & {24, 37, 39}) == 3: return 2597 + if len(set_ball & {24, 37, 42}) == 3: return 2598 + if len(set_ball & {24, 37, 43}) == 3: return 2599 + if len(set_ball & {24, 38, 41}) == 3: return 2600 + if len(set_ball & {24, 38, 43}) == 3: return 2601 + if len(set_ball & {24, 39, 43}) == 3: return 2602 + if len(set_ball & {24, 40, 45}) == 3: return 2603 + if len(set_ball & {24, 42, 43}) == 3: return 2604 + if len(set_ball & {25, 26, 28}) == 3: return 2605 + if len(set_ball & {25, 26, 32}) == 3: return 2606 + if len(set_ball & {25, 26, 35}) == 3: return 2607 + if len(set_ball & {25, 26, 39}) == 3: return 2608 + if len(set_ball & {25, 26, 41}) == 3: return 2609 + if len(set_ball & {25, 26, 42}) == 3: return 2610 + if len(set_ball & {25, 27, 28}) == 3: return 2611 + if len(set_ball & {25, 27, 30}) == 3: return 2612 + if len(set_ball & {25, 27, 33}) == 3: return 2613 + if len(set_ball & {25, 27, 42}) == 3: return 2614 + if len(set_ball & {25, 28, 31}) == 3: return 2615 + if len(set_ball & {25, 28, 34}) == 3: return 2616 + if len(set_ball & {25, 28, 35}) == 3: return 2617 + if len(set_ball & {25, 28, 40}) == 3: return 2618 + if len(set_ball & {25, 28, 41}) == 3: return 2619 + if len(set_ball & {25, 29, 39}) == 3: return 2620 + if len(set_ball & {25, 29, 41}) == 3: return 2621 + if len(set_ball & {25, 30, 34}) == 3: return 2622 + if len(set_ball & {25, 30, 35}) == 3: return 2623 + if len(set_ball & {25, 30, 37}) == 3: return 2624 + if len(set_ball & {25, 30, 38}) == 3: return 2625 + if len(set_ball & {25, 30, 39}) == 3: return 2626 + if len(set_ball & {25, 31, 35}) == 3: return 2627 + if len(set_ball & {25, 31, 41}) == 3: return 2628 + if len(set_ball & {25, 31, 42}) == 3: return 2629 + if len(set_ball & {25, 32, 34}) == 3: return 2630 + if len(set_ball & {25, 32, 35}) == 3: return 2631 + if len(set_ball & {25, 32, 38}) == 3: return 2632 + if len(set_ball & {25, 32, 39}) == 3: return 2633 + if len(set_ball & {25, 32, 41}) == 3: return 2634 + if len(set_ball & {25, 33, 37}) == 3: return 2635 + if len(set_ball & {25, 33, 42}) == 3: return 2636 + if len(set_ball & {25, 34, 42}) == 3: return 2637 + if len(set_ball & {25, 34, 43}) == 3: return 2638 + if len(set_ball & {25, 34, 45}) == 3: return 2639 + if len(set_ball & {25, 36, 41}) == 3: return 2640 + if len(set_ball & {25, 37, 40}) == 3: return 2641 + if len(set_ball & {25, 38, 43}) == 3: return 2642 + if len(set_ball & {25, 39, 41}) == 3: return 2643 + if len(set_ball & {25, 40, 41}) == 3: return 2644 + if len(set_ball & {25, 41, 42}) == 3: return 2645 + if len(set_ball & {25, 41, 43}) == 3: return 2646 + if len(set_ball & {25, 42, 44}) == 3: return 2647 + if len(set_ball & {25, 43, 45}) == 3: return 2648 + if len(set_ball & {26, 28, 38}) == 3: return 2649 + if len(set_ball & {26, 28, 39}) == 3: return 2650 + if len(set_ball & {26, 29, 32}) == 3: return 2651 + if len(set_ball & {26, 29, 35}) == 3: return 2652 + if len(set_ball & {26, 30, 37}) == 3: return 2653 + if len(set_ball & {26, 30, 44}) == 3: return 2654 + if len(set_ball & {26, 32, 37}) == 3: return 2655 + if len(set_ball & {26, 32, 41}) == 3: return 2656 + if len(set_ball & {26, 32, 43}) == 3: return 2657 + if len(set_ball & {26, 32, 44}) == 3: return 2658 + if len(set_ball & {26, 32, 45}) == 3: return 2659 + if len(set_ball & {26, 34, 35}) == 3: return 2660 + if len(set_ball & {26, 34, 37}) == 3: return 2661 + if len(set_ball & {26, 34, 39}) == 3: return 2662 + if len(set_ball & {26, 35, 36}) == 3: return 2663 + if len(set_ball & {26, 35, 41}) == 3: return 2664 + if len(set_ball & {26, 35, 44}) == 3: return 2665 + if len(set_ball & {26, 35, 45}) == 3: return 2666 + if len(set_ball & {26, 36, 38}) == 3: return 2667 + if len(set_ball & {26, 38, 42}) == 3: return 2668 + if len(set_ball & {26, 38, 44}) == 3: return 2669 + if len(set_ball & {26, 39, 43}) == 3: return 2670 + if len(set_ball & {26, 40, 44}) == 3: return 2671 + if len(set_ball & {26, 40, 45}) == 3: return 2672 + if len(set_ball & {26, 41, 43}) == 3: return 2673 + if len(set_ball & {26, 41, 44}) == 3: return 2674 + if len(set_ball & {27, 28, 31}) == 3: return 2675 + if len(set_ball & {27, 28, 33}) == 3: return 2676 + if len(set_ball & {27, 28, 34}) == 3: return 2677 + if len(set_ball & {27, 29, 32}) == 3: return 2678 + if len(set_ball & {27, 29, 39}) == 3: return 2679 + if len(set_ball & {27, 31, 33}) == 3: return 2680 + if len(set_ball & {27, 32, 33}) == 3: return 2681 + if len(set_ball & {27, 32, 35}) == 3: return 2682 + if len(set_ball & {27, 32, 36}) == 3: return 2683 + if len(set_ball & {27, 32, 39}) == 3: return 2684 + if len(set_ball & {27, 32, 41}) == 3: return 2685 + if len(set_ball & {27, 32, 43}) == 3: return 2686 + if len(set_ball & {27, 32, 44}) == 3: return 2687 + if len(set_ball & {27, 33, 34}) == 3: return 2688 + if len(set_ball & {27, 33, 42}) == 3: return 2689 + if len(set_ball & {27, 34, 37}) == 3: return 2690 + if len(set_ball & {27, 36, 42}) == 3: return 2691 + if len(set_ball & {27, 37, 38}) == 3: return 2692 + if len(set_ball & {27, 39, 41}) == 3: return 2693 + if len(set_ball & {27, 39, 42}) == 3: return 2694 + if len(set_ball & {27, 42, 44}) == 3: return 2695 + if len(set_ball & {28, 29, 31}) == 3: return 2696 + if len(set_ball & {28, 29, 32}) == 3: return 2697 + if len(set_ball & {28, 29, 35}) == 3: return 2698 + if len(set_ball & {28, 29, 37}) == 3: return 2699 + if len(set_ball & {28, 29, 38}) == 3: return 2700 + if len(set_ball & {28, 29, 41}) == 3: return 2701 + if len(set_ball & {28, 29, 42}) == 3: return 2702 + if len(set_ball & {28, 29, 45}) == 3: return 2703 + if len(set_ball & {28, 30, 31}) == 3: return 2704 + if len(set_ball & {28, 30, 37}) == 3: return 2705 + if len(set_ball & {28, 30, 40}) == 3: return 2706 + if len(set_ball & {28, 31, 35}) == 3: return 2707 + if len(set_ball & {28, 31, 37}) == 3: return 2708 + if len(set_ball & {28, 31, 40}) == 3: return 2709 + if len(set_ball & {28, 31, 42}) == 3: return 2710 + if len(set_ball & {28, 32, 33}) == 3: return 2711 + if len(set_ball & {28, 32, 35}) == 3: return 2712 + if len(set_ball & {28, 32, 39}) == 3: return 2713 + if len(set_ball & {28, 32, 41}) == 3: return 2714 + if len(set_ball & {28, 32, 42}) == 3: return 2715 + if len(set_ball & {28, 32, 43}) == 3: return 2716 + if len(set_ball & {28, 32, 44}) == 3: return 2717 + if len(set_ball & {28, 33, 34}) == 3: return 2718 + if len(set_ball & {28, 33, 43}) == 3: return 2719 + if len(set_ball & {28, 34, 37}) == 3: return 2720 + if len(set_ball & {28, 35, 36}) == 3: return 2721 + if len(set_ball & {28, 35, 45}) == 3: return 2722 + if len(set_ball & {28, 36, 37}) == 3: return 2723 + if len(set_ball & {28, 36, 38}) == 3: return 2724 + if len(set_ball & {28, 36, 43}) == 3: return 2725 + if len(set_ball & {28, 37, 41}) == 3: return 2726 + if len(set_ball & {28, 38, 41}) == 3: return 2727 + if len(set_ball & {28, 39, 44}) == 3: return 2728 + if len(set_ball & {28, 40, 42}) == 3: return 2729 + if len(set_ball & {28, 40, 44}) == 3: return 2730 + if len(set_ball & {28, 40, 45}) == 3: return 2731 + if len(set_ball & {28, 41, 45}) == 3: return 2732 + if len(set_ball & {28, 42, 44}) == 3: return 2733 + if len(set_ball & {28, 44, 45}) == 3: return 2734 + if len(set_ball & {29, 30, 32}) == 3: return 2735 + if len(set_ball & {29, 30, 36}) == 3: return 2736 + if len(set_ball & {29, 30, 40}) == 3: return 2737 + if len(set_ball & {29, 31, 41}) == 3: return 2738 + if len(set_ball & {29, 32, 34}) == 3: return 2739 + if len(set_ball & {29, 32, 35}) == 3: return 2740 + if len(set_ball & {29, 32, 41}) == 3: return 2741 + if len(set_ball & {29, 33, 36}) == 3: return 2742 + if len(set_ball & {29, 34, 41}) == 3: return 2743 + if len(set_ball & {29, 34, 42}) == 3: return 2744 + if len(set_ball & {29, 34, 43}) == 3: return 2745 + if len(set_ball & {29, 35, 39}) == 3: return 2746 + if len(set_ball & {29, 35, 41}) == 3: return 2747 + if len(set_ball & {29, 35, 45}) == 3: return 2748 + if len(set_ball & {29, 36, 42}) == 3: return 2749 + if len(set_ball & {29, 36, 44}) == 3: return 2750 + if len(set_ball & {29, 37, 42}) == 3: return 2751 + if len(set_ball & {29, 37, 44}) == 3: return 2752 + if len(set_ball & {29, 41, 43}) == 3: return 2753 + if len(set_ball & {29, 42, 44}) == 3: return 2754 + if len(set_ball & {29, 44, 45}) == 3: return 2755 + if len(set_ball & {30, 31, 32}) == 3: return 2756 + if len(set_ball & {30, 31, 35}) == 3: return 2757 + if len(set_ball & {30, 31, 36}) == 3: return 2758 + if len(set_ball & {30, 32, 36}) == 3: return 2759 + if len(set_ball & {30, 32, 44}) == 3: return 2760 + if len(set_ball & {30, 33, 40}) == 3: return 2761 + if len(set_ball & {30, 35, 45}) == 3: return 2762 + if len(set_ball & {30, 36, 40}) == 3: return 2763 + if len(set_ball & {30, 37, 42}) == 3: return 2764 + if len(set_ball & {30, 38, 42}) == 3: return 2765 + if len(set_ball & {30, 40, 45}) == 3: return 2766 + if len(set_ball & {30, 43, 44}) == 3: return 2767 + if len(set_ball & {30, 44, 45}) == 3: return 2768 + if len(set_ball & {31, 32, 35}) == 3: return 2769 + if len(set_ball & {31, 32, 42}) == 3: return 2770 + if len(set_ball & {31, 32, 44}) == 3: return 2771 + if len(set_ball & {31, 33, 35}) == 3: return 2772 + if len(set_ball & {31, 33, 39}) == 3: return 2773 + if len(set_ball & {31, 33, 43}) == 3: return 2774 + if len(set_ball & {31, 34, 41}) == 3: return 2775 + if len(set_ball & {31, 35, 36}) == 3: return 2776 + if len(set_ball & {31, 35, 41}) == 3: return 2777 + if len(set_ball & {31, 35, 42}) == 3: return 2778 + if len(set_ball & {31, 36, 39}) == 3: return 2779 + if len(set_ball & {31, 36, 41}) == 3: return 2780 + if len(set_ball & {31, 36, 42}) == 3: return 2781 + if len(set_ball & {31, 37, 39}) == 3: return 2782 + if len(set_ball & {31, 37, 45}) == 3: return 2783 + if len(set_ball & {31, 38, 42}) == 3: return 2784 + if len(set_ball & {31, 39, 42}) == 3: return 2785 + if len(set_ball & {31, 42, 44}) == 3: return 2786 + if len(set_ball & {31, 42, 45}) == 3: return 2787 + if len(set_ball & {32, 34, 35}) == 3: return 2788 + if len(set_ball & {32, 34, 37}) == 3: return 2789 + if len(set_ball & {32, 35, 38}) == 3: return 2790 + if len(set_ball & {32, 35, 39}) == 3: return 2791 + if len(set_ball & {32, 35, 41}) == 3: return 2792 + if len(set_ball & {32, 35, 42}) == 3: return 2793 + if len(set_ball & {32, 35, 43}) == 3: return 2794 + if len(set_ball & {32, 36, 37}) == 3: return 2795 + if len(set_ball & {32, 36, 41}) == 3: return 2796 + if len(set_ball & {32, 36, 44}) == 3: return 2797 + if len(set_ball & {32, 37, 38}) == 3: return 2798 + if len(set_ball & {32, 37, 42}) == 3: return 2799 + if len(set_ball & {32, 38, 41}) == 3: return 2800 + if len(set_ball & {32, 38, 45}) == 3: return 2801 + if len(set_ball & {32, 39, 44}) == 3: return 2802 + if len(set_ball & {32, 40, 44}) == 3: return 2803 + if len(set_ball & {32, 41, 44}) == 3: return 2804 + if len(set_ball & {32, 42, 43}) == 3: return 2805 + if len(set_ball & {32, 42, 45}) == 3: return 2806 + if len(set_ball & {32, 43, 45}) == 3: return 2807 + if len(set_ball & {33, 34, 41}) == 3: return 2808 + if len(set_ball & {33, 34, 45}) == 3: return 2809 + if len(set_ball & {33, 35, 42}) == 3: return 2810 + if len(set_ball & {33, 37, 39}) == 3: return 2811 + if len(set_ball & {33, 38, 41}) == 3: return 2812 + if len(set_ball & {33, 38, 43}) == 3: return 2813 + if len(set_ball & {33, 38, 44}) == 3: return 2814 + if len(set_ball & {33, 39, 42}) == 3: return 2815 + if len(set_ball & {33, 39, 43}) == 3: return 2816 + if len(set_ball & {33, 39, 45}) == 3: return 2817 + if len(set_ball & {33, 41, 43}) == 3: return 2818 + if len(set_ball & {33, 43, 44}) == 3: return 2819 + if len(set_ball & {34, 35, 38}) == 3: return 2820 + if len(set_ball & {34, 36, 38}) == 3: return 2821 + if len(set_ball & {34, 36, 39}) == 3: return 2822 + if len(set_ball & {34, 36, 43}) == 3: return 2823 + if len(set_ball & {34, 37, 41}) == 3: return 2824 + if len(set_ball & {34, 37, 42}) == 3: return 2825 + if len(set_ball & {34, 37, 43}) == 3: return 2826 + if len(set_ball & {34, 37, 44}) == 3: return 2827 + if len(set_ball & {34, 38, 44}) == 3: return 2828 + if len(set_ball & {35, 36, 38}) == 3: return 2829 + if len(set_ball & {35, 37, 38}) == 3: return 2830 + if len(set_ball & {35, 38, 42}) == 3: return 2831 + if len(set_ball & {35, 39, 40}) == 3: return 2832 + if len(set_ball & {35, 40, 41}) == 3: return 2833 + if len(set_ball & {35, 40, 43}) == 3: return 2834 + if len(set_ball & {36, 37, 39}) == 3: return 2835 + if len(set_ball & {36, 38, 42}) == 3: return 2836 + if len(set_ball & {37, 39, 42}) == 3: return 2837 + if len(set_ball & {37, 42, 44}) == 3: return 2838 + if len(set_ball & {38, 39, 45}) == 3: return 2839 + if len(set_ball & {38, 40, 41}) == 3: return 2840 + if len(set_ball & {38, 41, 42}) == 3: return 2841 + if len(set_ball & {38, 42, 44}) == 3: return 2842 + if len(set_ball & {38, 43, 45}) == 3: return 2843 + if len(set_ball & {38, 44, 45}) == 3: return 2844 + if len(set_ball & {39, 40, 42}) == 3: return 2845 + if len(set_ball & {39, 40, 45}) == 3: return 2846 + if len(set_ball & {39, 42, 43}) == 3: return 2847 + if len(set_ball & {39, 42, 44}) == 3: return 2848 + if len(set_ball & {40, 43, 45}) == 3: return 2849 + if len(set_ball & {40, 44, 45}) == 3: return 2850 + if len(set_ball & {41, 42, 44}) == 3: return 2851 + if len(set_ball & {1, 9, 12}) == 3: return 2852 + if len(set_ball & {1, 9, 28}) == 3: return 2853 + if len(set_ball & {1, 12, 23}) == 3: return 2854 + if len(set_ball & {1, 28, 41}) == 3: return 2855 + if len(set_ball & {2, 25, 28}) == 3: return 2856 + if len(set_ball & {2, 26, 43}) == 3: return 2857 + if len(set_ball & {3, 32, 45}) == 3: return 2858 + if len(set_ball & {4, 12, 24}) == 3: return 2859 + if len(set_ball & {4, 26, 33}) == 3: return 2860 + if len(set_ball & {4, 28, 40}) == 3: return 2861 + if len(set_ball & {4, 33, 40}) == 3: return 2862 + if len(set_ball & {6, 7, 15}) == 3: return 2863 + if len(set_ball & {6, 14, 21}) == 3: return 2864 + if len(set_ball & {6, 18, 31}) == 3: return 2865 + if len(set_ball & {7, 18, 23}) == 3: return 2866 + if len(set_ball & {7, 22, 40}) == 3: return 2867 + if len(set_ball & {7, 42, 45}) == 3: return 2868 + if len(set_ball & {8, 17, 27}) == 3: return 2869 + if len(set_ball & {8, 18, 45}) == 3: return 2870 + if len(set_ball & {8, 19, 21}) == 3: return 2871 + if len(set_ball & {8, 21, 31}) == 3: return 2872 + if len(set_ball & {10, 11, 39}) == 3: return 2873 + if len(set_ball & {10, 16, 41}) == 3: return 2874 + if len(set_ball & {11, 14, 21}) == 3: return 2875 + if len(set_ball & {11, 16, 21}) == 3: return 2876 + if len(set_ball & {11, 17, 21}) == 3: return 2877 + if len(set_ball & {11, 19, 21}) == 3: return 2878 + if len(set_ball & {11, 26, 44}) == 3: return 2879 + if len(set_ball & {11, 29, 44}) == 3: return 2880 + if len(set_ball & {12, 13, 32}) == 3: return 2881 + if len(set_ball & {12, 13, 33}) == 3: return 2882 + if len(set_ball & {12, 15, 34}) == 3: return 2883 + if len(set_ball & {12, 24, 27}) == 3: return 2884 + if len(set_ball & {12, 33, 40}) == 3: return 2885 + if len(set_ball & {12, 33, 42}) == 3: return 2886 + if len(set_ball & {12, 34, 42}) == 3: return 2887 + if len(set_ball & {13, 29, 39}) == 3: return 2888 + if len(set_ball & {13, 33, 45}) == 3: return 2889 + if len(set_ball & {14, 27, 30}) == 3: return 2890 + if len(set_ball & {14, 31, 40}) == 3: return 2891 + if len(set_ball & {14, 35, 39}) == 3: return 2892 + if len(set_ball & {15, 21, 34}) == 3: return 2893 + #if len(set_ball & {16, 25, 36}) == 2: return 2894 + if len(set_ball & {16, 27, 35}) == 3: return 2895 + if len(set_ball & {16, 31, 36}) == 3: return 2896 + if len(set_ball & {17, 30, 31}) == 3: return 2897 + if len(set_ball & {17, 34, 45}) == 3: return 2898 + if len(set_ball & {18, 30, 34}) == 3: return 2899 + if len(set_ball & {18, 30, 41}) == 3: return 2900 + if len(set_ball & {18, 31, 38}) == 3: return 2901 + if len(set_ball & {19, 21, 45}) == 3: return 2902 + if len(set_ball & {20, 26, 35}) == 3: return 2903 + if len(set_ball & {21, 34, 44}) == 3: return 2904 + if len(set_ball & {23, 29, 44}) == 3: return 2905 + if len(set_ball & {23, 30, 34}) == 3: return 2906 + if len(set_ball & {24, 27, 35}) == 3: return 2907 + if len(set_ball & {27, 29, 40}) == 3: return 2908 + if len(set_ball & {30, 39, 43}) == 3: return 2909 + if len(set_ball & {32, 33, 40}) == 3: return 2910 + if len(set_ball & {32, 40, 41}) == 3: return 2911 + if len(set_ball & {34, 42, 45}) == 3: return 2912 + if len(set_ball & {35, 43, 45}) == 3: return 2913 + if len(set_ball & {1, 3, 27}) == 3: return 2914 + if len(set_ball & {3, 12, 13}) == 3: return 2915 + if len(set_ball & {3, 20, 24}) == 3: return 2916 + if len(set_ball & {6, 18, 38}) == 3: return 2917 + if len(set_ball & {6, 37, 38}) == 3: return 2918 + if len(set_ball & {12, 15, 24}) == 3: return 2919 + #if len(set_ball & {14, 30, 38}) == 2: return 2920 + if len(set_ball & {15, 28, 34}) == 3: return 2921 + if len(set_ball & {17, 26, 36}) == 3: return 2922 + if len(set_ball & {18, 31, 34}) == 3: return 2923 + if len(set_ball & {21, 26, 36}) == 3: return 2924 + if len(set_ball & {23, 35, 43}) == 3: return 2925 + if len(set_ball & {33, 37, 40}) == 3: return 2926 + if len(set_ball & {3, 8, 27}) == 3: return 2927 + if len(set_ball & {3, 20, 44}) == 3: return 2928 return None def extract_final_candidates(self, ball, no=None, until_end=False, df=None): - p_ball = df[df["no"] == no - 1].values.tolist()[0] + p_ball = df[df['no'] == no - 1].values.tolist()[0] p_ball = p_ball[1:7] filter_set = set() + A = TRAIN_ALLOW + ### S: 이전 당첨 번호 if no is not None: if self.hasWon(ball, no): - filter_set.add("이전 당첨 번호") + # 이전 당첨된 번호인지 확인 + filter_set.add('이전 당첨 번호') if not until_end: return filter_set + ### E: 이전 당첨 번호 + ### S: 당첨번호 6개 합 acc = sum(ball) - if acc not in P._F_SUM6: - filter_set.add("6개 합: {}".format(acc)) + if acc not in A.sum6: + filter_set.add('6개 합: {}'.format(acc)) if not until_end: return filter_set p_acc = sum(p_ball) + ### E: 당첨번호 6개 합 - if abs(acc - p_acc) not in P._F_SUM6_DIFF: - filter_set.add("6개 합 전주차: {}".format(abs(acc - p_acc))) + ### S: 당첨번호 6개 합에 대한 전주와 차이 + if abs(acc - p_acc) not in A.abs_sum_diff: + filter_set.add('6개 합 전주차: {}'.format(abs(acc - p_acc))) if not until_end: return filter_set + ### E: 당첨번호 6개 합에 대한 전주와 차이 - avg = acc // 6 - if avg not in P._F_AVG6: - filter_set.add("6개 평균: {}".format(avg)) - if not until_end: - return filter_set - p_avg = sum(p_ball) // 6 - if abs(avg - p_avg) not in P._F_AVG6_DIFF: - filter_set.add("6개 평균 전주차: {}".format(abs(avg - p_avg))) + ### S: 당첨번호 6개 평균 + acc = sum(ball) + avg = int(acc / 6) + if avg not in [18,19,20,21,22,23,24,25,26,27,28,29,30]: + # 모든 볼의 합 평균 + filter_set.add('6개 평균: {}'.format(avg)) if not until_end: return filter_set + ### E: 당첨번호 6개 평균 - s3f = ball[0] + ball[1] + ball[2] - if s3f not in P._F_SUM3F: - filter_set.add("b1+b2+b3: {}".format(s3f)) - if not until_end: - return filter_set - ps3f = p_ball[0] + p_ball[1] + p_ball[2] - if abs(s3f - ps3f) not in P._F_SUM3F_DIFF: - filter_set.add("b1+b2+b3 전주차: {}".format(abs(s3f - ps3f))) + ### S: 당첨번호 6개 평균에 대한 전주와 차이 + pAcc = sum(p_ball) + pAvg = int(pAcc / 6) + diff = abs(avg - pAvg) + if diff not in [0,1,2,3,4,5,6,7,8,9]: + # 모든 볼의 합 평균 + filter_set.add('6개 평균 전주차: {}'.format(diff)) if not until_end: return filter_set + ### E: 당첨번호 6개 평균에 대한 전주와 차이 - s3b = ball[3] + ball[4] + ball[5] - if s3b not in P._F_SUM3B: - filter_set.add("b4+b5+b6: {}".format(s3b)) - if not until_end: - return filter_set - ps3b = p_ball[3] + p_ball[4] + p_ball[5] - if abs(s3b - ps3b) not in P._F_SUM3B_DIFF: - filter_set.add("b4+b5+b6 전주차: {}".format(abs(s3b - ps3b))) + ### S: 앞 3개 볼의 합 + acc = ball[0] + ball[1] + ball[2] + if acc not in [20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,42,45,46,47,48,49,50,51,52,53,54,55,56,59,65,66,67,68,69,70]: + # 앞 3개 당번첨호의 합 + filter_set.add('b1+b2+b3: 68.9%') if not until_end: return filter_set + ### E: 앞 3개 볼의 합 + ### S: 앞 3개 볼의 합에 대한 전주와 차이 + p_acc = p_ball[0] + p_ball[1] + p_ball[2] + if abs(acc - p_acc) not in [6,7,8,9,10,11,12,13,14,15,17,18,19,20,21,22,23,24,25]: + # 두자리 중 첫자리 숫자의 sum이 전주와 같으면 필터 + filter_set.add('b1+b2+b3 전주차: 96.5%') + if not until_end: + return filter_set + ### E: 앞 3개 볼의 합에 대한 전주와 차이 + + ### S: 뒤 3개 볼의 합 + acc = ball[3] + ball[4] + ball[5] + if acc not in [86,87,88,89,90,91,92,93,94,95,96,98,99,100,101,102,103,104,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125]: + # 뒤 3개 당번첨호의 합 + filter_set.add('b4+b5+b6: {}'.format(acc)) + if not until_end: + return filter_set + ### E: 뒤 3개 볼의 합 + + ### S: 뒤 3개 볼의 합에 대한 전주와 차이 + p_acc = p_ball[3] + p_ball[4] + p_ball[5] + if abs(acc - p_acc) not in [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,24,25,26,27,28,29,30,31]: + # 두자리 중 첫자리 숫자의 sum이 전주와 같으면 필터 + filter_set.add('b4+b5+b6 전주차: {}'.format(abs(acc - p_acc))) + if not until_end: + return filter_set + ### E: 뒤 3개 볼의 합 + + ### S: 23기준 작은 숫자 개수와 큰 숫자 개수 (23보다 작은 숫자의 개수와 큰 숫자의 개수) l, h = self.getHigLowRate(ball) - if (l in (0, 1) or h in (0, 1)) and (l, h) not in P._F_HL_SEEN: - filter_set.add("high/low: {}".format((l, h))) + if l in [0, 1] or h in [0, 1]: + # (고저 비율) 45개 번호중 23 아래를 저, 위를 고로 분류한 비율 (일반적으로 0:4, 2:2, 4:0 가 많음) + # 23 이하가 1개 이하이거나 23이상이 1개 이하인 경우 제외 + filter_set.add('high/low: 0/0, 0/1, 1/0') if not until_end: return filter_set + ### E: 23기준 작은 숫자 개수와 큰 숫자 개수 - gh = ball[0] + ball[5] - if gh not in P._F_GO_SUM: - filter_set.add("고저합: {}".format(gh)) - if not until_end: - return filter_set - pgh = p_ball[0] + p_ball[5] - if abs(gh - pgh) not in P._F_GO_SUM_DIFF: - filter_set.add("고저합 전주차: {}".format(abs(gh - pgh))) + ### S: 고저합 (가장 큰 수와 가작 작은 숫자의 합) + acc = ball[0] + ball[5] + if acc not in [38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57]: + filter_set.add('고저합: 81.8%') if not until_end: return filter_set + ### E: 고저합 (가장 큰 수와 가작 작은 숫자의 합) + ### S: 고저합 (가장 큰 수와 가작 작은 숫자의 합)에 대한 전주와 차이 + p_acc = p_ball[0] + p_ball[5] + if abs(acc - p_acc) not in [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]: + # 첫수와 끝수의 합에 대해서 전주 금주의 차이 + filter_set.add('고저합 전주차: 85.4%') + if not until_end: + return filter_set + ### E: 고저합 (가장 큰 수와 가작 작은 숫자의 합)에 대한 전주와 차이 + + ### S: ball 간격의 합 interval_sum = self.get_ball_interval(ball) - if interval_sum not in P._F_INTERVAL: - filter_set.add("Interval_sum: {}".format(interval_sum)) + if interval_sum not in {27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44}: + filter_set.add('Interval_sum: 78.5%') if not until_end: return filter_set + ### S: ball 간격의 합 + + ### E: ball 간격의 합에 대한 전주와 차이 p_interval_sum = self.get_ball_interval(p_ball) - if abs(interval_sum - p_interval_sum) not in P._F_INTERVAL_DIFF: - filter_set.add("Interval_sum 전주차: {}".format(abs(interval_sum - p_interval_sum))) + if abs(interval_sum-p_interval_sum) not in {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}: + filter_set.add('Interval_sum 전주차: 90.6%') if not until_end: return filter_set + ### E: ball 간격의 합에 대한 전주와 차이 + ### S: 두 자리 중 첫자리 숫자의 합 (예, 8은 0, 15는 1, 28은 2) firstLetterSum = self.getFirstLetterSumBall(ball) - if firstLetterSum not in P._F_FIRST_LETTER: - filter_set.add("첫수합: {}".format(firstLetterSum)) + if firstLetterSum not in [8,9,10,11,12,13,14,15]: + filter_set.add('첫수합: 92.2%') if not until_end: return filter_set + ### S: 두 자리 중 첫자리 숫자의 합 (예, 8은 0, 15는 1, 27은 2) + + ### E: 두 자리 중 첫자리 숫자의 합 (예, 8은 0, 15는 1, 28은 2)에 대한 전주와 차이 p_firstLetterSum = self.getFirstLetterSumBall(p_ball) - if abs(firstLetterSum - p_firstLetterSum) not in P._F_FIRST_LETTER_DIFF: - filter_set.add("첫수합 전주차: {}".format(abs(firstLetterSum - p_firstLetterSum))) + if abs(firstLetterSum-p_firstLetterSum) not in [0,1,2,3,4,5,6]: + filter_set.add('첫수합 전주차: 91.1%') if not until_end: return filter_set + ### E: 두 자리 중 첫자리 숫자의 합 (예, 8은 0, 15는 1, 27은 2)에 대한 전주와 차이 + ### S: 두 자리 중 두번째 자리 숫자의 합 (예, 8은 8, 15는 5, 27은 7) lastLetterSum = self.getLastLetterSumBall(ball) - if lastLetterSum not in P._F_LAST_LETTER: - filter_set.add("끝수합: {}".format(lastLetterSum)) + if lastLetterSum not in [16,21,23,24,25,26,27,28,29,30,31,32,33,34,36,37,38]: + filter_set.add('끝수합: 95.5%') if not until_end: return filter_set + ### E: 두 자리 중 두번째 자리 숫자의 합 (예, 8은 8, 15는 5, 27은 7) + + ### S: 두 자리 중 두번째 자리 숫자의 합 (예, 8은 8, 15는 5, 27은 7)에 대한 전주와 차이 p_lastLetterSum = self.getLastLetterSumBall(p_ball) - if abs(lastLetterSum - p_lastLetterSum) not in P._F_LAST_LETTER_DIFF: - filter_set.add("끝수합 전주차: {}".format(abs(lastLetterSum - p_lastLetterSum))) + if abs(lastLetterSum-p_lastLetterSum) not in [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]: + filter_set.add('끝수합 전주차: 90.6%') if not until_end: return filter_set + ### E: 두번째 자리 숫자의 합 (예, 8은 8, 15는 5, 27은 7)에 대한 전주와 차이 - if ball[0] not in P._F_B0: - filter_set.add("첫수: {}".format(ball[0])) - if not until_end: - return filter_set - if abs(ball[0] - p_ball[0]) not in P._F_B0_DIFF: - filter_set.add("전주와 첫수 차: {}".format(abs(ball[0] - p_ball[0]))) + ### S: 첫번째 숫자 + if ball[0] not in [1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 14]: + # 첫 볼이 11 이상은 제거 + filter_set.add('첫수: 70.6%') if not until_end: return filter_set + ### E: 첫번째 숫자 - if ball[5] not in P._F_B5: - filter_set.add("마지막 공: {}".format(ball[5])) - if not until_end: - return filter_set - if abs(ball[5] - p_ball[5]) not in P._F_B5_DIFF: - filter_set.add("마지막 공 전주차: {}".format(abs(ball[5] - p_ball[5]))) + ### S: 첫번째 숫자에 대한 전주와 차이 + if abs(ball[0] - p_ball[0]) not in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]: + # 첫 볼과 이전 첫 볼의 비교 + filter_set.add('전주와 첫수 차: {}'.format(abs(ball[0] - p_ball[0]))) if not until_end: return filter_set + ### E: 첫번째 숫자에 대한 전주와 차이 + ### S: 마지막 숫자 + if ball[5] not in [36, 38, 39, 40, 41, 42, 43, 44, 45]: + filter_set.add('마지막 공: 81.2%') + if not until_end: + return filter_set + ### E: 마지막 숫자 + + ### E: 마지막 숫자에 대한 전주와 차이 + if abs(ball[5] - p_ball[5]) not in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]: + # 마지막 볼이 30이하는 제거 + filter_set.add('마지막 공: 81.8%') + if not until_end: + return filter_set + ### E: 마지막 숫자에 대한 전주와 차이 + + ### S: Uniq한 끝자리 숫자 개수 ([8, 18, 22, 31, 40, 44]는 8, 2, 1, 0, 4 이렇게 5개임) uniq_last_count = self.filterOneDigitPattern(ball) - if uniq_last_count not in P._F_UNIQ_END: - filter_set.add("Unique 끝수 개수: {}".format(uniq_last_count)) - if not until_end: - return filter_set - p_uniq = self.filterOneDigitPattern(p_ball) - if abs(uniq_last_count - p_uniq) not in P._F_UNIQ_END_DIFF: - filter_set.add("Unique 끝수 전주차: {}".format(abs(uniq_last_count - p_uniq))) + if uniq_last_count not in {4,5,6}: + # 끝수의 형태 + filter_set.add('Unique 끝수 개수: 96%') if not until_end: return filter_set + ### E: Uniq한 끝자리 숫자 개수 ([8, 18, 22, 31, 40, 44]는 8, 2, 1, 0, 4 이렇게 5개임) + ### S: Uniq한 끝자리 숫자 개수 ([8, 18, 22, 31, 40, 44]는 8, 2, 1, 0, 4 이렇게 5개임)에 대한 전주와 차이 + p_uniq_last_count = self.filterOneDigitPattern(p_ball) + if abs(uniq_last_count-p_uniq_last_count) not in {0,1}: + # 끝수의 형태 + filter_set.add('Unique 끝수 개수: 82.6%') + if not until_end: + return filter_set + ### E: Uniq한 끝자리 숫자 개수 ([8, 18, 22, 31, 40, 44]는 8, 2, 1, 0, 4 이렇게 5개임)에 대한 전주와 차이 + + ### S: AC 값 ac_value = self.getACValue(ball) - if ac_value not in P._F_AC: - filter_set.add("ac: {}".format(ac_value)) + if ac_value not in {7,8,9,10}: + # AC 값에 의한 필터 + filter_set.add('ac: 94.4%') if not until_end: return filter_set + ### E: AC 값 + + ### S: AC 값에 대한 전주와 차이 p_ac_value = self.getACValue(p_ball) - if abs(ac_value - p_ac_value) not in P._F_AC_DIFF: - filter_set.add("ac 전주: {}".format(abs(ac_value - p_ac_value))) + if abs(ac_value-p_ac_value) not in {0,1,2,3}: + # AC 값에 의한 필터 + filter_set.add('ac 전주: 91.0%') if not until_end: return filter_set + ### E: AC 값에 대한 전주와 차이 - def _mulchk(n_mul, allow, allow_diff): - bn = len([b for b in ball if b % n_mul == 0]) - if bn not in allow: - filter_set.add("{}의배수: {}".format(n_mul, bn)) - if not until_end: - return True - pbn = len([b for b in p_ball if b % n_mul == 0]) - if abs(bn - pbn) not in allow_diff: - filter_set.add("{}의배수 전주차: {}".format(n_mul, abs(bn - pbn))) - if not until_end: - return True - return False - - _pairs = ( - (3, P._F_MUL3, P._F_MUL3_DIFF), - (4, P._F_MUL4, P._F_MUL4_DIFF), - (5, P._F_MUL5, P._F_MUL5_DIFF), - (6, P._F_MUL6, P._F_MUL6_DIFF), - (7, P._F_MUL7, P._F_MUL7_DIFF), - (8, P._F_MUL8, P._F_MUL8_DIFF), - (9, P._F_MUL9, P._F_MUL9_DIFF), - (10, P._F_MUL10, P._F_MUL10_DIFF), - (11, P._F_MUL11, P._F_MUL11_DIFF), - (13, P._F_MUL13, P._F_MUL13_DIFF), - (17, P._F_MUL17, P._F_MUL17_DIFF), - (19, P._F_MUL19, P._F_MUL19_DIFF), - (23, P._F_MUL23, P._F_MUL23_DIFF), - ) - for n_mul, fa, fd in _pairs: - if _mulchk(n_mul, fa, fd): + ### S: 3의 배수의 개수 + n_mul = 3 + ball_n = len([b for b in ball if b % n_mul == 0]) + if ball_n not in {2, 1, 3}: + filter_set.add('{}의배수: {}'.format(n_mul, ball_n)) + if not until_end: return filter_set + ### E: 3의 배수의 개수 + ### S: 3의 배수의 개수에 대한 전주와 차이 + p_ball_n = len([b for b in p_ball if b % n_mul == 0]) + if abs(ball_n - p_ball_n) not in {0, 1, 2}: + filter_set.add('{}의배수 전주차: {:.1f}%'.format(n_mul, 91.3)) + if not until_end: + return filter_set + ### E: 3의 배수의 개수에 대한 전주와 차이 + + ### S: 4의 배수의 개수 + n_mul = 4 + ball_n = len([b for b in ball if b % n_mul == 0]) + if ball_n not in {0, 1, 2}: + filter_set.add('{}의배수: {}'.format(n_mul, ball_n)) + if not until_end: + return filter_set + ### E: 4의 배수의 개수 + + ### S: 4의 배수의 개수에 대한 전주와 차이 + p_ball_n = len([b for b in p_ball if b % n_mul == 0]) + if abs(ball_n - p_ball_n) not in {0, 1, 2}: + filter_set.add('{}의배수 전주차: {:.1f}%'.format(n_mul, 92.3)) + if not until_end: + return filter_set + ### E: 4의 배수의 개수에 대한 전주와 차이 + + ### S: 5의 배수의 개수 + n_mul = 5 + ball_n = len([b for b in ball if b % n_mul == 0]) + if ball_n not in {0, 1, 2}: + filter_set.add('{}의배수: {}'.format(n_mul, ball_n)) + if not until_end: + return filter_set + ### E: 5의 배수의 개수 + + ### S: 5의 배수의 개수에 대한 전주와 차이 + p_ball_n = len([b for b in p_ball if b % n_mul == 0]) + if abs(ball_n - p_ball_n) not in {0, 1,2}: + filter_set.add('{}의배수 전주차: {:.1f}%'.format(n_mul, 76.3)) + if not until_end: + return filter_set + ### E: 5의 배수의 개수에 대한 전주와 차이 + + ### S: 6의 배수의 개수 + n_mul = 6 + ball_n = len([b for b in ball if b % n_mul == 0]) + if ball_n not in {0, 1, 2}: + filter_set.add('{}의배수: {}'.format(n_mul, ball_n)) + if not until_end: + return filter_set + ### E: 6의 배수의 개수 + + ### S: 6의 배수의 개수에 대한 전주와 차이 + p_ball_n = len([b for b in p_ball if b % n_mul == 0]) + if abs(ball_n - p_ball_n) not in {0, 1}: + filter_set.add('{}의배수 전주차: {:.1f}%'.format(n_mul, 80.7)) + if not until_end: + return filter_set + ### E: 6의 배수의 개수에 대한 전주와 차이 + + ### S: 7의 배수의 개수 + n_mul = 7 + ball_n = len([b for b in ball if b % n_mul == 0]) + if ball_n not in {0, 1, 2}: + filter_set.add('{}의배수: {}'.format(n_mul, ball_n)) + if not until_end: + return filter_set + ### E: 7의 배수의 개수 + + ### S: 7의 배수의 개수에 대한 전주와 차이 + p_ball_n = len([b for b in p_ball if b % n_mul == 0]) + if abs(ball_n - p_ball_n) not in {0, 1}: + filter_set.add('{}의배수 전주차: {:.1f}%'.format(n_mul, 85.0)) + if not until_end: + return filter_set + ### E: 7의 배수의 개수에 대한 전주와 차이 + + ### S: 8의 배수의 개수 + n_mul = 8 + ball_n = len([b for b in ball if b % n_mul == 0]) + if ball_n not in {0, 1}: + filter_set.add('{}의배수: {}'.format(n_mul, ball_n)) + if not until_end: + return filter_set + ### E: 8의 배수의 개수 + + ### S: 8의 배수의 개수에 대한 전주와 차이 + p_ball_n = len([b for b in p_ball if b % n_mul == 0]) + if abs(ball_n - p_ball_n) not in {0, 1}: + filter_set.add('{}의배수 전주차: {:.1f}%'.format(n_mul, 87.4)) + if not until_end: + return filter_set + ### E: 8의 배수의 개수에 대한 전주와 차이 + + ### S: 9의 배수의 개수 + n_mul = 9 + ball_n = len([b for b in ball if b % n_mul == 0]) + if ball_n not in {0, 1,2}: + filter_set.add('{}의배수: {}'.format(n_mul, ball_n)) + if not until_end: + return filter_set + ### E: 9의 배수의 개수 + + ### S: 9의 배수의 개수에 대한 전주와 차이 + p_ball_n = len([b for b in p_ball if b % n_mul == 0]) + if abs(ball_n - p_ball_n) not in {0, 1}: + filter_set.add('{}의배수 전주차: {:.1f}%'.format(n_mul, 87.9)) + if not until_end: + return filter_set + ### E: 9의 배수의 개수에 대한 전주와 차이 + + ### S: 10의 배수의 개수 + n_mul = 10 + ball_n = len([b for b in ball if b % n_mul == 0]) + if ball_n not in {0, 1}: + filter_set.add('{}의배수: {}'.format(n_mul, ball_n)) + if not until_end: + return filter_set + ### E: 10의 배수의 개수 + + ### S: 10의 배수의 개수에 대한 전주와 차이 + p_ball_n = len([b for b in p_ball if b % n_mul == 0]) + if abs(ball_n - p_ball_n) not in {0, 1}: + filter_set.add('{}의배수 전주차: {:.1f}%'.format(n_mul, 89.9)) + if not until_end: + return filter_set + ### E: 10의 배수의 개수에 대한 전주와 차이 + + ### S: 11의 배수의 개수 + n_mul = 11 + ball_n = len([b for b in ball if b % n_mul == 0]) + if ball_n not in {0, 1,2}: + filter_set.add('{}의배수: {}'.format(n_mul, ball_n)) + if not until_end: + return filter_set + ### E: 11의 배수의 개수 + + ### S: 11의 배수의 개수에 대한 전주와 차이 + p_ball_n = len([b for b in p_ball if b % n_mul == 0]) + if abs(ball_n - p_ball_n) not in {0, 1}: + filter_set.add('{}의배수 전주차: {:.1f}%'.format(n_mul, 89.9)) + if not until_end: + return filter_set + ### E: 11의 배수의 개수에 대한 전주와 차이 + + ### S: 13의 배수의 개수 + n_mul = 13 + ball_n = len([b for b in ball if b % n_mul == 0]) + if ball_n not in {0, 1}: + filter_set.add('{}의배수: {}'.format(n_mul, ball_n)) + if not until_end: + return filter_set + ### E: 13의 배수의 개수 + + ### S: 13의 배수의 개수에 대한 전주와 차이 + p_ball_n = len([b for b in p_ball if b % n_mul == 0]) + if abs(ball_n - p_ball_n) not in {0, 1}: + filter_set.add('{}의배수 전주차: {:.1f}%'.format(n_mul, 89.9)) + if not until_end: + return filter_set + ### E: 13의 배수의 개수에 대한 전주와 차이 + + ### S: 17의 배수의 개수 + n_mul = 17 + ball_n = len([b for b in ball if b % n_mul == 0]) + if ball_n not in {0, 1}: + filter_set.add('{}의배수: {}'.format(n_mul, ball_n)) + if not until_end: + return filter_set + ### E: 17의 배수의 개수 + + ### S: 17의 배수의 개수에 대한 전주와 차이 + p_ball_n = len([b for b in p_ball if b % n_mul == 0]) + if abs(ball_n - p_ball_n) not in {0, 1}: + filter_set.add('{}의배수 전주차: {:.1f}%'.format(n_mul, 89.9)) + if not until_end: + return filter_set + ### E: 17의 배수의 개수에 대한 전주와 차이 + + ### S: 19의 배수의 개수 + n_mul = 19 + ball_n = len([b for b in ball if b % n_mul == 0]) + if ball_n not in {0, 1}: + filter_set.add('{}의배수: {}'.format(n_mul, ball_n)) + if not until_end: + return filter_set + ### E: 19의 배수의 개수 + + ### S: 19의 배수의 개수에 대한 전주와 차이 + p_ball_n = len([b for b in p_ball if b % n_mul == 0]) + if abs(ball_n - p_ball_n) not in {0, 1}: + filter_set.add('{}의배수 전주차: {:.1f}%'.format(n_mul, 89.9)) + if not until_end: + return filter_set + ### E: 19의 배수의 개수에 대한 전주와 차이 + + ### S: 23의 배수의 개수 + n_mul = 23 + ball_n = len([b for b in ball if b % n_mul == 0]) + if ball_n not in {0}: + filter_set.add('{}의배수: {}'.format(n_mul, ball_n)) + if not until_end: + return filter_set + ### E: 23의 배수의 개수 + + ### S: 23의 배수의 개수에 대한 전주와 차이 + p_ball_n = len([b for b in p_ball if b % n_mul == 0]) + if abs(ball_n - p_ball_n) not in {0}: + filter_set.add('{}의배수 전주차: {:.1f}%'.format(n_mul, 89.9)) + if not until_end: + return filter_set + ### E: 23의 배수의 개수에 대한 전주와 차이 + + ### S: 소수 포함 개수 pn_acc = len(set(ball) & set(self.primeNumber)) - if pn_acc not in P._F_PRIME_N: - filter_set.add("소수: {}".format(pn_acc)) + if pn_acc not in [1,2,3]: + filter_set.add('소수: 85.5%') if not until_end: return filter_set + """ + diff = abs(pn_acc - len(set(p_ball) & set(self.primeNumber))) + if diff not in [0,1,0]: + filter_set.add('소수 전주차: 91.0%') + if not until_end: + return filter_set + """ + ### E: 소수 포함 개수 + ### S: 복소수 포함 개수 cn_acc = len(set(ball) & set(self.compositeNumber)) - if cn_acc not in P._F_COMPOSITE_N: - filter_set.add("복소수: {}".format(cn_acc)) + if cn_acc not in [3,4,5]: + filter_set.add('복소수: 85.0%') if not until_end: return filter_set + diff = abs(cn_acc - len(set(p_ball) & set(self.compositeNumber))) - if diff not in P._F_COMPOSITE_DIFF: - filter_set.add("복소수 전주차: {}".format(diff)) + if diff not in [0,1,2,3]: + filter_set.add('복소수 전주차: 90.2%') if not until_end: return filter_set + ### E: 복소수 포함 개수 + + ### S: 홀짝 개수 even_count = len([b for b in ball if b % 2 == 0]) - if even_count not in P._F_EVEN_N: - filter_set.add("짝수: {}".format(even_count)) - if not until_end: - return filter_set - p_even_count = len([b for b in p_ball if b % 2 == 0]) - if abs(even_count - p_even_count) not in P._F_EVEN_DIFF: - filter_set.add("짝수 전주차: {}".format(abs(even_count - p_even_count))) + if even_count not in [2,3,4]: + filter_set.add('짝수 (0,2,4): 82.6%') if not until_end: return filter_set + ### S: 홀짝 개수 - for fn in ( - self.filterPatternInPaper1, - self.filterPatternInPaper2, - self.filterPatternInPaper3, - self.filterPatternInPaper4, - self.filterPatternInPaper5, - self.filterPatternInPaper6, - ): - v = fn(ball) + ### E: 홀짝 개수에 대한 전주와 차이 + p_even_count = len([b for b in p_ball if b % 2 == 0]) + if abs(even_count - p_even_count) not in [0,1,2]: + filter_set.add('짝수 (0,2,4) 전주차: 88.4%') + if not until_end: + return filter_set + ### E: 홀짝 개수에 대한 전주와 차이 + ### S: 용지에 안나올 것 같은 마킹 위치 (filterPatternInPaper1~filterPatternInPaper6) + v1 = self.filterPatternInPaper1(ball) + v2 = self.filterPatternInPaper2(ball) + v3 = self.filterPatternInPaper3(ball) + v4 = self.filterPatternInPaper4(ball) + v5 = self.filterPatternInPaper5(ball) + v6 = self.filterPatternInPaper6(ball) + vs = [v1, v2, v3, v4, v5, v6] + for v in vs: if v is not None: filter_set.add(v) if not until_end: return filter_set + ### E: 용지에 안나올 것 같은 마킹 위치 (filterPatternInPaper1~filterPatternInPaper6) - if not P.DISABLE_FILTER_PREVIOUS_NUMBER: - if self.filterPreviousNumber(ball, no): - filter_set.add("이전회차 수/좌우수") - if not until_end: - return filter_set + ### S: 전회차와 주어진 볼과 전후 볼 + if self.filterPreviousNumber(ball, no): + filter_set.add('이전회차 수/좌우수') + if not until_end: + return filter_set + ### E: 전회차와 주어진 볼과 전후 볼 + ### S: 공 6개가 1번대, 10번대, 20번대, 30번대, 40번대 중 공이 존재하는 구간의 개수 count_section10 = self.getNumberOfAppearancesInSection10(ball) - if count_section10 not in P._F_SEC10: - filter_set.add("같은 10구간대만 출현: {}".format(count_section10)) + if count_section10 not in {3,4,5}: + filter_set.add('같은 10구간대만 출현: {}'.format(count_section10)) if not until_end: return filter_set + ### E: 공 6개가 1번대, 10번대, 20번대, 30번대, 40번대 중 공이 존재하는 구간의 개수 + + ### S: 공 6개가 1번대, 10번대, 20번대, 30번대, 40번대 중 공이 존재하는 구간의 개수에 대한 전주와 차이 p_count_section10 = self.getNumberOfAppearancesInSection10(p_ball) - if abs(count_section10 - p_count_section10) not in P._F_SEC10_DIFF: - filter_set.add("같은 10구간대만 출현 전주차: {}".format(abs(count_section10 - p_count_section10))) + if abs(count_section10-p_count_section10) not in {0,1,2}: + filter_set.add('같은 10구간대만 출현 전주차: {}'.format(abs(count_section10-p_count_section10))) if not until_end: return filter_set + ### E: 공 6개가 1번대, 10번대, 20번대, 30번대, 40번대 중 공이 존재하는 구간의 개수에 대한 전주와 차이 - for wk, fw, fwd in ( - (8, P._F_W8, P._F_W8_DIFF), - (12, P._F_W12, P._F_W12_DIFF), - (16, P._F_W16, P._F_W16_DIFF), - (20, P._F_W20, P._F_W20_DIFF), - ): - exist_ball = self.getWeeksFrequency(ball, df, no, week=wk) - if exist_ball not in fw: - filter_set.add("{} weeks: {}".format(wk, exist_ball)) - if not until_end: - return filter_set - p_exist_ball = self.getWeeksFrequency(p_ball, df, no, week=wk) - if abs(exist_ball - p_exist_ball) not in fwd: - filter_set.add("{} weeks 전주차: {}".format(wk, abs(exist_ball - p_exist_ball))) - if not until_end: - return filter_set + ### S: 최근 8주간 모든 당첨번호에 포함되는 금주 번호 개수 + exist_ball = self.getWeeksFrequency(ball, df, no, week=8) + if exist_ball not in {3,4,5,6}: + filter_set.add('8 weeks: 92.8%') + if not until_end: + return filter_set + ### E: 최근 8주간 모든 당첨번호에 포함되는 금주 번호 개수 + + ### S: 최근 8주간 모든 당첨번호에 포함되는 금주 번호 개수에 대한 전주와 차이 + p_exist_ball = self.getWeeksFrequency(p_ball, df, no, week=8) + if abs(exist_ball-p_exist_ball) not in {0,1,2,3}: + filter_set.add('8 weeks 전주차: 90.5%') + if not until_end: + return filter_set + ### E: 최근 8주간 모든 당첨번호에 포함되는 금주 번호 개수에 대한 전주와 차이 + + ### S: 최근 12주간 모든 당첨번호에 포함되는 금주 번호 개수 + exist_ball = self.getWeeksFrequency(ball, df, no, week=12) + if exist_ball not in {3, 4, 5, 6}: + filter_set.add('12 weeks: 99.0%') + if not until_end: + return filter_set + ### E: 최근 12주간 모든 당첨번호에 포함되는 금주 번호 개수 + + ### S: 최근 12주간 모든 당첨번호에 포함되는 금주 번호 개수에 대한 전주와 차이 + p_exist_ball = self.getWeeksFrequency(p_ball, df, no, week=12) + if abs(exist_ball - p_exist_ball) not in {0, 1, 2}: + filter_set.add('12 weeks 전주차: 96.8%') + if not until_end: + return filter_set + ### E: 최근 12주간 모든 당첨번호에 포함되는 금주 번호 개수에 대한 전주와 차이 + + ### S: 최근 16주간 모든 당첨번호에 포함되는 금주 번호 개수 + exist_ball = self.getWeeksFrequency(ball, df, no, week=16) + if exist_ball not in {4,5,6}: + filter_set.add('16 weeks: 98.2%') + if not until_end: + return filter_set + ### S: 최근 16주간 모든 당첨번호에 포함되는 금주 번호 개수 + + ### S: 최근 16주간 모든 당첨번호에 포함되는 금주 번호 개수에 대한 전주와 차이 + p_exist_ball = self.getWeeksFrequency(p_ball, df, no, week=16) + if abs(exist_ball - p_exist_ball) not in {0, 1}: + filter_set.add('16 weeks 전주차: 87.7%') + if not until_end: + return filter_set + ### S: 최근 16주간 모든 당첨번호에 포함되는 금주 번호 개수에 대한 전주와 차이 + + ### S: 최근 20주간 모든 당첨번호에 포함되는 금주 번호 개수 + exist_ball = self.getWeeksFrequency(ball, df, no, week=20) + if exist_ball not in {5, 6}: + filter_set.add('20 weeks: 95.1%') + if not until_end: + return filter_set + ### S: 최근 20주간 모든 당첨번호에 포함되는 금주 번호 개수 + + ### S: 최근 20주간 모든 당첨번호에 포함되는 금주 번호 개수에 대한 전주와 차이 + p_exist_ball = self.getWeeksFrequency(p_ball, df, no, week=20) + if abs(exist_ball - p_exist_ball) not in {0, 1}: + filter_set.add('20 weeks 전주차: 93.8%') + if not until_end: + return filter_set + ### S: 최근 20주간 모든 당첨번호에 포함되는 금주 번호 개수에 대한 전주와 차이 + + ### S: 통계적으로 잘 나올 것 같지 않은 3개 공 조합 체크 type3 = self.filterTriplePairBall(ball) if type3 is not None: - filter_set.add("직관 3개 볼을 제거: {}".format(type3)) + filter_set.add('직관 3개 볼을 제거: {}'.format(type3)) if not until_end: return filter_set + ### S: 통계적으로 잘 나올 것 같지 않은 3개 공 조합 체크 - if not P.DISABLE_FILTER_ALL_PREVIOUS_7: - if self.filterAllPreivous7(ball, no): - filter_set.add("이전 7회차 전부 포함") - if not until_end: - return filter_set + ### S: 이전 7회차에서 안나온 값이 없는 경우 + if self.filterAllPreivous7(ball, no): + filter_set.add('이전 17차') + if not until_end: + return filter_set + ### E: 이전 7회차에서 안나온 값이 없는 경우 + ### S: 하나의 당첨 번호에서 N개 연속된 숫자인지 체크 continous_ball = self.getContinusNumber(ball) - if continous_ball > _MAX_CONT: - filter_set.add("연속볼") + if 3 < continous_ball: + # 연속 볼이 있으면 제거 + filter_set.add('연속볼') if not until_end: return filter_set + ### E: 하나의 당첨 번호에서 N개 연속된 숫자인지 체크 + + """ + if self.filterNTimesIn10UnitSections(ball, N=2): + filter_set.add('filter#1') + + if self.filterNTimesIn5UnitSections(ball, N=0): + filter_set.add('filter#1') + """ return filter_set def filter(self, ball, no, until_end=False, df=None, filter_ball=None): - return self.extract_final_candidates(ball=ball, no=no, until_end=until_end, df=df) + filter_type = self.extract_final_candidates(ball=ball, no=no, until_end=until_end, df=df) + + return filter_type \ No newline at end of file diff --git a/final_filterTest.py b/final_filterTest.py index 70742c1..598ae4c 100644 --- a/final_filterTest.py +++ b/final_filterTest.py @@ -1,50 +1,38 @@ -# -*- coding: utf-8 -*- """ -학습(1~800) / 검증(801~1000) / 테스트(1001~) 구간별 필터 통과(당첨번호가 필터를 통과하는지) 분석. -1_FilterTest_25.py 와 동일한 흐름이며 BallFilter 대신 final_BallFilter.BallFilter 를 사용합니다. - -실행: miniconda 환경 ncue 에서 `python final_filterTest.py` (README 참고). +`1_FilterTest_25.py`와 동일한 역할이며 `final_BallFilter.BallFilter` + `lotto_history.txt`를 사용합니다. """ -from __future__ import annotations -import datetime +import argparse +import itertools import os +import random import time +import datetime import pandas as pd from final_BallFilter import BallFilter -# PROMPT.txt 기준 구간 -TRAIN_NO = (1, 800) -VALID_NO = (801, 1000) -TEST_NO = (1001, 10**9) - class FilterTest: - def __init__(self, resources_path: str): - lotto_json = os.path.join(resources_path, "lotto_history.json") - self.ballFilter = BallFilter(lotto_json) + ballFilter = None - def find_filter_method(self, df_ball, filter_ball=None, no_min=None, no_max=None): - """no_min~no_max 회차만 역순으로 검사 (None 이면 전체).""" + def __init__(self, resources_path): + lotto_path = os.path.join(resources_path, "lotto_history.txt") + self.ballFilter = BallFilter(lotto_path) + + def find_filter_method(self, df_ball, filter_ball=None): win_count = 0 no_filter_ball = {} + printLog = True filter_dic = {} filter_dic_len = {} filter_dic_1 = {} filter_dic_2 = {} - - idx_list = list(range(len(df_ball) - 1, 19, -1)) - for i in idx_list: - no = int(df_ball["no"].iloc[i]) - if no_min is not None and no < no_min: - continue - if no_max is not None and no > no_max: - continue - + for i in range(len(df_ball) - 1, 19, -1): + no = df_ball["no"].iloc[i] answer = df_ball[df_ball["no"] == no].values.tolist()[0] - answer = answer[1:7] + answer = sorted(int(x) for x in answer[1:7]) filter_type = self.ballFilter.filter(ball=answer, no=no, until_end=True, df=df_ball) filter_type = list(filter_type) @@ -53,13 +41,20 @@ class FilterTest: if size == 0: win_count += 1 no_filter_ball[no] = answer + print("\t", no) elif size == 1: key = filter_type[0] filter_dic_1[key] = filter_dic_1.get(key, 0) + 1 + if printLog: + print("\t", no, filter_type) elif size == 2: key = ",".join(filter_type) filter_dic_2[key] = filter_dic_2.get(key, 0) + 1 + if printLog: + print("\t", no, filter_type) else: + if printLog: + print("\t", no, filter_type) if size not in filter_dic_len: filter_dic_len[size] = [] filter_dic_len[size].append(filter_type) @@ -67,46 +62,106 @@ class FilterTest: for f_t in filter_type: filter_dic[f_t] = filter_dic.get(f_t, 0) + 1 - print("\n\t[구간 {}~{}] 필터에 걸리지 않은 회차 (당첨 조합 통과)]".format(no_min, no_max)) - print("\tcount: {:,} (통과)".format(len(no_filter_ball))) - for no in sorted(no_filter_ball.keys()): + print("\n\t[필터 개수가 적은 것부터 최적화를 위함]") + sorted_filter_dic_len = sorted(filter_dic_len.keys()) + for filter_count in sorted_filter_dic_len: + for filter_type in filter_dic_len[filter_count]: + print("\t\t>{} > {}".format(filter_count, filter_type)) + + print("\n\t[걸러진 유일 필터]") + sorted_filter_dic_1 = sorted(filter_dic_1.items(), key=lambda x: x[1], reverse=True) + for i in range(len(sorted_filter_dic_1)): + print("\t\t>", sorted_filter_dic_1[i][0], "->", sorted_filter_dic_1[i][1]) + + print("\n\t[2개 필터에 걸린 경우]") + sorted_filter_dic_2 = sorted(filter_dic_2.items(), key=lambda x: x[1], reverse=True) + for i in range(len(sorted_filter_dic_2)): + print("\t\t>", sorted_filter_dic_2[i][0], "->", sorted_filter_dic_2[i][1]) + + print("\n\t[Filter 유형 별 걸린 개수]") + sorted_filter_dic = sorted(filter_dic.items(), key=lambda x: x[1], reverse=True) + for i in range(len(sorted_filter_dic)): + print("\t\t>", sorted_filter_dic[i][0], "->", sorted_filter_dic[i][1]) + + print("\n\t# 필터에 걸리지 않고 당첨된 회차") + print("\tcount: {:,} / total: {:,}".format(len(no_filter_ball), len(df_ball))) + for no in no_filter_ball: print("\t\t>", no, no_filter_ball[no]) + print("\tcount: {:,} / total: {:,}".format(len(no_filter_ball), len(df_ball))) - return win_count, no_filter_ball + return win_count - def report_split(self, df_ball, name: str, lo: int, hi: int): - print("\n" + "=" * 60) - print(" {} | 회차 {} ~ {}".format(name, lo, hi)) - print("=" * 60) - t0 = time.time() - wc, _ = self.find_filter_method(df_ball, no_min=lo, no_max=hi) - elapsed = datetime.timedelta(seconds=time.time() - t0) - span = hi - lo + 1 - rate = (wc / span * 100) if span else 0 - print("\t처리 시간: {}".format(elapsed)) - print("\t통과 회차 수: {} / {} ({:.2f}%)".format(wc, span, rate)) - if lo >= TRAIN_NO[0] and hi <= TRAIN_NO[1]: - need = max(1, span // 100) - print("\t(참고) 100회당 최소 1회 기준 대략 {}회 이상이면 충족".format(need)) - if lo >= VALID_NO[0] and hi <= VALID_NO[1]: - print("\t(참고) 검증 200회 구간에서 최소 3회 이상이면 요구사항 예시 충족") - return wc + def find_final_candidates(self, no, df_ball, filter_ball=None): + final_candidates = [] + generation_balls = list(range(1, 46)) + nCr = list(itertools.combinations(generation_balls, 6)) + for idx, ball in enumerate(nCr): + if idx % 1000000 == 0: + print(" - {} processed...".format(idx)) + + if filter_ball is not None and 0 < len(set(ball) & set(filter_ball)): + continue + + filter_type = self.ballFilter.filter(ball=list(ball), no=no, until_end=False, df=df_ball) + if filter_type: + continue + final_candidates.append(ball) + + return final_candidates + + def check_filter_method(self, df_ball, p_win_count, filter_ball=None): + win_count = 0 + for i in range(len(df_ball) - 1, 0, -1): + no = df_ball["no"].iloc[i] + answer = df_ball[df_ball["no"] == no].values.tolist()[0] + answer = sorted(int(x) for x in answer[1:7]) + + if filter_ball is not None and len(set(answer) & set(filter_ball)): + continue + + filter_type = self.ballFilter.extract_final_candidates(answer, no=no, until_end=True, df=df_ball) + + if len(filter_type) == 0: + win_count += 1 + print("\t\t>{}. {}".format(no, answer)) + + print("\n\t> {} / {} p_win_count, {} total".format(win_count, p_win_count, len(df_ball) - 1)) + + def estimate_survivors_mc(self, no, df_ball, n_samples=8000, seed=0): + """전수(814만) 대신 무작위 조합으로 생존 비율을 추정해 대략적인 생존 개수를 반환합니다.""" + rng = random.Random(seed) + generation_balls = list(range(1, 46)) + total = 8145060 + hits = 0 + for _ in range(n_samples): + ball = sorted(rng.sample(generation_balls, 6)) + fts = self.ballFilter.filter(ball=ball, no=no, until_end=False, df=df_ball) + if not fts: + hits += 1 + est = int(round(total * (hits / n_samples))) + return est, hits, n_samples if __name__ == "__main__": - resources_path = os.path.join(os.path.dirname(__file__), "resources") - csv_path = os.path.join(resources_path, "lotto_history.txt") - df_ball = pd.read_csv(csv_path, header=None) + parser = argparse.ArgumentParser() + parser.add_argument("--resources", default="resources") + parser.add_argument("--mc-no", type=int, default=None, help="생존 MC 추정을 할 회차 번호") + parser.add_argument("--mc-samples", type=int, default=8000) + args = parser.parse_args() + + resources_path = args.resources + lottoHistoryFileName = os.path.join(resources_path, "lotto_history.txt") + df_ball = pd.read_csv(lottoHistoryFileName, header=None) df_ball.columns = ["no", "b1", "b2", "b3", "b4", "b5", "b6", "bn"] - ft = FilterTest(resources_path) + filterTest = FilterTest(resources_path) - ft.report_split(df_ball, "학습 TRAIN", TRAIN_NO[0], TRAIN_NO[1]) - ft.report_split(df_ball, "검증 VALID", VALID_NO[0], min(VALID_NO[1], int(df_ball["no"].max()))) - if int(df_ball["no"].max()) >= TEST_NO[0]: - ft.report_split( - df_ball, - "테스트 TEST", - TEST_NO[0], - int(df_ball["no"].max()), - ) + print("STEP #1. 필터 방법 추출") + start = time.time() + win_count = filterTest.find_filter_method(df_ball) + process_time = datetime.timedelta(seconds=time.time() - start) + print("process_time: ", process_time) + + if args.mc_no is not None: + est, h, n = filterTest.estimate_survivors_mc(args.mc_no, df_ball, n_samples=args.mc_samples) + print(f"MC 생존 추정 (회차 {args.mc_no}): 약 {est}개 (표본 통과 {h}/{n})") diff --git a/final_filter_params.py b/final_filter_params.py index 9b9fa81..e2579f6 100644 --- a/final_filter_params.py +++ b/final_filter_params.py @@ -1,148 +1,39 @@ -# -*- coding: utf-8 -*- -"""학습 구간 1~800회 기준 자동 생성 — tools/compute_final_filter_params.py""" +""" +학습 구간(회차 1~800) 당첨번호로부터 6개 합 및 전주 합 차이 허용 집합만 계산합니다. +`final_BallFilter`의 나머지 필터는 `BallFilter_25`와 동일한 고정 임계값을 유지합니다. +""" -TRAIN_RANGE = (1, 800) -DISABLE_FILTER_PREVIOUS_NUMBER = True -DISABLE_FILTER_ALL_PREVIOUS_7 = True +from __future__ import annotations -ALLOW_SUM6 = [71, 72, 73, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 93, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 192, 193, 194, 195, 196, 197] -ALLOW_SUM6_DIFF = [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 88, 89, 92, 93, 94, 95] -ALLOW_AVG6 = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34] -ALLOW_AVG6_DIFF = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] -ALLOW_SUM3F = [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81] -ALLOW_SUM3F_DIFF = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 58, 59] -ALLOW_SUM3B = [51, 52, 53, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125] -ALLOW_SUM3B_DIFF = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53, 54, 56, 57, 58, 59, 64] -HL_SKIP = [(0, 0), (0, 1), (1, 0), (1, 1)] -HL_SEEN = [(0, 5), (0, 6), (1, 4), (1, 5), (2, 3), (2, 4), (3, 2), (3, 3), (4, 1), (4, 2), (5, 0), (5, 1), (6, 0)] -ALLOW_GO_SUM = [24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67] -ALLOW_GO_SUM_DIFF = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32] -ALLOW_INTERVAL = [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] -ALLOW_INTERVAL_DIFF = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25] -ALLOW_FIRST_LETTER = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] -ALLOW_FIRST_LETTER_DIFF = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] -ALLOW_LAST_LETTER = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40] -ALLOW_LAST_LETTER_DIFF = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25] -ALLOW_B0 = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25] -ALLOW_B0_DIFF = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22] -ALLOW_B5 = [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42] -ALLOW_B5_DIFF = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23] -ALLOW_UNIQ_END = [3, 4, 5, 6] -ALLOW_UNIQ_END_DIFF = [0, 1, 2, 3] -ALLOW_AC = [2, 3, 4, 5, 6, 7, 8, 9] -ALLOW_AC_DIFF = [0, 1, 2, 3, 4, 5, 6, 7] -ALLOW_MUL3 = [0, 1, 2, 3, 4, 5] -ALLOW_MUL3_DIFF = [0, 1, 2, 3, 4, 5] -ALLOW_MUL4 = [0, 1, 2, 3, 4, 5] -ALLOW_MUL4_DIFF = [0, 1, 2, 3, 4] -ALLOW_MUL5 = [0, 1, 2, 3, 4] -ALLOW_MUL5_DIFF = [0, 1, 2, 3, 4] -ALLOW_MUL6 = [0, 1, 2, 3] -ALLOW_MUL6_DIFF = [0, 1, 2, 3] -ALLOW_MUL7 = [0, 1, 2, 3] -ALLOW_MUL7_DIFF = [0, 1, 2, 3] -ALLOW_MUL8 = [0, 1, 2, 3] -ALLOW_MUL8_DIFF = [0, 1, 2, 3] -ALLOW_MUL9 = [0, 1, 2, 3, 4] -ALLOW_MUL9_DIFF = [0, 1, 2, 3] -ALLOW_MUL10 = [0, 1, 2, 3] -ALLOW_MUL10_DIFF = [0, 1, 2, 3] -ALLOW_MUL11 = [0, 1, 2, 3] -ALLOW_MUL11_DIFF = [0, 1, 2, 3] -ALLOW_MUL13 = [0, 1, 2, 3] -ALLOW_MUL13_DIFF = [0, 1, 2, 3] -ALLOW_MUL17 = [0, 1, 2] -ALLOW_MUL17_DIFF = [0, 1, 2] -ALLOW_MUL19 = [0, 1, 2] -ALLOW_MUL19_DIFF = [0, 1, 2] -ALLOW_MUL23 = [0, 1] -ALLOW_MUL23_DIFF = [0, 1] -ALLOW_PRIME_N = [0, 1, 2, 3, 4, 5] -ALLOW_COMPOSITE_N = [1, 2, 3, 4, 5, 6] -ALLOW_COMPOSITE_DIFF = [0, 1, 2, 3, 4] -ALLOW_EVEN_N = [0, 1, 2, 3, 4, 5] -ALLOW_EVEN_DIFF = [0, 1, 2, 3, 4, 5] -ALLOW_SEC10 = [2, 3, 4, 5] -ALLOW_SEC10_DIFF = [0, 1, 2, 3] -ALLOW_W8 = [0, 1, 2, 3, 4, 5] -ALLOW_W8_DIFF = [0, 1, 2, 3, 4, 5] -ALLOW_W12 = [0, 1, 2, 3, 4, 5] -ALLOW_W12_DIFF = [0, 1, 2, 3, 4, 5] -ALLOW_W16 = [0, 1, 3, 4, 5, 6] -ALLOW_W16_DIFF = [0, 1, 2, 3, 5, 6] -ALLOW_W20 = [0, 1, 3, 4, 5, 6] -ALLOW_W20_DIFF = [0, 1, 2, 3, 5, 6] -ALLOW_CONTINUS_MAX = [1, 2, 3, 4] -PAIR_BLOCKLIST = [] -TRIPLE_BLOCKLIST = [[1, 2, 32], [1, 2, 41], [1, 2, 43], [1, 3, 5], [1, 3, 13], [1, 3, 19], [1, 3, 38], [1, 4, 7], [1, 4, 11], [1, 4, 21], [1, 4, 22], [1, 4, 24], [1, 4, 25], [1, 4, 27], [1, 4, 30], [1, 4, 32], [1, 4, 36], [1, 4, 44], [1, 5, 7], [1, 5, 8], [1, 5, 15], [1, 5, 17], [1, 5, 22], [1, 5, 33], [1, 5, 43], [1, 5, 45], [1, 6, 7], [1, 6, 8], [1, 6, 10], [1, 6, 18], [1, 6, 21], [1, 6, 23], [1, 6, 26], [1, 6, 29], [1, 6, 30], [1, 6, 32], [1, 6, 35], [1, 6, 43], [1, 6, 44], [1, 7, 13], [1, 7, 17], [1, 7, 25], [1, 7, 28], [1, 7, 29], [1, 7, 31], [1, 7, 39], [1, 7, 43], [1, 7, 44], [1, 7, 45], [1, 8, 16], [1, 8, 20], [1, 8, 25], [1, 8, 30], [1, 8, 40], [1, 8, 41], [1, 9, 15], [1, 9, 22], [1, 9, 34], [1, 9, 37], [1, 9, 44], [1, 10, 11], [1, 10, 30], [1, 10, 34], [1, 10, 39], [1, 11, 19], [1, 11, 20], [1, 11, 29], [1, 11, 31], [1, 11, 33], [1, 11, 41], [1, 11, 43], [1, 12, 25], [1, 12, 30], [1, 12, 31], [1, 13, 15], [1, 13, 23], [1, 13, 27], [1, 13, 30], [1, 13, 31], [1, 13, 41], [1, 14, 17], [1, 14, 19], [1, 14, 22], [1, 14, 23], [1, 14, 25], [1, 14, 30], [1, 14, 31], [1, 14, 36], [1, 14, 38], [1, 14, 45], [1, 15, 21], [1, 15, 27], [1, 15, 29], [1, 15, 30], [1, 15, 31], [1, 15, 33], [1, 15, 43], [1, 16, 27], [1, 16, 31], [1, 17, 18], [1, 17, 38], [1, 18, 21], [1, 18, 25], [1, 18, 35], [1, 18, 39], [1, 19, 21], [1, 19, 22], [1, 19, 25], [1, 19, 29], [1, 19, 31], [1, 19, 32], [1, 19, 33], [1, 19, 37], [1, 19, 45], [1, 20, 21], [1, 20, 38], [1, 21, 28], [1, 21, 43], [1, 22, 23], [1, 22, 24], [1, 22, 26], [1, 22, 27], [1, 22, 29], [1, 22, 30], [1, 22, 34], [1, 22, 35], [1, 22, 36], [1, 22, 41], [1, 22, 43], [1, 22, 44], [1, 23, 32], [1, 23, 36], [1, 24, 37], [1, 25, 27], [1, 25, 30], [1, 25, 31], [1, 25, 32], [1, 25, 33], [1, 25, 42], [1, 25, 43], [1, 26, 39], [1, 26, 45], [1, 27, 31], [1, 27, 38], [1, 27, 44], [1, 28, 33], [1, 28, 38], [1, 28, 39], [1, 29, 30], [1, 29, 41], [1, 30, 31], [1, 30, 37], [1, 30, 40], [1, 30, 44], [1, 30, 45], [1, 31, 32], [1, 31, 33], [1, 31, 35], [1, 31, 36], [1, 31, 37], [1, 31, 38], [1, 31, 39], [1, 31, 41], [1, 31, 45], [1, 32, 38], [1, 32, 39], [1, 32, 43], [1, 32, 44], [1, 33, 38], [1, 33, 41], [1, 33, 44], [1, 35, 36], [1, 36, 43], [1, 37, 44], [1, 38, 42], [1, 38, 43], [1, 38, 44], [1, 39, 41], [1, 39, 42], [1, 41, 45], [2, 3, 8], [2, 3, 10], [2, 3, 18], [2, 3, 21], [2, 3, 28], [2, 3, 29], [2, 3, 31], [2, 3, 32], [2, 3, 35], [2, 3, 41], [2, 3, 45], [2, 4, 7], [2, 4, 9], [2, 4, 10], [2, 4, 12], [2, 4, 13], [2, 4, 14], [2, 4, 18], [2, 4, 22], [2, 4, 40], [2, 4, 41], [2, 4, 42], [2, 4, 45], [2, 5, 9], [2, 5, 21], [2, 5, 25], [2, 5, 26], [2, 5, 30], [2, 5, 35], [2, 5, 37], [2, 5, 38], [2, 5, 41], [2, 5, 42], [2, 5, 43], [2, 6, 10], [2, 6, 15], [2, 6, 23], [2, 6, 24], [2, 6, 32], [2, 6, 35], [2, 6, 38], [2, 6, 41], [2, 7, 11], [2, 7, 23], [2, 7, 31], [2, 7, 32], [2, 7, 35], [2, 7, 37], [2, 8, 10], [2, 8, 12], [2, 8, 16], [2, 8, 40], [2, 9, 11], [2, 9, 13], [2, 9, 18], [2, 9, 20], [2, 9, 21], [2, 9, 27], [2, 9, 29], [2, 9, 30], [2, 9, 32], [2, 9, 36], [2, 9, 39], [2, 10, 17], [2, 10, 20], [2, 10, 21], [2, 10, 23], [2, 10, 24], [2, 10, 27], [2, 10, 28], [2, 10, 30], [2, 10, 41], [2, 10, 43], [2, 11, 20], [2, 11, 38], [2, 11, 40], [2, 12, 13], [2, 12, 16], [2, 12, 18], [2, 12, 25], [2, 12, 29], [2, 12, 32], [2, 12, 35], [2, 12, 36], [2, 13, 21], [2, 13, 23], [2, 13, 24], [2, 13, 26], [2, 13, 35], [2, 13, 39], [2, 14, 18], [2, 14, 19], [2, 14, 20], [2, 14, 26], [2, 14, 34], [2, 14, 35], [2, 14, 37], [2, 14, 43], [2, 15, 17], [2, 15, 26], [2, 15, 32], [2, 15, 35], [2, 15, 39], [2, 16, 18], [2, 16, 23], [2, 16, 43], [2, 17, 23], [2, 17, 25], [2, 17, 35], [2, 17, 44], [2, 18, 22], [2, 18, 35], [2, 18, 41], [2, 19, 21], [2, 19, 30], [2, 19, 40], [2, 20, 22], [2, 20, 23], [2, 20, 26], [2, 20, 28], [2, 20, 32], [2, 20, 36], [2, 21, 23], [2, 21, 24], [2, 21, 31], [2, 21, 32], [2, 21, 37], [2, 21, 40], [2, 22, 26], [2, 22, 35], [2, 22, 43], [2, 23, 24], [2, 23, 28], [2, 23, 30], [2, 23, 32], [2, 23, 33], [2, 23, 35], [2, 23, 36], [2, 23, 39], [2, 23, 42], [2, 23, 45], [2, 24, 25], [2, 24, 26], [2, 24, 38], [2, 25, 35], [2, 26, 28], [2, 26, 31], [2, 26, 32], [2, 26, 35], [2, 26, 38], [2, 26, 39], [2, 26, 41], [2, 26, 42], [2, 27, 29], [2, 27, 31], [2, 27, 34], [2, 27, 45], [2, 28, 40], [2, 28, 41], [2, 29, 33], [2, 29, 35], [2, 29, 37], [2, 29, 41], [2, 29, 42], [2, 30, 37], [2, 30, 44], [2, 31, 36], [2, 31, 44], [2, 32, 37], [2, 32, 38], [2, 32, 40], [2, 32, 41], [2, 33, 38], [2, 34, 36], [2, 34, 39], [2, 35, 38], [2, 35, 44], [2, 35, 45], [2, 36, 38], [2, 36, 40], [2, 36, 43], [2, 36, 44], [2, 36, 45], [2, 37, 38], [2, 37, 42], [2, 37, 44], [2, 38, 41], [2, 38, 43], [2, 38, 44], [2, 39, 40], [2, 40, 45], [2, 42, 43], [2, 44, 45], [3, 4, 8], [3, 4, 13], [3, 4, 18], [3, 4, 21], [3, 4, 26], [3, 4, 35], [3, 4, 39], [3, 5, 9], [3, 5, 15], [3, 5, 16], [3, 5, 18], [3, 5, 23], [3, 5, 25], [3, 5, 28], [3, 5, 36], [3, 5, 40], [3, 5, 41], [3, 5, 45], [3, 6, 8], [3, 6, 11], [3, 6, 15], [3, 6, 16], [3, 6, 25], [3, 6, 26], [3, 6, 29], [3, 6, 31], [3, 6, 32], [3, 6, 33], [3, 6, 40], [3, 6, 42], [3, 6, 43], [3, 6, 45], [3, 7, 19], [3, 7, 28], [3, 7, 30], [3, 7, 35], [3, 7, 45], [3, 8, 10], [3, 8, 14], [3, 8, 25], [3, 8, 26], [3, 8, 28], [3, 8, 33], [3, 8, 37], [3, 9, 15], [3, 9, 16], [3, 9, 20], [3, 9, 21], [3, 9, 26], [3, 9, 31], [3, 9, 38], [3, 9, 39], [3, 9, 41], [3, 9, 44], [3, 10, 12], [3, 10, 18], [3, 10, 21], [3, 10, 41], [3, 11, 23], [3, 11, 25], [3, 11, 28], [3, 11, 29], [3, 11, 40], [3, 12, 17], [3, 12, 28], [3, 12, 29], [3, 12, 37], [3, 12, 44], [3, 14, 19], [3, 14, 29], [3, 14, 39], [3, 15, 16], [3, 15, 17], [3, 15, 18], [3, 15, 19], [3, 15, 21], [3, 15, 23], [3, 15, 26], [3, 15, 31], [3, 15, 39], [3, 15, 42], [3, 16, 25], [3, 16, 33], [3, 16, 41], [3, 16, 42], [3, 16, 45], [3, 17, 25], [3, 17, 26], [3, 17, 29], [3, 17, 33], [3, 17, 40], [3, 17, 42], [3, 17, 43], [3, 18, 21], [3, 18, 24], [3, 18, 25], [3, 18, 38], [3, 18, 39], [3, 18, 44], [3, 19, 26], [3, 19, 29], [3, 19, 33], [3, 19, 34], [3, 19, 40], [3, 19, 44], [3, 20, 29], [3, 20, 30], [3, 21, 24], [3, 21, 27], [3, 21, 28], [3, 21, 32], [3, 21, 34], [3, 21, 36], [3, 21, 40], [3, 21, 43], [3, 22, 34], [3, 23, 25], [3, 23, 30], [3, 23, 33], [3, 24, 28], [3, 24, 40], [3, 25, 26], [3, 25, 27], [3, 25, 28], [3, 25, 30], [3, 25, 31], [3, 25, 34], [3, 25, 35], [3, 25, 38], [3, 25, 39], [3, 25, 40], [3, 25, 41], [3, 25, 42], [3, 26, 28], [3, 26, 30], [3, 26, 32], [3, 26, 36], [3, 26, 39], [3, 26, 40], [3, 26, 45], [3, 27, 33], [3, 27, 34], [3, 27, 36], [3, 28, 29], [3, 28, 31], [3, 28, 33], [3, 28, 35], [3, 28, 36], [3, 28, 37], [3, 28, 41], [3, 29, 30], [3, 29, 31], [3, 29, 33], [3, 29, 34], [3, 30, 35], [3, 30, 42], [3, 30, 44], [3, 31, 33], [3, 31, 36], [3, 31, 45], [3, 32, 38], [3, 32, 39], [3, 33, 40], [3, 33, 44], [3, 34, 40], [3, 35, 38], [3, 35, 39], [3, 35, 41], [3, 35, 42], [3, 36, 43], [3, 36, 44], [3, 37, 40], [3, 38, 41], [3, 39, 40], [3, 44, 45], [4, 5, 10], [4, 5, 19], [4, 5, 28], [4, 5, 30], [4, 5, 33], [4, 5, 34], [4, 5, 36], [4, 5, 40], [4, 5, 44], [4, 6, 7], [4, 6, 16], [4, 6, 18], [4, 6, 22], [4, 6, 23], [4, 6, 24], [4, 6, 27], [4, 6, 29], [4, 6, 34], [4, 6, 35], [4, 6, 36], [4, 6, 38], [4, 6, 45], [4, 7, 8], [4, 7, 9], [4, 7, 21], [4, 7, 27], [4, 7, 28], [4, 7, 30], [4, 7, 34], [4, 7, 36], [4, 7, 37], [4, 7, 43], [4, 8, 12], [4, 8, 14], [4, 8, 22], [4, 8, 26], [4, 8, 28], [4, 8, 35], [4, 9, 12], [4, 9, 15], [4, 9, 20], [4, 9, 35], [4, 9, 41], [4, 9, 43], [4, 10, 39], [4, 10, 43], [4, 11, 15], [4, 11, 16], [4, 11, 19], [4, 11, 25], [4, 11, 30], [4, 11, 33], [4, 11, 34], [4, 11, 36], [4, 11, 40], [4, 11, 44], [4, 12, 13], [4, 12, 15], [4, 12, 17], [4, 12, 19], [4, 12, 21], [4, 12, 26], [4, 12, 29], [4, 12, 30], [4, 12, 31], [4, 12, 36], [4, 12, 39], [4, 12, 40], [4, 12, 44], [4, 13, 15], [4, 13, 16], [4, 13, 24], [4, 13, 25], [4, 13, 30], [4, 13, 35], [4, 14, 17], [4, 14, 27], [4, 14, 30], [4, 14, 34], [4, 14, 36], [4, 14, 38], [4, 14, 39], [4, 15, 19], [4, 15, 30], [4, 15, 32], [4, 15, 44], [4, 15, 45], [4, 16, 32], [4, 16, 45], [4, 17, 21], [4, 17, 23], [4, 17, 24], [4, 17, 25], [4, 17, 29], [4, 17, 35], [4, 17, 41], [4, 17, 45], [4, 18, 28], [4, 18, 35], [4, 18, 36], [4, 19, 23], [4, 19, 28], [4, 19, 36], [4, 19, 37], [4, 20, 42], [4, 21, 27], [4, 21, 28], [4, 21, 30], [4, 21, 31], [4, 21, 35], [4, 22, 23], [4, 22, 25], [4, 22, 26], [4, 22, 29], [4, 22, 30], [4, 22, 31], [4, 22, 32], [4, 22, 35], [4, 22, 36], [4, 22, 39], [4, 22, 45], [4, 23, 24], [4, 23, 27], [4, 23, 36], [4, 24, 29], [4, 24, 30], [4, 24, 31], [4, 24, 39], [4, 24, 43], [4, 25, 28], [4, 25, 30], [4, 25, 38], [4, 25, 39], [4, 25, 44], [4, 26, 39], [4, 26, 45], [4, 27, 29], [4, 27, 31], [4, 27, 33], [4, 27, 36], [4, 28, 41], [4, 29, 30], [4, 29, 44], [4, 30, 38], [4, 30, 39], [4, 30, 44], [4, 30, 45], [4, 31, 32], [4, 31, 38], [4, 32, 35], [4, 32, 45], [4, 34, 36], [4, 34, 42], [4, 34, 45], [4, 35, 38], [4, 35, 39], [4, 35, 41], [4, 35, 44], [4, 36, 38], [4, 36, 42], [4, 36, 44], [4, 37, 44], [4, 38, 42], [4, 40, 44], [4, 41, 44], [4, 42, 44], [4, 44, 45], [5, 6, 7], [5, 6, 10], [5, 6, 23], [5, 6, 30], [5, 6, 33], [5, 6, 34], [5, 6, 35], [5, 6, 36], [5, 6, 40], [5, 7, 10], [5, 7, 17], [5, 7, 19], [5, 7, 23], [5, 7, 24], [5, 7, 27], [5, 7, 31], [5, 7, 36], [5, 7, 38], [5, 8, 9], [5, 8, 10], [5, 8, 12], [5, 8, 13], [5, 8, 20], [5, 8, 24], [5, 8, 25], [5, 8, 31], [5, 8, 32], [5, 8, 34], [5, 8, 36], [5, 8, 37], [5, 8, 40], [5, 8, 41], [5, 8, 45], [5, 9, 10], [5, 9, 18], [5, 9, 24], [5, 9, 28], [5, 9, 33], [5, 9, 42], [5, 9, 44], [5, 10, 11], [5, 10, 14], [5, 10, 15], [5, 10, 23], [5, 10, 25], [5, 10, 26], [5, 10, 28], [5, 10, 33], [5, 10, 38], [5, 10, 40], [5, 10, 42], [5, 11, 25], [5, 11, 28], [5, 11, 40], [5, 12, 15], [5, 12, 36], [5, 12, 40], [5, 13, 15], [5, 13, 30], [5, 13, 38], [5, 15, 17], [5, 15, 24], [5, 15, 28], [5, 15, 29], [5, 15, 32], [5, 15, 33], [5, 15, 38], [5, 15, 40], [5, 15, 41], [5, 15, 44], [5, 16, 19], [5, 16, 25], [5, 16, 33], [5, 16, 36], [5, 16, 39], [5, 16, 43], [5, 16, 44], [5, 17, 19], [5, 17, 37], [5, 17, 45], [5, 18, 24], [5, 18, 26], [5, 18, 27], [5, 18, 29], [5, 18, 39], [5, 18, 44], [5, 19, 29], [5, 19, 32], [5, 19, 33], [5, 19, 35], [5, 19, 37], [5, 19, 40], [5, 20, 29], [5, 20, 32], [5, 20, 38], [5, 21, 28], [5, 21, 31], [5, 21, 32], [5, 22, 24], [5, 22, 27], [5, 22, 30], [5, 22, 40], [5, 23, 29], [5, 23, 31], [5, 23, 32], [5, 23, 37], [5, 23, 39], [5, 23, 41], [5, 23, 42], [5, 23, 44], [5, 24, 26], [5, 24, 28], [5, 24, 31], [5, 24, 36], [5, 24, 38], [5, 24, 41], [5, 24, 43], [5, 24, 45], [5, 25, 33], [5, 25, 35], [5, 25, 42], [5, 26, 28], [5, 26, 32], [5, 26, 33], [5, 26, 36], [5, 26, 37], [5, 26, 40], [5, 28, 35], [5, 28, 38], [5, 28, 40], [5, 29, 38], [5, 30, 32], [5, 30, 37], [5, 30, 40], [5, 31, 33], [5, 31, 37], [5, 31, 38], [5, 32, 36], [5, 32, 38], [5, 33, 34], [5, 33, 35], [5, 33, 36], [5, 33, 37], [5, 33, 41], [5, 33, 43], [5, 33, 45], [5, 35, 36], [5, 35, 37], [5, 35, 39], [5, 35, 41], [5, 36, 37], [5, 36, 38], [5, 36, 39], [5, 36, 40], [5, 36, 41], [5, 36, 45], [5, 37, 43], [5, 37, 44], [5, 38, 40], [5, 38, 43], [5, 39, 41], [5, 39, 42], [5, 39, 44], [5, 40, 42], [5, 40, 43], [5, 40, 44], [5, 41, 42], [5, 41, 44], [5, 43, 44], [6, 7, 8], [6, 7, 23], [6, 7, 27], [6, 7, 29], [6, 8, 9], [6, 8, 10], [6, 8, 12], [6, 8, 15], [6, 8, 19], [6, 8, 20], [6, 8, 24], [6, 8, 25], [6, 8, 27], [6, 8, 29], [6, 8, 32], [6, 8, 34], [6, 8, 41], [6, 8, 44], [6, 9, 12], [6, 9, 13], [6, 9, 14], [6, 9, 20], [6, 9, 26], [6, 9, 27], [6, 9, 29], [6, 9, 34], [6, 9, 36], [6, 9, 38], [6, 9, 42], [6, 9, 43], [6, 9, 44], [6, 9, 45], [6, 10, 13], [6, 10, 23], [6, 10, 24], [6, 10, 27], [6, 10, 33], [6, 10, 45], [6, 11, 12], [6, 11, 35], [6, 12, 16], [6, 13, 18], [6, 13, 19], [6, 13, 26], [6, 13, 33], [6, 13, 34], [6, 13, 45], [6, 14, 29], [6, 14, 32], [6, 14, 33], [6, 14, 45], [6, 15, 27], [6, 15, 29], [6, 15, 45], [6, 16, 22], [6, 16, 26], [6, 16, 35], [6, 16, 36], [6, 16, 44], [6, 17, 24], [6, 17, 25], [6, 17, 36], [6, 17, 41], [6, 17, 42], [6, 18, 20], [6, 18, 23], [6, 18, 27], [6, 18, 41], [6, 18, 44], [6, 19, 22], [6, 19, 27], [6, 19, 29], [6, 19, 37], [6, 20, 22], [6, 20, 25], [6, 20, 34], [6, 20, 35], [6, 20, 43], [6, 20, 45], [6, 21, 24], [6, 21, 25], [6, 21, 28], [6, 21, 44], [6, 22, 27], [6, 22, 33], [6, 22, 42], [6, 23, 26], [6, 23, 27], [6, 23, 29], [6, 23, 33], [6, 23, 41], [6, 23, 43], [6, 23, 44], [6, 23, 45], [6, 24, 26], [6, 24, 29], [6, 24, 31], [6, 24, 33], [6, 24, 43], [6, 24, 45], [6, 25, 27], [6, 25, 29], [6, 25, 30], [6, 25, 36], [6, 25, 39], [6, 25, 41], [6, 25, 42], [6, 25, 45], [6, 26, 31], [6, 26, 32], [6, 26, 35], [6, 26, 42], [6, 27, 29], [6, 27, 30], [6, 27, 33], [6, 27, 34], [6, 27, 36], [6, 27, 45], [6, 28, 29], [6, 28, 31], [6, 28, 37], [6, 28, 43], [6, 29, 31], [6, 29, 32], [6, 29, 33], [6, 29, 34], [6, 29, 35], [6, 29, 40], [6, 29, 44], [6, 30, 33], [6, 30, 36], [6, 30, 42], [6, 30, 44], [6, 30, 45], [6, 31, 42], [6, 32, 33], [6, 32, 41], [6, 32, 42], [6, 32, 43], [6, 32, 45], [6, 33, 35], [6, 33, 36], [6, 33, 37], [6, 33, 41], [6, 33, 42], [6, 33, 43], [6, 33, 45], [6, 34, 36], [6, 34, 43], [6, 36, 40], [6, 37, 42], [6, 37, 44], [6, 38, 42], [6, 39, 42], [6, 40, 44], [6, 41, 42], [6, 41, 44], [6, 44, 45], [7, 8, 12], [7, 8, 25], [7, 8, 26], [7, 8, 28], [7, 8, 35], [7, 8, 40], [7, 9, 16], [7, 9, 21], [7, 9, 30], [7, 9, 40], [7, 9, 41], [7, 9, 44], [7, 9, 45], [7, 10, 11], [7, 10, 14], [7, 10, 18], [7, 10, 20], [7, 10, 24], [7, 10, 27], [7, 10, 30], [7, 10, 32], [7, 10, 37], [7, 10, 39], [7, 10, 43], [7, 10, 45], [7, 11, 14], [7, 11, 15], [7, 11, 19], [7, 11, 25], [7, 11, 30], [7, 11, 34], [7, 11, 36], [7, 11, 39], [7, 11, 40], [7, 12, 17], [7, 12, 20], [7, 12, 30], [7, 12, 44], [7, 13, 14], [7, 13, 22], [7, 13, 23], [7, 13, 32], [7, 13, 34], [7, 14, 18], [7, 14, 19], [7, 14, 21], [7, 14, 25], [7, 14, 27], [7, 14, 29], [7, 14, 30], [7, 14, 41], [7, 14, 43], [7, 14, 45], [7, 15, 17], [7, 15, 29], [7, 15, 35], [7, 15, 41], [7, 16, 22], [7, 16, 30], [7, 16, 32], [7, 16, 39], [7, 16, 43], [7, 17, 21], [7, 17, 25], [7, 17, 27], [7, 17, 31], [7, 17, 34], [7, 17, 37], [7, 17, 41], [7, 17, 42], [7, 17, 43], [7, 19, 20], [7, 19, 34], [7, 21, 22], [7, 21, 25], [7, 21, 26], [7, 21, 28], [7, 21, 37], [7, 21, 40], [7, 21, 42], [7, 21, 45], [7, 22, 30], [7, 22, 45], [7, 23, 25], [7, 23, 30], [7, 23, 31], [7, 23, 38], [7, 23, 40], [7, 23, 41], [7, 24, 26], [7, 24, 32], [7, 25, 27], [7, 25, 30], [7, 25, 31], [7, 25, 32], [7, 25, 41], [7, 26, 31], [7, 26, 32], [7, 26, 41], [7, 27, 28], [7, 27, 31], [7, 27, 32], [7, 27, 34], [7, 28, 31], [7, 28, 32], [7, 28, 34], [7, 29, 37], [7, 29, 41], [7, 29, 45], [7, 30, 31], [7, 30, 32], [7, 30, 42], [7, 31, 32], [7, 31, 42], [7, 31, 43], [7, 31, 44], [7, 31, 45], [7, 32, 38], [7, 33, 42], [7, 34, 43], [7, 34, 44], [7, 35, 41], [7, 35, 42], [7, 35, 43], [7, 35, 44], [7, 35, 45], [7, 36, 44], [7, 36, 45], [7, 38, 42], [7, 38, 43], [7, 38, 45], [7, 40, 42], [7, 40, 45], [7, 42, 43], [7, 42, 44], [7, 43, 45], [8, 9, 11], [8, 9, 13], [8, 9, 14], [8, 9, 15], [8, 9, 23], [8, 9, 26], [8, 9, 30], [8, 9, 31], [8, 9, 34], [8, 9, 35], [8, 9, 36], [8, 9, 37], [8, 9, 38], [8, 9, 39], [8, 9, 41], [8, 9, 42], [8, 9, 43], [8, 9, 45], [8, 10, 17], [8, 10, 22], [8, 10, 25], [8, 10, 26], [8, 10, 29], [8, 10, 39], [8, 11, 20], [8, 11, 23], [8, 11, 24], [8, 11, 27], [8, 11, 29], [8, 11, 31], [8, 11, 32], [8, 11, 34], [8, 11, 35], [8, 11, 40], [8, 11, 42], [8, 12, 14], [8, 12, 15], [8, 12, 16], [8, 12, 17], [8, 12, 18], [8, 12, 20], [8, 12, 22], [8, 12, 23], [8, 12, 25], [8, 12, 26], [8, 12, 27], [8, 12, 28], [8, 12, 30], [8, 12, 32], [8, 12, 34], [8, 12, 37], [8, 12, 38], [8, 12, 39], [8, 12, 40], [8, 12, 41], [8, 12, 45], [8, 13, 17], [8, 13, 21], [8, 13, 41], [8, 14, 20], [8, 14, 24], [8, 14, 26], [8, 14, 41], [8, 14, 42], [8, 14, 43], [8, 15, 24], [8, 15, 26], [8, 15, 32], [8, 15, 36], [8, 15, 40], [8, 15, 42], [8, 16, 20], [8, 16, 22], [8, 16, 23], [8, 16, 24], [8, 16, 27], [8, 16, 28], [8, 16, 33], [8, 16, 35], [8, 16, 39], [8, 16, 40], [8, 17, 25], [8, 17, 28], [8, 17, 41], [8, 18, 26], [8, 18, 36], [8, 18, 41], [8, 19, 23], [8, 19, 24], [8, 19, 26], [8, 19, 29], [8, 20, 24], [8, 20, 26], [8, 20, 28], [8, 20, 31], [8, 20, 32], [8, 20, 40], [8, 21, 26], [8, 21, 32], [8, 21, 41], [8, 21, 42], [8, 21, 43], [8, 22, 27], [8, 22, 29], [8, 22, 30], [8, 22, 34], [8, 22, 37], [8, 22, 40], [8, 22, 43], [8, 22, 44], [8, 22, 45], [8, 23, 28], [8, 23, 29], [8, 23, 30], [8, 23, 32], [8, 23, 34], [8, 23, 37], [8, 24, 25], [8, 24, 26], [8, 24, 30], [8, 24, 32], [8, 25, 26], [8, 26, 33], [8, 26, 35], [8, 26, 39], [8, 26, 40], [8, 26, 41], [8, 26, 42], [8, 27, 28], [8, 28, 41], [8, 28, 44], [8, 29, 37], [8, 29, 39], [8, 29, 41], [8, 30, 36], [8, 31, 32], [8, 31, 37], [8, 31, 39], [8, 31, 40], [8, 32, 38], [8, 32, 40], [8, 32, 41], [8, 32, 44], [8, 33, 43], [8, 34, 35], [8, 34, 38], [8, 34, 42], [8, 37, 38], [8, 37, 42], [8, 37, 44], [8, 38, 43], [8, 40, 41], [8, 40, 42], [8, 41, 42], [8, 42, 44], [8, 42, 45], [9, 10, 17], [9, 10, 18], [9, 10, 19], [9, 10, 20], [9, 10, 23], [9, 10, 42], [9, 10, 43], [9, 11, 25], [9, 11, 29], [9, 11, 33], [9, 11, 34], [9, 11, 40], [9, 11, 45], [9, 12, 17], [9, 12, 18], [9, 12, 22], [9, 12, 32], [9, 12, 33], [9, 12, 42], [9, 13, 14], [9, 13, 16], [9, 13, 17], [9, 13, 22], [9, 13, 23], [9, 13, 29], [9, 13, 30], [9, 13, 36], [9, 13, 40], [9, 13, 44], [9, 14, 19], [9, 14, 24], [9, 14, 32], [9, 14, 37], [9, 14, 39], [9, 14, 40], [9, 14, 45], [9, 15, 18], [9, 15, 24], [9, 15, 32], [9, 15, 35], [9, 15, 41], [9, 15, 44], [9, 15, 45], [9, 16, 18], [9, 16, 20], [9, 16, 22], [9, 16, 30], [9, 16, 31], [9, 16, 33], [9, 16, 39], [9, 16, 42], [9, 17, 20], [9, 17, 23], [9, 17, 27], [9, 17, 40], [9, 17, 41], [9, 18, 31], [9, 18, 39], [9, 18, 41], [9, 18, 45], [9, 19, 21], [9, 19, 24], [9, 19, 26], [9, 19, 27], [9, 19, 28], [9, 19, 29], [9, 19, 31], [9, 19, 32], [9, 19, 37], [9, 19, 38], [9, 19, 43], [9, 19, 44], [9, 19, 45], [9, 20, 23], [9, 20, 31], [9, 20, 32], [9, 20, 35], [9, 20, 40], [9, 20, 42], [9, 21, 23], [9, 21, 24], [9, 21, 38], [9, 21, 39], [9, 21, 44], [9, 21, 45], [9, 22, 23], [9, 22, 26], [9, 22, 28], [9, 22, 29], [9, 22, 32], [9, 22, 39], [9, 22, 40], [9, 22, 41], [9, 22, 43], [9, 23, 27], [9, 23, 30], [9, 23, 31], [9, 23, 36], [9, 23, 41], [9, 23, 42], [9, 24, 26], [9, 24, 28], [9, 24, 35], [9, 24, 37], [9, 24, 39], [9, 24, 40], [9, 24, 42], [9, 25, 38], [9, 26, 32], [9, 26, 34], [9, 26, 36], [9, 26, 39], [9, 27, 28], [9, 27, 30], [9, 27, 33], [9, 28, 29], [9, 28, 32], [9, 28, 37], [9, 28, 42], [9, 28, 44], [9, 29, 30], [9, 29, 35], [9, 29, 36], [9, 29, 42], [9, 29, 44], [9, 30, 32], [9, 30, 38], [9, 30, 45], [9, 31, 36], [9, 31, 37], [9, 31, 42], [9, 31, 43], [9, 32, 34], [9, 32, 41], [9, 32, 45], [9, 33, 35], [9, 34, 44], [9, 35, 36], [9, 35, 44], [9, 37, 41], [9, 37, 43], [9, 37, 45], [9, 38, 40], [9, 38, 41], [9, 38, 42], [9, 39, 40], [9, 39, 42], [9, 40, 44], [9, 42, 45], [9, 43, 44], [9, 44, 45], [10, 11, 13], [10, 11, 16], [10, 11, 17], [10, 11, 30], [10, 11, 33], [10, 11, 40], [10, 11, 43], [10, 12, 17], [10, 12, 23], [10, 12, 30], [10, 12, 32], [10, 12, 34], [10, 12, 36], [10, 12, 37], [10, 12, 41], [10, 13, 14], [10, 13, 17], [10, 13, 20], [10, 13, 30], [10, 14, 17], [10, 14, 26], [10, 14, 34], [10, 14, 41], [10, 15, 28], [10, 15, 31], [10, 15, 40], [10, 15, 45], [10, 16, 21], [10, 16, 22], [10, 16, 23], [10, 16, 30], [10, 17, 20], [10, 17, 24], [10, 17, 25], [10, 17, 26], [10, 17, 28], [10, 17, 36], [10, 17, 39], [10, 17, 40], [10, 17, 41], [10, 17, 45], [10, 18, 33], [10, 19, 26], [10, 19, 30], [10, 19, 36], [10, 19, 41], [10, 20, 22], [10, 20, 29], [10, 20, 37], [10, 21, 23], [10, 21, 24], [10, 21, 26], [10, 21, 28], [10, 21, 32], [10, 21, 33], [10, 21, 44], [10, 22, 26], [10, 22, 38], [10, 22, 41], [10, 22, 45], [10, 23, 34], [10, 23, 38], [10, 23, 41], [10, 23, 45], [10, 24, 30], [10, 24, 34], [10, 25, 28], [10, 25, 30], [10, 25, 32], [10, 25, 38], [10, 25, 39], [10, 25, 42], [10, 25, 43], [10, 25, 45], [10, 26, 27], [10, 26, 30], [10, 26, 42], [10, 26, 45], [10, 27, 30], [10, 27, 32], [10, 27, 34], [10, 27, 36], [10, 27, 44], [10, 28, 29], [10, 28, 32], [10, 28, 35], [10, 28, 43], [10, 29, 30], [10, 29, 36], [10, 29, 39], [10, 30, 40], [10, 30, 41], [10, 30, 45], [10, 31, 38], [10, 32, 39], [10, 33, 34], [10, 33, 39], [10, 33, 43], [10, 34, 39], [10, 35, 44], [10, 35, 45], [10, 36, 43], [10, 36, 45], [10, 37, 42], [10, 37, 44], [10, 37, 45], [10, 38, 39], [10, 39, 45], [10, 42, 45], [10, 43, 45], [11, 12, 17], [11, 12, 22], [11, 12, 28], [11, 12, 30], [11, 12, 34], [11, 12, 40], [11, 12, 41], [11, 12, 43], [11, 13, 27], [11, 13, 39], [11, 13, 41], [11, 14, 20], [11, 14, 24], [11, 14, 25], [11, 14, 34], [11, 14, 40], [11, 14, 42], [11, 14, 44], [11, 15, 19], [11, 15, 22], [11, 15, 27], [11, 15, 29], [11, 15, 30], [11, 15, 33], [11, 15, 38], [11, 16, 20], [11, 16, 23], [11, 16, 30], [11, 16, 34], [11, 16, 42], [11, 17, 32], [11, 17, 41], [11, 17, 42], [11, 17, 43], [11, 18, 25], [11, 18, 30], [11, 18, 32], [11, 18, 33], [11, 18, 34], [11, 18, 44], [11, 19, 23], [11, 19, 30], [11, 19, 33], [11, 19, 37], [11, 19, 38], [11, 19, 40], [11, 19, 42], [11, 19, 44], [11, 20, 24], [11, 20, 30], [11, 20, 34], [11, 20, 36], [11, 20, 38], [11, 20, 40], [11, 21, 29], [11, 21, 40], [11, 22, 23], [11, 22, 27], [11, 22, 31], [11, 22, 33], [11, 22, 34], [11, 22, 40], [11, 22, 43], [11, 22, 45], [11, 23, 27], [11, 23, 31], [11, 23, 33], [11, 23, 41], [11, 24, 25], [11, 24, 31], [11, 24, 34], [11, 24, 43], [11, 25, 37], [11, 25, 38], [11, 25, 42], [11, 25, 43], [11, 26, 30], [11, 26, 32], [11, 26, 42], [11, 27, 30], [11, 27, 34], [11, 27, 42], [11, 27, 43], [11, 27, 45], [11, 28, 31], [11, 28, 38], [11, 29, 34], [11, 29, 35], [11, 29, 37], [11, 29, 40], [11, 30, 36], [11, 30, 37], [11, 31, 45], [11, 32, 34], [11, 32, 41], [11, 32, 42], [11, 32, 43], [11, 33, 34], [11, 33, 36], [11, 33, 41], [11, 33, 45], [11, 34, 36], [11, 34, 37], [11, 34, 38], [11, 34, 39], [11, 34, 40], [11, 34, 45], [11, 35, 38], [11, 36, 41], [11, 36, 42], [11, 36, 44], [11, 37, 38], [11, 37, 44], [11, 38, 40], [11, 39, 40], [11, 40, 42], [11, 40, 43], [11, 40, 44], [11, 40, 45], [12, 13, 14], [12, 13, 16], [12, 13, 23], [12, 13, 26], [12, 13, 27], [12, 13, 28], [12, 13, 30], [12, 14, 19], [12, 14, 29], [12, 14, 31], [12, 14, 36], [12, 15, 31], [12, 15, 33], [12, 15, 35], [12, 16, 17], [12, 16, 25], [12, 16, 27], [12, 16, 31], [12, 16, 32], [12, 16, 33], [12, 16, 35], [12, 16, 36], [12, 17, 27], [12, 17, 30], [12, 17, 38], [12, 18, 33], [12, 18, 36], [12, 18, 37], [12, 18, 44], [12, 18, 45], [12, 19, 30], [12, 19, 38], [12, 20, 22], [12, 20, 32], [12, 20, 37], [12, 20, 40], [12, 20, 43], [12, 21, 22], [12, 21, 23], [12, 21, 28], [12, 21, 33], [12, 21, 42], [12, 21, 44], [12, 22, 27], [12, 22, 29], [12, 22, 35], [12, 22, 38], [12, 22, 39], [12, 22, 43], [12, 22, 45], [12, 23, 24], [12, 23, 25], [12, 23, 29], [12, 23, 33], [12, 23, 38], [12, 23, 40], [12, 23, 41], [12, 25, 28], [12, 25, 30], [12, 26, 32], [12, 26, 37], [12, 27, 31], [12, 27, 34], [12, 27, 42], [12, 28, 29], [12, 28, 31], [12, 28, 33], [12, 28, 37], [12, 29, 30], [12, 30, 33], [12, 30, 35], [12, 31, 36], [12, 31, 37], [12, 31, 45], [12, 33, 34], [12, 33, 35], [12, 33, 37], [12, 33, 43], [12, 34, 39], [12, 35, 36], [12, 35, 39], [12, 35, 44], [12, 36, 38], [12, 37, 42], [12, 37, 43], [12, 37, 44], [12, 38, 39], [12, 38, 44], [12, 43, 45], [13, 14, 23], [13, 14, 29], [13, 14, 31], [13, 15, 19], [13, 15, 20], [13, 15, 22], [13, 15, 30], [13, 15, 32], [13, 16, 17], [13, 16, 20], [13, 16, 21], [13, 16, 22], [13, 16, 34], [13, 16, 39], [13, 16, 40], [13, 16, 41], [13, 16, 42], [13, 17, 24], [13, 17, 26], [13, 17, 30], [13, 17, 35], [13, 17, 37], [13, 17, 38], [13, 18, 36], [13, 18, 43], [13, 19, 21], [13, 19, 23], [13, 19, 24], [13, 19, 29], [13, 19, 30], [13, 19, 34], [13, 19, 39], [13, 19, 41], [13, 19, 44], [13, 20, 26], [13, 20, 34], [13, 21, 27], [13, 21, 28], [13, 21, 31], [13, 21, 35], [13, 21, 36], [13, 21, 38], [13, 21, 41], [13, 22, 41], [13, 22, 43], [13, 23, 25], [13, 23, 27], [13, 23, 29], [13, 23, 30], [13, 23, 33], [13, 23, 34], [13, 23, 37], [13, 23, 41], [13, 23, 42], [13, 24, 30], [13, 24, 31], [13, 24, 43], [13, 25, 30], [13, 25, 39], [13, 25, 40], [13, 26, 41], [13, 26, 42], [13, 26, 45], [13, 27, 33], [13, 27, 35], [13, 27, 36], [13, 27, 39], [13, 28, 33], [13, 28, 35], [13, 29, 32], [13, 29, 45], [13, 30, 32], [13, 30, 34], [13, 30, 37], [13, 30, 42], [13, 30, 44], [13, 31, 40], [13, 34, 35], [13, 34, 37], [13, 35, 36], [13, 35, 37], [13, 35, 41], [13, 35, 42], [13, 35, 44], [13, 36, 39], [13, 36, 43], [13, 37, 42], [13, 37, 44], [13, 38, 44], [13, 39, 44], [13, 41, 43], [13, 42, 43], [13, 42, 44], [13, 43, 44], [14, 16, 20], [14, 16, 22], [14, 16, 23], [14, 16, 26], [14, 16, 30], [14, 16, 32], [14, 16, 33], [14, 16, 34], [14, 16, 41], [14, 17, 23], [14, 17, 25], [14, 17, 28], [14, 17, 29], [14, 17, 34], [14, 17, 43], [14, 18, 19], [14, 18, 25], [14, 18, 33], [14, 18, 38], [14, 18, 40], [14, 18, 41], [14, 18, 43], [14, 18, 45], [14, 19, 29], [14, 19, 32], [14, 19, 33], [14, 19, 42], [14, 20, 21], [14, 20, 26], [14, 20, 27], [14, 20, 29], [14, 20, 32], [14, 20, 41], [14, 20, 45], [14, 21, 24], [14, 21, 28], [14, 21, 33], [14, 21, 42], [14, 22, 29], [14, 22, 42], [14, 23, 24], [14, 23, 27], [14, 23, 29], [14, 23, 41], [14, 24, 29], [14, 24, 30], [14, 24, 38], [14, 24, 43], [14, 25, 38], [14, 25, 41], [14, 25, 42], [14, 26, 29], [14, 27, 41], [14, 28, 33], [14, 28, 38], [14, 28, 42], [14, 28, 43], [14, 28, 44], [14, 29, 38], [14, 29, 39], [14, 29, 41], [14, 29, 42], [14, 29, 43], [14, 30, 35], [14, 31, 35], [14, 31, 43], [14, 32, 43], [14, 32, 44], [14, 34, 36], [14, 34, 39], [14, 36, 41], [14, 37, 43], [14, 37, 44], [14, 38, 41], [14, 38, 44], [14, 41, 43], [14, 41, 44], [14, 41, 45], [14, 42, 43], [15, 16, 18], [15, 16, 23], [15, 16, 27], [15, 16, 33], [15, 16, 35], [15, 16, 36], [15, 16, 40], [15, 16, 44], [15, 17, 20], [15, 17, 22], [15, 17, 28], [15, 17, 32], [15, 18, 20], [15, 18, 25], [15, 18, 29], [15, 18, 30], [15, 18, 31], [15, 18, 33], [15, 18, 37], [15, 18, 38], [15, 18, 43], [15, 19, 20], [15, 19, 29], [15, 19, 31], [15, 19, 32], [15, 19, 33], [15, 19, 35], [15, 20, 32], [15, 20, 37], [15, 20, 40], [15, 20, 45], [15, 21, 24], [15, 21, 37], [15, 21, 40], [15, 21, 42], [15, 22, 29], [15, 22, 30], [15, 22, 31], [15, 23, 24], [15, 23, 27], [15, 23, 30], [15, 23, 33], [15, 23, 36], [15, 24, 26], [15, 24, 34], [15, 25, 27], [15, 25, 38], [15, 25, 40], [15, 25, 44], [15, 26, 29], [15, 26, 32], [15, 26, 38], [15, 27, 28], [15, 27, 31], [15, 27, 36], [15, 27, 37], [15, 27, 38], [15, 27, 39], [15, 27, 44], [15, 28, 32], [15, 28, 35], [15, 28, 38], [15, 28, 44], [15, 29, 31], [15, 29, 32], [15, 29, 33], [15, 29, 36], [15, 29, 41], [15, 30, 32], [15, 30, 34], [15, 30, 35], [15, 30, 36], [15, 30, 40], [15, 30, 41], [15, 30, 42], [15, 31, 36], [15, 31, 37], [15, 31, 39], [15, 31, 44], [15, 31, 45], [15, 32, 37], [15, 32, 38], [15, 33, 34], [15, 33, 36], [15, 33, 42], [15, 33, 44], [15, 36, 43], [15, 36, 45], [15, 37, 41], [15, 38, 39], [15, 38, 40], [15, 38, 42], [15, 38, 44], [15, 39, 45], [15, 40, 45], [15, 41, 45], [15, 44, 45], [16, 17, 18], [16, 17, 21], [16, 17, 27], [16, 17, 35], [16, 18, 22], [16, 18, 33], [16, 18, 36], [16, 18, 40], [16, 18, 41], [16, 19, 26], [16, 19, 28], [16, 19, 30], [16, 20, 21], [16, 20, 22], [16, 20, 34], [16, 20, 37], [16, 20, 38], [16, 20, 45], [16, 21, 38], [16, 21, 40], [16, 21, 45], [16, 22, 24], [16, 22, 25], [16, 22, 26], [16, 22, 27], [16, 22, 32], [16, 22, 33], [16, 22, 35], [16, 22, 41], [16, 22, 45], [16, 23, 28], [16, 23, 37], [16, 24, 31], [16, 24, 34], [16, 25, 28], [16, 25, 32], [16, 26, 27], [16, 26, 32], [16, 26, 35], [16, 26, 37], [16, 27, 30], [16, 27, 32], [16, 28, 29], [16, 28, 31], [16, 28, 32], [16, 28, 33], [16, 28, 45], [16, 29, 32], [16, 29, 37], [16, 29, 39], [16, 29, 43], [16, 30, 32], [16, 30, 33], [16, 30, 35], [16, 30, 39], [16, 31, 33], [16, 31, 42], [16, 31, 45], [16, 32, 35], [16, 32, 36], [16, 32, 37], [16, 32, 40], [16, 32, 42], [16, 32, 44], [16, 33, 34], [16, 33, 37], [16, 34, 41], [16, 35, 41], [16, 35, 42], [16, 35, 44], [16, 37, 42], [16, 38, 42], [16, 38, 43], [16, 43, 44], [17, 18, 37], [17, 19, 26], [17, 19, 29], [17, 19, 31], [17, 19, 33], [17, 19, 39], [17, 20, 21], [17, 20, 22], [17, 20, 23], [17, 20, 25], [17, 21, 28], [17, 21, 35], [17, 21, 38], [17, 21, 41], [17, 21, 42], [17, 21, 43], [17, 22, 29], [17, 22, 32], [17, 22, 38], [17, 22, 41], [17, 22, 42], [17, 22, 44], [17, 23, 26], [17, 23, 31], [17, 23, 33], [17, 24, 28], [17, 24, 32], [17, 24, 33], [17, 24, 34], [17, 24, 38], [17, 24, 42], [17, 24, 43], [17, 25, 29], [17, 25, 32], [17, 26, 32], [17, 26, 33], [17, 26, 34], [17, 26, 44], [17, 27, 30], [17, 27, 41], [17, 27, 42], [17, 28, 31], [17, 28, 32], [17, 28, 34], [17, 28, 38], [17, 29, 36], [17, 29, 37], [17, 29, 41], [17, 29, 42], [17, 30, 39], [17, 31, 35], [17, 31, 41], [17, 32, 36], [17, 32, 38], [17, 32, 40], [17, 32, 43], [17, 33, 37], [17, 33, 39], [17, 33, 43], [17, 34, 40], [17, 35, 37], [17, 38, 39], [17, 38, 40], [17, 38, 42], [17, 39, 41], [17, 40, 41], [17, 40, 42], [17, 40, 45], [18, 19, 20], [18, 19, 35], [18, 19, 36], [18, 19, 37], [18, 19, 41], [18, 19, 43], [18, 20, 29], [18, 20, 37], [18, 20, 39], [18, 20, 41], [18, 21, 24], [18, 21, 30], [18, 21, 45], [18, 22, 27], [18, 22, 32], [18, 22, 33], [18, 22, 36], [18, 22, 37], [18, 22, 40], [18, 22, 41], [18, 23, 24], [18, 23, 31], [18, 23, 33], [18, 23, 38], [18, 23, 42], [18, 24, 28], [18, 24, 35], [18, 24, 43], [18, 25, 29], [18, 25, 36], [18, 25, 40], [18, 25, 41], [18, 25, 42], [18, 25, 43], [18, 26, 28], [18, 27, 30], [18, 27, 34], [18, 27, 35], [18, 27, 37], [18, 27, 38], [18, 27, 44], [18, 28, 29], [18, 28, 33], [18, 28, 41], [18, 28, 44], [18, 29, 40], [18, 29, 41], [18, 29, 45], [18, 30, 33], [18, 30, 35], [18, 31, 35], [18, 32, 42], [18, 33, 35], [18, 33, 39], [18, 33, 41], [18, 33, 43], [18, 34, 36], [18, 34, 37], [18, 35, 36], [18, 35, 41], [18, 36, 38], [18, 36, 45], [18, 37, 41], [18, 38, 39], [18, 38, 40], [18, 38, 42], [18, 40, 44], [18, 41, 44], [19, 20, 22], [19, 20, 27], [19, 20, 29], [19, 20, 31], [19, 20, 36], [19, 20, 37], [19, 21, 28], [19, 21, 38], [19, 22, 26], [19, 22, 27], [19, 22, 33], [19, 22, 38], [19, 22, 41], [19, 22, 45], [19, 23, 26], [19, 23, 40], [19, 24, 25], [19, 24, 28], [19, 24, 29], [19, 24, 35], [19, 24, 38], [19, 25, 30], [19, 25, 35], [19, 25, 40], [19, 26, 29], [19, 26, 32], [19, 26, 38], [19, 27, 32], [19, 27, 33], [19, 27, 36], [19, 27, 37], [19, 27, 38], [19, 27, 39], [19, 28, 29], [19, 28, 35], [19, 28, 39], [19, 28, 40], [19, 29, 30], [19, 29, 34], [19, 29, 37], [19, 29, 38], [19, 29, 41], [19, 29, 44], [19, 30, 32], [19, 31, 32], [19, 31, 37], [19, 31, 41], [19, 32, 39], [19, 32, 44], [19, 33, 37], [19, 35, 36], [19, 35, 37], [19, 35, 44], [19, 36, 37], [19, 36, 40], [19, 36, 41], [19, 38, 39], [19, 38, 45], [19, 39, 42], [19, 39, 45], [20, 21, 23], [20, 21, 27], [20, 21, 28], [20, 21, 31], [20, 21, 35], [20, 21, 36], [20, 21, 38], [20, 21, 42], [20, 21, 43], [20, 22, 31], [20, 22, 32], [20, 22, 35], [20, 22, 39], [20, 22, 45], [20, 23, 25], [20, 23, 33], [20, 23, 41], [20, 24, 26], [20, 24, 29], [20, 24, 35], [20, 25, 26], [20, 25, 27], [20, 25, 30], [20, 25, 35], [20, 25, 42], [20, 25, 44], [20, 26, 34], [20, 27, 29], [20, 27, 30], [20, 27, 34], [20, 27, 45], [20, 28, 29], [20, 28, 31], [20, 28, 33], [20, 28, 34], [20, 28, 42], [20, 28, 45], [20, 29, 30], [20, 29, 32], [20, 29, 37], [20, 29, 40], [20, 30, 32], [20, 30, 42], [20, 30, 43], [20, 31, 39], [20, 34, 36], [20, 34, 38], [20, 34, 39], [20, 37, 41], [20, 37, 44], [20, 38, 39], [20, 39, 40], [20, 39, 43], [20, 43, 45], [21, 22, 29], [21, 22, 40], [21, 22, 43], [21, 22, 45], [21, 23, 28], [21, 23, 29], [21, 23, 35], [21, 23, 36], [21, 23, 37], [21, 23, 38], [21, 23, 41], [21, 23, 42], [21, 24, 25], [21, 24, 28], [21, 24, 32], [21, 24, 34], [21, 24, 35], [21, 24, 38], [21, 25, 28], [21, 25, 31], [21, 25, 43], [21, 26, 28], [21, 27, 28], [21, 27, 30], [21, 28, 29], [21, 28, 30], [21, 28, 32], [21, 28, 33], [21, 28, 41], [21, 28, 44], [21, 29, 30], [21, 29, 36], [21, 29, 41], [21, 30, 31], [21, 30, 41], [21, 31, 34], [21, 31, 42], [21, 33, 43], [21, 33, 44], [21, 33, 45], [21, 34, 39], [21, 34, 40], [21, 36, 42], [21, 37, 39], [21, 39, 42], [21, 40, 43], [21, 41, 45], [21, 42, 43], [21, 42, 44], [21, 43, 45], [22, 23, 26], [22, 23, 27], [22, 23, 28], [22, 23, 31], [22, 23, 33], [22, 23, 39], [22, 23, 40], [22, 23, 41], [22, 23, 45], [22, 24, 25], [22, 24, 29], [22, 24, 39], [22, 24, 43], [22, 24, 45], [22, 25, 26], [22, 25, 27], [22, 25, 35], [22, 25, 39], [22, 26, 28], [22, 26, 32], [22, 27, 29], [22, 27, 32], [22, 27, 41], [22, 27, 45], [22, 28, 29], [22, 28, 30], [22, 29, 38], [22, 29, 41], [22, 29, 42], [22, 30, 31], [22, 30, 32], [22, 30, 33], [22, 31, 33], [22, 32, 37], [22, 32, 41], [22, 32, 43], [22, 33, 38], [22, 33, 39], [22, 33, 43], [22, 33, 44], [22, 34, 43], [22, 35, 44], [22, 35, 45], [22, 36, 43], [22, 39, 40], [22, 39, 42], [22, 39, 43], [22, 40, 41], [22, 40, 44], [22, 41, 44], [22, 41, 45], [22, 42, 44], [23, 24, 25], [23, 24, 26], [23, 24, 33], [23, 24, 34], [23, 24, 40], [23, 24, 41], [23, 24, 42], [23, 25, 26], [23, 25, 31], [23, 25, 34], [23, 26, 32], [23, 26, 34], [23, 26, 37], [23, 26, 38], [23, 26, 41], [23, 27, 30], [23, 27, 32], [23, 27, 37], [23, 27, 39], [23, 28, 31], [23, 28, 32], [23, 28, 41], [23, 29, 32], [23, 30, 31], [23, 30, 33], [23, 30, 39], [23, 30, 42], [23, 31, 32], [23, 31, 41], [23, 31, 42], [23, 32, 33], [23, 32, 35], [23, 32, 37], [23, 32, 41], [23, 32, 42], [23, 33, 38], [23, 33, 45], [23, 34, 37], [23, 35, 39], [23, 35, 41], [23, 35, 42], [23, 36, 42], [23, 37, 41], [23, 37, 44], [23, 38, 41], [23, 38, 44], [23, 39, 40], [23, 39, 41], [23, 40, 42], [23, 40, 43], [23, 41, 42], [24, 25, 28], [24, 25, 41], [24, 25, 42], [24, 25, 45], [24, 26, 27], [24, 26, 28], [24, 26, 31], [24, 26, 32], [24, 26, 33], [24, 26, 43], [24, 26, 44], [24, 27, 33], [24, 27, 38], [24, 27, 40], [24, 28, 29], [24, 28, 31], [24, 28, 33], [24, 28, 34], [24, 28, 41], [24, 28, 42], [24, 28, 43], [24, 28, 44], [24, 28, 45], [24, 29, 32], [24, 29, 36], [24, 29, 39], [24, 30, 37], [24, 30, 40], [24, 30, 42], [24, 30, 43], [24, 30, 44], [24, 31, 35], [24, 31, 37], [24, 31, 38], [24, 31, 41], [24, 31, 43], [24, 31, 45], [24, 32, 43], [24, 33, 43], [24, 34, 37], [24, 34, 43], [24, 35, 39], [24, 35, 41], [24, 35, 42], [24, 36, 42], [24, 36, 43], [24, 37, 39], [24, 37, 42], [24, 37, 43], [24, 38, 41], [24, 38, 43], [24, 39, 43], [24, 40, 45], [24, 42, 43], [25, 26, 28], [25, 26, 32], [25, 26, 35], [25, 26, 39], [25, 26, 41], [25, 26, 42], [25, 27, 28], [25, 27, 30], [25, 27, 33], [25, 27, 42], [25, 28, 31], [25, 28, 34], [25, 28, 35], [25, 28, 40], [25, 28, 41], [25, 29, 39], [25, 29, 41], [25, 30, 34], [25, 30, 35], [25, 30, 37], [25, 30, 38], [25, 30, 39], [25, 31, 35], [25, 31, 41], [25, 31, 42], [25, 32, 34], [25, 32, 35], [25, 32, 38], [25, 32, 39], [25, 32, 41], [25, 33, 37], [25, 33, 42], [25, 34, 42], [25, 34, 43], [25, 34, 45], [25, 36, 41], [25, 37, 40], [25, 38, 43], [25, 39, 41], [25, 40, 41], [25, 41, 42], [25, 41, 43], [25, 42, 44], [25, 43, 45], [26, 28, 38], [26, 28, 39], [26, 29, 32], [26, 29, 35], [26, 30, 37], [26, 30, 44], [26, 32, 37], [26, 32, 41], [26, 32, 43], [26, 32, 44], [26, 32, 45], [26, 34, 35], [26, 34, 37], [26, 34, 39], [26, 35, 36], [26, 35, 41], [26, 35, 44], [26, 35, 45], [26, 36, 38], [26, 38, 42], [26, 38, 44], [26, 39, 43], [26, 40, 44], [26, 40, 45], [26, 41, 43], [26, 41, 44], [27, 28, 31], [27, 28, 33], [27, 28, 34], [27, 29, 32], [27, 29, 39], [27, 31, 33], [27, 32, 33], [27, 32, 35], [27, 32, 36], [27, 32, 39], [27, 32, 41], [27, 32, 43], [27, 32, 44], [27, 33, 34], [27, 33, 42], [27, 34, 37], [27, 36, 42], [27, 37, 38], [27, 39, 41], [27, 39, 42], [27, 42, 44], [28, 29, 31], [28, 29, 32], [28, 29, 35], [28, 29, 37], [28, 29, 38], [28, 29, 41], [28, 29, 42], [28, 29, 45], [28, 30, 31], [28, 30, 37], [28, 30, 40], [28, 31, 35], [28, 31, 37], [28, 31, 40], [28, 31, 42], [28, 32, 33], [28, 32, 35], [28, 32, 39], [28, 32, 41], [28, 32, 42], [28, 32, 43], [28, 32, 44], [28, 33, 34], [28, 33, 43], [28, 34, 37], [28, 35, 36], [28, 35, 45], [28, 36, 37], [28, 36, 38], [28, 36, 43], [28, 37, 41], [28, 38, 41], [28, 39, 44], [28, 40, 42], [28, 40, 44], [28, 40, 45], [28, 41, 45], [28, 42, 44], [28, 44, 45], [29, 30, 32], [29, 30, 36], [29, 30, 40], [29, 31, 41], [29, 32, 34], [29, 32, 35], [29, 32, 41], [29, 33, 36], [29, 34, 41], [29, 34, 42], [29, 34, 43], [29, 35, 39], [29, 35, 41], [29, 35, 45], [29, 36, 42], [29, 36, 44], [29, 37, 42], [29, 37, 44], [29, 41, 43], [29, 42, 44], [29, 44, 45], [30, 31, 32], [30, 31, 35], [30, 31, 36], [30, 32, 36], [30, 32, 44], [30, 33, 40], [30, 35, 45], [30, 36, 40], [30, 37, 42], [30, 38, 42], [30, 40, 45], [30, 43, 44], [30, 44, 45], [31, 32, 35], [31, 32, 42], [31, 32, 44], [31, 33, 35], [31, 33, 39], [31, 33, 43], [31, 34, 41], [31, 35, 36], [31, 35, 41], [31, 35, 42], [31, 36, 39], [31, 36, 41], [31, 36, 42], [31, 37, 39], [31, 37, 45], [31, 38, 42], [31, 39, 42], [31, 42, 44], [31, 42, 45], [32, 34, 35], [32, 34, 37], [32, 35, 38], [32, 35, 39], [32, 35, 41], [32, 35, 42], [32, 35, 43], [32, 36, 37], [32, 36, 41], [32, 36, 44], [32, 37, 38], [32, 37, 42], [32, 38, 41], [32, 38, 45], [32, 39, 44], [32, 40, 44], [32, 41, 44], [32, 42, 43], [32, 42, 45], [32, 43, 45], [33, 34, 41], [33, 34, 45], [33, 35, 42], [33, 37, 39], [33, 38, 41], [33, 38, 43], [33, 38, 44], [33, 39, 42], [33, 39, 43], [33, 39, 45], [33, 41, 43], [33, 43, 44], [34, 35, 38], [34, 36, 38], [34, 36, 39], [34, 36, 43], [34, 37, 41], [34, 37, 42], [34, 37, 43], [34, 37, 44], [34, 38, 44], [35, 36, 38], [35, 37, 38], [35, 38, 42], [35, 39, 40], [35, 40, 41], [35, 40, 43], [36, 37, 39], [36, 38, 42], [37, 39, 42], [37, 42, 44], [38, 39, 45], [38, 40, 41], [38, 41, 42], [38, 42, 44], [38, 43, 45], [38, 44, 45], [39, 40, 42], [39, 40, 45], [39, 42, 43], [39, 42, 44], [40, 43, 45], [40, 44, 45], [41, 42, 44]] +import os +from dataclasses import dataclass -# frozenset 캐시 +import pandas as pd -_F_SUM6 = frozenset(ALLOW_SUM6) -_F_SUM6_DIFF = frozenset(ALLOW_SUM6_DIFF) -_F_AVG6 = frozenset(ALLOW_AVG6) -_F_AVG6_DIFF = frozenset(ALLOW_AVG6_DIFF) -_F_SUM3F = frozenset(ALLOW_SUM3F) -_F_SUM3F_DIFF = frozenset(ALLOW_SUM3F_DIFF) -_F_SUM3B = frozenset(ALLOW_SUM3B) -_F_SUM3B_DIFF = frozenset(ALLOW_SUM3B_DIFF) -_F_GO_SUM = frozenset(ALLOW_GO_SUM) -_F_GO_SUM_DIFF = frozenset(ALLOW_GO_SUM_DIFF) -_F_INTERVAL = frozenset(ALLOW_INTERVAL) -_F_INTERVAL_DIFF = frozenset(ALLOW_INTERVAL_DIFF) -_F_FIRST_LETTER = frozenset(ALLOW_FIRST_LETTER) -_F_FIRST_LETTER_DIFF = frozenset(ALLOW_FIRST_LETTER_DIFF) -_F_LAST_LETTER = frozenset(ALLOW_LAST_LETTER) -_F_LAST_LETTER_DIFF = frozenset(ALLOW_LAST_LETTER_DIFF) -_F_B0 = frozenset(ALLOW_B0) -_F_B0_DIFF = frozenset(ALLOW_B0_DIFF) -_F_B5 = frozenset(ALLOW_B5) -_F_B5_DIFF = frozenset(ALLOW_B5_DIFF) -_F_UNIQ_END = frozenset(ALLOW_UNIQ_END) -_F_UNIQ_END_DIFF = frozenset(ALLOW_UNIQ_END_DIFF) -_F_AC = frozenset(ALLOW_AC) -_F_AC_DIFF = frozenset(ALLOW_AC_DIFF) -_F_MUL3 = frozenset(ALLOW_MUL3) -_F_MUL3_DIFF = frozenset(ALLOW_MUL3_DIFF) -_F_MUL4 = frozenset(ALLOW_MUL4) -_F_MUL4_DIFF = frozenset(ALLOW_MUL4_DIFF) -_F_MUL5 = frozenset(ALLOW_MUL5) -_F_MUL5_DIFF = frozenset(ALLOW_MUL5_DIFF) -_F_MUL6 = frozenset(ALLOW_MUL6) -_F_MUL6_DIFF = frozenset(ALLOW_MUL6_DIFF) -_F_MUL7 = frozenset(ALLOW_MUL7) -_F_MUL7_DIFF = frozenset(ALLOW_MUL7_DIFF) -_F_MUL8 = frozenset(ALLOW_MUL8) -_F_MUL8_DIFF = frozenset(ALLOW_MUL8_DIFF) -_F_MUL9 = frozenset(ALLOW_MUL9) -_F_MUL9_DIFF = frozenset(ALLOW_MUL9_DIFF) -_F_MUL10 = frozenset(ALLOW_MUL10) -_F_MUL10_DIFF = frozenset(ALLOW_MUL10_DIFF) -_F_MUL11 = frozenset(ALLOW_MUL11) -_F_MUL11_DIFF = frozenset(ALLOW_MUL11_DIFF) -_F_MUL13 = frozenset(ALLOW_MUL13) -_F_MUL13_DIFF = frozenset(ALLOW_MUL13_DIFF) -_F_MUL17 = frozenset(ALLOW_MUL17) -_F_MUL17_DIFF = frozenset(ALLOW_MUL17_DIFF) -_F_MUL19 = frozenset(ALLOW_MUL19) -_F_MUL19_DIFF = frozenset(ALLOW_MUL19_DIFF) -_F_MUL23 = frozenset(ALLOW_MUL23) -_F_MUL23_DIFF = frozenset(ALLOW_MUL23_DIFF) -_F_PRIME_N = frozenset(ALLOW_PRIME_N) -_F_COMPOSITE_N = frozenset(ALLOW_COMPOSITE_N) -_F_COMPOSITE_DIFF = frozenset(ALLOW_COMPOSITE_DIFF) -_F_EVEN_N = frozenset(ALLOW_EVEN_N) -_F_EVEN_DIFF = frozenset(ALLOW_EVEN_DIFF) -_F_SEC10 = frozenset(ALLOW_SEC10) -_F_SEC10_DIFF = frozenset(ALLOW_SEC10_DIFF) -_F_W8 = frozenset(ALLOW_W8) -_F_W8_DIFF = frozenset(ALLOW_W8_DIFF) -_F_W12 = frozenset(ALLOW_W12) -_F_W12_DIFF = frozenset(ALLOW_W12_DIFF) -_F_W16 = frozenset(ALLOW_W16) -_F_W16_DIFF = frozenset(ALLOW_W16_DIFF) -_F_W20 = frozenset(ALLOW_W20) -_F_W20_DIFF = frozenset(ALLOW_W20_DIFF) -_F_CONTINUS_MAX = frozenset(ALLOW_CONTINUS_MAX) -_F_HL_SEEN = frozenset(HL_SEEN) +@dataclass(frozen=True) +class TrainAllow: + sum6: frozenset + abs_sum_diff: frozenset + + +def build_train_allow(max_no: int = 800) -> TrainAllow: + base = os.path.dirname(__file__) + path = os.path.join(base, "resources", "lotto_history.txt") + df = pd.read_csv(path, header=None) + df.columns = ["no", "b1", "b2", "b3", "b4", "b5", "b6", "bn"] + df = df[df["no"] <= max_no].sort_values("no") + rows = [] + for _, r in df.iterrows(): + b = sorted(int(r[f"b{i}"]) for i in range(1, 7)) + rows.append((int(r["no"]), b)) + sum6 = {sum(b) for _, b in rows} + abs_sum_diff = set() + for i in range(1, len(rows)): + s = sum(rows[i][1]) + ps = sum(rows[i - 1][1]) + abs_sum_diff.add(abs(s - ps)) + return TrainAllow(sum6=frozenset(sum6), abs_sum_diff=frozenset(abs_sum_diff)) + + +TRAIN_ALLOW = build_train_allow(800) diff --git a/scripts/run_with_ncue.sh b/scripts/run_with_ncue.sh index 9d9e869..533c09f 100755 --- a/scripts/run_with_ncue.sh +++ b/scripts/run_with_ncue.sh @@ -1,17 +1,9 @@ #!/usr/bin/env bash -# miniconda 환경 ncue에서 Python으로 인자 실행: ./scripts/run_with_ncue.sh final_filterTest.py set -euo pipefail -ROOT="$(cd "$(dirname "$0")/.." && pwd)" -cd "$ROOT" -for base in "${MINICONDA_HOME:-}" "$HOME/miniconda3" "$HOME/miniforge3" "$HOME/anaconda3" "$HOME/mambaforge"; do - [ -n "$base" ] || continue - c="$base/bin/conda" - if [ -x "$c" ]; then - exec "$c" run -n ncue -- python "$@" - fi -done -if [ -n "${CONDA_EXE:-}" ] && [ -x "$CONDA_EXE" ]; then - exec "$CONDA_EXE" run -n ncue -- python "$@" -fi -echo "conda ncue 환경을 찾지 못했습니다. 터미널에서: conda activate ncue && python \"\$@\"" >&2 -exit 1 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" +export PATH="${HOME}/miniconda3/bin:${HOME}/anaconda3/bin:/opt/anaconda3/bin:${PATH}" +source "$(conda info --base)/etc/profile.d/conda.sh" +conda activate ncue +cd "${REPO_ROOT}" +exec python "$@" diff --git a/train.py b/train.py new file mode 100644 index 0000000..248c0cc --- /dev/null +++ b/train.py @@ -0,0 +1,50 @@ +""" +학습 구간(1~800회): 당첨번호가 필터를 모두 통과한 회차 수를 집계합니다. +최소 20회차 이후부터 통계(최근 N주 등)가 의미 있으므로 기본은 21~800회만 평가합니다. +""" + +import argparse +import os + +import pandas as pd + +from final_BallFilter import BallFilter + + +def load_history(resources_path: str) -> pd.DataFrame: + path = os.path.join(resources_path, "lotto_history.txt") + df = pd.read_csv(path, header=None) + df.columns = ["no", "b1", "b2", "b3", "b4", "b5", "b6", "bn"] + return df + + +def run_train(resources_path: str, start_no: int, end_no: int) -> tuple[int, int, list[int]]: + df = load_history(resources_path) + hist_path = os.path.join(resources_path, "lotto_history.txt") + bf = BallFilter(hist_path) + wins = 0 + total = 0 + win_nos: list[int] = [] + for no in range(start_no, end_no + 1): + sub = df[df["no"] == no] + if sub.empty: + continue + answer = sorted(int(x) for x in sub.iloc[0][1:7].tolist()) + fts = bf.extract_final_candidates(answer, no=no, until_end=True, df=df) + total += 1 + if len(fts) == 0: + wins += 1 + win_nos.append(no) + return wins, total, win_nos + + +if __name__ == "__main__": + p = argparse.ArgumentParser() + p.add_argument("--resources", default=os.path.join(os.path.dirname(__file__), "resources")) + p.add_argument("--start-no", type=int, default=21) + p.add_argument("--end-no", type=int, default=800) + args = p.parse_args() + w, t, nos = run_train(args.resources, args.start_no, args.end_no) + rate = w / t if t else 0.0 + print(f"학습 구간 당첨 통과: {w} / {t} ({rate:.4f})") + print(f"통과 회차: {nos}") diff --git a/valid.py b/valid.py new file mode 100644 index 0000000..18fac87 --- /dev/null +++ b/valid.py @@ -0,0 +1,49 @@ +""" +검증 구간(801~1000회): 필터만 검사(학습으로 튜닝하지 않음). +""" + +import argparse +import os + +import pandas as pd + +from final_BallFilter import BallFilter + + +def load_history(resources_path: str) -> pd.DataFrame: + path = os.path.join(resources_path, "lotto_history.txt") + df = pd.read_csv(path, header=None) + df.columns = ["no", "b1", "b2", "b3", "b4", "b5", "b6", "bn"] + return df + + +def run_valid(resources_path: str, start_no: int, end_no: int) -> tuple[int, int, list[int]]: + df = load_history(resources_path) + hist_path = os.path.join(resources_path, "lotto_history.txt") + bf = BallFilter(hist_path) + wins = 0 + total = 0 + win_nos: list[int] = [] + for no in range(start_no, end_no + 1): + sub = df[df["no"] == no] + if sub.empty: + continue + answer = sorted(int(x) for x in sub.iloc[0][1:7].tolist()) + fts = bf.extract_final_candidates(answer, no=no, until_end=True, df=df) + total += 1 + if len(fts) == 0: + wins += 1 + win_nos.append(no) + return wins, total, win_nos + + +if __name__ == "__main__": + p = argparse.ArgumentParser() + p.add_argument("--resources", default=os.path.join(os.path.dirname(__file__), "resources")) + p.add_argument("--start-no", type=int, default=801) + p.add_argument("--end-no", type=int, default=1000) + args = p.parse_args() + w, t, nos = run_valid(args.resources, args.start_no, args.end_no) + rate = w / t if t else 0.0 + print(f"검증 구간 당첨 통과: {w} / {t} ({rate:.4f})") + print(f"통과 회차: {nos}")