Re: F-Nim

Liste des GroupesRevenir à frj enigmes 
Sujet : Re: F-Nim
De : om+news (at) *nospam* miakinen.net (Olivier Miakinen)
Groupes : fr.rec.jeux.enigmes
Date : 05. Nov 2022, 18:50:50
Autres entêtes
Organisation : There's no cabale
Message-ID : <tk649a$1aau$1@cabale.usenet-fr.net>
References : 1 2 3 4
User-Agent : Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0 SeaMonkey/2.49.4
Le 05/11/2022 17:35, je répondais à Jacques Mathon :
 
Au début du jeu, le programme demande de choisir un pourcentage. Supposons
que j'aie choisi 80. Alors le programme avant de jouer commence à tirer au
hasard un nombre entre 0 et 100. Si ce nombre est inférieur à 80, alors il
applique la stratégie optimale pour ce coup. Sinon, il joue un nombre tiré
au hasard entre 1 et le maximum permis (quand même plus petit que le tiers
du nombre restant si c'est possible).
 
Question subsidiaire: n est-il borné ?
 
Non. La stratégie est valable quel que soit N. D'ailleurs Python ne limite
la taille des entiers que selon la taille mémoire disponible, ce qui fait
qu'en pratique il n'y a pas vraiment de limite pour une partie de durée
raisonnable.


Je vais donner ci-dessous le programme en Python (presque complet).


La partie du programme qui réalise la stratégie optimale est la fonction
'choix(have, maxi)' pour laquelle le paramètre 'have' est le nombre d'objets
restant et le paramètre 'maxi' est le nombre maximum que le programme a le
droit de retirer.

Voici cette fonction, dans laquelle j'ai remplacé les caractères non blancs
de la fin par des '#' :
=============================================================================
def choix(have, maxi):
    while True:
        if have <= maxi:
            return have
        ## # # ## #
        ##### # # #####
            ## # # ## ###
        #### ## #
=============================================================================

Comme vous pouvez le voir, l'algorithme est *trés* court.


Programme complet, modulo les '#' de la fonction 'choix' :
=============================================================================
#!/usr/bin/python3

import random

def choix(have, maxi):
    while True:
        if have <= maxi:
            return have
        ## # # ## #
        ##### # # #####
            ## # # ## ###
        #### ## #

def saisie(message, mini, maxi = 0):
    if maxi <= 0:
        invite = f'{message} (au moins {mini}) ? '
        erreur = f'Vous devez choisir un nombre au moins égal à {mini}.'
    else:
        invite = f'{message} (entre {mini} et {maxi}) ? '
        erreur = f'Vous devez choisir un nombre entre {mini} et {maxi}.'
    result = int(input(invite))
    while result < mini or result > maxi > 0:
        print(erreur)
        result = int(input(invite))
    return result

def premier_a_jouer():
    invite = "Qui commence ?"
    print("Choisissez qui va commencer.")
    print("1 = Vous jouez en premier.")
    print("2 = Vous jouez en deuxième.")
    print("3 = C'est le hasard qui décide.")
    result = saisie("Qui commence", 1, 3)
    if result == 3:
        result = random.randint(1, 2);
    if result == 1:
        print("Et donc vous commencez.")
    else:
        print("Et donc je commence.")
    return result

def joueur_humain(have, maxi):
    print()
    s = "s" if (have > 1) else ""
    print(f"C'est à vous de jouer. Il reste {have} objet{s}.")
    retire = saisie("Combien en retirez-vous", 1, maxi)
    return retire

TRACE_RANDOM = True
def joueur_ordi(have, maxi, percent):
    print()
    s = "s" if (have > 1) else ""
    print(f"C'est à moi de jouer. Il reste {have} objet{s}.")
    if have <= maxi:
        if TRACE_RANDOM: print("Mon choix est évident.")
        return have
    if random.uniform(0, 100) <= percent:
        if TRACE_RANDOM: print("Je joue au mieux.")
        retire = choix(have, maxi)
        if 3*retire < have:
            return retire
    else:
        if TRACE_RANDOM: print("Je joue au hasard.")
    if 3*maxi >= have:
        maxi = int((have-1)/3);
    if maxi <= 1:
        return 1
    return random.randint(1, maxi)

def main():
    print("Bienvenue à F-Nim !")
    have = saisie("Combien d'objets au départ", 2)
    percent = saisie("Pourcentage de fiabilité du programme", 0, 100)
    qui = premier_a_jouer()
    maxi = have - 1

    while have > 0:
        if qui == 1:
            retire = joueur_humain(have, maxi)
            qui = 2
        else:
            retire = joueur_ordi(have, maxi, percent)
            s = "s" if (retire > 1) else ""
            print(f"Je retire {retire} objet{s}.")
            qui = 1
        have = have - retire
        maxi = min(have, 2 * retire)

    if qui == 1:
        print("J'ai gagné !")
    else:
        print("Vous avez gagné !")

main()
=============================================================================


--
Olivier Miakinen

Date Sujet#  Auteur
21 Oct 22 * F-Nim47Olivier Miakinen
21 Oct 22 +* Re: F-Nim4Jacques Mathon
21 Oct 22 i`* Re: F-Nim3Olivier Miakinen
21 Oct 22 i `* Re: F-Nim2Jacques Mathon
21 Oct 22 i  `- Re: F-Nim1Olivier Miakinen
21 Oct 22 +* Re: F-Nim7Dominique
21 Oct 22 i`* Re: F-Nim6Olivier Miakinen
21 Oct 22 i +* Re: F-Nim4Olivier Miakinen
22 Oct 22 i i`* Re: F-Nim3Dominique
22 Oct 22 i i `* Re: F-Nim2Dominique
22 Oct 22 i i  `- Saisie mini/maxi (was: F-Nim)1Olivier Miakinen
21 Oct 22 i `- Re: F-Nim1Olivier Miakinen
22 Oct 22 `* Re: F-Nim35Olivier Miakinen
4 Nov 22  `* Re: F-Nim34Jacques Mathon
5 Nov 22   `* Re: F-Nim33Olivier Miakinen
5 Nov 22    `* Re: F-Nim32Olivier Miakinen
6 Nov 22     `* Re: F-Nim31Jacques Mathon
6 Nov 22      `* Re: F-Nim30Olivier Miakinen
6 Nov 22       `* Re: F-Nim29Jacques Mathon
6 Nov 22        +* Re: F-Nim27Olivier Miakinen
7 Nov 22        i`* Re: F-Nim26Jacques Mathon
7 Nov 22        i +* Re: F-Nim24Olivier Miakinen
26 Nov 22        i i`* Un indice : F-Nim23Olivier Miakinen
27 Nov 22        i i `* Re: Un indice : F-Nim22Jacques Mathon
28 Nov 22        i i  `* Re: Un indice : F-Nim21Olivier Miakinen
29 Nov 22        i i   +* Re: Un indice : F-Nim2Jac
30 Nov 22        i i   i`- Re: Un indice : F-Nim1Olivier Miakinen
29 Nov 22        i i   `* Re: Un indice : F-Nim18Jacques Mathon
29 Nov 22        i i    +* Re: Un indice : F-Nim15Jac
29 Nov 22        i i    i`* Re: Un indice : F-Nim14Jacques Mathon
30 Nov 22        i i    i `* Re: Un indice : F-Nim13Jac
30 Nov 22        i i    i  `* Re: Un indice : F-Nim12Jacques Mathon
19 Dec 22        i i    i   `* [Solution] F-Nim11Olivier Miakinen
19 Dec 22        i i    i    +* Re: [Solution] F-Nim4Jac
20 Dec 22        i i    i    i`* Re: [Solution] F-Nim3Olivier Miakinen
21 Dec 22        i i    i    i `* Re: [Solution] F-Nim2Gerardus
21 Dec 22        i i    i    i  `- Re: [Solution] F-Nim1Olivier Miakinen
20 Dec 22        i i    i    `* Re: [Solution] F-Nim6Dominique
20 Dec 22        i i    i     `* Re: [Solution] F-Nim5Jacques Mathon
20 Dec 22        i i    i      `* Re: [Solution] F-Nim4Dominique
20 Dec 22        i i    i       `* Re: [Solution] F-Nim3Olivier Miakinen
21 Dec 22        i i    i        `* Re: [Solution] F-Nim2Dominique
21 Dec 22        i i    i         `- Re: [Solution] F-Nim1Olivier Miakinen
30 Nov 22        i i    `* Re: Un indice : F-Nim2Olivier Miakinen
30 Nov 22        i i     `- Re: Un indice : F-Nim1Jacques Mathon
13 Nov 22        i `- Re: F-Nim1Olivier Miakinen
6 Nov 22        `- [aide python] Re: F-Nim1Olivier Miakinen

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal