2025-09-12

Skandináv Lottó Python statisztika

 Annak vizsgálata, hogy a sorsolt számok első száma, hogyan alakult. Hányszor volt első helyen az 1-es szám? Melyik az az első szám a hétből ami a legnagyobb értékű?

 Egy húzási számsorban hogyan oszlanak el a páros és a páratlan számok. A hét darab számban mi volt többször, a páros vagy a páratlan?


from collections import Counter

class OsszesHuzas:
def __init__(self):

# Ebben a fájlban vannak a mindenkori Skandináv húzott számai.
# 14 szám egy sorban, 7 gépi és 7 kézi húzás.
self.FILENAME = 'utolso14.csv'

# Az összes húzás tárolója 7 elemű 2D lista
self.het_elemu_listak = []

@staticmethod
def ketfele(lista):
"""A 14 elemű számlistát két hét eleműre bontja"""
kozep_index = len(lista) // 2
return lista[:kozep_index], lista[kozep_index:]

@staticmethod
def elemzes(filename):
"""Beolvassa a fájl sorait és integer számlistává alakítja"""
with open(filename) as adatok:
for sor in map(str.strip, adatok):
yield list(map(int, sor.rstrip(',').split(',')))

def vegrehajt(self):
""" for ciklusban beolvassa a fájl sorait.
Az elemzes() és a ketfele() függvény hívása.
:return: osszes_huzas 2D lista
"""
for line in self.elemzes(self.FILENAME):
elso, masik = self.ketfele(line)
self.het_elemu_listak.append(elso)
self.het_elemu_listak.append(masik)

return self.het_elemu_listak


class Statisztika(OsszesHuzas):
def __init__(self):
super().__init__()

# Az OsszesHuzas() osztály metódusa
self.osszes_huzas = self.vegrehajt()

# Ide jonnek a különböző statisztikai adatokat készítő metódusok.

def elso_szamok(self):
"""Milyen számmal kezdődnek a húzasok?
Ezt vizsgálja a metódus."""
elsok_lista = []

huzasok = self.osszes_huzas
for szam in huzasok:
elsok_lista.append(szam[0])

elsok_szotarban = Counter(elsok_lista)

return elsok_szotarban

@staticmethod
def szetvalagatas(het_elemu_lista):
paros_szamok = []
paratlan_szamok = []

for num in het_elemu_lista:
if num % 2 == 0:
paros_szamok.append(num)
else:
paratlan_szamok.append(num)

darab_paros_szam = len(paros_szamok)
darab_paratlan_szam = len(paratlan_szamok)

return darab_paros_szam, darab_paratlan_szam

def paros_paratlan(self):
"""Visszadja a hételemu listában lévő páros és
páratlan számok darabját."""
paros_db = []
paratlan_db = []

for het_szam_listaja in self.osszes_huzas:
paros, paratlan = self.szetvalagatas(het_szam_listaja)
paros_db.append(paros)
paratlan_db.append(paratlan)

paros_szotar = Counter(paros_db)
paros_sorban = sorted(paros_szotar.items())

paratlan_szotar = Counter(paratlan_db)
paratlan_sorban = sorted(paratlan_szotar.items())

return paros_sorban, paratlan_sorban


class App(Statisztika):
def __init__(self):
super().__init__()

# A Statisztika() osztály lista változója
teljes_huzasi_lista = self.osszes_huzas
print(f'\nAz összes gépi és kézi húzas (2025, 09, 05 ig): '
f'{len(teljes_huzasi_lista)} darab\n'
f'Néhány példa következik.......')

for i, hetszam in enumerate(teljes_huzasi_lista):
if i < 10:
print(hetszam)
else:
print('stb.......')
break

# ****************************************************************

# Statisztika() osztály metódusa,
counter_szotar = self.elso_szamok()
# Lista benne tuple-k.
kulcs_sorbarendezve = sorted(counter_szotar.items())

min_elso_kulcs = min(counter_szotar.keys())
min_elso_ertek = counter_szotar[min_elso_kulcs]
max_elso_kulcs = max(counter_szotar.keys())
max_elso_ertek = counter_szotar[max_elso_kulcs]

print(f'\nA sorsolt számok (7 db) első, legkisebb értékű vizsgálata.'
f'\nA legkisebb húzott szám: {min_elso_kulcs} -s, '
f'Összesen: {min_elso_ertek} db húzásban.')

for zarojelben in kulcs_sorbarendezve:
szazalek = round((zarojelben[1]/len(teljes_huzasi_lista))*100, 1)
print(f'{zarojelben[0]} szám, {zarojelben[1]} húzásban volt első,\t'
f'{szazalek}%')


print(f'A legnagyobb első helyezett húzott szám: {max_elso_kulcs} -s,'
f'Összesen {max_elso_ertek} db húzásban.')

# **************************************************************

print(f'\nA sorsolási számok páros és páratlan eloszlása, egy szelvényre vizsgálva.')
talalatok = self.paros_paratlan()
paros = talalatok[0]
paratlan = talalatok[1]

for tuple_ben1 in paros:
print(f'{tuple_ben1[0]} darab párosszám {tuple_ben1[1]} alkalommal,\t')

print()

for tuple_ben2 in paratlan:
print(f'{tuple_ben2[0]} darab páratlanszám {tuple_ben2[1]} alkalommal,\t')

print(f'A csupa párosszámokat tartalmazó húzás {paros[-1][1]}!, '
f'\nEz több mint a háromszorosa, a páratlan húzásokkal '
f'összehasonlítva, {paratlan[-1][1]}.')

if __name__ == '__main__':
app = App()

Letöltés:
utolso14.csv
 
 
 
 
 
 
 
 
 

 

2025-09-05

Python Pygame GUI-val készült jelentés Snapszerhez.

 Az alábbi kódot Linux Mint -n írtam. A Linux kezdeti felfedezéséhez a Gemini és  Linux Mint Fórum nyújtott segítséget. Az alábbi kód szimulálja minden lehetséges kézkártyák variációját, a húsz és negyven megtalálásához. Fejlesztői környezet a szokásos PyCharm community. 

import itertools
import os
import random

import pygame as pyg
import pygame_gui

class SnapszerJelentes:
"""Megkeresi az összes lehetséges adatot a változókhoz."""
def __init__(self):
os.environ['SDL_VIDEO_WINDOW_POS'] = "660,150"
pyg.init()

self.SZELES = 700
self.MAGAS = 500
self.ablak = pyg.display.set_mode((self.SZELES, self.MAGAS))
pyg.display.set_caption('Snapszer jelentést készítő.')

self.hatter = pyg.Surface((self.SZELES, self.MAGAS))
self.hatter.fill(pyg.Color(1, 38, 5))

self.mester = pygame_gui.UIManager(
(self.SZELES, self.MAGAS))

self.pakli_lista = [
'm02', 'm03', 'm04', 'm10', 'm11',
'p02', 'p03', 'p04', 'p10', 'p11',
't02', 't03', 't04', 't10', 't11',
'z02', 'z03', 'z04', 'z10', 'z11'
]
random.shuffle(self.pakli_lista)

self.kez_lista_kombinaciok = None

self.adu_kartya = []
self.adu_kartya_szine = []

self.makk_husz_elemek = () # ('m03, m04')
self.piros_husz_elemek = () # ('p03, p04')
self.tok_husz_elemek = () # ('t03, t04')
self.zold_husz_elemek = () # ('z03, z04')

self.makk_negyven_elem = () # ('m03, m04') + adu kártya színe 'm'
self.piros_negyven_elem = () # ('p03, p04') + adu kártya színe 'p'
self.tok_negyven_elem = () # ('t03, t04') + adu kártya színe 't'
self.zold_negyven_elem = () # ('z03, z04') + adu kártya színe 'z'

self.makk_husz_pont = 0 # 20
self.piros_husz_pont = 0 # 20
self.tok_husz_pont = 0 # 20
self.zold_husz_pont = 0 # 20

self.makk_negyven_pont = 0 # 40
self.piros_negyven_pont = 0 # 40
self.tok_negyven_pont = 0 # 40
self.zold_negyven_pont = 0 # 40

# metódusok
self.adu_megszerzes()
self.pakli_osszes_variacioja()
self.valtozok_feltoltese()
self.adatok_megjelenito()

self.ido_mero = pyg.time.Clock()

self.futas = True
while self.futas:
self.delta_ido = self.ido_mero.tick(60) / 1000.0

for esemeny in pyg.event.get():
if esemeny.type == pyg.QUIT:
self.futas = False

self.mester.process_events(esemeny)

self.mester.update(self.delta_ido)
self.ablak.blit(self.hatter, (0, 0))
pyg.display.update()

def adu_megszerzes(self):
"""Az adu és színe változók meghatározása."""
self.adu_kartya.append(self.pakli_lista.pop(-1))
self.adu_kartya_szine.append(self.adu_kartya[0][0])
print(f'\nAdu kartya: {self.adu_kartya}, Színe: {self.adu_kartya_szine}')

def pakli_osszes_variacioja(self):
"""Minden lehetséges kézkártya lapok variációja.
# Elem darab: 11628, 5 elemű tuple, variáció."""
self.kez_lista_kombinaciok = list(itertools.combinations(self.pakli_lista, 5))

print(f'Elem darab: {len(self.kez_lista_kombinaciok)}, '
f'{type(self.kez_lista_kombinaciok)}')

for i, elem in enumerate(self.kez_lista_kombinaciok):
if i < 10:
print(elem)

def valtozok_feltoltese(self):
"""A kéz_lista_kombináciok minden elemének vizsgálata.
Üres vagy egyelemű esetet is kezeli.
Egy színre vagy husz (20), vagy negyven (40)."""

if not self.kez_lista_kombinaciok:
print("Nincs kézkombináció.")
return

kombok = self.kez_lista_kombinaciok
if isinstance(kombok, tuple):
kombok = [kombok]

adu = self.adu_kartya_szine[0] if self.adu_kartya_szine else None

for kez in kombok:
# MAKK
if not (self.makk_husz_elemek or self.makk_negyven_elem):
if 'm03' in kez and 'm04' in kez:
if adu == 'm':
self.makk_negyven_elem = ('m03', 'm04')
self.makk_negyven_pont = 40
else:
self.makk_husz_elemek = ('m03', 'm04')
self.makk_husz_pont = 20

# PIROS
if not (self.piros_husz_elemek or self.piros_negyven_elem):
if 'p03' in kez and 'p04' in kez:
if adu == 'p':
self.piros_negyven_elem = ('p03', 'p04')
self.piros_negyven_pont = 40
else:
self.piros_husz_elemek = ('p03', 'p04')
self.piros_husz_pont = 20

# TÖK
if not (self.tok_husz_elemek or self.tok_negyven_elem):
if 't03' in kez and 't04' in kez:
if adu == 't':
self.tok_negyven_elem = ('t03', 't04')
self.tok_negyven_pont = 40
else:
self.tok_husz_elemek = ('t03', 't04')
self.tok_husz_pont = 20

# ZÖLD
if not (self.zold_husz_elemek or self.zold_negyven_elem):
if 'z03' in kez and 'z04' in kez:
if adu == 'z':
self.zold_negyven_elem = ('z03', 'z04')
self.zold_negyven_pont = 40
else:
self.zold_husz_elemek = ('z03', 'z04')
self.zold_husz_pont = 20

# ha mind a négy szín beállt, nem kell tovább keresni
if ((self.makk_husz_elemek or self.makk_negyven_elem) and
(self.piros_husz_elemek or self.piros_negyven_elem) and
(self.tok_husz_elemek or self.tok_negyven_elem) and
(self.zold_husz_elemek or self.zold_negyven_elem)):
break

def adatok_megjelenito(self):
"""Kiírja a változókat a konzolra, ellenőrzéshez."""
print(f'\n{len(self.pakli_lista)=}'
f'\n{self.makk_husz_elemek=}'
f'\n{self.piros_husz_elemek=}'
f'\n{self.tok_husz_elemek=}'
f'\n{self.zold_husz_elemek=}'
f'\n{self.makk_negyven_elem=}'
f'\n{self.piros_negyven_elem=}'
f'\n{self.tok_negyven_elem=}'
f'\n{self.zold_negyven_elem=}'
f'\n{self.makk_husz_pont=}'
f'\n{self.piros_husz_pont=}'
f'\n{self.tok_husz_pont=}'
f'\n{self.zold_husz_pont=}'
f'\n{self.makk_negyven_pont=}'
f'\n{self.piros_negyven_pont=}'
f'\n{self.tok_negyven_pont=}'
f'\n{self.zold_negyven_pont=}')


if __name__ == '__main__':
sj = SnapszerJelentes()