[edit. 11.2.24 muutin pelin tulostaulukon kuvaksi. tabulaattorit eivät toimi oikein wordpress-blogissa. korjasin pari näppäilyvihrettä.]
Edellisessä artikkelissa esitin, miten luoda GeoGebra-sovellus aNEGoS pelistä. Tässä tarinassa tuotan Python koodia pelin pelaamiseen. Tämän koodin avulla peliin liittyvät haastavammat ongelmat saattavat ratketa helpommin. Lopussa on myös kuvaaja piirrettynä GeoGebra/Pythonilla.
pelin säännöt
Valitse joukko lukuja. Kutsutaan lukujoukkoa listaksi. Valitse näistä kaksi lukua. Poista ne listalta ja korvaa ne lukujen tulon ja summan summalla. Jatka näin, kunnes listaan jää vain yksi luku.
python koodi
Lopullinen valmis koodi löytyy Google Colabista, linkki on lähteet-luvussa.
Alla olevassa ensimmäisessä koodiversiossa 1 rivillä ladataan randint-funktio random-kirjastosta.
Rivillä 7 valitaan randintin kanssa satunnaisen alkion indeksi listasta nimeltä lukulista. En keksinyt tähän fiksumpaa tapaa satunnaisen alkion valitsemiseksi ja poistamiseksi. Pop-metodi tuottaa indeksin mukaisen arvon ja poistaa sen samalla lukulistasta.
Rivillä 10 tuo edellinen on tehty yhdellä rivillä.
Riveillä 11-13 lasketaan algoritmin mukainen lasku, tulostetaan välitulos ja lisätään tulos lukulistalle.

pelataan monta peliä
Muokataan alkuperäisestä koodista versio, jossa voidaan pelata useita pelejä. Tässä tarvitaan listoja, jossa on pelkkiä ykkösiä tyyliin [1, 1, 1, 1, …, 1] ja lukujonoja [1, 2, ,…, 10].
Ykköset saadaan menetelmällä, joka monistaa listan kertomerkin avulla ja lukujono 1, 2, … n käyttämällä range-funktiota.

Riveillä 3-12 luodaan peli()-funktio. Se tuottaa pelin lopputulosta vastaavan arvon, kun syötteenä on lista, jossa on alkuarvot. Esimerkiksi peli([2, 3, 3, 5, 7]) tuottaisi funktion arvoksi luvun 2303.
Rivillä 15 määritellään kuinka monta peliä pelataan.
Riveillä 18-20 luodaan lista ykkösiä tyyliin [[1], [1, 1,], … . Riveillä 23-26 pelataan ykköspelit ja tulostetaan lopputulokset.
Riveillä 29 – 41 tuotetaan lukujonoja tyyliin [[1], [1, 2], …, [1, 2, ,…, 10]] ja pelataan vastaavat pelit siten että tulostaulukon voi kopioida vaikkapa taulukkolaskentaan. Merkki ”\t” on tabulaattori eli sarkainmerkki.

Alla koodin tuottama tuloste

GeoGebra/Python
Yksi tapa tutkia tätä ongelmaa on käyttää GeoGebra Pythonia. Koodin idea on sama kuin edellä esitetty.
Rivien 21-24 for-silmukassa pelataan peliä ja GeoGebran Point-komennon avulla verrataan pelin lopputulosta n:n mittaisella ykköslistalla lukuun 2^n-1. Point tuottaa pisteen GeoGebran Piirtoalueelle. Vaikuttaa siltä, että nuo ovat samoja lukuja.

Ensimmäisessä artikkelissani tästä aiheesta ”A not-exciting game of solitaire, peli yhteen- ja kertolaskun harjoitteluun” esitin Haastavia ongelmia.
Haastavampi laskutehtävä 1. Olkoon listassa n kappaletta ykkösiä. Mikä on pelin viimeinen luku. Jos merkitään että f(n) on pelin lopputulos, niin minkä tyyppinen funktio on kyseessä? Lineaarinen, potenssi, eksponentiaalinen, … ?
Haastavampi laskutehtävä 2. Olkoon listassa luvut [1, 2, 3, …, n]. Mikä on pelin viimeinen luku? Minkä tyyppistä on f(n):n kasvu?
Haastavampi laskutehtävä 3. Olkoon listassa luvut [a, b, c, d, …]. Kehitä mahdollisimman yksinkertainen kaava viimeisen luvun laskemiseksi.
Palaan näiden ratkaisuun seuraavassa artikkelissani.
lähteet
aiemmat artikkelit
A not-exciting game of solitaire, peli yhteen- ja kertolaskun harjoitteluun
https://mikkorahikka.blog/2024/01/28/a-not-exciting-game-of-solitaire-peli-yhteen-ja-kertolaskun-harjoitteluun/
Tantonin aNEGoS-peli GeoGebralla
https://mikkorahikka.blog/2024/02/04/tantonin-anegos-peli-geogebralla/
koodit
Lähdekoodi Colabissa
https://colab.research.google.com/drive/1pbgiBnetXQrM77IDWCZTWzSvv-iiJikQ?usp=sharing
GeoGebra/Python Tantonin pelille
koodi
toisinaan tuo linkkimenetelmä ei toimi, niinpä koodi on tässä. Sen voi kopioida GeoGebra/Pythoniin sivulla https://geogebra.org/python/index.html
from random import randint
def peli(lista):
while len(lista)>1:
#valitaan eka luku ja poistetaan listasta.
a = lista.pop(randint(0,len(lista)-1))
b = lista.pop(randint(0,len(lista)-1))
tulos = a*b+a+b
lista.append(tulos)
return lista[0]
#tuotetaan jonoja ykkösiä
montako = 10
ykkoslista = []
for i in range(montako):
ykkoslista.append([1]*(i+1))
#print(ykkoslista)
#pelataan ykkospelit
for i in range(montako):
viimeinen = peli(ykkoslista[i])
Point(i+1, viimeinen, size = 10, color = ”red”)
Point(i+1, 2**(i+1)-1, size = 1, color = ”blue”)

Jätä kommentti