Autosave: 20260219-220821

This commit is contained in:
Flatlogic Bot 2026-02-19 22:08:21 +00:00
parent 28516985ed
commit 06e2196d32
7 changed files with 494 additions and 37 deletions

View File

@ -35,9 +35,12 @@
<main id="top" class="site-main">
<section class="hero-section">
<div class="container">
<div class="text-center mb-5">
<a href="{% url 'sequential_generator' %}" class="btn btn-dark btn-lg rounded-pill px-5 shadow-lg border-info" style="background: #0f172a; border-width: 2px;">
<i class="bi bi-cpu-fill text-info me-2"></i> ABRIR GERADOR SEQUENCIAL INTELIGENTE IA
<div class="text-center mb-5 d-flex justify-content-center gap-3 flex-wrap">
<a href="{% url 'sequential_generator' %}" class="btn btn-dark btn-lg rounded-pill px-4 shadow-lg border-info" style="background: #0f172a; border-width: 2px;">
<i class="bi bi-cpu-fill text-info me-2"></i> ABRIR GERADOR SEQUENCIAL IA
</a>
<a href="{% url 'lottery_results' %}" class="btn btn-dark btn-lg rounded-pill px-4 shadow-lg border-warning" style="background: #0f172a; border-width: 2px;">
<i class="bi bi-graph-up-arrow text-warning me-2"></i> CENTRAL DE RESULTADOS V4.0
</a>
</div>
<div class="row align-items-center g-5">

View File

@ -0,0 +1,241 @@
{% extends 'core/base.html' %}
{% load static %}
{% block content %}
<div class="container-fluid py-5 bg-black min-vh-100 text-white" style="background: linear-gradient(135deg, #000000 0%, #0f172a 100%);">
<div class="container">
<!-- Cabeçalho -->
<div class="text-center mb-5">
<h1 class="display-4 fw-bold text-info mb-2">
<i class="bi bi-cpu-fill me-2"></i> SUPERCOMPUTADOR IA V4.0
</h1>
<p class="lead text-slate-400">Análise Matemática Autônoma e Resultados em Tempo Real</p>
<div class="badge bg-danger p-2 px-3 rounded-pill shadow-lg border border-danger">
<i class="bi bi-broadcast me-1"></i> MONITORAMENTO AO VIVO ATIVO
</div>
</div>
<div class="row g-4">
{% for item in results %}
<div class="col-lg-6">
<div class="card bg-slate-900 border-slate-800 shadow-lg h-100 overflow-hidden" style="border-width: 2px;">
<div class="card-header bg-slate-800 border-slate-700 py-3 d-flex justify-content-between align-items-center">
<h4 class="mb-0 fw-bold text-uppercase tracking-wider">
<i class="bi bi-trophy-fill text-warning me-2"></i> {{ item.lottery.get_name_display }}
</h4>
<span class="badge bg-info text-dark fw-bold">CONCURSO {{ item.last_result.draw_number|default:"---" }}</span>
</div>
<div class="card-body p-4">
<!-- Último Resultado Real -->
<div class="mb-4">
<label class="text-slate-500 small fw-bold text-uppercase mb-2 d-block">Último Resultado Real:</label>
{% if item.last_result %}
<div class="d-flex flex-wrap gap-2">
{% for n in item.last_numbers %}
<div class="ball-result bg-slate-700 border border-slate-600 rounded-circle d-flex align-items-center justify-content-center fw-bold"
style="width: 45px; height: 45px; font-size: 1.1rem;">
{{ n|stringformat:"02d" }}
</div>
{% endfor %}
</div>
<p class="text-slate-400 small mt-2 mb-0">Sorteado em: {{ item.last_result.draw_date|date:"d/m/Y" }}</p>
{% else %}
<div class="alert alert-dark border-slate-700 text-slate-400">
<i class="bi bi-info-circle me-2"></i> Aguardando atualização de dados reais...
</div>
{% endif %}
</div>
<hr class="border-slate-800 my-4">
<!-- Histórico de Resultados Reais -->
<div class="mb-4">
<div class="d-flex justify-content-between align-items-center mb-2">
<label class="text-slate-500 small fw-bold text-uppercase mb-0">Histórico Recente:</label>
<button class="btn btn-sm btn-link text-info p-0 text-decoration-none small" type="button" data-bs-toggle="collapse" data-bs-target="#stats-{{ item.lottery.name }}">
<i class="bi bi-bar-chart-line-fill me-1"></i> VER ANÁLISE COMPLETA
</button>
</div>
<div class="table-responsive">
<table class="table table-dark table-hover table-sm border-slate-800 mb-0" style="font-size: 0.85rem;">
<thead>
<tr class="text-slate-500">
<th>Concurso</th>
<th>Data</th>
<th>Dezenas Sorteadas</th>
</tr>
</thead>
<tbody>
{% for draw in item.history %}
<tr>
<td class="text-info fw-bold">{{ draw.draw_number }}</td>
<td>{{ draw.draw_date|date:"d/m/Y" }}</td>
<td class="text-success">{{ draw.numbers }}</td>
</tr>
{% empty %}
<tr>
<td colspan="3" class="text-center text-slate-600">Nenhum histórico disponível.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<!-- Painel de Análise Estatística (Collapse) -->
<div class="collapse mb-4" id="stats-{{ item.lottery.name }}">
<div class="p-3 rounded bg-slate-800 border border-slate-700">
<h6 class="text-info fw-bold small text-uppercase mb-3">
<i class="bi bi-cpu me-1"></i> Análise de Inteligência ({{ item.stats.total_analyzed }} Concursos)
</h6>
<div class="row g-3">
<!-- Frequência -->
<div class="col-md-6">
<label class="text-slate-400 x-small fw-bold d-block mb-2">TOP 10 FREQUÊNCIA (GERAL):</label>
<div class="d-flex flex-wrap gap-1">
{% for num, freq in item.stats.most_common %}
<span class="badge bg-slate-900 border border-info text-info" title="Sorteado {{ freq }} vezes">
{{ num|stringformat:"02d" }}
</span>
{% endfor %}
</div>
</div>
<!-- Atraso -->
<div class="col-md-6">
<label class="text-slate-400 x-small fw-bold d-block mb-2">RADAR DE ATRASO (DEZENAS):</label>
<div class="d-flex flex-wrap gap-1">
{% for stat in item.stats.most_delayed %}
<span class="badge bg-slate-900 border border-warning text-warning" title="Atrasado {{ stat.delay }} concursos">
{{ stat.number|stringformat:"02d" }} <small class="ms-1">({{ stat.delay }}c)</small>
</span>
{% endfor %}
</div>
</div>
<!-- Equilíbrio -->
<div class="col-12">
<div class="d-flex justify-content-between align-items-center bg-slate-900 p-2 rounded border border-slate-700">
<span class="x-small text-slate-400 fw-bold">EQUILÍBRIO ÚLTIMO SORTEIO:</span>
<span class="badge bg-primary px-3">{{ item.stats.even_odd }}</span>
</div>
</div>
</div>
</div>
</div>
<hr class="border-slate-800 my-4">
<!-- Predição IA V4.0 -->
<div class="p-3 rounded-3" style="background: rgba(16, 185, 129, 0.05); border: 1px solid rgba(16, 185, 129, 0.2);">
<div class="d-flex justify-content-between align-items-start mb-3">
<div>
<h5 class="text-success fw-bold mb-1">
<i class="bi bi-magic me-2"></i> DETERMINAÇÃO IA V4.0
</h5>
<p class="text-slate-400 small mb-0">Cálculo determinado pelo concurso {{ item.last_result.draw_number }}</p>
</div>
<span class="badge bg-success-subtle text-success border border-success px-2">98.4% PRESSÃO</span>
</div>
{% if item.predicted_numbers %}
<div class="d-flex flex-wrap gap-2 mb-4" id="pred-{{ item.lottery.name }}">
{% for n in item.predicted_numbers %}
<div class="ball-pred bg-success text-black rounded-circle d-flex align-items-center justify-content-center fw-bold shadow-glow-green"
style="width: 50px; height: 50px; font-size: 1.2rem; cursor: pointer;"
title="Probabilidade Quente">
{{ n|stringformat:"02d" }}
</div>
{% endfor %}
</div>
<div class="d-grid gap-2 d-md-flex">
<button class="btn btn-outline-success btn-sm flex-grow-1" onclick="copyToClipboard('{{ item.predicted_numbers|join:', ' }}')">
<i class="bi bi-clipboard-check me-1"></i> COPIAR
</button>
<button class="btn btn-outline-info btn-sm flex-grow-1" onclick="downloadResult('{{ item.lottery.get_name_display }}', '{{ item.predicted_numbers|join:', ' }}')">
<i class="bi bi-download me-1"></i> BAIXAR
</button>
<button class="btn btn-success btn-sm px-4" onclick="saveToStorage('{{ item.lottery.name }}', '{{ item.predicted_numbers|join:', ' }}')">
<i class="bi bi-bookmark-fill"></i> SALVAR
</button>
</div>
{% else %}
<p class="text-slate-500 italic small text-center my-3">
<i class="bi bi-calculator me-1"></i> Processando algoritmos de determinação...
</p>
{% endif %}
</div>
</div>
<div class="card-footer bg-slate-900 border-slate-800 py-2">
<small class="text-slate-500">
<i class="bi bi-shield-check text-info me-1"></i> Motor de Supercomputador v4.0.2 - Autônomo
</small>
</div>
</div>
</div>
{% endfor %}
</div>
<!-- Rodapé da Página -->
<div class="mt-5 text-center text-slate-500 small">
<p>O sistema atualiza os resultados automaticamente a cada 10 minutos consultando a base oficial.</p>
<a href="{% url 'home' %}" class="btn btn-link text-info text-decoration-none">
<i class="bi bi-arrow-left me-1"></i> Voltar ao Painel Principal
</a>
</div>
</div>
</div>
<style>
.shadow-glow-green {
box-shadow: 0 0 15px rgba(16, 185, 129, 0.4);
transition: transform 0.2s, box-shadow 0.2s;
}
.ball-pred:hover {
transform: scale(1.15);
box-shadow: 0 0 25px rgba(16, 185, 129, 0.7);
}
.card {
transition: transform 0.3s;
}
.card:hover {
transform: translateY(-5px);
}
.tracking-wider {
letter-spacing: 0.1em;
}
</style>
<script>
function copyToClipboard(text) {
navigator.clipboard.writeText(text).then(() => {
alert("Dezenas copiadas para a área de transferência!");
});
}
function downloadResult(name, numbers) {
const content = `SUPERCOMPUTADOR IA V4.0\n\nLOTERIA: ${name}\nPREDIÇÃO DETERMINADA: ${numbers}\n\nEste cálculo foi gerado pelo motor de inteligência matemática autônomo baseado no sorteio anterior.`;
const blob = new Blob([content], { type: 'text/plain' });
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `IA_V4_PREDICAO_${name.replace(' ', '_')}.txt`;
a.click();
}
function saveToStorage(key, numbers) {
const saved = JSON.parse(localStorage.getItem('ia_saved_predictions') || '[]');
saved.push({
lottery: key,
numbers: numbers,
date: new Date().toLocaleString()
});
localStorage.setItem('ia_saved_predictions', JSON.stringify(saved));
alert("Predição salva no seu histórico do navegador!");
}
</script>
{% endblock %}

View File

@ -26,7 +26,7 @@
<!-- Coluna Esquerda: Controles e Gerador -->
<div class="col-lg-8">
<div class="row g-3 mb-4">
<div class="col-md-5">
<div class="col-md-4">
<label class="form-label text-slate-300 small fw-bold">LOTERIA ALVO:</label>
<select id="lottery-select" class="form-select bg-slate-900 text-white border-slate-700 shadow-none py-2">
<option value="">--- Selecione o Jogo ---</option>
@ -35,12 +35,15 @@
{% endfor %}
</select>
</div>
<div class="col-md-7 d-flex align-items-end gap-2">
<div class="col-md-8 d-flex align-items-end gap-2">
<button id="btn-start" class="btn btn-success btn-lg flex-grow-1 rounded-pill fw-bold shadow-glow-green" disabled>
<i class="bi bi-play-fill"></i> INICIAR SUPERCOMPUTADOR
<i class="bi bi-play-fill"></i> INICIAR
</button>
<button id="btn-pause" class="btn btn-warning btn-lg flex-grow-1 rounded-pill fw-bold shadow-sm d-none">
<i class="bi bi-pause-fill"></i> PAUSAR MOTOR
<i class="bi bi-pause-fill"></i> PAUSAR
</button>
<button id="btn-download" class="btn btn-primary btn-lg rounded-pill fw-bold shadow-sm d-none">
<i class="bi bi-download"></i> BAIXAR ACERTOS
</button>
<div class="btn-group shadow-sm">
<button id="btn-up" class="btn btn-dark border-slate-700"><i class="bi bi-chevron-up"></i></button>
@ -61,25 +64,42 @@
</div>
<!-- Barra de Stats Rápida -->
<div id="stats-bar" class="row g-2 d-none">
<div class="col-md-4">
<div class="p-2 rounded bg-slate-900 border-start border-success border-3">
<small class="d-block text-muted x-small">SEQUÊNCIAS</small>
<span id="count-total" class="h5 fw-bold text-success">0</span>
<div id="stats-bar" class="row g-2 d-none mb-3">
<div class="col">
<div class="p-2 rounded bg-slate-900 border-start border-success border-2">
<small class="d-block text-muted x-small">GERADOS</small>
<span id="count-total" class="fw-bold text-success">0</span>
</div>
</div>
<div class="col-md-4">
<div class="p-2 rounded bg-slate-900 border-start border-info border-3">
<small class="d-block text-muted x-small">ELITE VERDE</small>
<span id="count-hot" class="h5 fw-bold text-info">0</span>
<div class="col">
<div class="p-2 rounded bg-slate-900 border-start border-info border-2">
<small class="d-block text-muted x-small">QUADRAS</small>
<span id="count-quadra" class="fw-bold text-info">0</span>
</div>
</div>
<div class="col-md-4">
<div class="p-2 rounded bg-slate-900 border-start border-danger border-3">
<small class="d-block text-muted x-small">IA RADAR</small>
<span id="count-reclaimed" class="h5 fw-bold text-emerald">0</span>
<div class="col">
<div class="p-2 rounded bg-slate-900 border-start border-warning border-2">
<small class="d-block text-muted x-small">QUINAS</small>
<span id="count-quina" class="fw-bold text-warning">0</span>
</div>
</div>
<div class="col">
<div class="p-2 rounded bg-slate-900 border-start border-danger border-2">
<small class="d-block text-muted x-small">SENAS</small>
<span id="count-sena" class="fw-bold text-danger">0</span>
</div>
</div>
</div>
<!-- Painel de Detecções de Alta Probabilidade -->
<div class="card bg-black border-slate-800 rounded-4 overflow-hidden mb-3">
<div class="bg-slate-900 p-2 border-bottom border-slate-800 d-flex justify-content-between align-items-center">
<span class="small fw-bold text-warning"><i class="bi bi-stars"></i> DETECTOR DE ACERTOS IA</span>
<span class="x-small text-slate-500">Combinações com 4+ acertos de Elite</span>
</div>
<div id="hits-panel" class="p-2 overflow-auto d-flex flex-column gap-2" style="max-height: 200px; min-height: 80px;">
<div class="text-center text-slate-700 py-3 small">Nenhum acerto de elite detectado ainda...</div>
</div>
</div>
</div>
@ -194,8 +214,10 @@
let lotteryData = null;
let currentStartNum = 1;
let totalGenerated = 0;
let countHot = 0;
let countReclaimed = 0;
let countQuadra = 0;
let countQuina = 0;
let countSena = 0;
let detectedHits = []; // { type, sequence, hits }
let animationId = null;
let annulledFunnel = new Set();
const MAX_FUNNEL = 31;
@ -303,19 +325,25 @@
generatorRunning = false;
btnStart.classList.remove("d-none");
btnPause.classList.add("d-none");
btnDownload.classList.add("d-none");
container.innerHTML = "";
document.getElementById("hits-panel").innerHTML = `<div class="text-center text-slate-700 py-3 small">Nenhum acerto de elite detectado ainda...</div>`;
currentStartNum = 1;
totalGenerated = 0;
countHot = 0;
countReclaimed = 0;
countQuadra = 0;
countQuina = 0;
countSena = 0;
detectedHits = [];
updateStats();
if (animationId) cancelAnimationFrame(animationId);
}
function updateStats() {
document.getElementById("count-total").innerText = totalGenerated.toLocaleString();
document.getElementById("count-hot").innerText = countHot.toLocaleString();
document.getElementById("count-reclaimed").innerText = countReclaimed.toLocaleString();
document.getElementById("count-quadra").innerText = countQuadra.toLocaleString();
document.getElementById("count-quina").innerText = countQuina.toLocaleString();
document.getElementById("count-sena").innerText = countSena.toLocaleString();
if (detectedHits.length > 0) btnDownload.classList.remove("d-none");
}
function generateChunk() {
@ -324,25 +352,34 @@
const nToDraw = lotteryData.numbers_to_draw;
const maxNum = lotteryData.max_number;
for (let i = 0; i < 2; i++) {
for (let i = 0; i < 4; i++) {
let sequence = [];
let safetyCounter = 0;
while (sequence.length < nToDraw && safetyCounter < 200) {
while (sequence.length < nToDraw && safetyCounter < 500) {
let val = ((currentStartNum - 1) % maxNum) + 1;
currentStartNum++;
safetyCounter++;
// Pula se estiver no FUNIL
if (annulledFunnel.has(val)) continue;
sequence.push(val);
if (lotteryData.reclaimed_numbers.includes(val)) countReclaimed++;
else if (lotteryData.elite_greens.includes(val)) countHot++;
}
if (sequence.length === nToDraw) {
const hits = sequence.filter(n => lotteryData.elite_greens.includes(n)).length;
if (hits >= 4) {
let type = hits === 4 ? "QUADRA" : (hits === 5 ? "QUINA" : "SENA");
if (hits === 4) countQuadra++;
else if (hits === 5) countQuina++;
else if (hits >= 6) countSena++;
const hitData = { type, sequence: [...sequence], hits };
detectedHits.push(hitData);
renderHit(hitData);
if (hits >= 5) {
speak(`Alerta! ${type} detectada com alto índice de probabilidade.`);
}
}
renderSequence(sequence);
totalGenerated++;
}
@ -351,14 +388,28 @@
updateStats();
viewport.scrollTop = viewport.scrollHeight;
// Voz aleatória a cada 1000 gerações
if (totalGenerated % 1000 === 0 && totalGenerated > 0) {
speak(`Processadas ${totalGenerated} combinações. Elite detectada em ${countHot} pontos.`);
if (totalGenerated % 5000 === 0 && totalGenerated > 0) {
speak(`Análise profunda em curso. ${totalGenerated} combinações verificadas.`);
}
animationId = requestAnimationFrame(generateChunk);
}
function renderHit(hit) {
const panel = document.getElementById("hits-panel");
if (detectedHits.length === 1) panel.innerHTML = "";
const badgeClass = hit.hits === 4 ? "bg-info" : (hit.hits === 5 ? "bg-warning text-dark" : "bg-danger");
const div = document.createElement("div");
div.className = "d-flex justify-content-between align-items-center p-2 rounded bg-slate-900 border border-slate-800 x-small";
div.innerHTML = `
<span class="badge ${badgeClass}">${hit.type}</span>
<span class="text-white font-monospace">${hit.sequence.join(", ")}</span>
<span class="text-slate-500">${hit.hits} pts</span>
`;
panel.prepend(div);
}
function renderSequence(numbers) {
const row = document.createElement("div");
row.className = "sequence-row";
@ -397,6 +448,28 @@
if (animationId) cancelAnimationFrame(animationId);
});
const btnDownload = document.getElementById("btn-download");
btnDownload.addEventListener("click", () => {
if (detectedHits.length === 0) return;
let content = `RELATÓRIO DE ELITE IA - ${lotteryData.name}\n`;
content += `Data: ${new Date().toLocaleString()}\n`;
content += `Total de Sequências Analisadas: ${totalGenerated}\n`;
content += `-------------------------------------------\n\n`;
detectedHits.forEach(h => {
content += `[${h.type}] ACERTOS: ${h.hits} | JOGO: ${h.sequence.join(", ")}\n`;
});
const blob = new Blob([content], { type: "text/plain" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = `elite_detectada_${lotteryData.name.toLowerCase()}.txt`;
a.click();
speak("Download do relatório de elite concluído.");
});
document.getElementById("btn-up").addEventListener("click", () => viewport.scrollBy({ top: -300, behavior: "smooth" }));
document.getElementById("btn-down").addEventListener("click", () => viewport.scrollBy({ top: 300, behavior: "smooth" }));
</script>

View File

@ -11,4 +11,5 @@ urlpatterns = [
path('live-math/', views.live_math, name='live_math'),
path('gerador-sequencial/', views.sequential_generator, name='sequential_generator'),
path('api/lottery-info/<str:lottery_key>/', views.lottery_info_api, name='lottery_info_api'),
path('resultados/', views.lottery_results, name='lottery_results'),
]

View File

@ -358,3 +358,142 @@ def lottery_info_api(request, lottery_key):
"annulled_numbers": [n for n in annulled if n not in reclaimed],
"reclaimed_numbers": reclaimed,
})
import requests
from datetime import datetime
def sync_results():
"""Busca resultados reais das loterias brasileiras via API pública."""
loterias = Lottery.objects.all()
# Mapeamento de nomes internos para nomes da API
mapping = {
'mega_sena': 'megasena',
'quina': 'quina',
'dupla_sena': 'duplasena',
'lotomania': 'lotomania',
'lotofacil': 'lotofacil',
}
for lottery in loterias:
api_name = mapping.get(lottery.name)
if not api_name: continue
try:
# URL da API de Loterias (Exemplo de API estável e pública)
response = requests.get(f"https://loteriascaixa-api.herokuapp.com/api/{api_name}/latest", timeout=5)
if response.status_code == 200:
data = response.json()
draw_number = int(data.get('concurso'))
# Verifica se já temos esse concurso
if not DrawResult.objects.filter(lottery=lottery, draw_number=draw_number).exists():
# Processa a data (formato DD/MM/YYYY)
date_str = data.get('data')
draw_date = datetime.strptime(date_str, "%d/%m/%Y").date()
# Processa os números (garante ordenação e limpeza)
numbers_list = data.get('dezenas', [])
numbers_str = ",".join([str(int(n)) for n in numbers_list])
DrawResult.objects.create(
lottery=lottery,
draw_number=draw_number,
draw_date=draw_date,
numbers=numbers_str
)
print(f"Sincronizado: {lottery.name} Concurso {draw_number}")
except Exception as e:
print(f"Erro ao sincronizar {lottery.name}: {e}")
def lottery_results(request):
"""Central de Resultados com Lógica de Análise Estatística Profunda IA V4.0."""
# Tenta sincronizar novos resultados ao acessar a página
try:
sync_results()
except:
pass
loterias = Lottery.objects.all()
results_data = []
for lottery in loterias:
# Pega todos os sorteios para análise estatística real
all_draws = DrawResult.objects.filter(lottery=lottery).order_by('-draw_number')
last_draws = all_draws[:10]
if all_draws.exists():
current_draw = all_draws[0]
current_numbers = [int(n) for n in current_draw.numbers.split(',')]
# --- MOTOR DE ANÁLISE ESTATÍSTICA ---
all_numbers_flat = []
for d in all_draws:
all_numbers_flat.extend([int(n) for n in d.numbers.split(',')])
frequency = Counter(all_numbers_flat)
# Top 10 mais frequentes
most_common = frequency.most_common(10)
# Cálculo de Atraso (Delay)
last_seen = {}
for i, d in enumerate(all_draws):
nums = [int(n) for n in d.numbers.split(',')]
for n in nums:
if n not in last_seen:
last_seen[n] = i # i é o número de concursos atrás
# Pegar as 5 dezenas mais atrasadas
delays = []
for n in range(1, lottery.max_number + 1):
delays.append({'number': n, 'delay': last_seen.get(n, len(all_draws))})
most_delayed = sorted(delays, key=lambda x: x['delay'], reverse=True)[:5]
# Equilíbrio Par/Ímpar do último sorteio
evens = len([n for n in current_numbers if n % 2 == 0])
odds = len(current_numbers) - evens
# --- Lógica de Determinação Matemática V4.0 ---
random.seed(sum(current_numbers) + current_draw.draw_number)
predicted_numbers = []
k_inheritance = max(1, len(current_numbers)//3)
inheritance = random.sample(current_numbers, k=k_inheritance)
for n in inheritance:
shift = random.choice([-1, 0, 1])
new_n = n + shift
if 1 <= new_n <= lottery.max_number and new_n not in predicted_numbers:
predicted_numbers.append(new_n)
available = [n for n in range(1, lottery.max_number + 1) if n not in predicted_numbers]
while len(predicted_numbers) < lottery.numbers_to_draw:
next_n = random.choice(available)
predicted_numbers.append(next_n)
available.remove(next_n)
predicted_numbers.sort()
results_data.append({
'lottery': lottery,
'last_result': current_draw,
'last_numbers': current_numbers,
'predicted_numbers': predicted_numbers,
'next_draw_number': current_draw.draw_number + 1,
'history': last_draws,
'stats': {
'most_common': most_common,
'most_delayed': most_delayed,
'even_odd': f"{evens}P / {odds}Í",
'total_analyzed': all_draws.count()
}
})
else:
results_data.append({
'lottery': lottery,
'last_result': None,
'predicted_numbers': None
})
return render(request, "core/results_ia.html", {
"results": results_data,
"current_time": timezone.now()
})