J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"

Histoire originale Histoire originale: [J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python] (http://qiita.com/elzup/items/d532ffa1d326fbf75d01) Histoire originale: [J'ai essayé de corriger "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"] (http://qiita.com/t2y/items/8584b77b3fe02dd2ce63)

Je ne sais toujours pas comment écrire un bloc doc, alors je vais étudier

L'une des fonctionnalités de Python est doctest. Si vous combinez le document sur l'utilisation de la fonction avec un test simple, il peut s'agir de deux oiseaux avec une pierre.

Si vous modifiez la logique du code original pour ne pas le gâcher, le doctest du code modifié n'est pas bon, mais si vous essayez de développer en écrivant le doctest, la perspective de la position à utiliser va s'étendre et il sera facile à utiliser naturellement Vous pouvez implémenter des fonctions et des modules.

Lors de l'écriture de doctest, si vous le développez de manière interactive, il sera facile à déboguer, ce sera une API facile à utiliser, et je voulais dire qu'il peut être utilisé comme un document tel quel, mais je ne pourrais pas écrire un exemple de code approprié, alors vengeance.

J'ai essayé de faciliter la compréhension du but de doctest.

En passant, je me demandais si je pouvais écrire le processus de génération de numéro de carte plus proprement d'hier, et j'étais un peu heureux lorsque j'ai utilisé * réduire *.

    def _generate(self):
        def sampling(k=5):
            for i in range(k):
                yield sample(range(15 * i + 1, 15 * (i + 1) + 1), k)

        return reduce(add, sampling())

Je serais heureux si je pouvais transmettre ce genre d'atmosphère.

# -*- coding: utf-8 -*-
from functools import reduce
from operator import add
from random import sample


class Card:
    """ 75-ball Bingo Card

    The middle square is designated a "FREE" space.
    The columns are labeled as follows.
    "B": (numbers 1–15)
    "I": (numbers 16–30)
    "N": (numbers 31–45)
    "G": (numbers 46–60)
    "O": (numbers 61–75)

    http://en.wikipedia.org/wiki/Bingo_card

    >>> data = [  # for testing use
    ... 1, 2, 3, 4, 5,
    ... 6, 7, 8, 9, 10,
    ... 11, 12, 13, 14, 15,
    ... 16, 17, 18, 19, 20,
    ... 21, 22, 23, 24, 25,
    ... ]
    >>> card = Card(data)
    >>> len(card.numbers)
    25
    >>> card.numbers[12]
    True
    >>> card.is_bingo
    False
    >>> print(card)
      1  2  3  4  5
      6  7  8  9 10
     11 12  o 14 15
     16 17 18 19 20
     21 22 23 24 25

    Show 'o' when giving number is found

    >>> card.set_number(14)
    >>> print(card)
      1  2  3  4  5
      6  7  8  9 10
     11 12  o  o 15
     16 17 18 19 20
     21 22 23 24 25

    Check bingo giving number to the card.

    >>> card.set_number(35)  # have no effect if number not in card.numbers
    >>> card.set_number(1)
    >>> card.set_number(7)
    >>> card.set_number(19)
    >>> card.is_bingo
    False
    >>> card.set_number(25)
    >>> card.is_bingo
    True
    >>> print(card)
      o  2  3  4  5
      6  o  8  9 10
     11 12  o  o 15
     16 17 18  o 20
     21 22 23 24  o
    """

    def __init__(self, numbers=None):
        self.numbers = self._generate() if numbers is None else numbers
        self.numbers[12] = True
        self.is_bingo = False

    def __repr__(self):
        ascii_card = ''
        for i in range(int(len(self.numbers) / 5)):
            for num in self.numbers[5 * i:5 * (i + 1)]:
                if num is True:
                    num = 'o'
                elif num is False:
                    num = 'x'
                ascii_card += '{0:>3s}'.format(str(num))
            ascii_card += '\n'
        return ascii_card[:-1]

    def _generate(self):
        def sampling(k=5):
            for i in range(k):
                yield sample(range(15 * i + 1, 15 * (i + 1) + 1), k)

        return reduce(add, sampling())

    def set_number(self, number):
        if number not in self.numbers:
            return
        self.numbers[self.numbers.index(number)] = True
        if not self.is_bingo:
            self.check_bingo()

    def check_bingo(self):
        def check(start, stop, step=1):
            return all(map(lambda x: x is True, self.numbers[start:stop:step]))

        if self.numbers.count(True) < 5:
            return

        for i in range(5):
            if check(i * 5, (i + 1) * 5):  # horizontal
                self.is_bingo = True
                return

        for i in range(5):
            if check(i, i + 21, 5):  # vertical
                self.is_bingo = True
                return

        if check(0, 25, 6) or check(4, 21, 4):  # skew
            self.is_bingo = True
            return

Exécutez doctest comme ça.

$ python -m doctest Bingo_kai2.py  #Si aucune erreur n'est affichée, le test est correct
$ python -m doctest Bingo_kai2.py -v  #Mode redondant

Recommended Posts

J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python
J'ai essayé de corriger "J'ai essayé la simulation probabiliste du jeu de bingo avec Python"
J'ai essayé d'implémenter le jeu de cartes de Trump en Python
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'implémenter le blackjack du jeu Trump en Python
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ①
J'ai essayé de créer une liste de nombres premiers avec python
J'ai écrit le code pour écrire le code Brainf * ck en python
J'ai essayé de mettre en œuvre un jeu de dilemme de prisonnier mal compris en Python
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de jouer à un jeu de frappe avec Python
Je veux faire un jeu avec Python
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé d'implémenter un pseudo pachislot en Python
J'ai essayé de visualiser facilement les tweets de JAWS DAYS 2017 avec Python + ELK
Je veux travailler avec un robot en python.
Comment obtenir une liste de fichiers dans le même répertoire avec python
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
J'ai essayé de résumer les opérations de chaîne de Python
Je voulais connaître le nombre de lignes dans plusieurs fichiers et j'ai essayé de l'obtenir avec une commande
Introduction à la création d'IA avec Python! Partie 2 J'ai essayé de prédire le prix de l'immobilier dans la ville de Boston avec un réseau neuronal
J'ai essayé de faire quelque chose comme un chatbot avec le modèle Seq2Seq de TensorFlow
Comment identifier l'élément avec le plus petit nombre de caractères dans une liste Python?
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
[Python] J'ai essayé de créer automatiquement un rapport quotidien de YWT avec la messagerie Outlook
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé d'implémenter un automate cellulaire unidimensionnel en Python
J'ai écrit rapidement un programme pour étudier la DI avec Python ①
J'ai écrit la grammaire de base de Python dans Jupyter Lab
J'ai essayé "Comment obtenir une méthode décorée en Python"
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
J'ai écrit la file d'attente en Python
J'ai écrit la pile en Python
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
J'ai essayé de prédire les ventes de logiciels de jeux avec VARISTA en me référant à l'article du Codexa
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
J'ai essayé de décrire le trafic en temps réel avec WebSocket