MIKKO RAHIKKA

The electrical things have their lives too, paltry as those lives are.


Tantonin aNEGoS-peli Pythonilla

[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]

jonoja ykkösiä

montako = 10

ykkoslista = []

for i in range(montako):

  ykkoslista.append([1]*(i+1))

(ykkoslista)

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”)

Yksi vastaus artikkeliin “Tantonin aNEGoS-peli Pythonilla”

  1. […] Tantonin aNEGoS-peli Pythonillahttps://mikkorahikka.blog/2024/02/11/tantonin-anegos-peli-pythonilla/ […]

    Tykkää

Jätä kommentti

This site uses Akismet to reduce spam. Learn how your comment data is processed.