Prediksi untuk hasil selanjutnya yang akurat

作成日: 2026年5月30日

使用モデル GPT-5.5 Thinking by Chat01

質問

hasil_ekstraksi_prize (1).csv

Prediksi untuk hasil selanjutnya yang akurat

思考

bash -lc cat > /mnt/data/backtest_predict.py <<'PY' import csv, math, itertools, collections from datetime import datetime, timedelta path='/mnt/data/hasil_ekstraksi_prize (1).csv' month={'Januari':1,'Februari':2,'Maret':3,'April':4,'Mei':5,'Juni':6,'Juli':7,'Agustus':8,'September':9,'Oktober':10,'November':11,'Desember':12} D='0123456789' def parse_date(s): d,m,y=s.split(); return datetime(int(y),month[m],int(d)) rows=[] with open(path,newline='',encoding='utf-8-sig') as f: for r in csv.DictReader(f): dt=parse_date(r['Tanggal']); h,mi=map(int,r['Waktu'].split(':')); dt=dt.replace(hour=h,minute=mi) rows.append({'dt':dt,'code':str(r['Kode_Prize']).zfill(4),'Tanggal':r['Tanggal'],'Waktu':r['Waktu']}) rows.sort(key=lambda r:r['dt']) blocks=[] for dt,grp in itertools.groupby(rows,key=lambda r:r['dt']): codes=[g['code'] for g in grp] if len(codes)>=3: blocks.append({'dt':dt,'time':dt.strftime('%H:%M'),'codes':codes[:3]})

def laplace(codes,pos,weights=None,alpha=1.0): c={d:alpha for d in D}; den=10*alpha if weights is None: weights=[1.0]*len(codes) for code,w in zip(codes,weights): c[code[pos]]+=w; den+=w return {d:c[d]/den for d in D}

def similarity(codes_a, codes_b): score=0.0 for ca,cb in zip(codes_a,codes_b): exact=sum(1 for a,b in zip(ca,cb) if a==b); score += 2.0exact cnta=collections.Counter(ca); cntb=collections.Counter(cb); inter=sum(min(cnta[d],cntb[d]) for d in D) score+=0.75inter score+=0.5*(len(set(ca))==len(set(cb))) dist=sum(abs(int(a)-int(b)) for a,b in zip(ca,cb)); score+=max(0,4.0-dist/3.0)0.25 cnta=collections.Counter(''.join(codes_a)); cntb=collections.Counter(''.join(codes_b)); inter=sum(min(cnta[d],cntb[d]) for d in D) score+=0.4inter return score

def predict_for(index, target_time): # target index in blocks, target has target_time; prev is index-1 hist_by_time=[b for b in blocks[:index] if b['time']==target_time and len(b['codes'])>=3] if len(hist_by_time)<25: return None recent_by_time=hist_by_time[-35:] recent_weights=[math.exp((i-(len(recent_by_time)-1))/12.0) for i in range(len(recent_by_time))] prev=blocks[index-1] prev_time=prev['time'] # transitions before index trans=[] for i in range(index-1): b=blocks[i]; nb=blocks[i+1] if b['time']==prev_time and nb['time']==target_time and len(b['codes'])>=3 and len(nb['codes'])>=3: trans.append((b,nb)) knn=sorted([(similarity(prev['codes'],b['codes']),b,nb) for b,nb in trans], reverse=True, key=lambda x:x[0])[:25] if knn: min_s=min(s for s,,__ in knn); neigh_weights=[(1+max(0,s-min_s))*(1/(rank+1)**0.35) for rank,(s,,__) in enumerate(knn)] else: neigh_weights=[] lastn=blocks[:index][-60:] wlast=[math.exp((i-(len(lastn)-1))/20.0) for i in range(len(lastn))] rank_probs=[] for r in range(3): pp=[] for p in range(4): po=laplace([b['codes'][r] for b in hist_by_time],p) pr=laplace([b['codes'][r] for b in recent_by_time],p,weights=recent_weights) if knn: pk=laplace([nb['codes'][r] for ,,nb in knn],p,weights=neigh_weights) else: pk={d:.1 for d in D} pl=laplace([b['codes'][r] for b in lastn],p,weights=wlast) probs={d:0.25po[d]+0.32pr[d]+0.33pk[d]+0.10pl[d] for d in D}; z=sum(probs.values()); probs={d:v/z for d,v in probs.items()} pp.append(probs) rank_probs.append(pp) topcodes=[] for r in range(3): top_digits=[sorted(D,key=lambda d:rank_probs[r][p][d],reverse=True)[:7] for p in range(4)] cand=[] for code in map(''.join,itertools.product(top_digits)): score=sum(math.log(rank_probs[r][p][code[p]]+1e-9) for p in range(4)) cand.append((score,code)) topcodes.append([code for ,code in sorted(cand,reverse=True)[:50]]) presence={d:0 for d in D} for d in D: over=sum(''.join(b['codes']).count(d) for b in hist_by_time)/(len(hist_by_time)*12) rec=sum(''.join(b['codes']).count(d)*recent_weights[i] for i,b in enumerate(recent_by_time))/(sum(recent_weights)*12) kn=sum(''.join(nb['codes']).count(d)*neigh_weights[i] for i,(,_,nb) in enumerate(knn))/(sum(neigh_weights)12) if neigh_weights else over l60=sum(''.join(b['codes']).count(d)wlast[i] for i,b in enumerate(lastn))/(sum(wlast)12) presence[d]=0.25over+0.3rec+0.35kn+0.1l60 bbfs=[d for d,_ in sorted(presence.items(),key=lambda kv:kv[1],reverse=True)] return rank_probs, topcodes, bbfs

target_time='11:30' indices=[i for i,b in enumerate(blocks) if b['time']==target_time] indices=indices[-50:] exact_top10=0; exact_top20=0; exact_top50=0; total_codes=0 pos_top3=0; total_pos=0 bbfs6_all=0; bbfs7_all=0; total_code=0 any_rank_top10=0; total_blocks=0 for idx in indices: pred=predict_for(idx,target_time) if not pred: continue rank_probs, topcodes, bbfs=pred actual=blocks[idx]['codes'] total_blocks+=1 block_any=False for r in range(3): code=actual[r] total_codes+=1; total_code+=1 if code in topcodes[r][:10]: exact_top10+=1; block_any=True if code in topcodes[r][:20]: exact_top20+=1 if code in topcodes[r][:50]: exact_top50+=1 if set(code).issubset(set(bbfs[:6])): bbfs6_all+=1 if set(code).issubset(set(bbfs[:7])): bbfs7_all+=1 for p in range(4): top3=set(sorted(D,key=lambda d:rank_probs[r][p][d],reverse=True)[:3]) if code[p] in top3: pos_top3+=1 total_pos+=1 if block_any: any_rank_top10+=1 print('tested blocks',total_blocks,'codes',total_codes) print('exact top10', exact_top10, exact_top10/total_codes if total_codes else None) print('exact top20', exact_top20, exact_top20/total_codes if total_codes else None) print('exact top50', exact_top50, exact_top50/total_codes if total_codes else None) print('any rank top10 per block', any_rank_top10, any_rank_top10/total_blocks if total_blocks else None) print('position top3',pos_top3,total_pos,pos_top3/total_pos if total_pos else None) print('bbfs6 all unique digits in top6',bbfs6_all,total_code,bbfs6_all/total_code if total_code else None) print('bbfs7 all unique digits in top7',bbfs7_all,total_code,bbfs7_all/total_code if total_code else None) PY python3 /mnt/data/backtest_predict.py

Thought for 1m 36s

回答

Berdasarkan CSV yang Anda unggah, data terakhir adalah 30 Mei 2026 06:30 dengan kode:

4049 — 6606 — 0339

Jadi prediksi sesi berikutnya yang paling masuk akal adalah 30 Mei 2026 pukul 11:30.

Perlu jujur: hasil seperti ini bersifat acak, jadi tidak ada prediksi yang bisa benar-benar “akurat pasti”. Backtest cepat pada 50 sesi 11:30 terakhir menunjukkan prediksi exact 4D sangat sulit. Jadi saya berikan prediksi statistik terbaik, bukan jaminan.

Prediksi utama 11:30

PrizePrediksi utamaAlternatif kuat
Prize 191979107, 9697, 9147, 9607
Prize 237075707, 6707, 1707, 3307
Prize 378057807, 7905, 7005, 7855

Angka kuat / BBFS

7 — 0 — 1 — 9 — 5 — 8 — 6

Angka yang lebih lemah dari pola data: 2 — 4 — 3

Kalau yang dimaksud kolom Angka_String

Karena Angka_String di file adalah angka yang tidak muncul dalam Kode_Prize, maka untuk prediksi utama:

Kode prediksiAngka_String prediksi
91970,2,3,4,5,6,8
37071,2,4,5,6,8,9
78051,2,3,4,6,9

Pilihan paling kuat saya: 9197 / 3707 / 7805, dengan BBFS 7019586.

質問

Cek sekali lagi dan buatkan scriptnya untuk di jalankan di google colab

思考

Preparing final script with download link

I’ll provide a final answer with a link to a downloadable script file. It seems the user wants to run it in Colab, so I'll include a concise script block and link to the .py file for easy downloading. I'll also note that predictions are not guaranteed and encourage them to "cek ulang" results.

Thought for 2m 30s

回答

Sudah saya cek ulang dari CSV yang Anda unggah. Struktur data valid:

  • 1.935 baris
  • 645 sesi
  • Setiap sesi berisi tepat 3 kode prize
  • Tidak ada duplikat baris
  • Data terakhir: 30 Mei 2026 06:30
  • Target berikutnya: 30 Mei 2026 11:30

Prediksi terbaru dari model ulang:

PrizePrediksi utamaAlternatif kuat
Prize 171917291, 7091, 7198, 7691, 7141
Prize 252075203, 5209, 5807, 5257, 5206
Prize 318171857, 1017, 1018, 1815, 1851

BBFS kuat: 7105892
Urutan digit terkuat: 7 — 1 — 0 — 5 — 8 — 9 — 2

Catatan penting: saat dicek backtest 100 sesi terakhir, prediksi exact 4D di top-20 tetap sangat sulit/0 hit. Jadi script ini lebih cocok untuk filter statistik dan pola digit, bukan jaminan angka pasti.

Saya buatkan script Google Colab di sini:

Download script Colab prediksi_prize_colab.py

Cara pakai:

  1. Buka Google Colab.
  2. Upload atau paste isi script tersebut ke satu cell.
  3. Jalankan cell.
  4. Saat diminta, upload file CSV Anda.
  5. Script akan mencetak prediksi dan menyimpan hasil ke prediksi_next_prize.csv.

質問

data_ekstraksi.json

Gunakan data ini

Python

python
import json, os, textwrap, pandas as pd, numpy as np, re, math, statistics path='/mnt/data/data_ekstraksi.json' os.path.exists(path), os.path.getsize(path)

Python

python
import json, os, textwrap, pandas as pd, numpy as np, re, math, statistics path='/mnt/data/data_ekstraksi.json' print(os.path.exists(path), os.path.getsize(path)) with open(path,'r',encoding='utf-8') as f: data=json.load(f) type(data), len(data), data[0].keys(), data[0]['tanggal'], data[0]['waktu'], len(data[0]['daftar_prize']) (list, 645, dict_keys(['tanggal', 'waktu', 'daftar_prize']), '10 Februari 2026', '21:30', 13)

Python

python
data[-3:] [{'tanggal': '29 Mei 2026', 'waktu': '21:30', 'daftar_prize': [{'kode': '8454', 'angka': [0, 1, 2, 3, 6, 7, 9]}, {'kode': '5906', 'angka': [1, 2, 3, 4, 7, 8]}, {'kode': '3294', 'angka': [0, 1, 5, 6, 7, 8]}, {'kode': '0491', 'angka': [2, 3, 5, 6, 7, 8]}, {'kode': '0302', 'angka': [1, 4, 5, 6, 7, 8, 9]}, {'kode': '9610', 'angka': [2, 3, 4, 5, 7, 8]}, {'kode': '1017', 'angka': [2, 3, 4, 5, 6, 8, 9]}, {'kode': '3490', 'angka': [1, 2, 5, 6, 7, 8]}, {'kode': '1588', 'angka': [0, 2, 3, 4, 6, 7, 9]}, {'kode': '5763', 'angka': [0, 1, 2, 4, 8, 9]}, {'kode': '8529', 'angka': [0, 1, 3, 4, 6, 7]}, {'kode': '4732', 'angka': [0, 1, 5, 6, 8, 9]}, {'kode': '8571', 'angka': [0, 2, 3, 4, 6, 9]}]}, {'tanggal': '30 Mei 2026', 'waktu': '03:30', 'daftar_prize': [{'kode': '5282', 'angka': [0, 1, 3, 4, 6, 7, 9]}, {'kode': '8368', 'angka': [0, 1, 2, 4, 5, 7, 9]}, {'kode': '0338', 'angka': [1, 2, 4, 5, 6, 7, 9]}, {'kode': '9217', 'angka': [0, 3, 4, 5, 6, 8]}, {'kode': '1632', 'angka': [0, 4, 5, 7, 8, 9]}, {'kode': '6303', 'angka': [1, 2, 4, 5, 7, 8, 9]}, {'kode': '5016', 'angka': [2, 3, 4, 7, 8, 9]}, {'kode': '7698', 'angka': [0, 1, 2, 3, 4, 5]}, {'kode': '0893', 'angka': [1, 2, 4, 5, 6, 7]}, {'kode': '2251', 'angka': [0, 3, 4, 6, 7, 8, 9]}, {'kode': '4553', 'angka': [0, 1, 2, 6, 7, 8, 9]}, {'kode': '2034', 'angka': [1, 5, 6, 7, 8, 9]}, {'kode': '2940', 'angka': [1, 3, 5, 6, 7, 8]}]}, {'tanggal': '30 Mei 2026', 'waktu': '06:30', 'daftar_prize': [{'kode': '4049', 'angka': [1, 2, 3, 5, 6, 7, 8]}, {'kode': '6606', 'angka': [1, 2, 3, 4, 5, 7, 8, 9]}, {'kode': '0339', 'angka': [1, 2, 4, 5, 6, 7, 8]}, {'kode': '7823', 'angka': [0, 1, 4, 5, 6, 9]}, {'kode': '1254', 'angka': [0, 3, 6, 7, 8, 9]}, {'kode': '6841', 'angka': [0, 2, 3, 5, 7, 9]}, {'kode': '5917', 'angka': [0, 2, 3, 4, 6, 8]}, {'kode': '7261', 'angka': [0, 3, 4, 5, 8, 9]}, {'kode': '3955', 'angka': [0, 1, 2, 4, 6, 7, 8]}, {'kode': '7657', 'angka': [0, 1, 2, 3, 4, 8, 9]}, {'kode': '4269', 'angka': [0, 1, 3, 5, 7, 8]}, {'kode': '1604', 'angka': [2, 3, 5, 7, 8, 9]}, {'kode': '1555', 'angka': [0, 2, 3, 4, 6, 7, 8, 9]}]}]

Python

python
from datetime import datetime, timedelta months = { "Januari":1,"Februari":2,"Maret":3,"April":4,"Mei":5,"Juni":6, "Juli":7,"Agustus":8,"September":9,"Oktober":10,"November":11,"Desember":12 } def parse_date(tgl, waktu): parts=tgl.split() day=int(parts[0]); month=months[parts[1]]; year=int(parts[2]) h,m=map(int,waktu.split(":")) return datetime(year, month, day, h, m) records=[] for si,s in enumerate(data): dt=parse_date(s['tanggal'], s['waktu']) for pi,p in enumerate(s['daftar_prize'], start=1): code=str(p['kode']).zfill(4) records.append({"session_idx":si, "dt":dt, "tanggal":s['tanggal'], "waktu":s['waktu'], "prize":pi, "kode":code, "angka":p['angka']}) df=pd.DataFrame(records) print(df.shape) print(df['prize'].nunique(), df.groupby('session_idx').size().value_counts()) print(df['waktu'].unique()) print(df.groupby('waktu')['session_idx'].nunique()) print(df['dt'].min(), df['dt'].max()) print(df.tail(13)[['dt','waktu','prize','kode']].to_string(index=False)) # validate angka complement def complement(code): return sorted(set(range(10))-set(map(int, code))) bad=[] for _,r in df.iterrows(): if sorted(r['angka']) != complement(r['kode']): bad.append((r['dt'], r['prize'], r['kode'], r['angka'], complement(r['kode']))) len(bad), bad[:3] (0, [])

Python

python
import json, os, math, itertools, pandas as pd, numpy as np from datetime import datetime, timedelta path='/mnt/data/data_ekstraksi.json' with open(path,'r',encoding='utf-8') as f: data=json.load(f) months = { "Januari":1,"Februari":2,"Maret":3,"April":4,"Mei":5,"Juni":6, "Juli":7,"Agustus":8,"September":9,"Oktober":10,"November":11,"Desember":12 } def parse_date(tgl, waktu): parts=tgl.split() day=int(parts[0]); month=months[parts[1]]; year=int(parts[2]) h,m=map(int,waktu.split(":")) return datetime(year, month, day, h, m) session_rows=[] records=[] for si,s in enumerate(data): dt=parse_date(s['tanggal'], s['waktu']) session_rows.append({"session_idx":si, "dt":dt, "tanggal":s['tanggal'], "waktu":s['waktu'], "n_prize":len(s['daftar_prize'])}) for pi,p in enumerate(s['daftar_prize'], start=1): code=str(p['kode']).zfill(4) records.append({"session_idx":si, "dt":dt, "tanggal":s['tanggal'], "waktu":s['waktu'], "prize":pi, "kode":code, "angka":p.get('angka')}) sessions=pd.DataFrame(session_rows) df=pd.DataFrame(records) sessions=sessions.sort_values("dt").reset_index(drop=True) # The session_idx already chronological? Yes likely, but map to chrono_idx idx_map={old:i for i,old in enumerate(sessions['session_idx'])} sessions['chrono_idx']=sessions.index df['chrono_idx']=df['session_idx'].map(idx_map) df=df.sort_values(['chrono_idx','prize']).reset_index(drop=True) schedule=["03:30","06:30","11:30","13:30","17:30","21:30"] last_s=sessions.iloc[-1] last_dt=last_s['dt']; last_time=last_s['waktu'] next_time = schedule[(schedule.index(last_time)+1)%len(schedule)] h,m=map(int,next_time.split(":")) next_date = last_dt.date() if schedule.index(next_time) <= schedule.index(last_time): next_date = (last_dt + timedelta(days=1)).date() target_dt = datetime.combine(next_date, datetime.min.time()).replace(hour=h, minute=m) print("sessions", len(sessions), "records", len(df), "last", last_dt, last_time, "next", target_dt, next_time) digits=list('0123456789') def digit_probs_for_prize(train_df, train_sessions, prize, pos, target_time, prev_code=None, alpha=0.35): """ Returns probabilities for digits 0-9 at a single position for a prize. """ # recency: use chrono_idx max maxidx = train_df['chrono_idx'].max() sub = train_df[(train_df['prize']==prize)].copy() # If no data, uniform def weighted_counts(rows, half_life=80): counts=np.ones(10)*alpha if rows.empty: return counts ages = maxidx - rows['chrono_idx'].values weights = np.exp(-np.log(2)*ages/half_life) for code, w in zip(rows['kode'].values, weights): counts[int(code[pos])] += w return counts # Global for this prize/position c_global = weighted_counts(sub, half_life=110) # Same target time c_time = weighted_counts(sub[sub['waktu']==target_time], half_life=45) # Recent sessions for this prize c_recent = weighted_counts(sub.tail(35), half_life=20) # All prizes same position, target time (adds cross-sectional stability) allpos = train_df.copy() c_all_time = weighted_counts(allpos[allpos['waktu']==target_time].assign(prize=prize), half_life=45) # Transition from prev_code same position: observed next digit after last time -> target time, same prize c_trans=np.ones(10)*alpha if prev_code is not None: prev_digit=prev_code[pos] # Pairs from consecutive sessions historically where previous time -> target_time rows=[] # use train_sessions chronological, from i=1 to len-1, current time target_time, previous session has prev_digit for prize at pos code_by_idx_prize = {(r.chrono_idx, r.prize):r.kode for r in train_df.itertuples()} for ci in range(1, int(train_sessions['chrono_idx'].max())+1): curr = train_sessions[train_sessions['chrono_idx']==ci].iloc[0] if curr['waktu'] != target_time: continue prev = train_sessions[train_sessions['chrono_idx']==ci-1].iloc[0] pc = code_by_idx_prize.get((ci-1, prize)) cc = code_by_idx_prize.get((ci, prize)) if pc and cc and pc[pos] == prev_digit: age = maxidx - ci w = math.exp(-math.log(2)*age/50) c_trans[int(cc[pos])] += w # If there are too few, fallback to all previous digit transitions independent of target time if c_trans.sum() < 10*alpha + 1e-9: pass # Combine normalized comps=[] weights=[] for c,w in [(c_global,0.24),(c_time,0.32),(c_recent,0.20),(c_all_time,0.10),(c_trans,0.14)]: p=c/c.sum() comps.append(p); weights.append(w) probs=sum(w*p for w,p in zip(weights,comps)) probs=probs/probs.sum() return probs def predict_for_prize(train_df, train_sessions, prize, target_time, prev_code=None, topn=10): pos_probs=[digit_probs_for_prize(train_df, train_sessions, prize, pos, target_time, prev_code=prev_code) for pos in range(4)] # Generate top candidates across all 10^4 combos # small penalties/bonuses for repeat-pattern based on historical same prize/time hist = train_df[(train_df['prize']==prize)&(train_df['waktu']==target_time)] # distributions for number of unique digits uniq_counts = hist['kode'].apply(lambda x: len(set(x))).value_counts(normalize=True).to_dict() # repeat positions maybe no need candidates=[] for combo in itertools.product(range(10), repeat=4): code=''.join(map(str,combo)) logp=sum(math.log(pos_probs[pos][combo[pos]]+1e-15) for pos in range(4)) # Pattern prior: probability of unique count with Laplace u=len(set(code)) pat=(uniq_counts.get(u,0)+0.1)/(1+0.4) # smoothing small # Slight code recency penalty if exact appeared in latest 20 same prize (reduce duplicates a bit, not eliminate) recent_codes=set(train_df[train_df['prize']==prize].tail(20)['kode']) if code in recent_codes: logp += math.log(0.80) logp += 0.15*math.log(pat) candidates.append((code, math.exp(logp))) candidates.sort(key=lambda x:x[1], reverse=True) top=candidates[:topn] # normalize among all? Use raw relative; convert top prob percentages normalized over 10000 score sum total=sum(s for _,s in candidates) top=[(c, s/total) for c,s in top] return top, pos_probs train_df=df.copy() train_sessions=sessions.copy() last_codes={r.prize:r.kode for r in train_df[train_df['chrono_idx']==train_df['chrono_idx'].max()].itertuples()} preds=[] pos_prob_agg=np.zeros(10) for prize in range(1,14): top,pos_probs=predict_for_prize(train_df, train_sessions, prize, next_time, prev_code=last_codes.get(prize), topn=10) preds.append({"prize":prize, "main":top[0][0], "alternatives":[c for c,_ in top[1:6]], "top10":top}) for pp in pos_probs: pos_prob_agg += pp preds[:3], preds[-1]

Python

python
import json, os, math, itertools from datetime import datetime, timedelta import numpy as np import pandas as pd path='/mnt/data/data_ekstraksi.json' with open(path,'r',encoding='utf-8') as f: data=json.load(f) months={"Januari":1,"Februari":2,"Maret":3,"April":4,"Mei":5,"Juni":6,"Juli":7,"Agustus":8,"September":9,"Oktober":10,"November":11,"Desember":12} def parse_dt(tgl,waktu): day, mon, year = tgl.split() h,m=map(int,waktu.split(':')) return datetime(int(year), months[mon], int(day), h, m) # sort chronologically just in case sessions_raw=[] for s in data: sessions_raw.append((parse_dt(s['tanggal'],s['waktu']), s)) sessions_raw.sort(key=lambda x:x[0]) N=len(sessions_raw) P=max(len(s['daftar_prize']) for _,s in sessions_raw) codes=np.empty((N,P), dtype

Python

python
# Backtest last 80 target sessions; each target session ti is predicted from data[:ti] def predict_prize_train(p, target_time, train_end, topn=20): prev_code=codes[train_end-1,p] probs=[digit_probs(p,pos,target_time,prev_code,train_end) for pos in range(4)] scores=np.ones(10000) for pos in range(4): scores *= probs[pos][combos[:,pos]] idx_time=np.where(time_arr[:train_end]==target_time)[0] unique_counts=np.ones(5)*0.1 for idx in idx_time: u=len(set(codes[idx,p])) unique_counts[u] += 1 unique_probs=unique_counts/unique_counts.sum() scores *= (unique_probs[combo_unique] ** 0.15) recent_set=set(codes[max(0,train_end-20):train_end,p]) if recent_set: mask=np.isin(combo_codes, list(recent_set)) scores[mask]*=0.80 order=np.argsort(scores)[::-1][:topn] return [str(combo_codes[i]) for i in order], probs test_start=max(60, N-80) n_cases=0; exact1=0; exact5=0; exact10=0; exact20=0; pos_correct=0; digitset_hit=0 bypos=np.zeros(4,int); bypos_total=np.zeros(4,int) for ti in range(test_start, N): target_time=times[ti] for p in range(P): tops, probs = predict_prize_train(p,target_time,ti,topn=20) actual=codes[ti,p] n_cases+=1 if actual==tops[0]: exact1+=1 if actual in tops[:5]: exact5+=1 if actual in tops[:10]: exact10+=1 if actual in tops[:20]: exact20+=1 pred=tops[0] for pos in range(4): if actual[pos]==pred[pos]: pos_correct+=1; bypos[pos]+=1 bypos_total[pos]+=1 # if top BBFS? check if all unique actual digits in aggregate of top prediction? we'll not print("cases", n_cases, "exact1", exact1, exact5, exact10, exact20, "exact rates", [x/n_cases for x in [exact1,exact5,exact10,exact20]], "posacc", pos_correct/(n_cases*4), "bypos", bypos/bypos_total)

思考

Saya sudah jalankan ulang model pada JSON ini. Data valid: 645 sesi, 8.385 kode, dan semua sesi berisi 13 prize; angka adalah digit pelengkap yang tidak muncul di kode.

Thought for 2m 45s

Python

python
from pathlib import Path import csv # Membuat file script Google Colab yang bisa dipakai ulang dengan data JSON serupa. script = r''' # ============================================================ # PREDIKSI NEXT PRIZE DARI data_ekstraksi.json # Cocok dijalankan di Google Colab # ============================================================ import json, math, itertools from datetime import datetime, timedelta from pathlib import Path import numpy as np import pandas as pd # ------------------------------------------------------------ # 1) Upload file JSON di Colab # ------------------------------------------------------------ try: from google.colab import files uploaded = files.upload() if not uploaded: raise RuntimeError("Tidak ada file yang diupload.") JSON_PATH = next(iter(uploaded.keys())) except Exception: # Untuk jalan lokal: ubah path ini sesuai lokasi file Anda. JSON_PATH = "data_ekstraksi.json" print("File dipakai:", JSON_PATH) # ------------------------------------------------------------ # 2) Load dan parse data # ------------------------------------------------------------ with open(JSON_PATH, "r", encoding="utf-8") as f: data = json.load(f) MONTHS_ID = { "Januari": 1, "Februari": 2, "Maret": 3, "April": 4, "Mei": 5, "Juni": 6, "Juli": 7, "Agustus": 8, "September": 9, "Oktober": 10, "November": 11, "Desember": 12 } def parse_dt(tanggal, waktu): hari, bulan, tahun = tanggal.split() jam, menit = map(int, waktu.split(":")) return datetime(int(tahun), MONTHS_ID[bulan], int(hari), jam, menit) sessions_raw = [] for s in data: sessions_raw.append((parse_dt(s["tanggal"], s["waktu"]), s)) sessions_raw.sort(key=lambda x: x[0]) N = len(sessions_raw) P = max(len(s["daftar_prize"]) for _, s in sessions_raw) codes = np.empty((N, P), dtype=object) times = [] dts = [] for i, (dt, s) in enumerate(sessions_raw): dts.append(dt) times.append(s["waktu"]) if len(s["daftar_prize"]) != P: raise ValueError(f"Sesi ke-{i} punya jumlah prize berbeda: {len(s['daftar_prize'])}") for p in range(P): codes[i, p] = str(s["daftar_prize"][p]["kode"]).zfill(4) digit_arr = np.zeros((N, P, 4), dtype=np.int8) for i in range(N): for p in range(P): digit_arr[i, p, :] = [int(ch) for ch in codes[i, p]] time_arr = np.array(times) # Validasi angka pelengkap jika field "angka" tersedia bad_complement = 0 for i, (_, s) in enumerate(sessions_raw): for p, prize in enumerate(s["daftar_prize"]): if "angka" in prize: kode = str(prize["kode"]).zfill(4) complement = sorted(set(range(10)) - set(map(int, kode))) if sorted(prize["angka"]) != complement: bad_complement += 1 print(f"Jumlah sesi : {N}") print(f"Jumlah prize/sesi: {P}") print(f"Total kode : {N * P}") print(f"Data pertama : {dts[0]}") print(f"Data terakhir : {dts[-1]}") print(f"Validasi angka pelengkap bermasalah: {bad_complement}") # ------------------------------------------------------------ # 3) Tentukan sesi berikutnya # ------------------------------------------------------------ SCHEDULE = ["03:30", "06:30", "11:30", "13:30", "17:30", "21:30"] last_dt = dts[-1] last_time = times[-1] next_time = SCHEDULE[(SCHEDULE.index(last_time) + 1) % len(SCHEDULE)] hour, minute = map(int, next_time.split(":")) next_date = last_dt.date() if SCHEDULE.index(next_time) <= SCHEDULE.index(last_time): next_date = (last_dt + timedelta(days=1)).date() target_dt = datetime.combine(next_date, datetime.min.time()).replace(hour=hour, minute=minute) print(f"Target prediksi : {target_dt.strftime('%d-%m-%Y %H:%M')}") # ------------------------------------------------------------ # 4) Model prediksi statistik # ------------------------------------------------------------ combos = np.array(list(itertools.product(range(10), repeat=4)), dtype=np.int8) combo_codes = np.array(["".join(map(str, c)) for c in combos]) combo_unique = np.array([len(set(code)) for code in combo_codes]) def weighted_counts_indices(indices, p, pos, half_life, maxidx, alpha=0.35): counts = np.ones(10) * alpha if len(indices) == 0: return counts ages = maxidx - indices weights = np.exp(-np.log(2) * ages / half_life) vals = digit_arr[indices, p, pos] for v, w in zip(vals, weights): counts[v] += w return counts def digit_probs(p, pos, target_time, prev_code=None, train_end=None): if train_end is None: train_end = N maxidx = train_end - 1 idx_all = np.arange(train_end) idx_time = np.where(time_arr[:train_end] == target_time)[0] idx_recent = np.arange(max(0, train_end - 35), train_end) # Komponen 1: frekuensi digit posisi untuk prize yang sama c_global = weighted_counts_indices(idx_all, p, pos, 110, maxidx) # Komponen 2: frekuensi digit pada jam target yang sama c_time = weighted_counts_indices(idx_time, p, pos, 45, maxidx) # Komponen 3: data terbaru c_recent = weighted_counts_indices(idx_recent, p, pos, 20, maxidx) # Komponen 4: semua prize pada jam target, untuk stabilisasi c_alltime = np.ones(10) * 0.35 if len(idx_time) > 0: for pp in range(P): c_alltime += weighted_counts_indices(idx_time, pp, pos, 45, maxidx, alpha=0.0) # Komponen 5: transisi dari sesi sebelumnya ke jam target c_trans = np.ones(10) * 0.35 if prev_code is not None: prev_digit = int(prev_code[pos]) for ci in range(1, train_end): if time_arr[ci] == target_time and digit_arr[ci - 1, p, pos] == prev_digit: age = maxidx - ci c_trans[digit_arr[ci, p, pos]] += math.exp(-math.log(2) * age / 50) comps = [ c_global / c_global.sum(), c_time / c_time.sum(), c_recent / c_recent.sum(), c_alltime / c_alltime.sum(), c_trans / c_trans.sum(), ] weights = [0.24, 0.32, 0.20, 0.10, 0.14] probs = sum(w * c for w, c in zip(weights, comps)) return probs / probs.sum() def predict_prize(p, target_time, train_end=None, topn=20): if train_end is None: train_end = N prev_code = codes[train_end - 1, p] probs = [digit_probs(p, pos, target_time, prev_code, train_end) for pos in range(4)] scores = np.ones(10000) for pos in range(4): scores *= probs[pos][combos[:, pos]] # Prior pola: jumlah digit unik di jam target idx_time = np.where(time_arr[:train_end] == target_time)[0] unique_counts = np.ones(5) * 0.1 for idx in idx_time: u = len(set(codes[idx, p])) unique_counts[u] += 1 unique_probs = unique_counts / unique_counts.sum() scores *= unique_probs[combo_unique] ** 0.15 # Penalti kecil untuk kode exact yang baru muncul di prize yang sama recent_set = set(codes[max(0, train_end - 20):train_end, p]) if recent_set: scores[np.isin(combo_codes, list(recent_set))] *= 0.80 order = np.argsort(scores)[::-1][:topn] total = scores.sum() return [(str(combo_codes[i]), float(scores[i] / total)) for i in order], probs # ------------------------------------------------------------ # 5) Backtest sederhana pada 80 sesi terakhir # ------------------------------------------------------------ def backtest(last_n_sessions=80): test_start = max(60, N - last_n_sessions) n_cases = exact1 = exact5 = exact10 = exact20 = pos_correct = 0 for ti in range(test_start, N): target_time = times[ti] for p in range(P): tops, _ = predict_prize(p, target_time, train_end=ti, topn=20) pred_list = [x[0] for x in tops] actual = codes[ti, p] n_cases += 1 exact1 += int(actual == pred_list[0]) exact5 += int(actual in pred_list[:5]) exact10 += int(actual in pred_list[:10]) exact20 += int(actual in pred_list[:20]) pred = pred_list[0] pos_correct += sum(actual[i] == pred[i] for i in range(4)) return { "cases": n_cases, "exact_top1": exact1, "exact_top5": exact5, "exact_top10": exact10, "exact_top20": exact20, "exact_top1_rate": exact1 / n_cases if n_cases else 0, "exact_top20_rate": exact20 / n_cases if n_cases else 0, "pos_digit_accuracy": pos_correct / (n_cases * 4) if n_cases else 0, } bt = backtest(80) print("\nBacktest 80 sesi terakhir") print("-------------------------") print(f"Jumlah kasus : {bt['cases']}") print(f"Exact Top-1 : {bt['exact_top1']} ({bt['exact_top1_rate']:.4%})") print(f"Exact Top-20 : {bt['exact_top20']} ({bt['exact_top20_rate']:.4%})") print(f"Akurasi posisi digit : {bt['pos_digit_accuracy']:.4%}") # ------------------------------------------------------------ # 6) Buat prediksi final # ------------------------------------------------------------ rows = [] digit_score = np.zeros(10) for p in range(P): top, probs = predict_prize(p, next_time, train_end=N, topn=20) for pr in probs: digit_score += pr rows.append({ "target_datetime": target_dt.strftime("%Y-%m-%d %H:%M"), "prize": p + 1, "prediksi_utama": top[0][0], "alternatif_1": top[1][0], "alternatif_2": top[2][0], "alternatif_3": top[3][0], "alternatif_4": top[4][0], "alternatif_5": top[5][0], "top10": ", ".join(x[0] for x in top[:10]), "score_relatif_top1": top[0][1], "angka_string_prediksi": ",".join(str(d) for d in sorted(set(range(10)) - set(map(int, top[0][0])))), }) result = pd.DataFrame(rows) bbfs_digits = [str(i) for i in np.argsort(digit_score)[::-1][:7]] bbfs = "".join(bbfs_digits) print("\nPrediksi final") print("--------------") print("Target:", target_dt.strftime("%d-%m-%Y %H:%M")) print("BBFS :", bbfs) print(result[["prize", "prediksi_utama", "alternatif_1", "alternatif_2", "alternatif_3", "alternatif_4", "alternatif_5", "angka_string_prediksi"]].to_string(index=False)) out_csv = "prediksi_next_prize_json.csv" result.to_csv(out_csv, index=False) print(f"\nFile hasil disimpan: {out_csv}") try: from google.colab import files files.download(out_csv) except Exception: pass ''' out_path = Path("/mnt/data/prediksi_prize_json_colab.py") out_path.write_text(script, encoding="utf-8") # Juga buat CSV hasil prediksi dari run saat ini agar bisa diunduh langsung. rows = [ [1, "5698", "7698, 9698, 5658, 7658, 9658", "1,2,3,4,7"], [2, "5937", "5935, 5932, 5939, 5907, 5905", "0,1,2,4,6,8"], [3, "5851", "5831, 5857, 5837, 5531, 7851", "0,2,3,4,6,7,9"], [4, "9593", "9573, 6593, 6573, 9523, 7593", "0,1,2,4,6,7,8"], [5, "4139", "4130, 4339, 4169, 4330, 4160", "0,2,5,6,7,8"], [6, "0781", "0581, 0785, 0281, 0181, 0787", "2,3,4,5,6,9"], [7, "9711", "9011, 9511, 9611, 9714, 9917", "0,2,3,4,5,6,8"], [8, "5534", "3534, 2534, 7534, 5537, 5532", "0,1,2,6,7,8,9"], [9, "3709", "3700, 3770, 3779, 3707, 3705", "1,2,4,5,6,8"], [10, "2736", "4736, 2136, 2735, 4136, 8736", "0,1,4,5,8,9"], [11, "1664", "1674, 1624, 1264, 1604, 1274", "0,2,3,5,7,8,9"], [12, "0636", "0106, 0603, 0706, 0136, 0633", "1,2,4,5,7,8,9"], [13, "9872", "9072, 9572, 9972, 9372, 9172", "0,1,3,4,5,6"], ] csv_path = Path("/mnt/data/prediksi_next_prize_json.csv") with csv_path.open("w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["prize", "prediksi_utama", "alternatif_kuat", "angka_string_prediksi"]) writer.writerows(rows) print(f"Script Colab dibuat: {out_path}") print(f"CSV hasil prediksi dibuat: {csv_path}")

回答

Sudah saya gunakan data JSON baru sebagai sumber utama. File ini berisi 645 sesi, 8.385 kode, dan setiap sesi punya 13 prize. Data terakhir adalah 30 Mei 2026 06:30, jadi target berikutnya adalah 30 Mei 2026 11:30. (data_ekstraksi.json)

Catatan jujur: backtest 80 sesi terakhir menunjukkan exact 4D sangat sulit: Top-1 = 0/1040, Top-20 = 2/1040. Jadi ini prediksi statistik/filter angka, bukan jaminan.

Prediksi 30 Mei 2026 — 11:30

BBFS kuat: 7591360

PrizePrediksi utamaAlternatif kuat
156987698, 9698, 5658, 7658, 9658
259375935, 5932, 5939, 5907, 5905
358515831, 5857, 5837, 5531, 7851
495939573, 6593, 6573, 9523, 7593
541394130, 4339, 4169, 4330, 4160
607810581, 0785, 0281, 0181, 0787
797119011, 9511, 9611, 9714, 9917
855343534, 2534, 7534, 5537, 5532
937093700, 3770, 3779, 3707, 3705
1027364736, 2136, 2735, 4136, 8736
1116641674, 1624, 1264, 1604, 1274
1206360106, 0603, 0706, 0136, 0633
1398729072, 9572, 9972, 9372, 9172

Saya juga buatkan script Colab versi JSON dan CSV hasil prediksinya:

Download script Colab JSON
Download CSV hasil prediksi

質問

Tambahkan generator angka tarung terkuat dan hasil generator 4D,3D,2D TERKUAT

思考

Finalizing output and citations

I need to ensure the final answer is concise. I’ll include the file citations, mentioning the uploaded JSON and final script outputs. I'll avoid making exact accuracy claims. The top generators like "Angka tarung terkuat" and combinations will be listed as requested, and I'll cite the source JSON structure for clarity.

Thought for 2m 10s

回答

Sudah saya tambahkan generator angka tarung terkuat dan generator 4D, 3D, 2D terkuat ke script Colab. Data yang dipakai tetap dari JSON terbaru yang Anda upload. (data_ekstraksi.json)

Target prediksi: 30 Mei 2026 — 11:30
BBFS terkuat: 7591360
Digit terkuat: 7 - 5 - 9 - 1 - 3 - 6 - 0 - 2 - 4 - 8

Angka tarung terkuat TOP 20

57, 17, 79, 37, 19, 95, 81, 78, 76, 50, 74, 07, 52, 13, 15, 27, 98, 56, 60, 01

Generator 4D terkuat TOP 20

4537, 4577, 4539, 4137, 4574, 9537, 0537, 5537, 4534, 5137, 4517, 9574, 4139, 0574, 4179, 4177, 4739, 4737, 5574, 9137

Generator 3D terkuat TOP 20

577, 573, 519, 777, 559, 575, 117, 597, 587, 551, 673, 679, 515, 511, 137, 539, 572, 077, 557, 979

Generator 2D terkuat TOP 20

55, 57, 17, 81, 79, 97, 75, 37, 19, 78, 71, 05, 50, 91, 95, 60, 67, 22, 18, 76

File siap pakai:

Download script Colab v2 + generator
[Download CSV angka tarung terkuat]
Download CSV generator 4D 3D 2D
Download CSV prediksi per prize

Catatan: angka tarung di script didefinisikan sebagai pasangan digit terkuat berdasarkan skor digit global, frekuensi pasangan, jam target, dan pola posisi. Hasil tetap bersifat statistik, bukan jaminan exact.

質問

Buatkan generator bbfs terkuat dan campur dengan angka2 kembar khusus 1prize

Python

python
import json, math, itertools, os, sys, statistics, textwrap, csv from pathlib import Path import numpy as np, pandas as pd path='/mnt/data/data_ekstraksi.json' print(os.path.exists(path), os.path.getsize(path)) data=json.load(open(path,encoding='utf-8')) len(data), data[0].keys(), len(data[0]['daftar_prize']) (645, dict_keys(['tanggal', 'waktu', 'daftar_prize']), 13)

Python

python
MONTHS_ID = { "Januari": 1, "Februari": 2, "Maret": 3, "April": 4, "Mei": 5, "Juni": 6, "Juli": 7, "Agustus": 8, "September": 9, "Oktober": 10, "November": 11, "Desember": 12 } from datetime import datetime, timedelta def parse_dt(tanggal, waktu): hari, bulan, tahun = tanggal.split() jam, menit = map(int, waktu.split(':')) return datetime(int(tahun), MONTHS_ID[bulan], int(hari), jam, menit) sessions=sorted([(parse_dt(s['tanggal'], s['waktu']), s) for s in data], key=lambda x:x[0]) N=len(sessions); P=13 times=[]; dts=[]; codes=np.empty((N,P),dtype=object) for i,(dt,s) in enumerate(sessions): dts.append(dt); times.append(s['waktu']) for p,pr in enumerate(s['daftar_prize']): codes[i,p]=str(pr['kode']).zfill(4) time_arr=np.array(times) digit_arr=np.array([[[int(ch) for ch in codes[i,p]] for p in range(P)] for i in range(N)], dtype=np.int8) dts[0], dts[-1], times[-1], codes[-1,0] (datetime.datetime(2026, 2, 10, 21, 30), datetime.datetime(2026, 5, 30, 6, 30), '06:30', '4049')

Python

python
SCHEDULE=["03:30","06:30","11:30","13:30","17:30","21:30"] last_dt=dts[-1]; last_time=times[-1]; next_time=SCHEDULE[(SCHEDULE.index(last_time)+1)%len(SCHEDULE)] next_date=last_dt.date() if SCHEDULE.index(next_time)<=SCHEDULE.index(last_time): next_date=(last_dt+timedelta(days=1)).date() target_dt=datetime.combine(next_date, datetime.min.time()).replace(hour=int(next_time.split(':')[0]), minute=int(next_time.split(':')[1])) target_dt datetime.datetime(2026, 5, 30, 11, 30)

Python

python
combos = np.array(list(itertools.product(range(10), repeat=4)), dtype=np.int8) combo_codes=np.array(["".join(map(str,c)) for c in combos]) combo_unique=np.array([len(set(code)) for code in combo_codes]) combo_max_count=np.array([max(code.count(str(d)) for d in range(10)) for code in combo_codes]) has_kembar=combo_max_count>=2 def weighted_counts_indices(indices, p, pos, half_life, maxidx, alpha=0.35): counts=np.ones(10)*alpha if len(indices)==0: return counts ages=maxidx-indices weights=np.exp(-np.log(2)*ages/half_life) vals=digit_arr[indices,p,pos] for v,w in zip(vals,weights): counts[v]+=w return counts def digit_probs(p, pos, target_time, prev_code=None, train_end=None): if train_end is None: train_end=N maxidx=train_end-1 idx_all (array([0.39526188, 0.39814505, 0.33403008, 0.33040065, 0.39364425, 0.44509624, 0.41529814, 0.41421015, 0.39534754, 0.47856601]), ['9', '5', '6', '7', '1', '8', '0'], ['9', '5', '6', '7', '1', '8', '0', '4'], ['9', '5', '6', '7', '1', '8', '0', '4', '2', '3'])

Python

python
idx_time=np.where(time_arr==next_time)[0] hist_prize1_time=[codes[i,0] for i in idx_time] from collections import Counter, defaultdict unique_count=Counter(len(set(c)) for c in hist_prize1_time) unique_count, len(hist_prize1_time), hist_prize1_time[-10:] (Counter({4: 54, 3: 51, 2: 3}), 108, ['7359', '8791', '4654', '9249', '1494', '5693', '9757', '0678', '5608', '7990'])

Python

python
from collections import Counter # kembar score def kembar_scores_for_prize(p=0, target_time=next_time, train_end=N): maxidx=train_end-1 scores=np.ones(10)*0.1 # all prize 1 weighted repeats for i in range(train_end): age=maxidx-i w=math.exp(-math.log(2)*age/90) c=Counter(codes[i,p]) for dstr,cnt in c.items(): if cnt>=2: scores[int(dstr)] += w*(cnt-1) # target time weighted repeats stronger for i in np.where(time_arr[:train_end]==target_time)[0]: age=maxidx-i w=math.exp(-math.log(2)*age/45) c=Counter(codes[i,p]) for dstr,cnt in c.items(): if cnt>=2: scores[int(dstr)] += 1.5*w*(cnt-1) # last 30 repeats for i in range(max(0,train_end-30), train_end): age=maxidx-i w=math.exp(-math.log(2)*age/15) c=Counter(codes[i,p]) for dstr,cnt in c.items(): if cnt>=2: scores[int(dstr)] += 1.0*w*(cnt-1) scores=scores/scores.max() return scores ks=kembar_scores_for_prize() [(d,ks[d],digit_score[d]) for d in np.argsort(ks)[::-1]] [(np.int64(4), np.float64(1.0), np.float64(0.39364425408161197)), (np.int64(1), np.float64(0.5785460318743447), np.float64(0.3981450469875175)), (np.int64(2), np.float64(0.5508521480069671), np.float64(0.3340300780764538)), (np.int64(9), np.float64(0.5076977145029216), np.float64(0.47856601368430324)), (np.int64(8), np.float64(0.49694138576162067), np.float64(0.39534754458645727)), (np.int64(7), np.float64(0.4802545156032401), np.float64(0.4142101469646493)), (np.int64(3), np.float64(0.4022164675127191), np.float64(0.3304006490470087)), (np.int64(5), np.float64(0.39636934092797443), np.float64(0.44509623884291216)), (np.int64(0), np.float64(0.3303874144202954), np.float64(0.3952618838390303)), (np.int64(6), np.float64(0.3251520056257602), np.float64(0.4152981438900561))]

Python

python
bbfs_set=set(map(int,bbfs8)) def code_score(code, probs, ks, bbfs_set=None, require_kembar=False): digs=[int(ch) for ch in code] if bbfs_set is not None and not set(digs).issubset(bbfs_set): return 0 cnt=Counter(code) if require_kembar and max(cnt.values()) < 2: return 0 s=1.0 for pos,d in enumerate(digs): s*=probs[pos][d] # bonus for repeated digits for dstr,c in cnt.items(): if c>=2: d=int(dstr) s*= (1.0 + 0.90*ks[d]*(c-1)) # Penalize too extreme quads, mild for triples maxc=max(cnt.values()) if maxc==4: s*=0.45 elif maxc==3: s*=0.72 # bonus using 7 strongest BBFS only s *= 1.0 + 0.04*sum(1 for d in digs if d in set(map(int,bbfs7))) # penalize recent exact if code in set(codes[max(0,N-30):N,0]): s*=0.75 return s scores=[] for code in combo_codes: sc=code_score(code,probs,ks,bbfs_set,require_kembar=True) if sc>0: scores.append((code,sc)) scores_sorted=sorted(scores,key=lambda x:x[1],reverse=True) scores_sorted[:30] [(np.str_('9698'), np.float64(0.0008715558975249444)), (np.str_('9696'), np.float64(0.0007918317981328293)), (np.str_('5658'), np.float64(0.0007464983173327588)), (np.str_('5656'), np.float64(0.0006782136482529077)), (np.str_('9494'), np.float64(0.0006187145477546674)), (np.str_('9697'), np.float64(0.0006157333377095553)), (np.str_('9694'), np.float64(0.0006139940062169489)), (np.str_('9690'), np.float64(0.0006133351588646869)), (np.str_('5699'), np.float64(0.0006092212577372335)), (np.str_('7697'), np.float64(0.0006079055107618311)), (np.str_('5696'), np.float64(0.0006019401752205342)), (np.str_('9898'), np.float64(0.0006012443736694818)), (np.str_('5644'), np.float64(0.0005954868803982419)), (np.str_('5598'), np.float64(0.0005941783178542863)), (np.str_('9691'), np.float64(0.0005866624255601324)), (np.str_('9598'), np.float64(0.0005761057487845899)), (np.str_('7699'), np.float64(0.0005524405972031514)), (np.str_('5998'), np.float64(0.0005476410668781676)), (np.str_('5599'), np.float64(0.0005463566211386492)), (np.str_('7696'), np.float64(0.0005458381263886058)), (np.str_('7644'), np.float64(0.0005399862917714152)), (np.str_('9644'), np.float64(0.000537667433953602)), (np.str_('5544'), np.float64(0.0005340394737950953)), (np.str_('5688'), np.float64(0.0005317203045215945)), (np.str_('5454'), np.float64(0.000529936599729037)), (np.str_('5657'), np.float64(0.0005273831567558307)), (np.str_('5654'), np.float64(0.0005258933979965796)), (np.str_('5650'), np.float64(0.0005253290871574936)), (np.str_('8698'), np.float64(0.000521867371786674)), (np.str_('9699'), np.float64(0.0005202597637132959))]

Python

python
# Kembar pairs scores (AA) using digit_score and ks and pos probabilities for positions 2,3 (last two) pair_scores=[] for d in range(10): code=f"{d}{d}" # 2D last two same sc=probs[2][d]*probs[3][d]*(1+1.2*ks[d])*(1+0.08*(d in bbfs_set)) pair_scores.append((code, sc)) sorted(pair_scores, key=lambda x:x[1], reverse=True) [('44', np.float64(0.02832205405544221)), ('99', np.float64(0.025733940409222337)), ('88', np.float64(0.022429125059172845)), ('11', np.float64(0.017995804732541483)), ('00', np.float64(0.016887027739476996)), ('77', np.float64(0.01499991259726263)), ('55', np.float64(0.011982480529559244)), ('33', np.float64(0.011271170532434044)), ('66', np.float64(0.010800337497197315)), ('22', np.float64(0.0104209437746414))]

Python

python
def score_3d(code): digs=[int(ch) for ch in code] if not set(digs).issubset(bbfs_set): return 0 cnt=Counter(code) if max(cnt.values())<2: return 0 # last 3 positions s=probs[1][digs[0]]*probs[2][digs[1]]*probs[3][digs[2]] for dstr,c in cnt.items(): if c>=2: s *= 1+0.9*ks[int(dstr)]*(c-1) if max(cnt.values())==3: s*=0.75 return s three_codes=["".join(map(str,c)) for c in itertools.product(range(10), repeat=3)] top3=sorted([(c,score_3d(c)) for c in three_codes if score_3d(c)>0], key=lambda x:x[1], reverse=True) top3[:30] [('644', np.float64(0.003708780956565076)), ('699', np.float64(0.003532643413717267)), ('696', np.float64(0.0034904231729251376)), ('998', np.float64(0.0031755632020685127)), ('688', np.float64(0.0030832447289915878)), ('494', np.float64(0.0029293394922560575)), ('656', np.float64(0.0028986586780096126)), ('558', np.float64(0.002861281250586855)), ('448', np.float64(0.00279569116770387)), ('898', np.float64(0.0026503069204790656)), ('544', np.float64(0.002451535278606497)), ('611', np.float64(0.0024491142767711187)), ('454', np.float64(0.0024327008272032264)), ('646', np.float64(0.0024305604300967868)), ('600', np.float64(0.0023787862646191655)), ('606', np.float64(0.0023671936509587262)), ('599', np.float64(0.0023351068873815836)), ('994', np.float64(0.0023170190952728053)), ('191', np.float64(0.002257930495845643)), ('444', np.float64(0.002254570085851306)), ('997', np.float64(0.0022434592377493802)), ('990', np.float64(0.0022347213375029703)), ('996', np.float64(0.0022319370189406128)), ('858', np.float64(0.002200975289766203)), ('616', np.float64(0.002173765123014184)), ('044', np.float64(0.0021693231930907317)), ('668', np.float64(0.0021664885510571897)), ('797', np.float64(0.002146139012139994)), ('991', np.float64(0.002137537725274465)), ('144', np.float64(0.0021294489681704665))]

Python

python
def score_2d(code, require_kembar_mix=True): digs=[int(ch) for ch in code] if not set(digs).issubset(bbfs_set): return 0 cnt=Counter(code) # last 2 positions s=probs[2][digs[0]]*probs[3][digs[1]] if max(cnt.values())>=2: s*=1+1.2*ks[digs[0]] elif require_kembar_mix: # mix with kembar-supported digits: one digit from high kembar score s*=1+0.25*(ks[digs[0]]+ks[digs[1]])/2 return s two_codes=["".join(map(str,c)) for c in itertools.product(range(10), repeat=2)] top2mix=sorted([(c,score_2d(c,True)) for c in two_codes if score_2d(c,True)>0], key=lambda x:x[1], reverse=True) top2kembar=sorted([(c,score_2d(c,False)) for c in two_codes if c[0]==c[1]], key=lambda x:x[1], reverse=True) top2mix[:30], top2kembar ([('98', np.float64(0.026406901357825318)), ('44', np.float64(0.02622412412540945)), ('99', np.float64(0.023827722601131793)), ('58', np.float64(0.021658760283906772)), ('88', np.float64(0.020767708388123002)), ('94', np.float64(0.0203439532650215)), ('48', np.float64(0.01939381414837273)), ('97', np.float64(0.018621270535834383)), ('90', np.float64(0.018239457935253348)), ('96', np.float64(0.018205941717681216)), ('91', np.float64(0.01793612171423004)), ('08', np.float64(0.01755642717755539)), ('54', np.float64(0.0166970235383332)), ('11', np.float64(0.016662782159760633)), ('18', np.float64(0.016575079650150596)), ('00', np.float64(0.015636136795812033)), ('57', np.float64(0.015272684053429415)), ('50', np.float64(0.014956349799146108)), ('56', np.float64(0.01492875362795447)), ('51', np.float64(0.014712738559533792)), ('78', np.float64(0.01399516095989455)), ('77', np.float64(0.013888807960428361)), ('59', np.float64(0.013686105634342225)), ('47', np.float64(0.013677190348187119)), ('04', np.float64(0.013539897134740807)), ('40', np.float64(0.013408548388864334)), ('46', np.float64(0.013384327855955938)), ('41', np.float64(0.01316655295157752)), ('14', np.float64(0.012764214914461152)), ('07', np.float64(0.012379748157001566))], [('44', np.float64(0.02622412412540945)), ('99', np.float64(0.023827722601131793)), ('88', np.float64(0.020767708388123002)), ('11', np.float64(0.016662782159760633)), ('00', np.float64(0.015636136795812033)), ('77', np.float64(0.013888807960428361)), ('55', np.float64(0.01109488937922152)), ('66', np.float64(0.01000031249740492)), ('22', 0), ('33', 0)])

思考

Saya akan buatkan versi script Colab baru yang hasilnya langsung memisahkan: BBFS Prize 1, digit kembar terkuat, 2D kembar, 2D campuran, 3D kembar, dan 4D kembar campuran.

Thought for 1m 43s

Python

python
from pathlib import Path import json, math, itertools, csv from datetime import datetime, timedelta from collections import Counter import numpy as np import pandas as pd DATA_PATH = Path("/mnt/data/data_ekstraksi.json") # --------------------------- # Helper parsing & modeling # --------------------------- MONTHS_ID = { "Januari": 1, "Februari": 2, "Maret": 3, "April": 4, "Mei": 5, "Juni": 6, "Juli": 7, "Agustus": 8, "September": 9, "Oktober": 10, "November": 11, "Desember": 12 } def parse_dt(tanggal, waktu): hari, bulan, tahun = tanggal.split() jam, menit = map(int, waktu.split(":")) return datetime(int(tahun), MONTHS_ID[bulan], int(hari), jam, menit) with DATA_PATH.open("r", encoding="utf-8") as f: data = json.load(f) sessions = sorted([(parse_dt(s["tanggal"], s["waktu"]), s) for s in data], key=lambda x: x[0]) N = len(sessions) P = max(len(s["daftar_prize"]) for _, s in sessions) codes = np.empty((N, P), dtype=object) times = [] dts = [] for i, (dt, s) in enumerate(sessions): dts.append(dt) times.append(s["waktu"]) for p, prize in enumerate(s["daftar_prize"]): codes[i, p] = str(prize["kode"]).zfill(4) time_arr = np.array(times) digit_arr = np.array( [[[int(ch) for ch in codes[i, p]] for p in range(P)] for i in range(N)], dtype=np.int8 ) SCHEDULE = ["03:30", "06:30", "11:30", "13:30", "17:30", "21:30"] last_dt = dts[-1] last_time = times[-1] next_time = SCHEDULE[(SCHEDULE.index(last_time) + 1) % len(SCHEDULE)] next_date = last_dt.date() if SCHEDULE.index(next_time) <= SCHEDULE.index(last_time): next_date = (last_dt + timedelta(days=1)).date() target_dt = datetime.combine(next_date, datetime.min.time()).replace( hour=int(next_time.split(":")[0]), minute=int(next_time.split(":")[1]) ) # Fokus khusus Prize 1 PRIZE_INDEX = 0 def weighted_counts_indices(indices, p, pos, half_life, maxidx, alpha=0.35): counts = np.ones(10) * alpha if len(indices) == 0: return counts ages = maxidx - indices weights = np.exp(-np.log(2) * ages / half_life) vals = digit_arr[indices, p, pos] for v, w in zip(vals, weights): counts[v] += w return counts def digit_probs(p, pos, target_time, prev_code=None, train_end=None): if train_end is None: train_end = N maxidx = train_end - 1 idx_all = np.arange(train_end) idx_time = np.where(time_arr[:train_end] == target_time)[0] idx_recent = np.arange(max(0, train_end - 45), train_end) c_global = weighted_counts_indices(idx_all, p, pos, 110, maxidx) c_time = weighted_counts_indices(idx_time, p, pos, 50, maxidx) c_recent = weighted_counts_indices(idx_recent, p, pos, 20, maxidx) c_alltime = np.ones(10) * 0.35 if len(idx_time) > 0: for pp in range(P): c_alltime += weighted_counts_indices(idx_time, pp, pos, 45, maxidx, alpha=0.0) c_trans = np.ones(10) * 0.35 if prev_code is not None: prev_digit = int(prev_code[pos]) for ci in range(1, train_end): if time_arr[ci] == target_time and digit_arr[ci - 1, p, pos] == prev_digit: age = maxidx - ci c_trans[digit_arr[ci, p, pos]] += math.exp(-math.log(2) * age / 50) comps = [ c_global / c_global.sum(), c_time / c_time.sum(), c_recent / c_recent.sum(), c_alltime / c_alltime.sum(), c_trans / c_trans.sum(), ] weights = [0.25, 0.34, 0.20, 0.08, 0.13] probs = sum(w * c for w, c in zip(weights, comps)) return probs / probs.sum() def kembar_scores_for_prize(p=PRIZE_INDEX, target_time=next_time, train_end=N): maxidx = train_end - 1 scores = np.ones(10) * 0.1 # Riwayat semua waktu Prize 1 for i in range(train_end): age = maxidx - i w = math.exp(-math.log(2) * age / 90) cnt = Counter(codes[i, p]) for dstr, c in cnt.items(): if c >= 2: scores[int(dstr)] += w * (c - 1) # Riwayat jam target Prize 1 for i in np.where(time_arr[:train_end] == target_time)[0]: age = maxidx - i w = math.exp(-math.log(2) * age / 45) cnt = Counter(codes[i, p]) for dstr, c in cnt.items(): if c >= 2: scores[int(dstr)] += 1.5 * w * (c - 1) # Riwayat terbaru Prize 1 for i in range(max(0, train_end - 30), train_end): age = maxidx - i w = math.exp(-math.log(2) * age / 15) cnt = Counter(codes[i, p]) for dstr, c in cnt.items(): if c >= 2: scores[int(dstr)] += 1.0 * w * (c - 1) return scores / scores.max() probs = [ digit_probs(PRIZE_INDEX, pos, next_time, prev_code=codes[-1, PRIZE_INDEX]) for pos in range(4) ] digit_score = np.sum(np.vstack(probs), axis=0) kembar_score = kembar_scores_for_prize() bbfs10 = [str(i) for i in np.argsort(digit_score)[::-1]] bbfs8 = [str(i) for i in np.argsort(digit_score)[::-1][:8]] bbfs7 = [str(i) for i in np.argsort(digit_score)[::-1][:7]] bbfs_set = set(map(int, bbfs8)) # --------------------------- # Generator scoring # --------------------------- def score_4d_kembar(code): digs = [int(ch) for ch in code] if not set(digs).issubset(bbfs_set): return 0.0 cnt = Counter(code) if max(cnt.values()) < 2: return 0.0 s = 1.0 for pos, d in enumerate(digs): s *= probs[pos][d] for dstr, c in cnt.items(): if c >= 2: d = int(dstr) s *= 1.0 + 0.90 * kembar_score[d] * (c - 1) maxc = max(cnt.values()) if maxc == 4: s *= 0.45 elif maxc == 3: s *= 0.72 s *= 1.0 + 0.04 * sum(1 for d in digs if str(d) in bbfs7) # Hindari exact terlalu dekat dengan 30 sesi terakhir Prize 1 recent_exact = set(codes[max(0, N - 30):N, PRIZE_INDEX]) if code in recent_exact: s *= 0.75 return float(s) def score_3d_kembar(code): # 3D diasumsikan dari 3 digit belakang: ratusan-puluhan-ekor digs = [int(ch) for ch in code] if not set(digs).issubset(bbfs_set): return 0.0 cnt = Counter(code) if max(cnt.values()) < 2: return 0.0 s = probs[1][digs[0]] * probs[2][digs[1]] * probs[3][digs[2]] for dstr, c in cnt.items(): if c >= 2: s *= 1.0 + 0.90 * kembar_score[int(dstr)] * (c - 1) if max(cnt.values()) == 3: s *= 0.75 return float(s) def score_2d_mix(code): # 2D diasumsikan dari 2 digit belakang: puluhan-ekor digs = [int(ch) for ch in code] if not set(digs).issubset(bbfs_set): return 0.0 s = probs[2][digs[0]] * probs[3][digs[1]] if digs[0] == digs[1]: s *= 1.0 + 1.20 * kembar_score[digs[0]] else: s *= 1.0 + 0.25 * (kembar_score[digs[0]] + kembar_score[digs[1]]) / 2 return float(s) def topn(items, n=50): return sorted(items, key=lambda x: x[1], reverse=True)[:n] # Digit tables digit_rows = [] for d in range(10): digit_rows.append({ "digit": str(d), "skor_bbfs": float(digit_score[d]), "skor_kembar": float(kembar_score[d]), "rank_bbfs": int(np.where(np.argsort(digit_score)[::-1] == d)[0][0] + 1), "rank_kembar": int(np.where(np.argsort(kembar_score)[::-1] == d)[0][0] + 1), }) digit_df = pd.DataFrame(digit_rows).sort_values("rank_bbfs") # Kembar murni AA kembar_2d = [] for d in range(10): code = f"{d}{d}" sc = probs[2][d] * probs[3][d] * (1.0 + 1.20 * kembar_score[d]) kembar_2d.append((code, float(sc))) top_4d = topn( [("".join(map(str, c)), score_4d_kembar("".join(map(str, c)))) for c in itertools.product(range(10), repeat=4)], 50 ) top_4d = [(a, s) for a, s in top_4d if s > 0] top_3d = topn( [("".join(map(str, c)), score_3d_kembar("".join(map(str, c)))) for c in itertools.product(range(10), repeat=3)], 50 ) top_3d = [(a, s) for a, s in top_3d if s > 0] top_2d_mix = topn( [("".join(map(str, c)), score_2d_mix("".join(map(str, c)))) for c in itertools.product(range(10), repeat=2)], 50 ) top_2d_mix = [(a, s) for a, s in top_2d_mix if s > 0] top_kembar_2d = topn(kembar_2d, 10) # --------------------------- # Save output files # --------------------------- summary_rows = [] summary_rows.append({ "kategori": "TARGET", "rank": "", "angka": target_dt.strftime("%Y-%m-%d %H:%M"), "skor": "", "catatan": "Target sesi berikutnya" }) summary_rows.append({ "kategori": "BBFS_7_PRIZE_1", "rank": 1, "angka": "".join(bbfs7), "skor": "", "catatan": "7 digit BBFS terkuat khusus Prize 1" }) summary_rows.append({ "kategori": "BBFS_8_PRIZE_1", "rank": 1, "angka": "".join(bbfs8), "skor": "", "catatan": "8 digit BBFS untuk generator campur kembar" }) summary_rows.append({ "kategori": "BBFS_10_URUTAN", "rank": 1, "angka": "-".join(bbfs10), "skor": "", "catatan": "Urutan semua digit dari terkuat ke terlemah" }) for rank, (angka, skor) in enumerate(top_kembar_2d, 1): summary_rows.append({ "kategori": "2D_KEMBAR_MURNI", "rank": rank, "angka": angka, "skor": skor, "catatan": "AA khusus posisi 2D belakang Prize 1" }) for rank, (angka, skor) in enumerate(top_2d_mix[:30], 1): summary_rows.append({ "kategori": "2D_CAMPUR_BBFS_KEMBAR", "rank": rank, "angka": angka, "skor": skor, "catatan": "2D belakang dari BBFS, dibonuskan dengan skor kembar" }) for rank, (angka, skor) in enumerate(top_3d[:30], 1): summary_rows.append({ "kategori": "3D_KEMBAR_CAMPUR", "rank": rank, "angka": angka, "skor": skor, "catatan": "3D belakang wajib mengandung digit kembar" }) for rank, (angka, skor) in enumerate(top_4d[:50], 1): summary_rows.append({ "kategori": "4D_KEMBAR_CAMPUR", "rank": rank, "angka": angka, "skor": skor, "catatan": "4D Prize 1 dari BBFS 8, wajib mengandung digit kembar" }) summary_df = pd.DataFrame(summary_rows) out_csv = Path("/mnt/data/generator_bbfs_kembar_prize1.csv") summary_df.to_csv(out_csv, index=False) digit_csv = Path("/mnt/data/skor_digit_bbfs_kembar_prize1.csv") digit_df.to_csv(digit_csv, index=False) # Colab script colab_script = r''' # ============================================================ # GENERATOR BBFS TERKUAT + ANGKA KEMBAR KHUSUS PRIZE 1 # Cocok dijalankan di Google Colab # ============================================================ import json, math, itertools from datetime import datetime, timedelta from collections import Counter import numpy as np import pandas as pd try: from google.colab import files uploaded = files.upload() if not uploaded: raise RuntimeError("Tidak ada file JSON yang diupload.") JSON_PATH = next(iter(uploaded.keys())) except Exception: JSON_PATH = "data_ekstraksi.json" MONTHS_ID = { "Januari": 1, "Februari": 2, "Maret": 3, "April": 4, "Mei": 5, "Juni": 6, "Juli": 7, "Agustus": 8, "September": 9, "Oktober": 10, "November": 11, "Desember": 12 } def parse_dt(tanggal, waktu): hari, bulan, tahun = tanggal.split() jam, menit = map(int, waktu.split(":")) return datetime(int(tahun), MONTHS_ID[bulan], int(hari), jam, menit) with open(JSON_PATH, "r", encoding="utf-8") as f: data = json.load(f) sessions = sorted([(parse_dt(s["tanggal"], s["waktu"]), s) for s in data], key=lambda x: x[0]) N = len(sessions) P = max(len(s["daftar_prize"]) for _, s in sessions) codes = np.empty((N, P), dtype=object) times, dts = [], [] for i, (dt, s) in enumerate(sessions): dts.append(dt) times.append(s["waktu"]) for p, prize in enumerate(s["daftar_prize"]): codes[i, p] = str(prize["kode"]).zfill(4) time_arr = np.array(times) digit_arr = np.array( [[[int(ch) for ch in codes[i, p]] for p in range(P)] for i in range(N)], dtype=np.int8 ) SCHEDULE = ["03:30", "06:30", "11:30", "13:30", "17:30", "21:30"] last_dt = dts[-1] last_time = times[-1] next_time = SCHEDULE[(SCHEDULE.index(last_time) + 1) % len(SCHEDULE)] next_date = last_dt.date() if SCHEDULE.index(next_time) <= SCHEDULE.index(last_time): next_date = (last_dt + timedelta(days=1)).date() target_dt = datetime.combine(next_date, datetime.min.time()).replace( hour=int(next_time.split(":")[0]), minute=int(next_time.split(":")[1]) ) PRIZE_INDEX = 0 # khusus Prize 1 def weighted_counts_indices(indices, p, pos, half_life, maxidx, alpha=0.35): counts = np.ones(10) * alpha if len(indices) == 0: return counts ages = maxidx - indices weights = np.exp(-np.log(2) * ages / half_life) vals = digit_arr[indices, p, pos] for v, w in zip(vals, weights): counts[v] += w return counts def digit_probs(p, pos, target_time, prev_code=None, train_end=None): if train_end is None: train_end = N maxidx = train_end - 1 idx_all = np.arange(train_end) idx_time = np.where(time_arr[:train_end] == target_time)[0] idx_recent = np.arange(max(0, train_end - 45), train_end) c_global = weighted_counts_indices(idx_all, p, pos, 110, maxidx) c_time = weighted_counts_indices(idx_time, p, pos, 50, maxidx) c_recent = weighted_counts_indices(idx_recent, p, pos, 20, maxidx) c_alltime = np.ones(10) * 0.35 if len(idx_time) > 0: for pp in range(P): c_alltime += weighted_counts_indices(idx_time, pp, pos, 45, maxidx, alpha=0.0) c_trans = np.ones(10) * 0.35 if prev_code is not None: prev_digit = int(prev_code[pos]) for ci in range(1, train_end): if time_arr[ci] == target_time and digit_arr[ci - 1, p, pos] == prev_digit: age = maxidx - ci c_trans[digit_arr[ci, p, pos]] += math.exp(-math.log(2) * age / 50) comps = [ c_global / c_global.sum(), c_time / c_time.sum(), c_recent / c_recent.sum(), c_alltime / c_alltime.sum(), c_trans / c_trans.sum(), ] weights = [0.25, 0.34, 0.20, 0.08, 0.13] probs = sum(w * c for w, c in zip(weights, comps)) return probs / probs.sum() def kembar_scores_for_prize(p=PRIZE_INDEX, target_time=next_time, train_end=N): maxidx = train_end - 1 scores = np.ones(10) * 0.1 for i in range(train_end): age = maxidx - i w = math.exp(-math.log(2) * age / 90) cnt = Counter(codes[i, p]) for dstr, c in cnt.items(): if c >= 2: scores[int(dstr)] += w * (c - 1) for i in np.where(time_arr[:train_end] == target_time)[0]: age = maxidx - i w = math.exp(-math.log(2) * age / 45) cnt = Counter(codes[i, p]) for dstr, c in cnt.items(): if c >= 2: scores[int(dstr)] += 1.5 * w * (c - 1) for i in range(max(0, train_end - 30), train_end): age = maxidx - i w = math.exp(-math.log(2) * age / 15) cnt = Counter(codes[i, p]) for dstr, c in cnt.items(): if c >= 2: scores[int(dstr)] += 1.0 * w * (c - 1) return scores / scores.max() probs = [ digit_probs(PRIZE_INDEX, pos, next_time, prev_code=codes[-1, PRIZE_INDEX]) for pos in range(4) ] digit_score = np.sum(np.vstack(probs), axis=0) kembar_score = kembar_scores_for_prize() bbfs10 = [str(i) for i in np.argsort(digit_score)[::-1]] bbfs8 = [str(i) for i in np.argsort(digit_score)[::-1][:8]] bbfs7 = [str(i) for i in np.argsort(digit_score)[::-1][:7]] bbfs_set = set(map(int, bbfs8)) def score_4d_kembar(code): digs = [int(ch) for ch in code] if not set(digs).issubset(bbfs_set): return 0.0 cnt = Counter(code) if max(cnt.values()) < 2: return 0.0 s = 1.0 for pos, d in enumerate(digs): s *= probs[pos][d] for dstr, c in cnt.items(): if c >= 2: d = int(dstr) s *= 1.0 + 0.90 * kembar_score[d] * (c - 1) maxc = max(cnt.values()) if maxc == 4: s *= 0.45 elif maxc == 3: s *= 0.72 s *= 1.0 + 0.04 * sum(1 for d in digs if str(d) in bbfs7) recent_exact = set(codes[max(0, N - 30):N, PRIZE_INDEX]) if code in recent_exact: s *= 0.75 return float(s) def score_3d_kembar(code): # 3D belakang: ratusan-puluhan-ekor digs = [int(ch) for ch in code] if not set(digs).issubset(bbfs_set): return 0.0 cnt = Counter(code) if max(cnt.values()) < 2: return 0.0 s = probs[1][digs[0]] * probs[2][digs[1]] * probs[3][digs[2]] for dstr, c in cnt.items(): if c >= 2: s *= 1.0 + 0.90 * kembar_score[int(dstr)] * (c - 1) if max(cnt.values()) == 3: s *= 0.75 return float(s) def score_2d_mix(code): # 2D belakang: puluhan-ekor digs = [int(ch) for ch in code] if not set(digs).issubset(bbfs_set): return 0.0 s = probs[2][digs[0]] * probs[3][digs[1]] if digs[0] == digs[1]: s *= 1.0 + 1.20 * kembar_score[digs[0]] else: s *= 1.0 + 0.25 * (kembar_score[digs[0]] + kembar_score[digs[1]]) / 2 return float(s) def topn(items, n=50): return sorted(items, key=lambda x: x[1], reverse=True)[:n] top_4d = topn( [("".join(map(str, c)), score_4d_kembar("".join(map(str, c)))) for c in itertools.product(range(10), repeat=4)], 50 ) top_4d = [(a, s) for a, s in top_4d if s > 0] top_3d = topn( [("".join(map(str, c)), score_3d_kembar("".join(map(str, c)))) for c in itertools.product(range(10), repeat=3)], 50 ) top_3d = [(a, s) for a, s in top_3d if s > 0] top_2d_mix = topn( [("".join(map(str, c)), score_2d_mix("".join(map(str, c)))) for c in itertools.product(range(10), repeat=2)], 50 ) top_2d_mix = [(a, s) for a, s in top_2d_mix if s > 0] kembar_2d = [] for d in range(10): code = f"{d}{d}" sc = probs[2][d] * probs[3][d] * (1.0 + 1.20 * kembar_score[d]) kembar_2d.append((code, float(sc))) top_kembar_2d = topn(kembar_2d, 10) summary_rows = [] summary_rows.append({"kategori": "TARGET", "rank": "", "angka": target_dt.strftime("%Y-%m-%d %H:%M"), "skor": "", "catatan": "Target sesi berikutnya"}) summary_rows.append({"kategori": "BBFS_7_PRIZE_1", "rank": 1, "angka": "".join(bbfs7), "skor": "", "catatan": "7 digit BBFS terkuat khusus Prize 1"}) summary_rows.append({"kategori": "BBFS_8_PRIZE_1", "rank": 1, "angka": "".join(bbfs8), "skor": "", "catatan": "8 digit BBFS untuk generator campur kembar"}) summary_rows.append({"kategori": "BBFS_10_URUTAN", "rank": 1, "angka": "-".join(bbfs10), "skor": "", "catatan": "Urutan semua digit dari terkuat ke terlemah"}) for rank, (angka, skor) in enumerate(top_kembar_2d, 1): summary_rows.append({"kategori": "2D_KEMBAR_MURNI", "rank": rank, "angka": angka, "skor": skor, "catatan": "AA khusus posisi 2D belakang Prize 1"}) for rank, (angka, skor) in enumerate(top_2d_mix[:30], 1): summary_rows.append({"kategori": "2D_CAMPUR_BBFS_KEMBAR", "rank": rank, "angka": angka, "skor": skor, "catatan": "2D belakang dari BBFS, dibonuskan dengan skor kembar"}) for rank, (angka, skor) in enumerate(top_3d[:30], 1): summary_rows.append({"kategori": "3D_KEMBAR_CAMPUR", "rank": rank, "angka": angka, "skor": skor, "catatan": "3D belakang wajib mengandung digit kembar"}) for rank, (angka, skor) in enumerate(top_4d[:50], 1): summary_rows.append({"kategori": "4D_KEMBAR_CAMPUR", "rank": rank, "angka": angka, "skor": skor, "catatan": "4D Prize 1 dari BBFS 8, wajib mengandung digit kembar"}) summary_df = pd.DataFrame(summary_rows) summary_df.to_csv("generator_bbfs_kembar_prize1.csv", index=False) digit_rows = [] for d in range(10): digit_rows.append({ "digit": str(d), "skor_bbfs": float(digit_score[d]), "skor_kembar": float(kembar_score[d]), "rank_bbfs": int(np.where(np.argsort(digit_score)[::-1] == d)[0][0] + 1), "rank_kembar": int(np.where(np.argsort(kembar_score)[::-1] == d)[0][0] + 1), }) digit_df = pd.DataFrame(digit_rows).sort_values("rank_bbfs") digit_df.to_csv("skor_digit_bbfs_kembar_prize1.csv", index=False) print("Target:", target_dt.strftime("%d-%m-%Y %H:%M")) print("BBFS 7 Prize 1:", "".join(bbfs7)) print("BBFS 8 Generator:", "".join(bbfs8)) print("Urutan digit:", "-".join(bbfs10)) print("\n2D kembar murni:", ", ".join(a for a, _ in top_kembar_2d)) print("2D campur TOP 20:", ", ".join(a for a, _ in top_2d_mix[:20])) print("3D kembar TOP 20:", ", ".join(a for a, _ in top_3d[:20])) print("4D kembar campur TOP 20:", ", ".join(a for a, _ in top_4d[:20])) try: from google.colab import files files.download("generator_bbfs_kembar_prize1.csv") files.download("skor_digit_bbfs_kembar_prize1.csv") except Exception: pass ''' script_path = Path("/mnt/data/generator_bbfs_kembar_prize1_colab.py") script_path.write_text(colab_script, encoding="utf-8") print("Generator BBFS + kembar khusus Prize 1 selesai dibuat.") print("Target:", target_dt.strftime("%d-%m-%Y %H:%M")) print("BBFS 7 Prize 1:", "".join(bbfs7)) print("BBFS 8 Generator:", "".join(bbfs8)) print("Top 4D:", ", ".join(a for a, _ in top_4d[:10])) print("Top 3D:", ", ".join(a for a, _ in top_3d[:10])) print("Top 2D campur:", ", ".join(a for a, _ in top_2d_mix[:10])) print("Top 2D kembar:", ", ".join(a for a, _ in top_kembar_2d[:10])) print("Files:") print(script_path) print(out_csv) print(digit_csv)

回答

Sudah saya buatkan generator BBFS terkuat + angka kembar khusus Prize 1 berdasarkan data JSON terbaru. (data_ekstraksi.json)

Target: 30 Mei 2026 — 11:30
BBFS 7 khusus Prize 1: 9567180
BBFS 8 untuk generator campur kembar: 95671804

Hasil terkuat

2D kembar murni:
44, 99, 88, 11, 00, 77, 33, 55, 22, 66

2D campur BBFS + kembar TOP 20:
98, 44, 99, 58, 88, 94, 48, 97, 90, 96, 91, 08, 54, 11, 18, 00, 57, 50, 56, 51

3D kembar campur TOP 20:
644, 699, 696, 998, 688, 494, 656, 558, 448, 898, 544, 611, 454, 646, 600, 606, 599, 994, 191, 444

4D kembar campur TOP 20:
9698, 9696, 5658, 5656, 9494, 9697, 9694, 9690, 5699, 7697, 5696, 9898, 5644, 5598, 9691, 9598, 7699, 5998, 5599, 7696

File siap pakai:

Download script Colab generator BBFS kembar Prize 1
Download hasil generator BBFS kembar Prize 1
Download skor digit BBFS dan kembar Prize 1

質問

Tambahkan generator angka tarung top 100 khusus 1prize

思考

Saya akan tambahkan generator angka tarung TOP 100 khusus Prize 1 sebagai ranking semua pasangan 00–99, dengan skor dari BBFS Prize 1, frekuensi pasangan, jam target, data terbaru, dan bonus kembar.

Thought for 16s

Python

python
from pathlib import Path import json, math, itertools from datetime import datetime, timedelta from collections import Counter, defaultdict import numpy as np import pandas as pd DATA_PATH = Path("/mnt/data/data_ekstraksi.json") MONTHS_ID = { "Januari": 1, "Februari": 2, "Maret": 3, "April": 4, "Mei": 5, "Juni": 6, "Juli": 7, "Agustus": 8, "September": 9, "Oktober": 10, "November": 11, "Desember": 12 } def parse_dt(tanggal, waktu): hari, bulan, tahun = tanggal.split() jam, menit = map(int, waktu.split(":")) return datetime(int(tahun), MONTHS_ID[bulan], int(hari), jam, menit) with DATA_PATH.open("r", encoding="utf-8") as f: data = json.load(f) sessions = sorted([(parse_dt(s["tanggal"], s["waktu"]), s) for s in data], key=lambda x: x[0]) N = len(sessions) P = max(len(s["daftar_prize"]) for _, s in sessions) codes = np.empty((N, P), dtype=object) times, dts = [], [] for i, (dt, s) in enumerate(sessions): dts.append(dt) times.append(s["waktu"]) for p, prize in enumerate(s["daftar_prize"]): codes[i, p] = str(prize["kode"]).zfill(4) time_arr = np.array(times) digit_arr = np.array( [[[int(ch) for ch in codes[i, p]] for p in range(P)] for i in range(N)], dtype=np.int8 ) SCHEDULE = ["03:30", "06:30", "11:30", "13:30", "17:30", "21:30"] last_dt = dts[-1] last_time = times[-1] next_time = SCHEDULE[(SCHEDULE.index(last_time) + 1) % len(SCHEDULE)] next_date = last_dt.date() if SCHEDULE.index(next_time) <= SCHEDULE.index(last_time): next_date = (last_dt + timedelta(days=1)).date() target_dt = datetime.combine(next_date, datetime.min.time()).replace( hour=int(next_time.split(":")[0]), minute=int(next_time.split(":")[1]) ) PRIZE_INDEX = 0 # Prize 1 def weighted_counts_indices(indices, p, pos, half_life, maxidx, alpha=0.35): counts = np.ones(10) * alpha if len(indices) == 0: return counts ages = maxidx - indices weights = np.exp(-np.log(2) * ages / half_life) vals = digit_arr[indices, p, pos] for v, w in zip(vals, weights): counts[v] += w return counts def digit_probs(p, pos, target_time, prev_code=None, train_end=None): if train_end is None: train_end = N maxidx = train_end - 1 idx_all = np.arange(train_end) idx_time = np.where(time_arr[:train_end] == target_time)[0] idx_recent = np.arange(max(0, train_end - 45), train_end) c_global = weighted_counts_indices(idx_all, p, pos, 110, maxidx) c_time = weighted_counts_indices(idx_time, p, pos, 50, maxidx) c_recent = weighted_counts_indices(idx_recent, p, pos, 20, maxidx) c_alltime = np.ones(10) * 0.35 if len(idx_time) > 0: for pp in range(P): c_alltime += weighted_counts_indices(idx_time, pp, pos, 45, maxidx, alpha=0.0) c_trans = np.ones(10) * 0.35 if prev_code is not None: prev_digit = int(prev_code[pos]) for ci in range(1, train_end): if time_arr[ci] == target_time and digit_arr[ci - 1, p, pos] == prev_digit: age = maxidx - ci c_trans[digit_arr[ci, p, pos]] += math.exp(-math.log(2) * age / 50) comps = [ c_global / c_global.sum(), c_time / c_time.sum(), c_recent / c_recent.sum(), c_alltime / c_alltime.sum(), c_trans / c_trans.sum(), ] weights = [0.25, 0.34, 0.20, 0.08, 0.13] probs = sum(w * c for w, c in zip(weights, comps)) return probs / probs.sum() def normalize_dict_score(score_dict, default=0.0): vals = list(score_dict.values()) if not vals: return defaultdict(lambda: default) maxv = max(vals) if maxv <= 0: return defaultdict(lambda: default) out = defaultdict(lambda: default) for k, v in score_dict.items(): out[k] = v / maxv return out def kembar_scores_for_prize(p=PRIZE_INDEX, target_time=next_time, train_end=N): maxidx = train_end - 1 scores = np.ones(10) * 0.1 for i in range(train_end): age = maxidx - i w = math.exp(-math.log(2) * age / 90) cnt = Counter(codes[i, p]) for dstr, c in cnt.items(): if c >= 2: scores[int(dstr)] += w * (c - 1) for i in np.where(time_arr[:train_end] == target_time)[0]: age = maxidx - i w = math.exp(-math.log(2) * age / 45) cnt = Counter(codes[i, p]) for dstr, c in cnt.items(): if c >= 2: scores[int(dstr)] += 1.5 * w * (c - 1) for i in range(max(0, train_end - 30), train_end): age = maxidx - i w = math.exp(-math.log(2) * age / 15) cnt = Counter(codes[i, p]) for dstr, c in cnt.items(): if c >= 2: scores[int(dstr)] += 1.0 * w * (c - 1) return scores / scores.max() def pair_frequency_scores(p=PRIZE_INDEX, target_time=next_time, train_end=N): """ Menghasilkan skor pasangan 00-99 khusus Prize 1. Komponen: - pair_2d_tail: frekuensi 2 digit belakang - pair_adjacent: frekuensi pasangan berurutan AB pada posisi 1-2, 2-3, 3-4 - pair_any: frekuensi pasangan digit yang sama-sama muncul dalam kode, arah AB/BA - pair_target_time: penguatan khusus jam target - pair_recent: penguatan data terbaru """ maxidx = train_end - 1 tail = defaultdict(float) adjacent = defaultdict(float) anypair = defaultdict(float) target_boost = defaultdict(float) recent_boost = defaultdict(float) for i in range(train_end): code = codes[i, p] age = maxidx - i w_global = math.exp(-math.log(2) * age / 115) w_recent = math.exp(-math.log(2) * age / 22) # 2D belakang tail[code[2:4]] += w_global # Pasangan posisi berurutan for a, b in [(code[0], code[1]), (code[1], code[2]), (code[2], code[3])]: adjacent[a + b] += w_global # Semua pasangan digit dalam kode, termasuk arah AB dan BA for x in range(4): for y in range(4): if x != y: anypair[code[x] + code[y]] += 0.33 * w_global # Jam target if time_arr[i] == target_time: wt = math.exp(-math.log(2) * age / 52) target_boost[code[2:4]] += 1.25 * wt for a, b in [(code[0], code[1]), (code[1], code[2]), (code[2], code[3])]: target_boost[a + b] += 0.80 * wt for x in range(4): for y in range(4): if x != y: target_boost[code[x] + code[y]] += 0.18 * wt # Data terbaru if i >= max(0, train_end - 45): recent_boost[code[2:4]] += 1.10 * w_recent for a, b in [(code[0], code[1]), (code[1], code[2]), (code[2], code[3])]: recent_boost[a + b] += 0.65 * w_recent for x in range(4): for y in range(4): if x != y: recent_boost[code[x] + code[y]] += 0.12 * w_recent return { "tail": normalize_dict_score(tail), "adjacent": normalize_dict_score(adjacent), "anypair": normalize_dict_score(anypair), "target": normalize_dict_score(target_boost), "recent": normalize_dict_score(recent_boost), } # Model digit khusus Prize 1 probs = [ digit_probs(PRIZE_INDEX, pos, next_time, prev_code=codes[-1, PRIZE_INDEX]) for pos in range(4) ] digit_score = np.sum(np.vstack(probs), axis=0) digit_score_norm = digit_score / digit_score.max() bbfs10 = [str(i) for i in np.argsort(digit_score)[::-1]] bbfs8 = [str(i) for i in np.argsort(digit_score)[::-1][:8]] bbfs7 = [str(i) for i in np.argsort(digit_score)[::-1][:7]] bbfs_set8 = set(bbfs8) kembar_score = kembar_scores_for_prize() pair_scores = pair_frequency_scores() # Score angka tarung 00-99 rows = [] for a, b in itertools.product(range(10), repeat=2): pair = f"{a}{b}" # skor digit utama: pakai semua posisi + tail 2D s_digit = ( 0.55 * (digit_score_norm[a] + digit_score_norm[b]) / 2 + 0.45 * math.sqrt(probs[2][a] * probs[3][b]) / math.sqrt(max(probs[2].max() * probs[3].max(), 1e-12)) ) s_freq = ( 0.34 * pair_scores["tail"][pair] + 0.22 * pair_scores["adjacent"][pair] + 0.16 * pair_scores["anypair"][pair] + 0.18 * pair_scores["target"][pair] + 0.10 * pair_scores["recent"][pair] ) s_bbfs = 0.0 if str(a) in bbfs_set8: s_bbfs += 0.5 if str(b) in bbfs_set8: s_bbfs += 0.5 s_kembar = 0.0 if a == b: s_kembar = kembar_score[a] else: s_kembar = 0.35 * (kembar_score[a] + kembar_score[b]) / 2 final_score = ( 0.43 * s_digit + 0.34 * s_freq + 0.13 * s_bbfs + 0.10 * s_kembar ) # Bonus kecil jika pasangan membentuk angka tarung dari dua digit sangat kuat if str(a) in bbfs7 and str(b) in bbfs7: final_score *= 1.04 rows.append({ "angka_tarung": pair, "digit_depan": a, "digit_belakang": b, "is_kembar": "YA" if a == b else "TIDAK", "dalam_bbfs8": "YA" if (str(a) in bbfs_set8 and str(b) in bbfs_set8) else "TIDAK", "skor_final": final_score, "skor_digit": s_digit, "skor_frekuensi_pair": s_freq, "skor_kembar": s_kembar, "tail_2d_score": pair_scores["tail"][pair], "target_time_score": pair_scores["target"][pair], "recent_score": pair_scores["recent"][pair], }) tarung_df = pd.DataFrame(rows).sort_values("skor_final", ascending=False).reset_index(drop=True) tarung_df.insert(0, "rank", np.arange(1, len(tarung_df) + 1)) # Save top100 and summary top100_path = Path("/mnt/data/angka_tarung_top100_prize1.csv") tarung_df.to_csv(top100_path, index=False) # Create updated combined generator file with prior BBFS/kembar outputs + top100 tarung # Recompute useful 4D/3D/2D from prior generator so this file stands alone. def score_4d_kembar(code): digs = [int(ch) for ch in code] if not set(map(str, digs)).issubset(bbfs_set8): return 0.0 cnt = Counter(code) if max(cnt.values()) < 2: return 0.0 s = 1.0 for pos, d in enumerate(digs): s *= probs[pos][d] for dstr, c in cnt.items(): if c >= 2: d = int(dstr) s *= 1.0 + 0.90 * kembar_score[d] * (c - 1) maxc = max(cnt.values()) if maxc == 4: s *= 0.45 elif maxc == 3: s *= 0.72 recent_exact = set(codes[max(0, N - 30):N, PRIZE_INDEX]) if code in recent_exact: s *= 0.75 return float(s) def score_3d_kembar(code): digs = [int(ch) for ch in code] if not set(map(str, digs)).issubset(bbfs_set8): return 0.0 cnt = Counter(code) if max(cnt.values()) < 2: return 0.0 s = probs[1][digs[0]] * probs[2][digs[1]] * probs[3][digs[2]] for dstr, c in cnt.items(): if c >= 2: s *= 1.0 + 0.90 * kembar_score[int(dstr)] * (c - 1) if max(cnt.values()) == 3: s *= 0.75 return float(s) def score_2d_mix(code): digs = [int(ch) for ch in code] if not set(map(str, digs)).issubset(bbfs_set8): return 0.0 s = probs[2][digs[0]] * probs[3][digs[1]] if digs[0] == digs[1]: s *= 1.0 + 1.20 * kembar_score[digs[0]] else: s *= 1.0 + 0.25 * (kembar_score[digs[0]] + kembar_score[digs[1]]) / 2 return float(s) top_4d = sorted( [("".join(map(str, c)), score_4d_kembar("".join(map(str, c)))) for c in itertools.product(range(10), repeat=4)], key=lambda x: x[1], reverse=True ) top_4d = [(a, s) for a, s in top_4d if s > 0][:50] top_3d = sorted( [("".join(map(str, c)), score_3d_kembar("".join(map(str, c)))) for c in itertools.product(range(10), repeat=3)], key=lambda x: x[1], reverse=True ) top_3d = [(a, s) for a, s in top_3d if s > 0][:50] top_2d = sorted( [("".join(map(str, c)), score_2d_mix("".join(map(str, c)))) for c in itertools.product(range(10), repeat=2)], key=lambda x: x[1], reverse=True ) top_2d = [(a, s) for a, s in top_2d if s > 0][:50] summary_rows = [ {"kategori": "TARGET", "rank": "", "angka": target_dt.strftime("%Y-%m-%d %H:%M"), "skor": "", "catatan": "Target sesi berikutnya"}, {"kategori": "BBFS_7_PRIZE_1", "rank": 1, "angka": "".join(bbfs7), "skor": "", "catatan": "7 digit BBFS terkuat khusus Prize 1"}, {"kategori": "BBFS_8_PRIZE_1", "rank": 1, "angka": "".join(bbfs8), "skor": "", "catatan": "8 digit untuk generator campur dan tarung"}, {"kategori": "BBFS_10_URUTAN", "rank": 1, "angka": "-".join(bbfs10), "skor": "", "catatan": "Urutan digit terkuat ke terlemah"}, ] for rank, row in tarung_df.head(100).iterrows(): summary_rows.append({ "kategori": "ANGKA_TARUNG_TOP100_PRIZE_1", "rank": int(row["rank"]), "angka": row["angka_tarung"], "skor": row["skor_final"], "catatan": f"kembar={row['is_kembar']}; bbfs8={row['dalam_bbfs8']}" }) for rank, (angka, skor) in enumerate(top_2d[:30], 1): summary_rows.append({"kategori": "2D_CAMPUR_BBFS_KEMBAR", "rank": rank, "angka": angka, "skor": skor, "catatan": "2D belakang Prize 1"}) for rank, (angka, skor) in enumerate(top_3d[:30], 1): summary_rows.append({"kategori": "3D_KEMBAR_CAMPUR", "rank": rank, "angka": angka, "skor": skor, "catatan": "3D belakang wajib ada kembar"}) for rank, (angka, skor) in enumerate(top_4d[:50], 1): summary_rows.append({"kategori": "4D_KEMBAR_CAMPUR", "rank": rank, "angka": angka, "skor": skor, "catatan": "4D Prize 1 wajib ada kembar"}) combined_path = Path("/mnt/data/generator_bbfs_kembar_tarung_prize1_v2.csv") pd.DataFrame(summary_rows).to_csv(combined_path, index=False) # Colab script standalone, with top100 tarung generator included. colab_script = r''' # ============================================================ # GENERATOR BBFS + ANGKA KEMBAR + ANGKA TARUNG TOP 100 # KHUSUS PRIZE 1 # Cocok dijalankan di Google Colab # ============================================================ import json, math, itertools from datetime import datetime, timedelta from collections import Counter, defaultdict import numpy as np import pandas as pd try: from google.colab import files uploaded = files.upload() if not uploaded: raise RuntimeError("Tidak ada file JSON yang diupload.") JSON_PATH = next(iter(uploaded.keys())) except Exception: JSON_PATH = "data_ekstraksi.json" MONTHS_ID = { "Januari": 1, "Februari": 2, "Maret": 3, "April": 4, "Mei": 5, "Juni": 6, "Juli": 7, "Agustus": 8, "September": 9, "Oktober": 10, "November": 11, "Desember": 12 } def parse_dt(tanggal, waktu): hari, bulan, tahun = tanggal.split() jam, menit = map(int, waktu.split(":")) return datetime(int(tahun), MONTHS_ID[bulan], int(hari), jam, menit) with open(JSON_PATH, "r", encoding="utf-8") as f: data = json.load(f) sessions = sorted([(parse_dt(s["tanggal"], s["waktu"]), s) for s in data], key=lambda x: x[0]) N = len(sessions) P = max(len(s["daftar_prize"]) for _, s in sessions) codes = np.empty((N, P), dtype=object) times, dts = [], [] for i, (dt, s) in enumerate(sessions): dts.append(dt) times.append(s["waktu"]) for p, prize in enumerate(s["daftar_prize"]): codes[i, p] = str(prize["kode"]).zfill(4) time_arr = np.array(times) digit_arr = np.array( [[[int(ch) for ch in codes[i, p]] for p in range(P)] for i in range(N)], dtype=np.int8 ) SCHEDULE = ["03:30", "06:30", "11:30", "13:30", "17:30", "21:30"] last_dt = dts[-1] last_time = times[-1] next_time = SCHEDULE[(SCHEDULE.index(last_time) + 1) % len(SCHEDULE)] next_date = last_dt.date() if SCHEDULE.index(next_time) <= SCHEDULE.index(last_time): next_date = (last_dt + timedelta(days=1)).date() target_dt = datetime.combine(next_date, datetime.min.time()).replace( hour=int(next_time.split(":")[0]), minute=int(next_time.split(":")[1]) ) PRIZE_INDEX = 0 # khusus Prize 1 def weighted_counts_indices(indices, p, pos, half_life, maxidx, alpha=0.35): counts = np.ones(10) * alpha if len(indices) == 0: return counts ages = maxidx - indices weights = np.exp(-np.log(2) * ages / half_life) vals = digit_arr[indices, p, pos] for v, w in zip(vals, weights): counts[v] += w return counts def digit_probs(p, pos, target_time, prev_code=None, train_end=None): if train_end is None: train_end = N maxidx = train_end - 1 idx_all = np.arange(train_end) idx_time = np.where(time_arr[:train_end] == target_time)[0] idx_recent = np.arange(max(0, train_end - 45), train_end) c_global = weighted_counts_indices(idx_all, p, pos, 110, maxidx) c_time = weighted_counts_indices(idx_time, p, pos, 50, maxidx) c_recent = weighted_counts_indices(idx_recent, p, pos, 20, maxidx) c_alltime = np.ones(10) * 0.35 if len(idx_time) > 0: for pp in range(P): c_alltime += weighted_counts_indices(idx_time, pp, pos, 45, maxidx, alpha=0.0) c_trans = np.ones(10) * 0.35 if prev_code is not None: prev_digit = int(prev_code[pos]) for ci in range(1, train_end): if time_arr[ci] == target_time and digit_arr[ci - 1, p, pos] == prev_digit: age = maxidx - ci c_trans[digit_arr[ci, p, pos]] += math.exp(-math.log(2) * age / 50) comps = [ c_global / c_global.sum(), c_time / c_time.sum(), c_recent / c_recent.sum(), c_alltime / c_alltime.sum(), c_trans / c_trans.sum(), ] weights = [0.25, 0.34, 0.20, 0.08, 0.13] probs = sum(w * c for w, c in zip(weights, comps)) return probs / probs.sum() def normalize_dict_score(score_dict, default=0.0): vals = list(score_dict.values()) if not vals: return defaultdict(lambda: default) maxv = max(vals) if maxv <= 0: return defaultdict(lambda: default) out = defaultdict(lambda: default) for k, v in score_dict.items(): out[k] = v / maxv return out def kembar_scores_for_prize(p=PRIZE_INDEX, target_time=next_time, train_end=N): maxidx = train_end - 1 scores = np.ones(10) * 0.1 for i in range(train_end): age = maxidx - i w = math.exp(-math.log(2) * age / 90) cnt = Counter(codes[i, p]) for dstr, c in cnt.items(): if c >= 2: scores[int(dstr)] += w * (c - 1) for i in np.where(time_arr[:train_end] == target_time)[0]: age = maxidx - i w = math.exp(-math.log(2) * age / 45) cnt = Counter(codes[i, p]) for dstr, c in cnt.items(): if c >= 2: scores[int(dstr)] += 1.5 * w * (c - 1) for i in range(max(0, train_end - 30), train_end): age = maxidx - i w = math.exp(-math.log(2) * age / 15) cnt = Counter(codes[i, p]) for dstr, c in cnt.items(): if c >= 2: scores[int(dstr)] += 1.0 * w * (c - 1) return scores / scores.max() def pair_frequency_scores(p=PRIZE_INDEX, target_time=next_time, train_end=N): maxidx = train_end - 1 tail = defaultdict(float) adjacent = defaultdict(float) anypair = defaultdict(float) target_boost = defaultdict(float) recent_boost = defaultdict(float) for i in range(train_end): code = codes[i, p] age = maxidx - i w_global = math.exp(-math.log(2) * age / 115) w_recent = math.exp(-math.log(2) * age / 22) tail[code[2:4]] += w_global for a, b in [(code[0], code[1]), (code[1], code[2]), (code[2], code[3])]: adjacent[a + b] += w_global for x in range(4): for y in range(4): if x != y: anypair[code[x] + code[y]] += 0.33 * w_global if time_arr[i] == target_time: wt = math.exp(-math.log(2) * age / 52) target_boost[code[2:4]] += 1.25 * wt for a, b in [(code[0], code[1]), (code[1], code[2]), (code[2], code[3])]: target_boost[a + b] += 0.80 * wt for x in range(4): for y in range(4): if x != y: target_boost[code[x] + code[y]] += 0.18 * wt if i >= max(0, train_end - 45): recent_boost[code[2:4]] += 1.10 * w_recent for a, b in [(code[0], code[1]), (code[1], code[2]), (code[2], code[3])]: recent_boost[a + b] += 0.65 * w_recent for x in range(4): for y in range(4): if x != y: recent_boost[code[x] + code[y]] += 0.12 * w_recent return { "tail": normalize_dict_score(tail), "adjacent": normalize_dict_score(adjacent), "anypair": normalize_dict_score(anypair), "target": normalize_dict_score(target_boost), "recent": normalize_dict_score(recent_boost), } # Hitung model utama Prize 1 probs = [ digit_probs(PRIZE_INDEX, pos, next_time, prev_code=codes[-1, PRIZE_INDEX]) for pos in range(4) ] digit_score = np.sum(np.vstack(probs), axis=0) digit_score_norm = digit_score / digit_score.max() bbfs10 = [str(i) for i in np.argsort(digit_score)[::-1]] bbfs8 = [str(i) for i in np.argsort(digit_score)[::-1][:8]] bbfs7 = [str(i) for i in np.argsort(digit_score)[::-1][:7]] bbfs_set8 = set(bbfs8) kembar_score = kembar_scores_for_prize() pair_scores = pair_frequency_scores() rows = [] for a, b in itertools.product(range(10), repeat=2): pair = f"{a}{b}" s_digit = ( 0.55 * (digit_score_norm[a] + digit_score_norm[b]) / 2 + 0.45 * math.sqrt(probs[2][a] * probs[3][b]) / math.sqrt(max(probs[2].max() * probs[3].max(), 1e-12)) ) s_freq = ( 0.34 * pair_scores["tail"][pair] + 0.22 * pair_scores["adjacent"][pair] + 0.16 * pair_scores["anypair"][pair] + 0.18 * pair_scores["target"][pair] + 0.10 * pair_scores["recent"][pair] ) s_bbfs = 0.0 if str(a) in bbfs_set8: s_bbfs += 0.5 if str(b) in bbfs_set8: s_bbfs += 0.5 if a == b: s_kembar = kembar_score[a] else: s_kembar = 0.35 * (kembar_score[a] + kembar_score[b]) / 2 final_score = 0.43 * s_digit + 0.34 * s_freq + 0.13 * s_bbfs + 0.10 * s_kembar if str(a) in bbfs7 and str(b) in bbfs7: final_score *= 1.04 rows.append({ "angka_tarung": pair, "digit_depan": a, "digit_belakang": b, "is_kembar": "YA" if a == b else "TIDAK", "dalam_bbfs8": "YA" if (str(a) in bbfs_set8 and str(b) in bbfs_set8) else "TIDAK", "skor_final": final_score, "skor_digit": s_digit, "skor_frekuensi_pair": s_freq, "skor_kembar": s_kembar, "tail_2d_score": pair_scores["tail"][pair], "target_time_score": pair_scores["target"][pair], "recent_score": pair_scores["recent"][pair], }) tarung_df = pd.DataFrame(rows).sort_values("skor_final", ascending=False).reset_index(drop=True) tarung_df.insert(0, "rank", np.arange(1, len(tarung_df) + 1)) tarung_df.to_csv("angka_tarung_top100_prize1.csv", index=False) print("Target:", target_dt.strftime("%d-%m-%Y %H:%M")) print("BBFS 7 Prize 1:", "".join(bbfs7)) print("BBFS 8 Generator:", "".join(bbfs8)) print("Urutan digit:", "-".join(bbfs10)) print("\nAngka tarung TOP 20:") print(", ".join(tarung_df.head(20)["angka_tarung"].tolist())) print("\nAngka tarung kembar terbaik:") print(", ".join(tarung_df[tarung_df["is_kembar"] == "YA"].head(10)["angka_tarung"].tolist())) print("\nFile disimpan: angka_tarung_top100_prize1.csv") try: from google.colab import files files.download("angka_tarung_top100_prize1.csv") except Exception: pass ''' script_path = Path("/mnt/data/generator_tarung_top100_prize1_colab.py") script_path.write_text(colab_script, encoding="utf-8") print("Target:", target_dt.strftime("%d-%m-%Y %H:%M")) print("BBFS 7 Prize 1:", "".join(bbfs7)) print("BBFS 8:", "".join(bbfs8)) print("Top 20 tarung:", ", ".join(tarung_df.head(20)["angka_tarung"].tolist())) print("Top 10 kembar:", ", ".join(tarung_df[tarung_df["is_kembar"] == "YA"].head(10)["angka_tarung"].tolist())) print("Files:") print(top100_path) print(combined_path) print(script_path)

回答

Sudah saya tambahkan generator angka tarung TOP 100 khusus Prize 1.

Target: 30 Mei 2026 — 11:30
BBFS 7 Prize 1: 9567180
BBFS 8 generator: 95671804
Sumber data tetap dari JSON terbaru yang Anda unggah. (data_ekstraksi.json)

Angka tarung TOP 20 khusus Prize 1

08, 94, 91, 54, 48, 19, 49, 97, 57, 98, 58, 06, 56, 10, 59, 50, 51, 90, 68, 99

Angka tarung kembar terbaik

99, 44, 11, 88, 77, 55, 00, 66, 33, 22

File siap pakai:

[Download script Colab generator tarung TOP 100 Prize 1]
Download CSV angka tarung TOP 100 Prize 1
Download CSV gabungan BBFS + kembar + tarung Prize 1

このQ&Aを共有