Vinnaren i pepparkakshustävlingen!
2023-09-01, 18:28
  #133
Medlem
Citat:
Ursprungligen postat av Enterprise
Med en del jobb tror jag att jag fick filskapandet att fungera även för Fullträff:
Kod:
import requests
import re
import json

import itertools
import sys

gamemode = int(input("Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff "))

if not gamemode in [1,2,3]:
        print ("Endast 1-2 möjliga val. Avbryter.")
        quit()

if gamemode == 3:
	pgoal = int(input("Önskad summa (heltal) ? "))
	pdev = float(input("Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? "))
	pmin = pgoal-pdev
	pmax = pgoal+pdev
else:
	pmin = int(input("Golvnivå för antal streck (t.ex. 500)? "))
	pmax = int(input("Taknivå för antal streck (t.ex. 550)? "))

mde = int(input("Tryck 1 för text-fil och 2 för CSV-fil: "))

if not mde in [1,2]:
	print ("Endast 1 eller 2 möjliga val. Avbryter.")
	quit()

urls = ["", "https://spela.svenskaspel.se/stryktipset" , "https://spela.svenskaspel.se/europatipset","https://spela.svenskaspel.se/fulltraff"]

url = urls[gamemode]

outfiles = ["","tips.txt","tips.csv"] # namn för dina output-filer
outfile = outfiles[mde]

response = requests.get(url)
html_content = response.text

pattern = r'_svs\.tipsen\.data\.preloadedState\s*=\s*(\{.*\});'
match = re.search(pattern, html_content)
json_str = match.group(1)
json_obj = json.loads(json_str)
gameDict = json_obj["EventTypeStatistic"]
gameKeys = list(dict.keys(gameDict))

signlists = []

if gamemode == 3:  # om fullträff, sätt upp lista utifrån 13 rader
	rowlist=[]
	draws=json_obj["Draws"]["entities"]
	drawsKey = list(dict.keys(draws))[0]
	omg=draws[drawsKey]["drawNumber"]
	#print(draws)
	#print(drawsKey)
	print(f"Fullträff omgång {omg}:")	
else:   # annars sätt upp lista utifrån 3 tecken
	for _ in range(0,3):
		signlists.append([])

for gameKey in gameKeys: # iterera över alla 13 matcher
	if gamemode==3:  # Fullträff
	
		game = gameDict[gameKey]["odds"]["current"]["value"]  # hämtar odds-värden från Fullträff-sidan
		gamesum = 0.0
		floats = []
		fgame = []
		
		for i in range(0,6):
			f = float(game[i])
			floats.append(f)
		
		gamesum = sum(floats)
	
		for ix,o in enumerate(floats):
			newo = 100.0 * o / gamesum  # normalfördela fullträff-oddsen så att summan blir 100.0
			if ix<6:
				fgame.append(newo)

		rowlist.append(fgame)

	else:   # Tipsspel
		game = gameDict[gameKey]["distributions"][str(gamemode)]["Global"]["current"]["value"] # Hämta streckfördelning
	
	if gamemode<3:
		for ix,perc in enumerate(game):
			if perc is not None:
				signlists[ix].append(int(perc)) # använd heltal för tipsen

if gamemode<3:
	P = { "1": signlists[0], "X": signlists[1], "2": signlists[2] } 
	rows = itertools.product(*(['1X2'] * 13))

	cn = 0

	with open(outfile, 'w') as f:  
		for row in rows:
			percentage = sum(P[result][n] for (n, result) in enumerate(row))
		
			if  pmin <= percentage <= pmax:
				cn += 1
				if mde==1:
					f.write("E,"+','.join(row)+"\n")
				if mde==2:
					f.write(','.join(row + (str(percentage),))+"\n")
else:
	maxcoupons = 10000
	cn = 0
	tsts = 0
	
	#for ix,row in enumerate(rowlist):
		#print(ix,":",row)

	valid_combinations = []

	for comb in itertools.product(*[enumerate(row) for row in rowlist]):  # Cartesian product of all rows with enumerated elements
		
		indices, values = zip(*comb)  # Unzip the enumerated pairs into indices and values
		s = sum(values)
		tsts += 1

		if tsts % 1000000 == 0:
			print(int(tsts / 1000000)," million iterations")
		if pmin <= s <= pmax:
			if mde == 2:
				indices=list(indices)+[s]
			valid_combinations.append(indices)
			#print (" ".join(str(nm) for nm in indices))
			cn += 1
		if cn>=maxcoupons:
			break
	
	with open(outfile, 'w') as f:
		f.write(f"Fulltraff,Omg={omg}\n") # första raden 
		for comb in valid_combinations:
			if mde == 1: # TXT-läge
				comb=list(comb)
				comb.pop() # ta bort summa som inte används i TXT-läge
				f.write("E,"+','.join(str(nm) for nm in comb)+"\n")
				
			elif mde == 2: # CSV-läge
				f.write(','.join(str(nm) for nm in comb)+"\n")



print(f"{outfile} skapad med {cn} rader!")

Hej, hoppas du hinner rätta till en detalj, jag tror jag har hittat vad som blir fel, kanske var jag som förklarade dåligt, hur som helst så har jag kollat alla 1745 raderna i Fullträff, jag skrev ner de aktuella oddsen då så jag vet hur streckfördelningen borde bli men det blir den inte.

Så här ser streckfördelningen ut på riktigt och nedanför hur den blev med de utvalda raderna:

5,668352314 13,43609437 22,39349062 24,38000995 20,38059259 13,74146015
6,301376239 16,22020921 23,60892984 23,67273776 18,43981678 11,75693016
6,029720915 15,86196853 24,38612891 23,9874456 18,15132482 11,58341123
5,99805482 17,50452733 24,78964854 24,09331009 17,15443679 10,46002243
7,647188061 19,66419787 26,16143284 23,00053993 15,16476277 8,361878534
6,357931146 17,31779341 25,25511538 23,13445684 17,48431065 10,45039257
6,774369647 16,0015283 23,73628239 22,91576893 18,74926549 11,82278524
6,196539194 17,18662758 24,03407022 23,4765789 17,86061297 11,24557113
6,394453713 17,63130927 25,43452177 23,10464191 16,81504495 10,62002839
6,576596626 15,04725308 23,93010986 24,17617783 18,44026113 11,82960148
6,396187379 16,81960385 25,58474951 23,90154231 16,97679641 10,32112054
8,438065079 21,87646502 27,43024252 21,60967886 13,32326065 7,322287878
7,058653128 18,67601973 26,13553782 23,34502467 15,59041647 9,194348177

28,08022923 18,85386819 11,80515759 12,49283668 12,26361032 16,50429799
27,27793696 14,67048711 13,23782235 13,23782235 14,61318052 16,96275072
27,16332378 16,27507163 13,63896848 9,340974212 13,86819484 19,71346705
26,76217765 14,95702006 12,83667622 12,60744986 13,18051576 19,65616046
23,5530086 14,26934097 11,86246418 13,06590258 15,35816619 21,89111748
27,50716332 13,5243553 11,69054441 14,26934097 13,35243553 19,65616046
28,252149 15,41547278 11,1747851 13,40974212 14,49856734 17,24928367
26,76217765 14,95702006 11,1747851 13,75358166 14,21203438 19,14040115
25,15759312 13,86819484 11,97707736 13,12320917 13,46704871 22,40687679
25,73065903 16,27507163 13,92550143 11,34670487 15,07163324 17,6504298
26,59025788 13,86819484 13,46704871 12,3782235 15,58739255 18,10888252
22,17765043 14,38395415 11,57593123 13,58166189 14,0974212 24,18338109
23,38108883 15,24355301 12,60744986 13,75358166 15,8739255 19,14040115

Normalfördelningen ser rätt ut, men jag tror du har glömt den viktiga detaljen att oddsen måste konverteras först, dvs 100/odds och sedan normalfördelas, mest streckade enl streck% är också lägsta oddset, därför misstänker jag när jag ser siffrorna att det är där det blivit fel.
Stryktipset ser rätt ut iaf.
__________________
Senast redigerad av Mysadname 2023-09-01 kl. 18:35.
Citera
2023-09-02, 09:57
  #134
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Mysadname
Hej, hoppas du hinner rätta till en detalj, jag tror jag har hittat vad som blir fel, kanske var jag som förklarade dåligt, hur som helst så har jag kollat alla 1745 raderna i Fullträff, jag skrev ner de aktuella oddsen då så jag vet hur streckfördelningen borde bli men det blir den inte.

Så här ser streckfördelningen ut på riktigt och nedanför hur den blev med de utvalda raderna:

5,668352314 13,43609437 22,39349062 24,38000995 20,38059259 13,74146015
6,301376239 16,22020921 23,60892984 23,67273776 18,43981678 11,75693016
6,029720915 15,86196853 24,38612891 23,9874456 18,15132482 11,58341123
5,99805482 17,50452733 24,78964854 24,09331009 17,15443679 10,46002243
7,647188061 19,66419787 26,16143284 23,00053993 15,16476277 8,361878534
6,357931146 17,31779341 25,25511538 23,13445684 17,48431065 10,45039257
6,774369647 16,0015283 23,73628239 22,91576893 18,74926549 11,82278524
6,196539194 17,18662758 24,03407022 23,4765789 17,86061297 11,24557113
6,394453713 17,63130927 25,43452177 23,10464191 16,81504495 10,62002839
6,576596626 15,04725308 23,93010986 24,17617783 18,44026113 11,82960148
6,396187379 16,81960385 25,58474951 23,90154231 16,97679641 10,32112054
8,438065079 21,87646502 27,43024252 21,60967886 13,32326065 7,322287878
7,058653128 18,67601973 26,13553782 23,34502467 15,59041647 9,194348177

28,08022923 18,85386819 11,80515759 12,49283668 12,26361032 16,50429799
27,27793696 14,67048711 13,23782235 13,23782235 14,61318052 16,96275072
27,16332378 16,27507163 13,63896848 9,340974212 13,86819484 19,71346705
26,76217765 14,95702006 12,83667622 12,60744986 13,18051576 19,65616046
23,5530086 14,26934097 11,86246418 13,06590258 15,35816619 21,89111748
27,50716332 13,5243553 11,69054441 14,26934097 13,35243553 19,65616046
28,252149 15,41547278 11,1747851 13,40974212 14,49856734 17,24928367
26,76217765 14,95702006 11,1747851 13,75358166 14,21203438 19,14040115
25,15759312 13,86819484 11,97707736 13,12320917 13,46704871 22,40687679
25,73065903 16,27507163 13,92550143 11,34670487 15,07163324 17,6504298
26,59025788 13,86819484 13,46704871 12,3782235 15,58739255 18,10888252
22,17765043 14,38395415 11,57593123 13,58166189 14,0974212 24,18338109
23,38108883 15,24355301 12,60744986 13,75358166 15,8739255 19,14040115

Normalfördelningen ser rätt ut, men jag tror du har glömt den viktiga detaljen att oddsen måste konverteras först, dvs 100/odds och sedan normalfördelas, mest streckade enl streck% är också lägsta oddset, därför misstänker jag när jag ser siffrorna att det är där det blivit fel.
Stryktipset ser rätt ut iaf.

Så du menar att innan nomalfördelningen ska man ta 100 och dividera med oddset.
Alltså om oddset är 5,0 så ska det belopp (som ska normalfördelas 0-100) blir 20?
Det är naturligtvis lätt ordnat.
Citera
2023-09-02, 10:09
  #135
Medlem
Enterprises avatar
Givet att jag förstått dig rätt så bör det här fungera. Jag lade också till en bit som visar antal hittade rader tillsammans med iterationer så att man bättre kan se om programmet hittar något alls.

Kod:
import requests
import re
import json

import itertools
import sys

gamemode = int(input("Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff "))

if not gamemode in [1,2,3]:
        print ("Endast 1-2 möjliga val. Avbryter.")
        quit()

if gamemode == 3:
	pgoal = int(input("Önskad summa (heltal) ? "))
	pdev = float(input("Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? "))
	pmin = pgoal-pdev
	pmax = pgoal+pdev
else:
	pmin = int(input("Golvnivå för antal streck (t.ex. 500)? "))
	pmax = int(input("Taknivå för antal streck (t.ex. 550)? "))

mde = int(input("Tryck 1 för text-fil och 2 för CSV-fil: "))

if not mde in [1,2]:
	print ("Endast 1 eller 2 möjliga val. Avbryter.")
	quit()

urls = ["", "https://spela.svenskaspel.se/stryktipset" , "https://spela.svenskaspel.se/europatipset","https://spela.svenskaspel.se/fulltraff"]

url = urls[gamemode]

outfiles = ["","tips.txt","tips.csv"] # namn för dina output-filer
outfile = outfiles[mde]

response = requests.get(url)
html_content = response.text

pattern = r'_svs\.tipsen\.data\.preloadedState\s*=\s*(\{.*\});'
match = re.search(pattern, html_content)
json_str = match.group(1)
json_obj = json.loads(json_str)
gameDict = json_obj["EventTypeStatistic"]
gameKeys = list(dict.keys(gameDict))

signlists = []

if gamemode == 3:  # om fullträff, sätt upp lista utifrån 13 rader
	rowlist=[]
	draws=json_obj["Draws"]["entities"]
	drawsKey = list(dict.keys(draws))[0]
	omg=draws[drawsKey]["drawNumber"]
	#print(draws)
	#print(drawsKey)
	print(f"Fullträff omgång {omg}:")	
else:   # annars sätt upp lista utifrån 3 tecken
	for _ in range(0,3):
		signlists.append([])

for gameKey in gameKeys: # iterera över alla 13 matcher
	if gamemode==3:  # Fullträff
	
		game = gameDict[gameKey]["odds"]["current"]["value"]  # hämtar odds-värden från Fullträff-sidan
		gamesum = 0.0
		floats = []
		fgame = []
		
		for i in range(0,6):
			f = 100.0/float(game[i]) # konvertera oddset 100/o
			floats.append(f)
		
		gamesum = sum(floats)
	
		for ix,o in enumerate(floats):
			newo = 100.0 * o / gamesum  # normalfördela fullträff-oddsen så att summan blir 100.0
			if ix<6:
				fgame.append(newo)

		rowlist.append(fgame)

	else:   # Tipsspel
		game = gameDict[gameKey]["distributions"][str(gamemode)]["Global"]["current"]["value"] # Hämta streckfördelning
	
	if gamemode<3:
		for ix,perc in enumerate(game):
			if perc is not None:
				signlists[ix].append(int(perc)) # använd heltal för tipsen

if gamemode<3:
	P = { "1": signlists[0], "X": signlists[1], "2": signlists[2] } 
	rows = itertools.product(*(['1X2'] * 13))

	cn = 0

	with open(outfile, 'w') as f:  
		for row in rows:
			percentage = sum(P[result][n] for (n, result) in enumerate(row))
		
			if  pmin <= percentage <= pmax:
				cn += 1
				if mde==1:
					f.write("E,"+','.join(row)+"\n")
				if mde==2:
					f.write(','.join(row + (str(percentage),))+"\n")
else:
	maxcoupons = 10000
	cn = 0
	tsts = 0
	
	#for ix,row in enumerate(rowlist):
		#print(ix,":",row)

	valid_combinations = []

	for comb in itertools.product(*[enumerate(row) for row in rowlist]):  # Cartesian product of all rows with enumerated elements
		
		indices, values = zip(*comb)  # Unzip the enumerated pairs into indices and values
		s = sum(values)
		tsts += 1

		if tsts % 1000000 == 0:
			print(int(tsts / 1000000)," million iterations,",cn," rows found")
		if pmin <= s <= pmax:
			if mde == 2:
				indices=list(indices)+[s]
			valid_combinations.append(indices)
			#print (" ".join(str(nm) for nm in indices))
			cn += 1
		if cn>=maxcoupons:
			break
	
	with open(outfile, 'w') as f:
		f.write(f"Fulltraff,Omg={omg}\n") # första raden 
		for comb in valid_combinations:
			if mde == 1: # TXT-läge
				comb=list(comb)
				comb.pop() # ta bort summa som inte används i TXT-läge
				f.write("E,"+','.join(str(nm) for nm in comb)+"\n")
				
			elif mde == 2: # CSV-läge
				f.write(','.join(str(nm) for nm in comb)+"\n")



print(f"{outfile} skapad med {cn} rader!")
Citera
2023-09-02, 10:11
  #136
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av horfittan
Ja, men man itererar alltså inte över hela FT, eftersom rymden är alldeles för stor. Man nyttjar felkorrigerande koder av något slag, varvid BCH-koder är de mest lämpliga.

Om man ändå tvunget vill köra över hela volymen kan man tillämpa parallella processer för att snabba upp förloppet.
Parallella processer förstår jag, men det är en fråga om att orka implementera det. Kanske en annan dag.
BCH-koderna ligger utanför min nuvarande bildningsnivå och jag har ingen lust att förkovra mig i detta.
Citera
2023-09-02, 10:15
  #137
Medlem
Citat:
Ursprungligen postat av Enterprise
Så du menar att innan nomalfördelningen ska man ta 100 och dividera med oddset.
Alltså om oddset är 5,0 så ska det belopp (som ska normalfördelas 0-100) blir 20?
Det är naturligtvis lätt ordnat.

Ja precis, då får jag högsta värdet på lägsta oddset och nästan jämförbart med streckprocenten, förutom att jag får med decimaler också, samma upplägg behövs ju på stryk och europatipset då det finns för många rader med samma summa.
Citera
2023-09-02, 10:20
  #138
Medlem
Citat:
Ursprungligen postat av Enterprise
Givet att jag förstått dig rätt så bör det här fungera. Jag lade också till en bit som visar antal hittade rader tillsammans med iterationer så att man bättre kan se om programmet hittar något alls.

Kod:
import requests
import re
import json

import itertools
import sys

gamemode = int(input("Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff "))

if not gamemode in [1,2,3]:
        print ("Endast 1-2 möjliga val. Avbryter.")
        quit()

if gamemode == 3:
	pgoal = int(input("Önskad summa (heltal) ? "))
	pdev = float(input("Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? "))
	pmin = pgoal-pdev
	pmax = pgoal+pdev
else:
	pmin = int(input("Golvnivå för antal streck (t.ex. 500)? "))
	pmax = int(input("Taknivå för antal streck (t.ex. 550)? "))

mde = int(input("Tryck 1 för text-fil och 2 för CSV-fil: "))

if not mde in [1,2]:
	print ("Endast 1 eller 2 möjliga val. Avbryter.")
	quit()

urls = ["", "https://spela.svenskaspel.se/stryktipset" , "https://spela.svenskaspel.se/europatipset","https://spela.svenskaspel.se/fulltraff"]

url = urls[gamemode]

outfiles = ["","tips.txt","tips.csv"] # namn för dina output-filer
outfile = outfiles[mde]

response = requests.get(url)
html_content = response.text

pattern = r'_svs\.tipsen\.data\.preloadedState\s*=\s*(\{.*\});'
match = re.search(pattern, html_content)
json_str = match.group(1)
json_obj = json.loads(json_str)
gameDict = json_obj["EventTypeStatistic"]
gameKeys = list(dict.keys(gameDict))

signlists = []

if gamemode == 3:  # om fullträff, sätt upp lista utifrån 13 rader
	rowlist=[]
	draws=json_obj["Draws"]["entities"]
	drawsKey = list(dict.keys(draws))[0]
	omg=draws[drawsKey]["drawNumber"]
	#print(draws)
	#print(drawsKey)
	print(f"Fullträff omgång {omg}:")	
else:   # annars sätt upp lista utifrån 3 tecken
	for _ in range(0,3):
		signlists.append([])

for gameKey in gameKeys: # iterera över alla 13 matcher
	if gamemode==3:  # Fullträff
	
		game = gameDict[gameKey]["odds"]["current"]["value"]  # hämtar odds-värden från Fullträff-sidan
		gamesum = 0.0
		floats = []
		fgame = []
		
		for i in range(0,6):
			f = 100.0/float(game[i]) # konvertera oddset 100/o
			floats.append(f)
		
		gamesum = sum(floats)
	
		for ix,o in enumerate(floats):
			newo = 100.0 * o / gamesum  # normalfördela fullträff-oddsen så att summan blir 100.0
			if ix<6:
				fgame.append(newo)

		rowlist.append(fgame)

	else:   # Tipsspel
		game = gameDict[gameKey]["distributions"][str(gamemode)]["Global"]["current"]["value"] # Hämta streckfördelning
	
	if gamemode<3:
		for ix,perc in enumerate(game):
			if perc is not None:
				signlists[ix].append(int(perc)) # använd heltal för tipsen

if gamemode<3:
	P = { "1": signlists[0], "X": signlists[1], "2": signlists[2] } 
	rows = itertools.product(*(['1X2'] * 13))

	cn = 0

	with open(outfile, 'w') as f:  
		for row in rows:
			percentage = sum(P[result][n] for (n, result) in enumerate(row))
		
			if  pmin <= percentage <= pmax:
				cn += 1
				if mde==1:
					f.write("E,"+','.join(row)+"\n")
				if mde==2:
					f.write(','.join(row + (str(percentage),))+"\n")
else:
	maxcoupons = 10000
	cn = 0
	tsts = 0
	
	#for ix,row in enumerate(rowlist):
		#print(ix,":",row)

	valid_combinations = []

	for comb in itertools.product(*[enumerate(row) for row in rowlist]):  # Cartesian product of all rows with enumerated elements
		
		indices, values = zip(*comb)  # Unzip the enumerated pairs into indices and values
		s = sum(values)
		tsts += 1

		if tsts % 1000000 == 0:
			print(int(tsts / 1000000)," million iterations,",cn," rows found")
		if pmin <= s <= pmax:
			if mde == 2:
				indices=list(indices)+[s]
			valid_combinations.append(indices)
			#print (" ".join(str(nm) for nm in indices))
			cn += 1
		if cn>=maxcoupons:
			break
	
	with open(outfile, 'w') as f:
		f.write(f"Fulltraff,Omg={omg}\n") # första raden 
		for comb in valid_combinations:
			if mde == 1: # TXT-läge
				comb=list(comb)
				comb.pop() # ta bort summa som inte används i TXT-läge
				f.write("E,"+','.join(str(nm) for nm in comb)+"\n")
				
			elif mde == 2: # CSV-läge
				f.write(','.join(str(nm) for nm in comb)+"\n")



print(f"{outfile} skapad med {cn} rader!")

Åh, tackar så mycket, återigen fast på jobbet så jag hinner inte kolla nu men hoppas precis hinna köra när jag kommer hem.

Är det stort jobb att få samma beräkning på stryk och europatipset som den gör nu med Fullträff, använda 100 / odds och normalfördelning och decimaler. Just ja, är det fortfarande ett måste att utgå från ett heltal på summan ?
Jag provade sätta med decimaler men det gillades inte så enkelt som jag hade hoppats.
Citera
2023-09-02, 21:22
  #139
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Mysadname
Är det stort jobb att få samma beräkning på stryk och europatipset som den gör nu med Fullträff, använda 100 / odds och normalfördelning och decimaler. Just ja, är det fortfarande ett måste att utgå från ett heltal på summan ?
Jag provade sätta med decimaler men det gillades inte så enkelt som jag hade hoppats.
Det borde gå att ordna hyfsat lätt.
Citera
2023-09-02, 21:41
  #140
Medlem
Enterprises avatar
Kolla om detta verkar funka. Jag har inte riktigt tid att testa det annars än helt kort, dessutom var Stryktipset stängt just nu, men Europatipset verkade fungera när jag provade ett enkel test.

Kod:
import requests
import re
import json

import itertools
#import sys

gamemode = int(input("Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff "))

if not gamemode in [1,2,3]:
        print ("Endast 1-2 möjliga val. Avbryter.")
        quit()

if gamemode == 3:
	pgoal = float(input("Önskad summa (t.ex. 200.0) ? "))
	pdev = float(input("Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? "))
	pmin = pgoal-pdev
	pmax = pgoal+pdev
else:
	pmin = float(input("Golvnivå för antal streck (t.ex. 500.0)? "))
	pmax = float(input("Taknivå för antal streck (t.ex. 500.9)? "))

mde = int(input("Tryck 1 för text-fil och 2 för CSV-fil: "))

if not mde in [1,2]:
	print ("Endast 1 eller 2 möjliga val. Avbryter.")
	quit()

urls = ["", "https://spela.svenskaspel.se/stryktipset" , "https://spela.svenskaspel.se/europatipset","https://spela.svenskaspel.se/fulltraff"]

url = urls[gamemode]

outfiles = ["","tips.txt","tips.csv"] # namn för dina output-filer
outfile = outfiles[mde]

response = requests.get(url)
html_content = response.text

pattern = r'_svs\.tipsen\.data\.preloadedState\s*=\s*(\{.*\});'
match = re.search(pattern, html_content)
json_str = match.group(1)
json_obj = json.loads(json_str)
gameDict = json_obj["EventTypeStatistic"]
gameKeys = list(dict.keys(gameDict))

signlists = []

if gamemode == 3:  # om fullträff, sätt upp lista utifrån 13 rader
	rowlist=[]
	draws=json_obj["Draws"]["entities"]
	drawsKey = list(dict.keys(draws))[0]
	omg=draws[drawsKey]["drawNumber"]
	#print(draws)
	#print(drawsKey)
	print(f"Fullträff omgång {omg}:")	
else:   # annars sätt upp lista utifrån 3 tecken
	for _ in range(0,3):
		signlists.append([])

for gameKey in gameKeys: # iterera över alla 13 matcher
	numAlts=3
	if gamemode==3:  # Fullträff
		numAlts=6
	
	game = gameDict[gameKey]["odds"]["current"]["value"]  # hämtar odds-värden från Fullträff-sidan
	gamesum = 0.0
		
	floats = []
	fgame = []
		
	for i in range(0,numAlts):
		f = 100.0/float(game[i]) # konvertera oddset 100/o
		floats.append(f)
		
	gamesum = sum(floats)
	
	for ix,o in enumerate(floats):
		newo = 100.0 * o / gamesum  # normalfördela fullträff-oddsen så att summan blir 100.0
		if ix<numAlts:
			fgame.append(newo)

	if gamemode==3:
		rowlist.append(fgame)
	else:
		for ix,perc in enumerate(fgame):
			signlists[ix].append(perc)

	#game = gameDict[gameKey]["distributions"][str(gamemode)]["Global"]["current"]["value"] # Hämta streckfördelning

if gamemode<3:
	P = { "1": signlists[0], "X": signlists[1], "2": signlists[2] } 
	rows = itertools.product(*(['1X2'] * 13))

	cn = 0

	with open(outfile, 'w') as f:  
		for row in rows:
			percentage = sum(P[result][n] for (n, result) in enumerate(row))
		
			if  pmin <= percentage <= pmax:
				cn += 1
				if mde==1:
					f.write("E,"+','.join(row)+"\n")
				if mde==2:
					f.write(','.join(row + (str(percentage),))+"\n")
else:
	maxcoupons = 10000
	cn = 0
	tsts = 0
	
	#for ix,row in enumerate(rowlist):
		#print(ix,":",row)

	valid_combinations = []

	for comb in itertools.product(*[enumerate(row) for row in rowlist]):  # Cartesian product of all rows with enumerated elements
		
		indices, values = zip(*comb)  # Unzip the enumerated pairs into indices and values
		s = sum(values)
		tsts += 1

		if tsts % 1000000 == 0:
			print(int(tsts / 1000000)," million iterations,",cn," rows found")
		if pmin <= s <= pmax:
			if mde == 2:
				indices=list(indices)+[s]
			valid_combinations.append(indices)
			#print (" ".join(str(nm) for nm in indices))
			cn += 1
		if cn>=maxcoupons:
			break
	
	with open(outfile, 'w') as f:
		f.write(f"Fulltraff,Omg={omg}\n") # första raden 
		for comb in valid_combinations:
			if mde == 1: # TXT-läge
				comb=list(comb)
				comb.pop() # ta bort summa som inte används i TXT-läge
				f.write("E,"+','.join(str(nm) for nm in comb)+"\n")
				
			elif mde == 2: # CSV-läge
				f.write(','.join(str(nm) for nm in comb)+"\n")

print(f"{outfile} skapad med {cn} rader!")
Citera
2023-09-03, 08:48
  #141
Medlem
Citat:
Ursprungligen postat av Enterprise
Kolla om detta verkar funka. Jag har inte riktigt tid att testa det annars än helt kort, dessutom var Stryktipset stängt just nu, men Europatipset verkade fungera när jag provade ett enkel test.

Kod:
import requests
import re
import json

import itertools
#import sys

gamemode = int(input("Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff "))

if not gamemode in [1,2,3]:
        print ("Endast 1-2 möjliga val. Avbryter.")
        quit()

if gamemode == 3:
	pgoal = float(input("Önskad summa (t.ex. 200.0) ? "))
	pdev = float(input("Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? "))
	pmin = pgoal-pdev
	pmax = pgoal+pdev
else:
	pmin = float(input("Golvnivå för antal streck (t.ex. 500.0)? "))
	pmax = float(input("Taknivå för antal streck (t.ex. 500.9)? "))

mde = int(input("Tryck 1 för text-fil och 2 för CSV-fil: "))

if not mde in [1,2]:
	print ("Endast 1 eller 2 möjliga val. Avbryter.")
	quit()

urls = ["", "https://spela.svenskaspel.se/stryktipset" , "https://spela.svenskaspel.se/europatipset","https://spela.svenskaspel.se/fulltraff"]

url = urls[gamemode]

outfiles = ["","tips.txt","tips.csv"] # namn för dina output-filer
outfile = outfiles[mde]

response = requests.get(url)
html_content = response.text

pattern = r'_svs\.tipsen\.data\.preloadedState\s*=\s*(\{.*\});'
match = re.search(pattern, html_content)
json_str = match.group(1)
json_obj = json.loads(json_str)
gameDict = json_obj["EventTypeStatistic"]
gameKeys = list(dict.keys(gameDict))

signlists = []

if gamemode == 3:  # om fullträff, sätt upp lista utifrån 13 rader
	rowlist=[]
	draws=json_obj["Draws"]["entities"]
	drawsKey = list(dict.keys(draws))[0]
	omg=draws[drawsKey]["drawNumber"]
	#print(draws)
	#print(drawsKey)
	print(f"Fullträff omgång {omg}:")	
else:   # annars sätt upp lista utifrån 3 tecken
	for _ in range(0,3):
		signlists.append([])

for gameKey in gameKeys: # iterera över alla 13 matcher
	numAlts=3
	if gamemode==3:  # Fullträff
		numAlts=6
	
	game = gameDict[gameKey]["odds"]["current"]["value"]  # hämtar odds-värden från Fullträff-sidan
	gamesum = 0.0
		
	floats = []
	fgame = []
		
	for i in range(0,numAlts):
		f = 100.0/float(game[i]) # konvertera oddset 100/o
		floats.append(f)
		
	gamesum = sum(floats)
	
	for ix,o in enumerate(floats):
		newo = 100.0 * o / gamesum  # normalfördela fullträff-oddsen så att summan blir 100.0
		if ix<numAlts:
			fgame.append(newo)

	if gamemode==3:
		rowlist.append(fgame)
	else:
		for ix,perc in enumerate(fgame):
			signlists[ix].append(perc)

	#game = gameDict[gameKey]["distributions"][str(gamemode)]["Global"]["current"]["value"] # Hämta streckfördelning

if gamemode<3:
	P = { "1": signlists[0], "X": signlists[1], "2": signlists[2] } 
	rows = itertools.product(*(['1X2'] * 13))

	cn = 0

	with open(outfile, 'w') as f:  
		for row in rows:
			percentage = sum(P[result][n] for (n, result) in enumerate(row))
		
			if  pmin <= percentage <= pmax:
				cn += 1
				if mde==1:
					f.write("E,"+','.join(row)+"\n")
				if mde==2:
					f.write(','.join(row + (str(percentage),))+"\n")
else:
	maxcoupons = 10000
	cn = 0
	tsts = 0
	
	#for ix,row in enumerate(rowlist):
		#print(ix,":",row)

	valid_combinations = []

	for comb in itertools.product(*[enumerate(row) for row in rowlist]):  # Cartesian product of all rows with enumerated elements
		
		indices, values = zip(*comb)  # Unzip the enumerated pairs into indices and values
		s = sum(values)
		tsts += 1

		if tsts % 1000000 == 0:
			print(int(tsts / 1000000)," million iterations,",cn," rows found")
		if pmin <= s <= pmax:
			if mde == 2:
				indices=list(indices)+[s]
			valid_combinations.append(indices)
			#print (" ".join(str(nm) for nm in indices))
			cn += 1
		if cn>=maxcoupons:
			break
	
	with open(outfile, 'w') as f:
		f.write(f"Fulltraff,Omg={omg}\n") # första raden 
		for comb in valid_combinations:
			if mde == 1: # TXT-läge
				comb=list(comb)
				comb.pop() # ta bort summa som inte används i TXT-läge
				f.write("E,"+','.join(str(nm) for nm in comb)+"\n")
				
			elif mde == 2: # CSV-läge
				f.write(','.join(str(nm) for nm in comb)+"\n")

print(f"{outfile} skapad med {cn} rader!")

Jo, det går att sätta decimaler, men jag trodde man kunde sätta det som tolerans från en angiven summa som i Fullträff.

Apropå resultatet på Fullträff igår, den raden var inte lätt att hitta, 2 av matcherna gick utanför ramen.
Ingen hade 13, 12, 11, 10 eller 9 rätt, utdelning på 6,7,8 rätt, jag fick en 7a och 2 6or på mitt system, så lite tröstpengar iaf.
Citera
2023-09-03, 12:37
  #142
Medlem
Citat:
Ursprungligen postat av Enterprise
Kolla om detta verkar funka. Jag har inte riktigt tid att testa det annars än helt kort, dessutom var Stryktipset stängt just nu, men Europatipset verkade fungera när jag provade ett enkel test.

Kod:
import requests
import re
import json

import itertools
#import sys

gamemode = int(input("Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff "))

if not gamemode in [1,2,3]:
        print ("Endast 1-2 möjliga val. Avbryter.")
        quit()

if gamemode == 3:
	pgoal = float(input("Önskad summa (t.ex. 200.0) ? "))
	pdev = float(input("Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? "))
	pmin = pgoal-pdev
	pmax = pgoal+pdev
else:
	pmin = float(input("Golvnivå för antal streck (t.ex. 500.0)? "))
	pmax = float(input("Taknivå för antal streck (t.ex. 500.9)? "))

mde = int(input("Tryck 1 för text-fil och 2 för CSV-fil: "))

if not mde in [1,2]:
	print ("Endast 1 eller 2 möjliga val. Avbryter.")
	quit()

urls = ["", "https://spela.svenskaspel.se/stryktipset" , "https://spela.svenskaspel.se/europatipset","https://spela.svenskaspel.se/fulltraff"]

url = urls[gamemode]

outfiles = ["","tips.txt","tips.csv"] # namn för dina output-filer
outfile = outfiles[mde]

response = requests.get(url)
html_content = response.text

pattern = r'_svs\.tipsen\.data\.preloadedState\s*=\s*(\{.*\});'
match = re.search(pattern, html_content)
json_str = match.group(1)
json_obj = json.loads(json_str)
gameDict = json_obj["EventTypeStatistic"]
gameKeys = list(dict.keys(gameDict))

signlists = []

if gamemode == 3:  # om fullträff, sätt upp lista utifrån 13 rader
	rowlist=[]
	draws=json_obj["Draws"]["entities"]
	drawsKey = list(dict.keys(draws))[0]
	omg=draws[drawsKey]["drawNumber"]
	#print(draws)
	#print(drawsKey)
	print(f"Fullträff omgång {omg}:")	
else:   # annars sätt upp lista utifrån 3 tecken
	for _ in range(0,3):
		signlists.append([])

for gameKey in gameKeys: # iterera över alla 13 matcher
	numAlts=3
	if gamemode==3:  # Fullträff
		numAlts=6
	
	game = gameDict[gameKey]["odds"]["current"]["value"]  # hämtar odds-värden från Fullträff-sidan
	gamesum = 0.0
		
	floats = []
	fgame = []
		
	for i in range(0,numAlts):
		f = 100.0/float(game[i]) # konvertera oddset 100/o
		floats.append(f)
		
	gamesum = sum(floats)
	
	for ix,o in enumerate(floats):
		newo = 100.0 * o / gamesum  # normalfördela fullträff-oddsen så att summan blir 100.0
		if ix<numAlts:
			fgame.append(newo)

	if gamemode==3:
		rowlist.append(fgame)
	else:
		for ix,perc in enumerate(fgame):
			signlists[ix].append(perc)

	#game = gameDict[gameKey]["distributions"][str(gamemode)]["Global"]["current"]["value"] # Hämta streckfördelning

if gamemode<3:
	P = { "1": signlists[0], "X": signlists[1], "2": signlists[2] } 
	rows = itertools.product(*(['1X2'] * 13))

	cn = 0

	with open(outfile, 'w') as f:  
		for row in rows:
			percentage = sum(P[result][n] for (n, result) in enumerate(row))
		
			if  pmin <= percentage <= pmax:
				cn += 1
				if mde==1:
					f.write("E,"+','.join(row)+"\n")
				if mde==2:
					f.write(','.join(row + (str(percentage),))+"\n")
else:
	maxcoupons = 10000
	cn = 0
	tsts = 0
	
	#for ix,row in enumerate(rowlist):
		#print(ix,":",row)

	valid_combinations = []

	for comb in itertools.product(*[enumerate(row) for row in rowlist]):  # Cartesian product of all rows with enumerated elements
		
		indices, values = zip(*comb)  # Unzip the enumerated pairs into indices and values
		s = sum(values)
		tsts += 1

		if tsts % 1000000 == 0:
			print(int(tsts / 1000000)," million iterations,",cn," rows found")
		if pmin <= s <= pmax:
			if mde == 2:
				indices=list(indices)+[s]
			valid_combinations.append(indices)
			#print (" ".join(str(nm) for nm in indices))
			cn += 1
		if cn>=maxcoupons:
			break
	
	with open(outfile, 'w') as f:
		f.write(f"Fulltraff,Omg={omg}\n") # första raden 
		for comb in valid_combinations:
			if mde == 1: # TXT-läge
				comb=list(comb)
				comb.pop() # ta bort summa som inte används i TXT-läge
				f.write("E,"+','.join(str(nm) for nm in comb)+"\n")
				
			elif mde == 2: # CSV-läge
				f.write(','.join(str(nm) for nm in comb)+"\n")

print(f"{outfile} skapad med {cn} rader!")
Jag tyckte först att det var märkligt att min summa var fel men jag ska ju inte räkna med de matcher som inte ens finns med på ramen, och då var det bara 0,5 ifrån, men alla tänkbara 11 matchers kombinationer av 13 möjliga innebär 78 olika och att köra 13 miljarder x 78 blir 1014 miljarder rader som ska kollas, suck det blir lite mycket det.
Citera
2023-09-07, 15:49
  #143
Medlem
Enterprises avatar
Jag har snickrat på en utbyggnad av skriptet som innebär att det förhoppningvis kommer gå uppemot 10 gånger så snabbt att iterera Fullträff genom parallella trådar. Men problemet är att inte alla matcher just nu är odds-satta, så jag kan inte testa på fullständiga data
Citera
2023-09-07, 17:46
  #144
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Mysadname
Jag tyckte först att det var märkligt att min summa var fel men jag ska ju inte räkna med de matcher som inte ens finns med på ramen, och då var det bara 0,5 ifrån, men alla tänkbara 11 matchers kombinationer av 13 möjliga innebär 78 olika och att köra 13 miljarder x 78 blir 1014 miljarder rader som ska kollas, suck det blir lite mycket det.
För vad det är värt så testa detta. Eftersom vissar matcher på Fullträff inte alltid har odds tydligen (antar att detta kommer så småningom) så gjorde jag en "fall back" där skriptet, när det inte finns odds på webben, istället använder spelarnas streckfördelning som guidance. Tanken är också att det ska gå rejält snabbare, men jag sitter på en lite för slö dator för att kunna avgöra någon stor skillnad.

Kod:
import requests
import re
import json
import itertools
from concurrent.futures import ProcessPoolExecutor

from pprint import pprint


gamemode = int(input("Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff "))

if not gamemode in [1,2,3]:
    print("Endast 1-2 möjliga val. Avbryter.")
    quit()

pgoal = float(input("Önskad summa (t.ex. 200.0) ? "))
pdev = float(input("Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? "))
pmin = pgoal - pdev
pmax = pgoal + pdev

mde = int(input("Tryck 1 för text-fil och 2 för CSV-fil: "))

if not mde in [1,2]:
    print("Endast 1 eller 2 möjliga val. Avbryter.")
    quit()

urls = ["", "https://spela.svenskaspel.se/stryktipset" , "https://spela.svenskaspel.se/europatipset", "https://spela.svenskaspel.se/fulltraff"]
url = urls[gamemode]

outfiles = ["", "tips.txt", "tips.csv"]
outfile = outfiles[mde]

try: 
	response = requests.get(url)
	html_content = response.text

except:
	print(f"Kan inte komma hämta data från: {url}. Avbryter.")
	quit()

pattern = r'_svs\.tipsen\.data\.preloadedState\s*=\s*(\{.*\});'

try:
	match = re.search(pattern, html_content)
	json_str = match.group(1)
	json_obj = json.loads(json_str)
	gameDict = json_obj["EventTypeStatistic"]
	gameKeys = list(dict.keys(gameDict))

except:
	print(f"Kunde inte extrahera data")
	quit()

signlists = []
rowlist = []

def process_chunk(start, end):
	sub_gen = itertools.islice(itertools.product(*[enumerate(row) for row in rowlist]), start, end)
	valid_combinations = []
	tss = 0
	for comb in sub_gen:
		tss += 1
		indices, values = zip(*comb)
		s = sum(values)
		if pmin <= s <= pmax:
			valid_combinations.append(indices + (s,))
	return valid_combinations, tss

if gamemode == 3:  # om fullträff, sätt upp lista utifrån 13 rader
	draws=json_obj["Draws"]["entities"]
	
	try:
		drawsKey = list(dict.keys(draws))[0]
	except IndexError:
		print("Inte möjligt att hämta Fullträff-omgång. Avbryter.")
		quit()
	
	omg=draws[drawsKey]["drawNumber"] # hämta omgångsnr
	print(f"Fullträff omgång {omg}:")	
	
else:   # annars sätt upp lista utifrån 3 tecken
	for _ in range(0,3):
		signlists.append([])

for gameKey in gameKeys: # iterera över alla 13 matcher
	
	numAlts=3
	if gamemode==3:  # Fullträff
		numAlts=6
	
	game = gameDict[gameKey]["odds"]["current"]["value"]  # hämtar odds-värden från Fullträff-sidan
	
	reserve = False
	
	if game[0] == None:
		reserve = True
		game = gameDict[gameKey]["distributions"]["38"]["Global"]["current"]["value"] #Fall-back till distributions om inte odds finns
	gamesum = 0.0
		
	floats = []
	fgame = []
		
	for i in range(0,numAlts):
		if game[i] == None:
			print ("None-error",gameDict[gameKey])
			quit()
		if reserve == False:
			f = 100.0/float(game[i]) # konvertera oddset 100/o
		else:
			f = float(game[i])
		floats.append(f)
		
	gamesum = sum(floats)
	
	for ix,o in enumerate(floats):
		if reserve == False:
			newo = 100.0 * o / gamesum  # normalfördela fullträff-oddsen så att summan blir 100.0
		else:
			newo = o # om fallback (distribution så behövs ingen normalfördelning)
		
		if ix<numAlts:
			fgame.append(newo)

	if gamemode==3:
		rowlist.append(fgame)
		
	else:
		for ix,perc in enumerate(fgame):
			signlists[ix].append(perc)

	#game = gameDict[gameKey]["distributions"][str(gamemode)]["Global"]["current"]["value"] # Hämta streckfördelning

if gamemode<3:
	
	P = { "1": signlists[0], "X": signlists[1], "2": signlists[2] } 
	rows = itertools.product(*(['1X2'] * 13))

	cn = 0

	with open(outfile, 'w') as f:  
		for row in rows:
			percentage = sum(P[result][n] for (n, result) in enumerate(row))
		
			if  pmin <= percentage <= pmax:
				cn += 1
				if mde==1:
					f.write("E,"+','.join(row)+"\n")
				if mde==2:
					f.write(','.join(row + (str(percentage),))+"\n")
else:
	maxcoupons = 10000
	cn = 0
	tsts = 0
	valid_combinations = []

	chunk_size = 100000  # You can adjust the chunk size
	total_size = 6 ** 13  # 6^13 combinations
	chunks = [(i, min(i + chunk_size, total_size)) for i in range(0, total_size, chunk_size)]

	with ProcessPoolExecutor() as executor:
		for chunk_result, chunk_tsts in executor.map(process_chunk, [start for start, end in chunks], [end for start, end in chunks]):
			tsts += chunk_tsts
			valid_combinations.extend(chunk_result)
			cn += len(chunk_result)

			if tsts % 1000000 == 0:
				print(int(tsts / 1000000), "million iterations,", cn, "rows found")

			if cn >= maxcoupons:
				break
	
	with open(outfile, 'w') as f:
		
		f.write(f"Fulltraff,Omg={omg}\n") # första raden 
		
		for comb in valid_combinations:
			
			if mde == 1: # TXT-läge
				comb=list(comb)
				comb.pop() # ta bort summa som inte används i TXT-läge
				f.write("E,"+','.join(str(nm) for nm in comb)+"\n")
				
			elif mde == 2: # CSV-läge
				f.write(','.join(str(nm) for nm in comb)+"\n")

print(f"{outfile} skapad med {cn} rader!")
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback