Essstäbchen mutiert mit Punkten KoTH


13

Grundregeln (anders als meine)

Geschichte

Es ist das Jahr 4579, Menschen haben jetzt 2 Hände mit je 1001 Fingern. Essstäbchen basieren auf Punkten. Und @Dennis hat mehr Wiederholungen als @Martin ... Von Hand gezeichnete rote Kreise werden jetzt herabgestuft ... Jon Skeet hat auf jeder SE-Site 2 Billionen Wiederholungen erzielt ... Ja, beängstigend, ich weiß

Chopsticks ist ein Handspiel, das gelöst wurde. Um das zu umgehen, habe ich es mutiert erstellt. Ich habe die Anzahl der Finger erhöht.

Spielregeln

So wird das gespielt

Jeder beginnt mit 2 Händen. Jede Hand hat 1001 Finger. Jede Hand beginnt mit 1 (einem) Finger auf jeder Hand. Während deines Zuges kannst du die Hand des anderen Spielers "schlagen". Zum Schlagen wählst du 1 deiner Hände zum Schlagen und 1 ihrer Hände zum Schlagen. Die Hand, die getroffen wurde, hat jetzt die Anzahl der Finger, die sie zuerst hatten, UND die Anzahl der Finger, die Sie auf der Hand hatten, mit der Sie geschlagen haben.

EX

P1: 1,1 P2: 1,1. P1[0]Treffer P2[1]. Jetzt sind es die Finger P1:1,1 P2:1,2. Jetzt P2[1]trifft p1[0]. Die Finger sind jetzt P1: 3,1P2 1,2.

Wenn eine Hand 1001 Finger oder mehr hat, ist diese Hand aus. Dann kann ein Spieler, der eine Hand ausgeteilt hat (für seinen Zug), "splitten". Teilen ist, wenn Sie die Hand nehmen, die sich in der Hand befindet, die Anzahl der Finger halbieren (aufrunden) und diese Finger der anderen Hand geben, die sie wieder in die Hand nimmt.

EX

P1: 1000,2P2 7,7. P2[0]Treffer P1[0]. Punktzahl ist P1: 0,2P2 1,1. P1[1]teilt sich für seinen Zug und die Punktzahl ist P1: 1,1und P2 7,7.

Das Spiel endet, wenn ein Spieler beide Hände ausgeteilt hat. Die Punkte werden nach der Anzahl der Finger des Gewinners gewertet. Mehr Punkte = besser. Der Verlierer erhält keine Punkte.

Es gibt andere Regeln, die verwendet werden, aber diese werden hier verwendet.

Jeder spielt jeder (Round Robin)

Endspiel

Zählen Sie Ihre Punkte aus jeder Runde, die Sie gewinnen, zusammen. Dann durchschnittlich alle Punkte. Teilen Sie Ihre Gesamtsumme durch die Durchschnittspunkte und erhalten Sie Ihre endgültige Punktzahl. Die meisten Punkte gewinnen.

Aktuelle Regeln

Standard-Schlupflöcher

Bitte versuchen Sie nicht , das Spiel zu lösen. Ich muss es tatsächlich ausführen können: P

Stellen Sie sicher, dass der Bot schnell laufen kann. Mit der Länge der Runden dauert dies eine Weile

Alle in Ihrem Programm benötigten Bibliotheken müssen sich in der Standard-Python-Bibliothek befinden. Listen Sie auch die Dateien auf, die Sie importieren möchten. Die Importe werden nur der grundlegende Import sein (für Mathematik I tun: import math)

Die Antworten müssen in Python 3.x funktionieren

Handler

Ihr Bot wird eine eigene Python 3-Datei mit einer playFunktion sein.

playEs werden zwei Listen mit jeweils zwei Nummern übergeben. Diese Zahl gibt an, wie viele Finger sich auf jeder Hand befinden. Die erste Liste ist Ihre eigene Hand.

Wenn Sie die Hand des anderen Spielers treffen möchten, geben Sie eine Liste mit zwei Bits zurück. Das erste Bit ist der Index der Hand, die Sie zum Schlagen verwenden ( 0für die erste, 1für die letzte), und das zweite Bit ist der Index der Hand, die Sie auf den Gegner schlagen.

Wenn Sie sich für eine Aufteilung entscheiden, geben Sie einen anderen Wahrheitswert zurück.

Tada!

Die Steuerung finden Sie hier . Speichern Sie jeden Bot in einer eigenen Datei und listen Sie den Dateinamen jedes Bots (ohne .py) in auf botnames.

Schlussbemerkung:

Sie und der andere Bot wechseln sich zuerst ab. Wenn das Spiel nicht in 100.000 (einhunderttausend) Runden endet, wird das Spiel beendet und keiner der beiden Bots gewinnt.

Der Controller ist nicht gegen ewige Bewegungen geschützt, aber unnötiger Overhead wird stark verpönt.



Könnte "Standard KOTH rules" ein Link sein? Und vielleicht auch "Standard-Schlupflöcher".
Trichoplax

My handler is very simple, your bot must do it's logic then adjust the the finger scores as needed, remember!Was, also machen wir die Berechnungen für den KoTH?
HyperNeutrino

@ HyperNeutrino opps Befestigung.
Christopher

4
Dennis hat jetzt mehr Repräsentanten als Martin . Oh mein Gott, woher kommen diese zusätzlichen 996 Finger ?!
caird coinheringaahing

Antworten:


6

CodingAndAlgorithms

Diese Antwort verwendet tatsächlich Codierung und Algorithmen, im Gegensatz zu den anderen bisher! reference: imgur ( übertrifft auch alle vorher geposteten Antworten)

def play(A, B):
    if sum(A) == 1:
        return [A.index(1), B.index(max(B))]
    elif max(A) + max(B) > 1000:
        return [A.index(max(A)), B.index(max(B))]
    elif 0 in A:
        return 1
    elif 0 in B:
        return [A.index(min(A)), 1-B.index(0)]
    else:
        return [A.index(min(A)), B.index(min(B))]

Ich habe diese Referenz XD
Christopher

Das hat gerade gewonnen. Es hat nie verloren.
Christopher

Herzliche Glückwünsche! Ich denke, ich muss mich mit dem zweiten Platz zufrieden geben. Ihre Kodierung und Algorithmen waren stärker als meine
Value Ink

3

CautionBot

def play(s,o):
 if max(s)+max(o)>1000 and (all(s) or max(s)+min(o)<1001):
  return [s.index(max(s)),o.index(max(o))]
 else:
  return [s.index(min(s)),o.index(min(filter(bool,o)))]if all(s) else 'split'

AchtungBot möchte nicht zu viel Ärger verursachen, also schlägt es mit seiner kleineren Hand auf die kleinere Hand des Gegners, wenn es beide Hände hat, und teilt sich ansonsten. CautionBot ist jedoch kein Dummkopf. Wenn es also die Hand eines Gegners herausnehmen kann, ohne den nächsten Zug sofort zu verlieren, wird es dies anstelle seines normalen Zuges tun.


Inoffiziell gewinnt dies
Christopher

Cool! Wir werden sehen, wie es weitergeht, denn ich bin nicht überrascht, wenn jemand eine bessere Strategie entwickelt. Ich habe gerade das, was ich als Vanille-Essstäbchen-Strategie verstehe (sei feige und spalte oft, um nicht getötet zu werden), so angewendet, dass es den neuen Regeln am besten entspricht (sei feige und harte Schläge, um nicht getötet zu werden, da du spaltest / fusionierst, während du beide Hände haben ist illegal) lol
Value Ink

3

Equalizer

def play(s, o):
    if not all(s):
        return 1
    else:
        return [s.index(max(s)), o.index(min(filter(bool, o)))]

Wenn dem Equalizer eine Hand fehlt, wird sie geteilt. Andernfalls schlägt er die kleinste Hand seines Gegners mit seiner eigenen größten Hand.


Nach diesen mutierten Regeln können Sie AFAIK nur aufteilen, wenn eine Hand aus ist.
Value Ink

Oh ja, das werde ich reparieren.
Text

"Wenn der Equalizer keine Hände hat ..." Nun, ich meine, wenn er keine Hände hat, dann hat er schon verloren? Aber das ist nur eine Kleinigkeit, nimm meine +1 zum Ausgleich
Value Ink

3

Aggressor

def play(s, o):
    return [s.index(max(s)),o.index(max(o))]if all(s)else 1

Ein weiterer Starterbot, Aggressor, schlägt die größere Hand des Gegners mit der größeren seiner eigenen Hände, wenn beide Hände nicht leer sind. ansonsten spaltet es sich.


2

RandomBot

import random

def play(s, o):
    return [random.randint(0,1)for i in'  ']if all(s)else 1

Hier ist ein Bot, der einen zufälligen Treffer macht, wenn beide Hände nicht leer sind. ansonsten spaltet sich.

Golfen, weil warum nicht: 3


Ich habe das behoben
Christopher

@Christopher Ihr Kommentar wurde leider nicht angezeigt. --- Wenn Sie es zu beheben Ich werde diese löschen .--- Ich werde nur diese löschen , weil es dumm xD ist
HyperNeutrino

@Christopher Hinweis: Ich habe dies in einen gültigen Beitrag umgewandelt. Ich werde auch eine andere Lösung hinzufügen; Sag mir, wenn der Controller nicht richtig funktioniert :)
HyperNeutrino

Schön, sie auszuprobieren
Christopher

@Christopher Funktioniert der Controller ordnungsgemäß?
HyperNeutrino

2

Error

Ja, das ist der Name des Bots.

def play(s, o):
    if max(s)+max(o)>1000:
        return [s.index(max(s)),o.index(max(o))]
    if 0 in s:return ''
    return [s.index(max(s)),o.index(min(o))]

Ich bin dazu gekommen, indem ich mit den anderen Bots getestet habe. In meinen Simulationen ist es jedoch durchweg der vorletzte. Also mache ich irgendwann einen anderen Bot.

Bearbeiten: Ich kann anscheinend keinen Bot schreiben, der CautionBot schlägt, und meine zusätzlichen Tests scheinen anzuzeigen, dass dies der zweitbeste und nicht der zweitbeste ist.


1

Marathonläufer

Ich habe den von "HyperNeutrino" bereitgestellten Aggressor-Code angepasst, um einfach die kleinere der beiden Hände des Gegners mit der kleineren der Hände zu treffen. Es ist natürlich eine sehr dumme Strategie, aber ich kann es nicht ablehnen, ganz oben auf einem Chart zu stehen! (Auch wenn dieses Diagramm Verluste sein würde)

Ich bin mir nicht sicher, ob dieser Code fehlerfrei ausgeführt wird, da ich ihn aufgrund der Arbeit nicht testen konnte. Es sollte jedoch einwandfrei funktionieren.

def play(s, o):
     return [s.index(min(s)),o.index(min(o))]if all(s)else 1

Schöne erste Antwort! Sie haben eine gute Frage ausgewählt: P (keine Voreingenommenheit)
Christopher

Danke :) Ich war ziemlich nervös, weil ich nicht sicher war, ob es erlaubt war, den Code eines anderen zu ändern, wie ich es tat. Ich nehme an, es ist so lange, wie Sie es offensichtlich machen. Und ich wollte versuchen, eine zu machen, die nur die größte Hand gegen die größte des Gegners spielt, aber HyperNeutrino hat mich genau geschlagen! haha
Jordanien

Ja. Auf dieser SE wird oft Optimierungscode verwendet: P
Christopher

Coole Antwort! Eine Sache, über die ich mir Sorgen machen müsste (die ich momentan nicht testen kann), ist, dass ich nicht weiß, wie der Controller reagieren wird, wenn Sie versuchen, eine leere Hand zu schlagen, oder wie sich dies auf die Regeln auswirkt.
Wert Tinte

1
Dies ist dem Equalizer sehr ähnlich, aber der Equalizer überprüft, ob er die leere Hand des Gegners trifft, falls vorhanden. @LyricLy
HyperNeutrino
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.