From 688b6e4a0b074af9e7379e49319ab5b2e38114c8 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 18 Feb 2026 04:45:51 +0000 Subject: [PATCH] =?UTF-8?q?CONFIGURA=C3=87AO=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/__pycache__/views.cpython-311.pyc | Bin 20934 -> 21674 bytes core/templates/core/index.html | 28 +++++++++++++++++++++++-- core/views.py | 21 ++++++++++++++++++- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index ea857fb6bf0cc96ac4c834651169705f84a7f84b..da4f488545f0ac93866a4c0c547da8cc12753067 100644 GIT binary patch delta 1599 zcmY*ZdrVVT7(b_lLaU{P)|S3#OP{o~yo)jc86apwl=#OsqhTGlB3cT$txnCkGmEHY zVT<}@aV*BvEFvoNk#5W465S&++p;B;HKS{`#AFXQ|LU^1nEl~)4hZ6xdw%!a-}imz ze2;U_-S_a7%edr{TrNXYNax$bpEukrc~GG^u?C@&zLWlwHD?h)Nx(8S+$mC|JZ8B_ zT)^*2wOFMX`%+z%4w2ZO@Il1hQ|Q}+xpEk@cc?VONYKVR*rH1k?}SZmJ$zlJtt%IF zMAwCOuMzY_PqYUyUr5S{mgqN9)5*1y>LDZ;CVbT5m|&dnC)Mz}dY#tDDW^pUU8Q45 z1QXFN>97&n+(w8x6jc?(#OaO{(o`xqJ$oOa#)6rc<2}oM2+=j|a6wiHkK0SiI0G}= zU%=G-I$}t!VcYc?r!n1(jwQipay%Yf{-Vok5`LPjalDu_%~ni{sVyB#B3M>$#+l=; zGcGLz9ZGD0T@I_+N-SIvu^t!cmOaoLHJo)E5eu<$MKGW?9j&A_un{>|xt|6{Gq4jo zFXGHmOyq)tvkA^c-C`|xF=rQ?Q9WfG`%f2K=>$ z@V9WOb_&m@I_eS_{|evK$FLOI8g{61rF?iW5*i)}a|6)>Bd>({7@ThS7yDqc@wN9#-NYEH3rw=rzUQbJQAYz zv2Zv#5Q;?jgG}=>gI5_`V!%4hA7;S*ublizUIVegQ9caqf!A;?+zz;4E+B>90$LF- zNj(nKW4t?6xBfQ9#gO0NJDM*>IzvMKv(|F4e8!WuHf5|$X>A~*4djtn>Rp71onS~6Q%yY%MY^g4filo(xkm$&& zjAvWVv?fcF9ch&_qjDy?vSGD#LG74VJCdRIRWmy;n`g~w^@fakL!$eh$(rn(+BwsG zqw{hwZCsz|yQeT-6eqVV*c<2VjcI!zV-KV)%^6Gc$F{Vkbzadnr)bM6tqV%`ywW{W znpS!yP*803kRwm0M3JFPGpK99pmPE7`!2`L?`@>_$cf$yxDwo37O>;Y)@wKi*SA6; ze}^^$wgw&eE{p|jlKZSdf524GLj7(98zc`YA;GD?gY{y?hpcg;(HQ>)v$_S1+idtM mytu6yKY&x)2!06i?I!$R%Da6Ct2T>pa~`e2?FDeL-}*ltS-Eon delta 1011 zcmY+BT})I*6vyY>3zyw%cUO_@_XoRscb8oY!U_eUq$TwOMK=|Avx!-m1wmlR-P@*3 z=B5wDuzp0-p0tgLu_a9~AksFsNuv*1l7_c_#D~)Co2h9NpH_XcZJN%YD4t~gIr;t1 z%$Yf}v18Ae>TZ{w2o%B zj_9mLcU`fWDt(nUGszghj}@=eIJ)H;DO_!Et4wBgrZUAih7Y&aZ!<;5M18>JKV%G z2l_#_em>9*P>c5d39d%}9Z<0S&>DaFKZkCE9d8{rVGSz-?cl(vfq8JD>&QCP<6lQs z;5Yp2DB3E@d-=(C3ngsHCE!OK&c&5K#C7kZnQP>GujckBk2rWtto2-0c74b5ic~D= xtD@>AdI#gMgs%^F!k=giGI)d!2Sf0$X;}^r*{s+5m3@iWu diff --git a/core/templates/core/index.html b/core/templates/core/index.html index 8915a9c..8532dee 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -139,15 +139,24 @@ * Atualizado ao vivo conforme anulações no editor.
-
Números Anulados (Vermelho)
+
Números Anulados (IA Radar Radar)
{% for number in result.annulled_numbers %} - {{ number|stringformat:"02d" }} + {% if number in result.reclaimed_numbers %} + {{ number|stringformat:"02d" }} + {% else %} + {{ number|stringformat:"02d" }} + {% endif %} {% endfor %} {% if not result.annulled_numbers %} Nenhum numero anulado pelo admin. {% endif %}
+ {% if result.reclaimed_numbers %} + + IA DETECTOU: {{ result.reclaimed_numbers|length }} número(s) anulado(s) com alta chance de sorteio imediato (Verde)! + + {% endif %}
@@ -351,6 +360,21 @@ document.addEventListener('DOMContentLoaded', function() { border-color: #198754; box-shadow: 0 0 15px rgba(25, 135, 84, 0.4); } +.pulse-green { + animation: pulse-animation 2s infinite; + box-shadow: 0 0 0 0 rgba(32, 201, 151, 0.7); +} +@keyframes pulse-animation { + 0% { + box-shadow: 0 0 0 0 rgba(32, 201, 151, 0.7); + } + 70% { + box-shadow: 0 0 0 10px rgba(32, 201, 151, 0); + } + 100% { + box-shadow: 0 0 0 0 rgba(32, 201, 151, 0); + } +} #live-result-area { transition: all 0.3s; } diff --git a/core/views.py b/core/views.py index edfb902..698791e 100644 --- a/core/views.py +++ b/core/views.py @@ -179,9 +179,27 @@ def home(request): # Definição de Cores: Verde (Hot) e Vermelho (Frio) # MATEMÁTICA AO VIVO: Calcula a elite estatística no momento do acesso, ignorando anulados. - # Pegamos os números com maior frequência que NÃO estão anulados. available_numbers = [n for n in range(1, lottery_obj.max_number + 1) if n not in annulled] + # IA DE RECLAMAÇÃO: Identifica números anulados com alta probabilidade de sorteio imediato + # Calculamos o atraso (delay) para todos os números + last_seen_all = {} + for i, draw in enumerate(reversed(draw_lists)): + for num in draw: + if num not in last_seen_all: + last_seen_all[num] = i + + # Score de Reclamação para Anulados + reclaimed_numbers = [] + for n in annulled: + freq = frequency.get(n, 0) + delay = last_seen_all.get(n, len(draw_lists)) + # Se o número tem frequência alta E está "atrasado", ele é um forte candidato a voltar + reclaim_score = (freq * 0.6) + (delay * 0.4) + # Se o score dele estiver no topo 15% de probabilidade global, nós o "reclamamos" + if reclaim_score > (max(frequency.values()) * 0.8): + reclaimed_numbers.append(n) + # Ordena os números disponíveis pela frequência (quentes primeiro) sorted_by_freq = sorted(available_numbers, key=lambda n: frequency.get(n, 0), reverse=True) @@ -224,6 +242,7 @@ def home(request): "hot_numbers": hot_numbers, "cold_numbers": cold_numbers[:15], # Amostra de frios "annulled_numbers": annulled, + "reclaimed_numbers": reclaimed_numbers, } context = {