Sie arbeiten hart, um zu heiraten. Das jährliche Einkommen, das Sie von der anderen Partei erwarten, beträgt über 8 Millionen Yen. Ich würde gerne an einer Hochzeitsfeier teilnehmen, aber ich halte es nicht für sinnvoll, daran teilzunehmen, es sei denn, ** mindestens einer der Teilnehmer ** hat ein Jahreseinkommen von 8 Millionen Yen oder mehr. Beantworten Sie angesichts einer Liste der Teilnehmer und ihres Jahresgehalts nicht, ob eine Teilnahme sinnvoll ist.
Nehmen wir an, die Teilnehmerzahl beträgt $ M $ und das jährliche Einkommen beträgt $ Y $ 10.000. Die obige Bedingung verwendet logische Symbole.
\exists M[Y\geq800]
Kann ausgedrückt werden als. $ \ existiert $ bedeutet "es gibt". Der Punkt ist ** "Wenn auch nur eine Person ein Jahreseinkommen von 8 Millionen oder mehr hat, ist es sofort in Ordnung" **.
def main1(M):
for Y in M:
if Y >= 800:
return "Teilnahme"
return "Nicht teilnehmen"
print(main1([800,900,1000,1100]))#Teilnahme
print(main1([500,600,700,800]))#Teilnahme
print(main1([400,500,600,700]))#Nicht teilnehmen
Sie können die Teilnehmer der Reihe nach ansehen und wenn Sie eine Person von 8 Millionen Yen finden, können Sie die Suche dort stoppen. Es ist das gleiche, egal wie viele Leute nach einem sind.
Nach vielen Erfahrungen mit der Eheparty werden Sie immer bullischer. Ich bin zu dem Schluss gekommen, dass es keinen Sinn macht, daran teilzunehmen, wenn nicht alle Teilnehmer ** ein Jahreseinkommen von 8 Millionen Yen oder mehr haben.
In diesem Fall,
\forall M[Y\geq800]
Kann ausgedrückt werden als. $ \ Forall $ bedeutet "über alles". Wenn Sie jedoch versuchen, dies im Programm so zu implementieren, wie es ist, wird es ein wenig mühsam sein, so dass wir eine kleine logische Konvertierung durchführen werden. Der obige Satz ist
\lnot(\lnot \forall M[Y\geq800])
Ist der gleiche Wert wie. $ \ Lnot $ steht für Negation. Bei einer Zwei-Wahl-Frage entspricht ** "not'not A '" ** ** "" A ". ** $ \ lnot $ kann durch Tauschen von $ \ forall $ nach rechts verschoben werden und $ \ existiert $ **
\lnot(\lnot \forall M[Y\geq800])\\
\Leftrightarrow \lnot(\exists M\lnot[Y\geq800])\\
\Leftrightarrow \lnot(\exists M[Y<800])
Die Konvertierung wird hergestellt. Der Punkt ist ** "Wenn sogar eine Person ein Jahreseinkommen von weniger als 800 hat, wird sie sofort ausfallen" **.
def main2(M):
for Y in M:
if Y < 800 :
return "Nicht teilnehmen"
return "Teilnahme"
print(main2([800,900,1000,1100]))#Teilnahme
print(main2([500,600,700,800]))#Nicht teilnehmen
print(main2([400,500,600,700]))#Nicht teilnehmen
Die Beurteilung der Teilnahme wird ebenfalls strenger.
Sie, die zu oft an der Hochzeitsfeier teilgenommen haben, haben sich der Planungsseite zugewandt, bevor Sie es wussten. Wir haben uns entschlossen, mehrere Gruppen zu organisieren, um den Bedürfnissen der Teilnehmer gerecht zu werden. Sie sind jedoch nicht motiviert, daher dachte ich, es wäre gut, wenn es ** mindestens eine ** Gruppe mit ** mindestens einem ** Teilnehmer mit einem Jahreseinkommen von 8 Millionen Yen oder mehr gäbe. Im schlimmsten Fall reicht nur eine Person! Was für ein unmotivierter Planer! Teilnehmer sind keine Sammlung.
Die Menge der Gruppen sei $ G $
\exists G \exists M[Y\geq800]
Es wird sein. Diese Implementierung ist einfach und es ändert sich nichts daran zu sagen, dass selbst eine Person ein Jahreseinkommen von 8 Millionen oder mehr haben sollte.
def main3(G):
for M in G:
for Y in M:
if Y >= 800:
return "Bestehen"
return "Fehler"
print(main3([[400,500,600,700],[500,600,700,800]]))#Bestehen
print(main3([[400,500,600,800],[500,600,700,800]]))#Bestehen
print(main3([[300,400,500,600],[800,900,1000,1100]]))#Bestehen
print(main3([[800,900,1000,1100],[900,1000,1100,1200]]))#Bestehen
Nachdem Sie Beschwerden über zu viel Text erhalten hatten, haben Sie sich entschlossen, dieses Mal eine perfekte Aufstellung vorzubereiten. ** Alle Teilnehmer aller Gruppen verdienen mehr als 8 Millionen Yen pro Jahr **.
\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])\\
Wenn auch nur eine Person ein Jahreseinkommen von weniger als 800 hat, wird es sofort ausfallen. Die Implementierung ist genauso einfach.
def main4(G):
for M in G:
for Y in M:
if Y < 800:
return "Fehler"
return "Bestehen"
print(main4([[400,500,600,700],[500,600,700,800]]))#Fehler
print(main4([[400,500,600,800],[500,600,700,800]]))#Fehler
print(main4([[300,400,500,600],[800,900,1000,1100]]))#Fehler
print(main4([[800,900,1000,1100],[900,1000,1100,1200]]))#Bestehen
Die perfekte Aufstellung wurde gut aufgenommen, aber es war zu schwierig, Leute zusammenzubringen und stieß bald an ihre Grenzen. Diesmal habe ich über einen solchen Plan nachgedacht.
"Es gibt mindestens ein ** Traumteam ** in der Gruppe, in dem alle Mitglieder mehr als 8 Millionen pro Jahr verdienen."
\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])\\
Es ist schwierig, dies in einer Schleife zu implementieren, wie es früher war, aber es kann einfach durch Aufteilen der Funktion implementiert werden.
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 "Bestehen"
return "Fehler"
print(main6([[400,500,600,700],[500,600,700,800]]))#Fehler
print(main6([[400,500,600,800],[500,600,700,800]]))#Fehler
print(main6([[300,400,500,600],[800,900,1000,1100]]))#Bestehen
print(main6([[800,900,1000,1100],[900,1000,1100,1200]]))#Bestehen
Mit diesem Traumteamplan begannen sich die Teilnehmer, die von Baba angezogen wurden, selbstverständlich zu beschweren. Sie haben sich also den nächsten Plan ausgedacht.
"Wir garantieren, dass jedes Team mindestens eine Person mit einem Jahreseinkommen von 8 Millionen oder mehr hat."
\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 "Fehler"
return "Bestehen"
print(main8([[400,500,600,700],[500,600,700,800]]))#Fehler
print(main8([[400,500,600,800],[500,600,700,800]]))#Bestehen
print(main8([[300,400,500,600],[800,900,1000,1100]]))#Fehler
print(main8([[800,900,1000,1100],[900,1000,1100,1200]]))#Bestehen
Damit war endlich ein stabiler Betrieb möglich. Ich bin glücklich.
Wenn Sie die beiden letztgenannten Fälle in einer Funktion ausführen möchten, müssen Sie eine separate Bool-Variable für das Flag vorbereiten.
\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 "Bestehen"
return "Fehler"
\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 "Fehler"
return "Bestehen"
Da die Flag-Bedingungen leicht zu verwechseln sind, versuche ich persönlich, Variablennamen wie "fail_at_least" (mindestens einmal fehlgeschlagen) anzugeben, auch wenn der Name lang ist.
Recommended Posts