Skip to content

Instantly share code, notes, and snippets.

@kpalin
Last active November 11, 2018 20:58
Show Gist options
  • Save kpalin/a85a123125a98c176981f73e8cbb4ad5 to your computer and use it in GitHub Desktop.
Save kpalin/a85a123125a98c176981f73e8cbb4ad5 to your computer and use it in GitHub Desktop.
Lasketaan 8x8 shakkilaudalla mahdollisten ei-uhkaavien kuningatarten asemien lukumäärät.
def valkoinenUhkaa(sarake,rivi,koko):
"""Palauttaa 'koko' x 'koko' kokoisen kaksiulotteisen listan 'lauta', jonka alkio on
1 joss kohdassa ('sarake','rivi') oleva shakkikuningatar uhkaa tai valloittaa
kyseistä alkiota. Muuten alkio on 0.
"""
# Alustetaan 2 ulotteinen taulukko/lista
lauta = []
for i in range(koko):
lauta.append([0]*koko)
for i in range(koko):
# Rivi
lauta[sarake][i] = 1
# Sarake
lauta[i][rivi] = 1
# Diagonaalit
if sarake-i >= 0:
if rivi-i >= 0:
lauta[sarake-i][rivi-i] = 1
if rivi+i < koko:
lauta[sarake-i][rivi+i] = 1
if sarake+i < koko:
if rivi-i >= 0:
lauta[sarake+i][rivi-i] = 1
if rivi+i < koko:
lauta[sarake+i][rivi+i] = 1
return lauta
def laskeTurvalliset(lauta):
"Laskee 2 ulotteisen listan alkiot joiden arvo on 0"
turvalliset = 0
for sarake in lauta:
for uhattu in sarake:
if uhattu==0:
turvalliset += 1
return turvalliset
def tulostaLauta(lauta):
"Tulostaa laudan siten että lauta[0][0] on vasemmassa alanurkassa, shakkilaudan ruutu a1"
koko = len(lauta)
for i in range(koko):
rivi=koko-i-1
s=""
for sarake in range(koko):
s=s+str(lauta[sarake][rivi])
print(s)
def laskeKaikkiTurvalliset(koko):
"""Laskee 'koko'x'koko' kokoisella shakkilaudalla kaikkien mahdollisten kahden kuningattaren
sellaisten asemien lukumäärän, missä ne eivät uhkaa toisiaan.
"""
turvalliset = 0
for rivi in range(koko):
for sarake in range(koko):
lauta = valkoinenUhkaa(sarake,rivi,koko)
turvalliset += laskeTurvalliset(lauta)
return turvalliset
if True:
turvalliset=0
koko=8
for vSarake in range(koko):
for vRivi in range(koko):
for mSarake in range(koko):
for mRivi in range(koko):
if not ( (mRivi==vRivi) or (mSarake==vSarake) or (mSarake-mRivi) == (vSarake-vRivi) or (mSarake+mRivi) == (vSarake+vRivi)):
turvalliset+=1
print(turvalliset)
else:
print(laskeKaikkiTurvalliset(8))
@kpalin
Copy link
Author

kpalin commented Nov 11, 2018

Tämä on aika vaikea knoppitehtävä. Lopussa olevat sisäkkäiset loopit käyvät läpi valkoisen ja mustan kuningattaren asemat ja pitkä if-lause tarkistaa uhkaavatko ne toisiaan vai eivät. Mikään näistä ratkaisuista ei ole suositeltava!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment