Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kata Abril: bowling #13

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions aabilio/python/.eric4project/Abril-Bowling.e4q
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE UserProject SYSTEM "UserProject-4.0.dtd">
<!-- eric4 user project file for project Abril-Bowling -->
<!-- Saved: 2011-04-11, 18:07:18 -->
<!-- Copyright (C) 2011 aabilio, [email protected] -->
<UserProject version="4.0">
</UserProject>
6 changes: 6 additions & 0 deletions aabilio/python/.eric4project/Abril-Bowling.e4t
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Tasks SYSTEM "Tasks-4.2.dtd">
<!-- eric4 tasks file for project Abril-Bowling -->
<!-- Saved: 2011-04-11, 18:07:18 -->
<Tasks version="4.2">
</Tasks>
Binary file added aabilio/python/.eric4project/project-apis.db
Binary file not shown.
40 changes: 40 additions & 0 deletions aabilio/python/Abril-Bowling.e4p
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-4.6.dtd">
<!-- eric4 project file for project Abril-Bowling -->
<!-- Saved: 2011-04-11, 06:38:26 -->
<!-- Copyright (C) 2011 aabilio, [email protected] -->
<Project version="4.6">
<Language></Language>
<ProgLanguage mixed="0">Python</ProgLanguage>
<ProjectType>Console</ProjectType>
<Description>12meses12katas: Abril - Bowling</Description>
<Version>0.1</Version>
<Author>aabilio</Author>
<Email>[email protected]</Email>
<Sources>
<Source>__init__.py</Source>
<Source>bowling.py</Source>
<Source>testBowling.py</Source>
</Sources>
<Forms>
</Forms>
<Translations>
</Translations>
<Resources>
</Resources>
<Interfaces>
</Interfaces>
<Others>
<Other>README</Other>
</Others>
<MainScript>bowling.py</MainScript>
<Vcs>
<VcsType>None</VcsType>
</Vcs>
<FiletypeAssociations>
<FiletypeAssociation pattern="*.pyw" type="SOURCES" />
<FiletypeAssociation pattern="*.idl" type="INTERFACES" />
<FiletypeAssociation pattern="*.py" type="SOURCES" />
<FiletypeAssociation pattern="*.ptl" type="SOURCES" />
</FiletypeAssociations>
</Project>
29 changes: 29 additions & 0 deletions aabilio/python/README
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
FUNCIONAMIENTO:
==============

Yo basándome en el principio de que no se debe validar ningún dato y que se dará un resultado válido para un cadena (introducida) válida pensé en hacerlo de la siguiente forma:

--Play() que es la función que lo hace todo:
| _ Primero llama a la función que busca el final normal (vamos, que separe los dos tiros adicionales si el último fue
Strike o el tira adicional si el último "normal" fue Spare)
|_ Con un bucle for() recorre por índices la cadena introducida hasta el valor devuelto por la función comentada
anteriormente (es decir, solo recorre los tiros "normales")
|_ Va buscando: las opciones serán que sea "X" y sume 10 + el_siguiente + el_siguiente, que sea "/" y entonces se
suma 10 + el_siguiente o que sea un número (isNumOrGuion comprueba si es número o guión) y se suma el número
(siempre sumándose todo en la misma variable, claro está). En esta opción final se comprueba si el_siguiente es un
"/" para no sumar el valor, ya que será en la siguiente iteración 10 (del Spare) (esto es posible claro ya que s
presupone que la cadena introducida va a ser válida).

Y no es más, no se me ocurrió manera más fácil (de codificar y de leer) para implementarlo. Evidentemente, de la manera
que está implementado, si se quisiera validar la cadena de puntuación introducida el código quedaría mucho más ilegible y
seguramente esta forma sería inútil.

LANZAMIENTO:
============

python bowling.py <cadena> (p.ej.: XXXXXXXXXXXX)

UNITTEST:
=========

El codigo de unnitest que se presenta es el de j2sg por que con una pequeña modificación me sirve para mi script
Empty file added aabilio/python/__init__.py
Empty file.
77 changes: 77 additions & 0 deletions aabilio/python/bowling.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-

# 12meses12katas: Abril Bowling
# aabilio - [email protected]

import sys

class Bowling(object):
def __init__(self, scores=None):
self.__scores = scores
def getScores(self):
return self.__scores
def setScores(self, scores):
self.__scores = scores
scores = property(getScores, setScores)

def __isNumOrGuion(self, x):
'''
Comprueba si el parámetro x que se le pasa es un número de 1 a 9 o un '-'
'''
for i in range(1, 10):
if x == str(i) or x == '-': return True
return False

def __buscarFinal(self, s):
'''
return: la posición final del último tira "normal"
'''
if s[-3] is 'X': return len(s)-2
elif s[-2] is '/': return len(s)-1
else: return len(s)

def __num(self, x):
'''
return: el número correspondiente (10 si X ó /, 0 si -,...)
'''
if x is 'X' or x is '/': return 10
elif x is '-': return 0
else: return int(x)

def play(self):
'''
return: El resultado final de la suma. No se valida ninguno de los datos inroducidos.
'''
rsult = 0
s = self.__scores
end = self.__buscarFinal(s)

for i in range(0, end):
if s[i] is 'X':
rsult += 10 + self.__num(s[i+1]) + self.__num(s[i+2])
elif s[i] is '/':
rsult += 10 + self.__num(s[i+1])
else:
try: # Chapucilla para que sea más legible
if s[i+1] is '/':
pass
else:
rsult += self.__num(s[i])
except IndexError:
rsult += self.__num(s[i])

return rsult


if __name__ == "__main__":
if len(sys.argv) < 2:
sys.exit("[!!!] You must enter punctuation line")
elif len(sys.argv) > 2:
sys.exit("[!!!] Enter only the score line")
else:
partida = Bowling()
partida.scores = sys.argv[1]
tgs = partida.play()

print tgs
26 changes: 26 additions & 0 deletions aabilio/python/testBowling.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 12 Meses 12 Katas - Abril Bowling
# By j2sg - [email protected]

import unittest, bowling

class TestBowling(unittest.TestCase):
# Test Cases
tcs={ 'XXXXXXXXXXXX':300,
'9-9-9-9-9-9-9-9-9-9-':90,
'5/5/5/5/5/5/5/5/5/5/5':150}

# Set Software Under Test
def setUp(self):
self.sut=bowling.Bowling()

# Unit Testing
def test_play(self):
for key in self.tcs:
self.sut.scores = key # Para adaptarlo a mi función play()
self.assertEqual(self.tcs[key],self.sut.play())

if __name__ == '__main__':
unittest.main()