Vous travaillez dur pour vous marier. Le revenu annuel que vous attendez de l'autre partie est supérieur à 8 millions de yens. J'aimerais assister à une fête de mariage, mais je ne pense pas qu'il soit logique d'y assister à moins que ** au moins l'un des participants ** ait un revenu annuel de 8 millions de yens ou plus. Étant donné la liste des participants et leur salaire annuel, ne répondez pas s'il est logique d'y assister.
Supposons que l'ensemble des participants est de M $ M $ et que le revenu annuel est de 10 000 $ Y $. La condition ci-dessus utilise des symboles logiques,
\exists M[Y\geq800]
Peut être exprimé comme. $ \ existe $ signifie "il y a". Le point est ** "Si même une personne a un revenu annuel de 8 millions ou plus, tout va bien" **.
def main1(M):
for Y in M:
if Y >= 800:
return "Présence"
return "N'assiste pas"
print(main1([800,900,1000,1100]))#Présence
print(main1([500,600,700,800]))#Présence
print(main1([400,500,600,700]))#N'assiste pas
Vous pouvez regarder les participants dans l'ordre, et si vous trouvez une personne de 8 millions de yens, vous pouvez y arrêter la recherche. C'est la même chose quel que soit le nombre de personnes après une.
Vous êtes de plus en plus optimiste après avoir vécu de nombreuses expériences de mariage. J'en suis venu à penser qu'il ne sert à rien d'assister à moins que tous les participants ** aient un revenu annuel de 8 millions de yens ou plus.
Dans ce cas,
\forall M[Y\geq800]
Peut être exprimé comme. $ \ Forall $ signifie «à propos de tout». Cependant, si vous essayez de l'implémenter dans le programme tel quel, ce sera un peu gênant, nous allons donc faire une petite conversion logique. La proposition ci-dessus est
\lnot(\lnot \forall M[Y\geq800])
Est la même valeur que. $ \ Lnot $ représente la négation. Pour une question à deux choix, ** "not'not A '" ** équivaut à ** "is A" **. ** $ \ lnot $ peut être déplacé vers la droite en échangeant $ \ forall $ et $ \ exists $ **
\lnot(\lnot \forall M[Y\geq800])\\
\Leftrightarrow \lnot(\exists M\lnot[Y\geq800])\\
\Leftrightarrow \lnot(\exists M[Y<800])
La conversion est établie. Le point est ** "Si même une personne a un revenu annuel inférieur à 800, elle sera immédiatement absente" **.
def main2(M):
for Y in M:
if Y < 800 :
return "N'assiste pas"
return "Présence"
print(main2([800,900,1000,1100]))#Présence
print(main2([500,600,700,800]))#N'assiste pas
print(main2([400,500,600,700]))#N'assiste pas
Le jugement de la fréquentation devient également strict.
Vous qui avez trop assisté à la fête de mariage vous êtes tourné vers la planification avant de le savoir. Nous avons décidé d'organiser plusieurs groupes pour répondre aux besoins des participants. Cependant, vous n'êtes pas motivé, alors j'ai pensé que ce serait bien s'il y avait ** au moins un ** groupe avec ** au moins un ** participant avec un revenu annuel de 8 millions de yens ou plus. Au pire, une seule personne suffit! Quel planificateur sans motivation! Les participants ne sont pas une collection.
Soit l'ensemble des groupes $ G $
\exists G \exists M[Y\geq800]
Ce sera. Cette mise en œuvre est facile et il n'y a pas de changement en disant que même une personne devrait avoir un revenu annuel de 8 millions ou plus.
def main3(G):
for M in G:
for Y in M:
if Y >= 800:
return "Passer"
return "échec"
print(main3([[400,500,600,700],[500,600,700,800]]))#Passer
print(main3([[400,500,600,800],[500,600,700,800]]))#Passer
print(main3([[300,400,500,600],[800,900,1000,1100]]))#Passer
print(main3([[800,900,1000,1100],[900,1000,1100,1200]]))#Passer
Après avoir reçu des plaintes concernant trop de texte, vous avez décidé de préparer une programmation parfaite cette fois. ** Tous les participants de tous les groupes gagnent plus de 8 millions de yens par an **.
\forall G \forall M[Y \geq 800]\\
\Leftrightarrow \lnot(\lnot \forall G \forall M[Y \geq 800])\\
\Leftrightarrow \lnot(\exists G \lnot(\forall M[Y \geq 800]))\\
\Leftrightarrow \lnot(\exists G \exists M[Y < 800])\\
Si même une personne a un revenu annuel inférieur à 800, il sera immédiatement éliminé. La mise en œuvre est tout aussi simple.
def main4(G):
for M in G:
for Y in M:
if Y < 800:
return "échec"
return "Passer"
print(main4([[400,500,600,700],[500,600,700,800]]))#échec
print(main4([[400,500,600,800],[500,600,700,800]]))#échec
print(main4([[300,400,500,600],[800,900,1000,1100]]))#échec
print(main4([[800,900,1000,1100],[900,1000,1100,1200]]))#Passer
La composition parfaite a été bien accueillie, mais il était trop difficile de rassembler les gens et a rapidement atteint sa limite. Cette fois, j'ai pensé à un tel plan.
"Il y a au moins une ** équipe de rêve ** dans le groupe avec tous les membres qui gagnent plus de 8 millions par an."
\exists G \forall M[Y \geq 800]\\
\Leftrightarrow \exists G \lnot(\lnot \forall M[Y \geq 800])\\
\Leftrightarrow \exists G \lnot(\exists M[Y < 800])\\
Il est difficile de l'implémenter en une seule boucle comme c'était le cas auparavant, mais cela peut être implémenté simplement en divisant la fonction.
def main5(M):
for Y in M:
if Y < 800:
return False
return True
def main6(G):
for M in G:
if main5(M):
return "Passer"
return "échec"
print(main6([[400,500,600,700],[500,600,700,800]]))#échec
print(main6([[400,500,600,800],[500,600,700,800]]))#échec
print(main6([[300,400,500,600],[800,900,1000,1100]]))#Passer
print(main6([[800,900,1000,1100],[900,1000,1100,1200]]))#Passer
Avec ce plan d'équipe de rêve, les participants qui ont été attirés par Baba ont commencé à se plaindre naturellement. Vous avez donc proposé le prochain plan.
"Nous garantissons que chaque équipe a au moins une personne avec un revenu annuel de 8 millions ou plus."
\forall G \exists M[Y \geq 800]\\
\Leftrightarrow \lnot ( \lnot \forall G \exists M[Y \geq 800])\\
\Leftrightarrow \lnot (\exists G \lnot(\exists M[Y \geq 800]))\\
def main7(M):
for Y in M:
if Y >= 800:
return False
return True
def main8(G):
for M in G:
if main7(M):
return "échec"
return "Passer"
print(main8([[400,500,600,700],[500,600,700,800]]))#échec
print(main8([[400,500,600,800],[500,600,700,800]]))#Passer
print(main8([[300,400,500,600],[800,900,1000,1100]]))#échec
print(main8([[800,900,1000,1100],[900,1000,1100,1200]]))#Passer
Avec cela, un fonctionnement stable était enfin possible. Je suis heureux.
Si vous voulez compléter les deux derniers cas en une seule fonction, vous devez préparer une variable bool
distincte pour l'indicateur.
\exists G \forall M[Y \geq 800]\\
\Leftrightarrow \exists G \lnot(\lnot \forall M[Y \geq 800])\\
\Leftrightarrow \exists G \lnot(\exists M[Y < 800])\\
def main9(G):
for M in G:
fail_at_least = 0
for Y in M:
if Y < 800:
fail_at_least = 1
if not fail_at_least:
return "Passer"
return "échec"
\forall G \exists M[Y \geq 800]\\
\Leftrightarrow \lnot ( \lnot \forall G \exists M[Y \geq 800])\\
\Leftrightarrow \lnot (\exists G \lnot ( \exists M[Y \geq 800]))\\
def main10(G):
for M in G:
success_at_least = 0
for Y in M:
if Y >= 800:
success_at_least = 1
if not success_at_least:
return "échec"
return "Passer"
Comme la condition du drapeau est facile à confondre, j'essaie personnellement de donner un nom de variable tel que fail_at_least
(échoué au moins une fois) même si le nom est long.
Recommended Posts