ผู้ค้าสู่ความตาย


19

คุณเป็นผู้ค้าต่างประเทศหวังที่จะทำกำไร มีสินค้า 5 รายการที่ผู้คนต้องการแลกเปลี่ยน: Apricots, Bพาย, Canaries, Daffodils และE arwigs เริ่มต้นในฤดูหนาวคุณต้องตัดสินใจว่าจะผลิตอะไร จากนั้นในฤดูใบไม้ร่วงคุณเดินทางและใช้เวลาทั้งวันเพื่อผลกำไร

เพลย์

คุณเริ่มเกมด้วยผลิตภัณฑ์ 10 ตัวในพื้นที่จัดเก็บ ในแต่ละปีคุณจะบริโภคสินค้า 2 รายการ

ที่จุดเริ่มต้นของเกมที่คุณจะได้รับรายชื่อจาก 5 สินค้าพร้อมกับจำนวนเงินที่คุณจะสามารถที่จะผลิตในแต่ละปี (เช่น: 5-A,6-B,3-C,12-D,4-E) จากนั้นคุณจะส่งคืนจดหมาย A ถึง E เพื่อตัดสินใจว่าจะผลิตอะไร

จากนั้นในช่วงฤดูใบไม้ร่วงคุณจะนำผลิตภัณฑ์ของคุณ (รวมถึงสินค้าในที่เก็บข้อมูล) ออกสู่ตลาด คุณมี 50 เทิร์นเพื่อแลกเปลี่ยน

คุณต้องตัดสินใจว่าคุณต้องการจะPซื้อ, ขายS, หรือขายLให้ตลาด จากนั้นผู้ซื้อจะถูกจับคู่แบบสุ่มกับผู้ขาย หากกลุ่มมีความพิเศษพิเศษการสุ่มจะพลาดโอกาสนี้ หากผู้ประกอบการจะข้ามพวกเขาจะได้รับมิฉะนั้นS Tผู้ขายจะต้องตัดสินใจในสิ่งที่เขาต้องการที่จะขายและจำนวนเงิน (เช่น3-A) และแล้วสิ่งที่เขาจะยอมรับ (เช่น: 5-B,2-D,1-E) (ค่ามีใด ๆไม่ได้ทั้งหมด ) จากนั้นผู้ซื้อจะได้รับแจ้งว่าผลิตภัณฑ์ที่ผู้ขายขายนั้นคืออะไรผลิตภัณฑ์ที่ผู้ขายจะนำไปใช้และเขาสามารถเลือกผลิตภัณฑ์เพื่อแลกเปลี่ยนกับมัน (เช่น: DหรือXเพื่ออะไร)

หลังจากการซื้อขายทั้งหมดจบลงหรือหลังจากที่คุณออกจากตลาดคุณจะบริโภคสินค้า 2 รายการและเริ่มปีใหม่ หากคุณมีน้อยกว่า 2 ใน 1 ผลิตภัณฑ์ใด ๆ คุณจะตาย (และผ่านQ)

คะแนนของคุณจะเป็นจำนวนปีที่คุณผ่านมาและหลังจาก 50 เกมคะแนนของคุณจะถูกเฉลี่ยสำหรับคะแนนรวมของคุณ

ย้ายตัวเลือก

เมื่อใดก็ตามที่คุณสามารถกลับGไปสอบถามสินค้าของคุณ

เมื่อใดก็ตามที่คุณสามารถกลับNไปค้นหาจำนวนของผลิตภัณฑ์ใหม่ในสินค้าคงคลังของคุณ (ผลิตโดยผู้เล่นใด ๆ ในปีที่ผ่านมาและผลิตภัณฑ์ใหม่จะมีการซื้อขายก่อนผลิตภัณฑ์เก่า)

เมื่อใดก็ตามที่คุณสามารถกลับTสู่วลี Turn ปัจจุบัน: Produce, Market หรือTrading

ในระหว่างการค้าคุณสามารถสอบถาม Iตัวระบุที่ไม่ซ้ำกับผู้เล่นที่คุณกำลังซื้อขาย

ในระหว่างการค้าคุณสามารถกลับMไปค้นหาจำนวนผู้ซื้อขาย

วิธีการรหัส:

คุณสามารถใช้ภาษามาตรฐานใด ๆ และจะต้องมีcommand.txtคำสั่งที่จะเรียกใช้โปรแกรมของคุณ

โฟลว์ทั่วไปของโปรแกรมของคุณควรเป็น:

Get productivity
While alive:
    Output product you want to produce
    While in trading:
        Output whether you want to purchase or sell
        Get whether or not you were skipped.  If not skipped:
            If purchasing:
                print product you offer, and products you will accept
            Else:
                Get product offered, products being accepted, and choose the product you will give

ฉันมีโปรแกรมทดสอบที่นี่ หากต้องการใช้งานให้สร้างโฟลเดอร์ในโฟลเดอร์บอทด้วยชื่อบอทของคุณ เพิ่มcommand.txtโปรแกรมของคุณและสิ่งอื่น ๆ ที่โปรแกรมของคุณต้องการ ฉันจะเพิ่มการส่งเมื่อพวกเขาเข้ามาหากคุณไม่ต้องการติดตั้งภาษาที่จำเป็นในการใช้งานบางส่วนหรือทั้งหมดคุณเพียงแค่ลบ command.txt ในโฟลเดอร์บอท

ผลงานภายใน

จะมี 5 บอทสำหรับแต่ละโปรแกรมที่ส่ง ID จะแตกต่างกันไปสำหรับบอทประเภทเดียวกัน

ฉันจะเรียกจำนวนเงินที่คนสามารถผลิตผลิตภัณฑ์ที่กำหนดผลผลิต ผลิตภัณฑ์แต่ละชิ้นจะได้รับผลผลิตพื้นฐานซึ่งทั้งหมดของผลผลิตพื้นฐานจะเพิ่มขึ้นถึง 30 คะแนนใดคะแนนหนึ่งจะได้รับการรับรองว่าให้มากที่สุด 3 คะแนนและทั้งหมดจะต้องมีอย่างน้อย 2

จากนั้นประสิทธิภาพการทำงานของผู้เล่นแต่ละคนจะแตกต่างจากการผลิตพื้นฐาน (หนึ่งค่าจะแตกต่างกันไปโดย +2, อีก +1, แล้ว +0, -1 และค่าที่เหลือจะแตกต่างกันไป -2)

ผลผลิตพื้นฐานจะเปลี่ยนจากเกมเป็นเกม

คะแนน:

seer:                10.128 years
level_headed_trader: 8.196 years
introvert:           6.856 years
random_ando:         5.408 years
hoarder_trader:      4.12 years
ratio_trader:        3.532 years
scared_trader:       3.056 years

ดังนั้นหากมี 10 โปรแกรมที่ผู้ใช้ส่งเกมจะมีผู้เล่น / ผู้ค้า 60 (10 ที่ส่ง + 10 x 5 บอท)? นอกจากนี้ฉันไม่คิดว่าคุณจะพูดถึงจำนวนปีสูงสุดที่เกมสามารถเล่นได้ เฉพาะที่จะมี 50 เกมและคะแนนของผู้ค้า / ผู้เล่นสำหรับเกมนั้นจะนานเท่าไหร่
AndoDaan

ไม่บอทของฉันไม่ต่างไปจากที่เหลือ หากมีผู้ใช้ 10 รายส่งจะมี(10 players + 4 my bots)*5ผู้ค้า เกมถูกตั้งค่าดังนั้นจึงเป็นไปไม่ได้ที่เกมจะดำเนินต่อไปตลอดกาล ในที่สุดทุกคนจะตาย
Nathan Merrill

1
@AndoDaan ฉันจะวางเงินรางวัลหลังจากนั้นหนึ่งสัปดาห์ ที่นั่นจะต้องส่ง
นาธานเมอร์ริลล์

1
@AndoDaan ฉันกำลังยุ่งกับหนึ่ง: D
EaterOfCode

1
@BetaDecay มันยากเพราะมีการเคลื่อนไหวที่หลากหลายให้เลือก ผลลัพธ์ที่จะเกิดขึ้นเสมอคือผลผลิตเริ่มต้นสุดท้ายqไม่ว่าคุณจะถูกข้ามไปและหากคุณกำลังซื้อข้อเสนอของผู้ขายและผลิตภัณฑ์ที่ได้รับการยอมรับ ฉันหวังว่าอินพุตจะชัดเจน
Nathan Merrill

คำตอบ:


3

หมอดู

โปรแกรมนี้ทำนายอนาคตและเขาเลือกการซื้อขายที่จะเพิ่มอายุการใช้งานที่คาดหวัง

สิ่งนี้ยังไม่เสร็จสมบูรณ์เพราะเขารู้วิธีซื้อเพียงอย่างเดียว แต่ไม่ขายสินค้าดังนั้นคาดว่าจะมีการอัปเดตในอนาคต ไม่ว่าฉันจะเชื่อว่าเขาจะสามารถแข่งขันได้

$| = 1;
@names = ('A','B','C','D','E');
@counts = (12,12,12,12,12);
%names = ('A',0,'B',1,'C',2,'D',3,'E',4);

sub predict{
 local @a = @_;
 local $minval = 1000;
 local $minloc = 0;
 for(0..~~@a-1){
  if($a[$_]<$minval){
   $minloc = $_;
   $minval = $a[$_]
  }
  $a[$_]-=2;
 }
 if($minval <= 1){return (0,@a)}
 if($minval == 100){return (10000,@a)}
 $a[$minloc] += $productivity[$minloc];
 local @b = predict(@a);
 @b[0]++;
 return @b;
}

sub choice{
 local @a = @_;
 local $minloc = 0;
 local $minval = 1000;
 for(0..~~@a-1){
  if($a[$_]<$minval){
   $minloc = $_;
   $minval = $a[$_]
  }
 }
 return $minloc;
}


$productivity = <>;
@productivity = split(',',$productivity);

#@c = predict(@counts);
#print "@c\n";
$alive = 1;
while($alive){
 for(0..4){
  $counts[$_] -= 2;
 }
 $choice = choice(@counts);
 print "$names[$choice]\n";
 $counts[$choice] += $productivity[$choice];
 for(1..50){
  print "P\n";
  chomp($in = <>);
  if($in eq "T"){
   chomp($forsale = <>);
   ($quantity,$type) = split("-",$forsale);
   $type = $names{$type};
   #print "$quantity, $type\n";
   chomp($in = <>);
   @options = split(",",$in);
   @baseline = predict(@counts);
   $lifespan = shift @baseline;
   $basescore = $lifespan * 1000;
   @bestcounts = @counts;
   for(0..4){
    $basescore -= 10**(-1 * $baseline[$_]);
   }
   #print "Base: $basescore\n";
   @hypo = ();
   $bestscore = $basescore;
   $choice = "X";
   for(0..$#options){$curchoice = $_;
    ($cost,$ctype) = split("-",$options[$curchoice]);
    $ctype = $names{$ctype};
    @tempcounts = @counts;
    $tempcounts[$type] += $quantity;
    $tempcounts[$ctype] -= $cost;
    @curhypo = predict(@tempcounts);
    @hypo[$curchoice] = [@curhypo];
    #print "@curhypo\n";
    $lifespan = shift @curhypo;
    $score = $lifespan * 1000;
    for(0..4){
     $score -= 10**(-1 * $curhypo[$_]);
    }
    #print"$score\n";
    if($score > $bestscore){
     $bestscore = $score;
     $choice = $names[$ctype];
     @bestcounts = @tempcounts;
    }
   }
   print "$choice\n";
   @counts = @bestcounts;
  }
  #print"@counts\n";
  #@c = predict(@counts);
  #print "@c\n";
 }
}

ฉันรันโปรแกรมนี้เช่นนั้น:

perl seer.plx

ฉันทำให้โปรแกรมของคุณทำงานได้ แต่ฉันต้องเพิ่ม$| = 1ตอนเริ่มต้น สำหรับการแก้ไขครั้งต่อไปของคุณโปรดทำเช่นนั้น บอทของคุณก็ทำได้ไม่ดีเช่นกัน หากต้องการดูผลลัพธ์: pastebin.com/yaDprHPq
Nathan Merrill

@NathanMerrill อายุการใช้งานที่สั้นมากเป็นเรื่องที่แปลกประหลาด .... ฉันจะดูตอนนี้
PhiNotPi

4

ผู้ค้าระดับหัว

บอทนี้พยายามทำให้ปริมาณของเขาเท่ากันเท่าที่จะทำได้

command.txt

python leveller.py

leveller.py

import sys

def current_goods():
    print "G"
    return parse_goods(readline())

def parse_goods(good_string):
    return dict([(a, int(b))
                 for a, b in [product.split("-")
                              for product in good_string.split(",")]])

def get_minimum(goods):
    cur_min = 200
    min_good = "X"
    for good, amount in goods.items():
        if amount < cur_min:
            min_good = good
            cur_min = amount
    return min_good

def get_maximum(goods):
    cur_max = -1
    max_good = "X"
    for good, amount in goods.items():
        if amount > cur_max:
            max_good = good
            cur_max = amount
    return max_good

def add_goods(x, y):
    return {k: int(x.get(k, 0)) + int(y.get(k, 0)) for k in set(x) | set(y)}

def readline():
    line = sys.stdin.readline().strip()
    if line == 'Q' or not line:
        exit()
    return line

def output_goods(goods):
    print ",".join([good+"-"+str(amount) for good, amount in goods.items()])

def output_good(good, amount):
    print good+"-"+str(amount)

def current_turn_is(turn):
    print "T"
    return readline() == turn

turns = MARKET, PRODUCE, TRADING, SKIPPED = "M", "P", "T", "S"
market_options = PURCHASE, SELL = "P", "S"
items = APRICOTS, BOARS, CANARIES, DAFFODILS, EARWIGS, NOTHING = "A", "B", "C", "D", "E", "X"

productivity = parse_goods(readline())
while True:
    product_to_produce = get_minimum(current_goods())
    print product_to_produce
    while current_turn_is(MARKET):
        print SELL
        if readline() != SKIPPED:
            maximum = get_maximum(current_goods())
            goods = {"A": 1, "B": 1, "C": 1, "D": 1, "E": 1}
            del goods[maximum]
            output_good(maximum, 1)
            output_goods(goods)

4

ผู้ซื้อขายที่กลัว

ผู้ซื้อขายรายนี้หลีกเลี่ยงการได้รับตัวเลขต่ำ

command.txt

python scared.py

scared.py

import sys

def current_goods():
    print "G"
    return parse_goods(readline())

def parse_goods(good_string):
    return dict([(a, int(b))
                 for a, b in [product.split("-")
                              for product in good_string.split(",")]])

def get_minimum(goods):
    cur_min = 200
    min_good = "X"
    for good, amount in goods.items():
        if amount < cur_min:
            min_good = good
            cur_min = amount
    return min_good

def get_maximum(goods):
    cur_max = -1
    max_good = "X"
    for good, amount in goods.items():
        if amount > cur_max:
            max_good = good
            cur_max = amount
    return max_good

def add_goods(x, y):
    return {k: int(x.get(k, 0)) + int(y.get(k, 0)) for k in set(x) | set(y)}

def readline():
    line = sys.stdin.readline().strip()
    if line == 'Q' or not line:
        exit()
    return line

def output_goods(goods):
    print ",".join([good+"-"+str(amount) for good, amount in goods.items()])

def output_good(good, amount):
    print good+"-"+str(amount)

def current_turn_is(turn):
    print "T"
    return readline() == turn

turns = MARKET, PRODUCE, TRADING, SKIPPED = "M", "P", "T", "S"
market_options = PURCHASE, SELL = "P", "S"
items = APRICOTS, BOARS, CANARIES, DAFFODILS, EARWIGS, NOTHING = "A", "B", "C", "D", "E", "X"

productivity = parse_goods(readline())
while True:
    current = current_goods()
    min_product = get_minimum(current)
    min_amount = current[min_product]
    product_to_produce = min_product if min_amount < 4 else get_minimum(productivity)
    print product_to_produce
    while current_turn_is(MARKET):
        print SELL
        if readline() != SKIPPED:
            current = current_goods()
            maximum = get_maximum(current)
            minimum = get_minimum(current)
            to_offer = {maximum: max(productivity[maximum]/productivity[minimum], 1)}
            output_good(minimum, 1)
            output_goods(goods=to_offer)

3

ผู้ซื้อขาย Hoarder

ผู้ซื้อขายรายนี้พยายามรับผลิตภัณฑ์ให้ได้มากที่สุด

command.txt

python hoarder.py

hoarder.py

import sys

def current_goods():
    print "G"
    return parse_goods(readline())

def parse_goods(good_string):
    try:
        return dict([(a, int(b))
                     for a, b in [product.split("-")
                                  for product in good_string.split(",")]])
    except:
        raise IOError(good_string)

def get_minimum(goods):
    cur_min = 200
    min_good = "X"
    for good, amount in goods.items():
        if amount < cur_min:
            min_good = good
            cur_min = amount
    return min_good

def get_maximum(goods):
    cur_max = -1
    max_good = "X"
    for good, amount in goods.items():
        if amount > cur_max:
            max_good = good
            cur_max = amount
    return max_good

def add_goods(x, y):
    return {k: int(x.get(k, 0)) + int(y.get(k, 0)) for k in set(x) | set(y)}

def readline():
    line = sys.stdin.readline().strip()
    if line == 'Q' or not line:
        exit()
    return line

def output_goods(goods):
    print ",".join([good+"-"+str(amount) for good, amount in goods.items()])

def output_good(good, amount):
    print good+"-"+str(amount)

def current_turn_is(turn):
    print "T"
    return readline() == turn

turns = MARKET, PRODUCE, TRADING, SKIPPED = "M", "P", "T","S"
market_options = PURCHASE, SELL = "P", "S"
items = APRICOTS, BOARS, CANARIES, DAFFODILS, EARWIGS, NOTHING = "A", "B", "C", "D", "E", "X"

productivity = parse_goods(readline())
while True:
    product_to_produce = get_minimum(add_goods(current_goods(), productivity))
    print product_to_produce
    while current_turn_is(MARKET):
        print PURCHASE
        if readline() != SKIPPED:
            offered_good = parse_goods(readline())
            accepted_goods = parse_goods(readline())
            minimum = get_minimum(accepted_goods)
            current = current_goods()
            if minimum not in current or current[minimum] < accepted_goods[minimum]:
                print NOTHING
            elif accepted_goods[minimum] < offered_good.values()[0]:
                print minimum
            elif accepted_goods[minimum] == offered_good.values()[0] \
                    and productivity[minimum] > productivity[offered_good.keys()[0]]:
                print minimum
            else:
                print NOTHING

3

ผู้ซื้อขายอัตราส่วน

บอทนี้นำเสนอผลิตภัณฑ์ที่ตรงกับอัตราส่วนผลผลิตของเขา

command.txt

python ratio.py

ratio.py

import sys

def current_goods():
    print "G"
    return parse_goods(readline())

def parse_goods(good_string):
    return dict([(a, int(b))
                 for a, b in [product.split("-")
                              for product in good_string.split(",")]])

def get_minimum(goods):
    cur_min = 200
    min_good = "X"
    for good, amount in goods.items():
        if amount < cur_min:
            min_good = good
            cur_min = amount
    return min_good

def get_maximum(goods):
    cur_max = -1
    max_good = "X"
    for good, amount in goods.items():
        if amount > cur_max:
            max_good = good
            cur_max = amount
    return max_good

def add_goods(x, y):
    return {k: int(x.get(k, 0)) + int(y.get(k, 0)) for k in set(x) | set(y)}

def readline():
    line = sys.stdin.readline().strip()
    if line == 'Q' or not line:
        exit()
    return line

def output_goods(goods):
    print ",".join([good+"-"+str(amount) for good, amount in goods.items()])

def output_good(good, amount):
    print good+"-"+str(amount)

def current_turn_is(turn):
    print "T"
    return readline() == turn

turns = MARKET, PRODUCE, TRADING, SKIPPED = "M", "P", "T", "S"
market_options = PURCHASE, SELL = "P", "S"
items = APRICOTS, BOARS, CANARIES, DAFFODILS, EARWIGS, NOTHING = "A", "B", "C", "D", "E", "X"

productivity = parse_goods(readline())
while True:
    current = current_goods()
    min_product = get_minimum(current)
    min_amount = current[min_product]
    product_to_produce = min_product if min_amount < 4 else get_minimum(productivity)
    print product_to_produce
    while current_turn_is(MARKET):
        print SELL
        if readline() != SKIPPED:
            current = current_goods()
            maximum = get_maximum(current)
            minimum = get_minimum(current)
            to_offer = {maximum: max(productivity[maximum]/productivity[minimum], 1)}
            output_good(minimum, 1)
            output_goods(goods=to_offer)

3

Family Farmers - Java

เกษตรกรในครอบครัวห้าคนทำอย่างดีที่สุดเพื่อให้ครอบคลุมทุกทางเลือกในการผลิตกับใครก็ตามที่สามารถทำประโยชน์ได้มากที่สุดในหมวดหมู่ใด ๆ ที่ทำงานในหมวดหมู่นั้น อย่างไรก็ตามหลังจากที่ได้รับมอบหมายเริ่มต้นสมาชิกในครอบครัวทุกคนออกมาเอง พวกเขาไม่สมรู้ร่วมคิดหลังจากได้รับมอบหมายเริ่มต้น ฉันอาจได้รับความช่วยเหลือจากพวกเขาขณะซื้อขาย

FamilyFarmers.java

import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.Scanner;

public class FamilyFarmers {
    final int MIN_PRODUCTION_CUTOFF = 4; // If my decision making has ended up
                                            // with a family member producing
                                            // less than this number, he will
                                            // just produce his most productive
                                            // item
    final int NUMBER_PRODUCTS = 5;
    final int MAX_TRADES = 50; // The number of trades per phase
    final byte EOF = 04;
    final byte NEW_LINE = 10;
    final int BILLBOARD_SIZE = 1000;

    boolean alive = true;

    int[] myInventory;

    int myNumber;
    // Primarily, the line this instance of the program will be printing on in
    // the billboard number 0 will be the "boss", and will do a bunch of the
    // calculations (To avoid them being done multiple times)
    MappedByteBuffer familyBillboard;
    String myProduct; // What product (single string character) we will be
                        // making
    Scanner stdin = new Scanner(System.in);

    /**
     * @param args
     *            A string in the form A-#,B-#,C-#,D-#,E-# representing the
     *            productivity of each good.
     * @throws IOException
     * @throws InterruptedException
     * @throws UnexpectedPhaseTokenException
     */
    public static void main(String[] args) throws IOException, InterruptedException {
        new FamilyFarmers();
    }

    public FamilyFarmers() throws IOException, InterruptedException {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                familyBillboard.clear();
                familyBillboard.put(new byte[familyBillboard.limit()]);
                Runtime.getRuntime().halt(0);
            }
        });
        initialSetup();
        mainLoop();
    }

    protected void mainLoop() throws InterruptedException {
        int tradeCounter = 0; // 50 trades per phase
        String currentStage;
        int toTrade = -1;
        int toGet = -1;
        boolean purchase = false;

        while (alive) {
            System.out.println("T");
            currentStage = stdin.nextLine();
            if (currentStage.equals("P")) { // Production period
                System.out.println(myProduct);
                /*
                System.out.println("G");
                String currentInv = stdin.nextLine();
                myInventory = parseProducts(currentInv);
                toTrade = getMostProduct();
                toGet = getLeastProduct();
                */
                tradeCounter = 0;

            } else if (currentStage.equals("M")) { // Market
                System.out.println("G");
                String currentInv = stdin.nextLine();
                myInventory = parseProducts(currentInv);
                tradeCounter++;
                purchase = (Math.random() >= 0.5);
                toTrade = getMostProduct();
                toGet = getLeastProduct();

                // If my goods are fairly even, it's time to head home!
                if (myInventory[toTrade] - myInventory[toGet] <= 2) {
                    System.out.println("L");
                    continue;
                }

                // If I don't have much to trade...
                if (toTrade <= 6) {
                    // But my goods levels are fairly even...
                    if (toGet >= 4) {
                        // I'll just leave the market
                        System.out.println("L");
                    }
                }

                if (purchase) {
                    System.out.println("P");
                } else {
                    System.out.println("S");
                }

            } else if (currentStage.equals("T")) {
                String toSend = "";
                if (purchase) { // Buying
                    boolean finished = false;
                    String offer = stdin.nextLine();
                    offer += "," + stdin.nextLine();
                    String[] offers = parseOffer(offer);
                    int quantityOffered = Integer.parseInt(offers[0].split("-")[0]);
                    int productOffered = offers[0].split("-")[1].charAt(0) - 65;

                    // This loop will probably never get off the first
                    // iteration...
                    // Go through the offers, blindly pick the first one that
                    // looks good.
                    for (int index = 1; index < offers.length && !finished; index++) {
                        int quantityDesired = Integer.parseInt(offers[index].split("-")[0]);
                        int productDesired = offers[index].split("-")[1].charAt(0) - 65;

                        // If the request would leave me with less than two, I'm
                        // not interested
                        if (quantityDesired - (myInventory[productDesired]) > 2) {
                            // Too rich for my blood!
                            continue;
                        }
                        if (productDesired == toGet) {
                            // I'm not interested in trading what I'm trying to
                            // get!
                        }
                        if (productOffered == toGet) {
                            // Since this is what I want to trade for, I'll be
                            // willing to consider different offers than
                            // otherwise

                            if (quantityDesired <= quantityOffered * 1.25
                                    && myInventory[productDesired] - quantityDesired > 4) {
                                System.out.println((char) (productDesired + 65));
                                finished = true;
                            }

                            // If I would otherwise die without the product,
                            // I'll accept a really bad trade
                            // (Remember that the incoming offers are already
                            // sorted least to highest)
                            if (myInventory[toGet] < 2 && tradeCounter > MAX_TRADES / 2) {
                                System.out.println((char) (productDesired + 65));
                                finished = true;
                            }
                        }

                        // If the product is what I'm trying to trade, and the
                        // offer isn't too bad
                        if (productDesired == toTrade && quantityOffered * 1.25 <= quantityDesired) {
                            System.out.println((char) (productDesired + 65));
                            finished = true;
                        }

                        // If I am offered either as much as or more of
                        // something, I'll do it.
                        if (quantityOffered >= quantityDesired) {
                            System.out.println((char) (productDesired + 65));
                            finished = true;
                        }
                    }

                    if (!finished) {
                        // If we get this far, nothing struck my fancy
                        System.out.println("X");
                    }

                } else { // Selling
                    int[] toBuy = getSameProducts(toGet);

                    // Make some self-beneficial offers in the first few rounds.
                    if (tradeCounter <= 5) {
                        toSend = "" + ("2-" + ((char) (toTrade + 65)));
                        for (int index = 0; index < toBuy.length; index++) {
                            toSend += (",3-" + ((char) (toBuy[index] + 65)));
                        }
                    } else {
                        // Basic offer. Just offer 1:1 for what I want.
                        toSend = "" + ("2-" + ((char) (toTrade + 65)));
                        for (int index = 0; index < toBuy.length; index++) {
                            toSend += (",2-" + ((char) (toBuy[index] + 65)));
                        }
                    }

                    // If trading has been going for awhile and I would die the
                    // next turn, I frantically offer everything I have for what
                    // I need to survive one more turn. This is probably a
                    // terrible strategy!
                    if (myInventory[toGet] < 2 && tradeCounter > MAX_TRADES / 2) {
                        toSend += ("4-" + ((char) (toTrade + 65))) + ",2-" + ((char) (toGet + 65));
                    }

                    if (toSend.length() < 6) {
                        // I couldn't find enough to sell...
                        System.out.println(toSend + "," + toSend);
                        // That's safe, right?
                        break;
                    }

                    // Put the products I would accept on a line after the
                    // product I want to sell
                    String[] splitSend = toSend.split(",");
                    toSend = splitSend[0] + "\n";
                    boolean first = true; // Don't prepend a comma on the first string

                    for (int index = 1; index < splitSend.length; index++) {
                        if (!first){
                            toSend += ",";
                        }
                        toSend += splitSend[index];
                        first = false;
                    }

                    System.out.println(toSend);

                }

            } else if (currentStage.equals("S")) { // I was skipped! Darn it!
            } else {
                // AAK! I received a token I don't know what to do with! I must
                // be dead...
                alive = false;
            }
        }
    }

    /**
     * Returns the offers, sorted from least product desired to most, with the
     * product being offered at the first index
     * 
     * @param offer
     * @return String[] index 0 contains the product being offered, the
     *         following indicies are the desired products ordered from least to
     *         most
     */
    protected String[] parseOffer(String offer) {
        String[] splitOffers = offer.split(",");

        // Sort. Just using selection sort. The first index contains the string
        // with the product being asked for,
        // so should not be sorted.
        for (int index = 1; index < splitOffers.length; index++) {
            int indexOfMin = index;
            int minimum = Integer.parseInt(splitOffers[index].split("-")[0]);
            for (int jdex = index + 1; jdex < splitOffers.length; jdex++) {
                int thisValue = Integer.parseInt(splitOffers[jdex].split("-")[0]);
                if (thisValue < minimum) {
                    indexOfMin = jdex;
                    minimum = thisValue;
                }
            }
            String temp = splitOffers[index];
            splitOffers[index] = splitOffers[indexOfMin];
            splitOffers[indexOfMin] = temp;

        }

        return splitOffers;
    }

    /**
     * Returns an array of the indices of the product which I have the same
     * quantity of in myInventory
     * 
     * @param startingIndex
     *            - The index of a value to match
     * @return
     */
    protected int[] getSameProducts(int startingIndex) {
        int[] toReturn = new int[0];

        for (int index = startingIndex + 1; index < myInventory.length; index++) {
            if (myInventory[index] == myInventory[startingIndex]) {
                int[] temp = new int[toReturn.length + 1];
                for (int jdex = 0; jdex < toReturn.length; jdex++) {
                    temp[jdex] = toReturn[jdex];
                }
                temp[temp.length - 1] = index;
                toReturn = temp;
            }
        }

        return toReturn;
    }

    /**
     * Returns the index of the product which I have the least of in myInventory
     * I can't help but feel that this lacks object-oriented design...
     * 
     * @return
     */
    protected int getLeastProduct() {
        int toReturn = 0;

        for (int index = 1; index < myInventory.length; index++) {
            toReturn = myInventory[index] < myInventory[toReturn] ? index : toReturn;
        }

        return toReturn;
    }

    /**
     * Returns the index of the product which I have the most of in myInventory
     * I can't help but feel that this lacks object-oriented design...
     * 
     * @return
     */
    protected int getMostProduct() {
        int toReturn = 0;

        for (int index = 1; index < myInventory.length; index++) {
            toReturn = myInventory[index] > myInventory[toReturn] ? index : toReturn;
        }

        return toReturn;
    }

    /**
     * Returns an int[] containing the productivity of each product in
     * alphabetical order
     * 
     * @param products
     * @return
     */
    protected int[] parseProducts(String products) {
        int[] toReturn;
        // Split the string so that each line of the array has #-P
        String[] lineProductivities = products.split(",");

        // Split each string in the array so that it is just the number
        for (int index = 0; index < lineProductivities.length; index++) {
            lineProductivities[index] = lineProductivities[index].split("-")[0];
        }

        toReturn = new int[lineProductivities.length];

        for (int index = 0; index < lineProductivities.length; index++) {
            toReturn[index] = Integer.parseInt(lineProductivities[index]);
        }

        return toReturn;
    }

    /**
     * Append my productivity string to the family billboard. If the file was
     * empty when I got here (contained no newlines), I am the boss! The boss
     * gives orders.
     * 
     * @throws IOException
     * @throws InterruptedException
     */
    protected void initialSetup() throws IOException, InterruptedException {
        String input;
        myNumber = 0;
        FileChannel familyBillboardFC;
        Path billboardPath = FileSystems.getDefault().getPath("family_billboard.txt");
        FileLock billboardLock;
        byte[] argsByteArray;

        byte currentByte = 0;

        input = stdin.nextLine();

        // Open the file and lock it
        familyBillboardFC = FileChannel.open(billboardPath, StandardOpenOption.WRITE, StandardOpenOption.READ);
        billboardLock = familyBillboardFC.lock();

        // Map the contents of the file to a space in memory
        familyBillboard = familyBillboardFC.map(FileChannel.MapMode.READ_WRITE, 0, BILLBOARD_SIZE);

        // Convert the incoming string into an array of bytes
        argsByteArray = input.getBytes();

        for (int index = 0; index < BILLBOARD_SIZE; index++) {
            currentByte = familyBillboard.get();
            if (currentByte == NEW_LINE) {
                myNumber++;
                familyBillboard.mark();
            }
        }

        if (myNumber == 0) {
            familyBillboard.position(0);
            familyBillboard.mark();
        }
        familyBillboard.reset();

        for (byte b : argsByteArray) {
            familyBillboard.put(b);
        }
        familyBillboard.put(NEW_LINE);
        familyBillboard.put(EOF);

        billboardLock.release();

        Thread.sleep(100); // Give other programs a chance to launch

        // Boss needs to wait for awhile to make sure the others have finished
        // writing...
        // I don't have any idea how to do this in an intelligent fashion. It is
        // *probably* safe to sleep for a few hundred milliseconds, but I'm not
        // certain. Instead, I'll try to take out a new lock. If I succeed
        // twice, the file must be finished!
        int counter = 0;
        while (myNumber == 0) {
            billboardLock = familyBillboardFC.tryLock();
            if (billboardLock != null) {
                billboardLock.release();
                counter++;
            } else {
                counter = 0;
                Thread.sleep(10);
            }
            if (counter >= 2) {
                giveOrders();
                break;
            }
        }

        byte foo = familyBillboard.get();
        // Until the boss has written out the instructions, sleep
        while (foo < 65) {
            Thread.sleep(10);
            familyBillboard.reset();
            foo = familyBillboard.get();
        }

        familyBillboard.reset();
        myProduct = String.valueOf((char) familyBillboard.get());
    } // initialSetup()

    /**
     * Run by the boss. Tries to sort the family so that every product is
     * covered and so that whoever can produce the most of a product is
     * producing it. Writes the character code representing the product to
     * produce to the first character of the relevant line in the family
     * billboard.
     */
    protected void giveOrders() {
        final int MAX_LINE_LENGTH = 24;
        int numberMembers = 0;
        byte currentByte = 0;
        Integer[][] productivities; // Table of member's productivities
        char[] selections; // Who will make what. selections[#] = the production
                            // letter for member #

        familyBillboard.position(0);

        // I have seen the rules to these games change. It's easy for me to
        // accommodate more (or less than) 5 instances now. It may not be easy
        // later
        while (currentByte != EOF) {
            currentByte = familyBillboard.get();
            if (currentByte == NEW_LINE) {
                numberMembers++;
            }
        }
        currentByte = 0;
        familyBillboard.reset();

        selections = new char[numberMembers];

        productivities = new Integer[numberMembers][NUMBER_PRODUCTS];

        for (int index = 0; index < numberMembers; index++) {
            byte[] currentLineBytes = new byte[MAX_LINE_LENGTH];
            String currentLine;

            // Read the next line
            for (int jdex = 0; jdex < currentLineBytes.length; jdex++) {
                currentByte = familyBillboard.get();
                if (currentByte == NEW_LINE) {
                    break;
                }
                currentLineBytes[jdex] = currentByte;
            }
            currentLine = new String(currentLineBytes);
            currentByte = 0;

            int[] lineProductivities = parseProducts(currentLine);

            // Need to iterate to get the int[] to Integer[]
            for (int jdex = 0; jdex < NUMBER_PRODUCTS; jdex++) {
                productivities[index][jdex] = lineProductivities[jdex];
            }

        }

        // If there are at least as many producers as products, select the most
        // productive for each producer. If there are overlaps, move the smaller
        // one to the second most productive and re-check for overlaps. If there
        // are overlaps and the productivity is tied, compare the second highest
        // and so on.
        // TODO What if members > 5?
        if (numberMembers <= NUMBER_PRODUCTS) {
            int[] overlapResult;
            for (int index = 0; index < selections.length; index++) {
                selections[index] = (char) (maxInArray(productivities[index]) + 65);
                // Can convert from a max value in productivities to a
                // human-readable character by adding 65, since 0 -> A, 1 -> B,
                // etc.
            }

            int counter = 0; // I imagine there is a possibility of this loop
                                // not terminating. I will use this counter to
                                // forcefully break it.

            // While there is an overlap
            while ((overlapResult = arrayHasOverlaps(selections)) != null && overlapResult[0] != -1) {
                byte productIndex = (byte) (selections[overlapResult[0]] - 65);
                // 0 through the number of production options, where A = 0, B =
                // 1, etc.
                if (productivities[overlapResult[0]][productIndex] > productivities[overlapResult[1]][productIndex]) {
                    int index = findNextHighestFromIndex(productivities[overlapResult[1]], productIndex);
                    selections[overlapResult[1]] = (char) (index + 65);
                }
                if (productivities[overlapResult[1]][productIndex] > productivities[overlapResult[0]][productIndex]) {
                    int index = findNextHighestFromIndex(productivities[overlapResult[0]], productIndex);
                    selections[overlapResult[0]] = (char) (index + 65);
                }
                // Things are beginning to get mega hairy
                if (productivities[overlapResult[0]][productIndex] == productivities[overlapResult[1]][productIndex]) {
                    int index0 = findNextHighestFromIndex(productivities[overlapResult[0]], productIndex);
                    int index1 = findNextHighestFromIndex(productivities[overlapResult[1]], productIndex);
                    if (productivities[overlapResult[0]][index0] > productivities[overlapResult[1]][index1]) {
                        selections[overlapResult[0]] = (char) (index0 + 65);
                    } else {
                        // I can't be bothered to go any further with this... If
                        // they're tied here, then to heck with it!
                        selections[overlapResult[1]] = (char) (index1 + 65);
                    }
                }

                counter++;
                if (counter > BILLBOARD_SIZE) {
                    break;
                }
            }
        }

        // Check for less than my minimum cutoff. If one is, set it to its max.
        for (int index = 0; index < selections.length; index++) {
            byte b = (byte) (selections[index] - 65);
            if (productivities[index][b] < MIN_PRODUCTION_CUTOFF) {
                selections[index] = (char) (maxInArray(productivities[index]) + 65);
            }
        }

        // Write the product to produce to the correct line
        familyBillboard.position(0);
        familyBillboard.put((byte) selections[0]);
        // If we find a newline, write the selected character to the next
        // spot. Otherwise, read the next character
        for (int index = 1; index < selections.length;) {
            byte thisByte = familyBillboard.get();
            if (thisByte == NEW_LINE) {
                familyBillboard.put((byte) selections[index]);
                index++;
            }
        }
    }

    /**
     * Look through the array. Find an element that is either later in the array
     * and <= the value at the incoming index and > the value at the toReturn
     * index, or earlier in the array and < the value at the current index and >
     * the value at toReturn. If we weren't able to set the new index (Maybe we
     * are already at the max value) return the index of the largest value
     * 
     * @param array
     *            the array to search in
     * @param incomingIndex
     *            the index of the value to begin searching with
     * @return an index as described
     */
    protected int findNextHighestFromIndex(Integer[] array, int incomingIndex) {
        int toReturn = incomingIndex;
        int comparisonValue = -1; // The value at toReturn
        int index = (incomingIndex + 1) % array.length;

        for (int counter = 0; counter < array.length; counter++) {
            if (index > incomingIndex && array[index] == array[incomingIndex]) {
                // If we have found an equal value later in the array, return
                // immediately. In the unlikely event everything is equal,
                // don't just take the value at the bottom index!
                return index;
            }
            if (index > incomingIndex && array[index] < array[incomingIndex] && array[index] > comparisonValue) {
                toReturn = index;
                comparisonValue = array[toReturn];
            }
            if (index < incomingIndex && array[index] < array[incomingIndex] && array[index] > comparisonValue) {
                toReturn = index;
                comparisonValue = array[toReturn];
            }

            index++;
            index %= array.length; // How often do you get to use %= ?
        }

        if (comparisonValue == -1) {
            // In the unlikely event we weren't able to set comparisonValue
            // (maybe we are already at the minimum?)
            toReturn = maxInArray(array);
            // This will probably contribute to those endless loops I mentioned
            // above!
        }

        return toReturn;
    }

    /**
     * Checks the array for any two elements being the same. If two are, return
     * the indices. If not, return {-1, -1}
     * 
     * @param selections
     *            The array to examine
     * @return Indices of the overlapping elements or {-1, -1}
     */
    protected int[] arrayHasOverlaps(char[] selections) {
        int[] toReturn = new int[] { -1, -1 };
        for (int index = 0; index < selections.length - 1; index++) {
            for (int jdex = index + 1; jdex < selections.length; jdex++) {
                if (selections[index] == selections[jdex]) {
                    toReturn[0] = index;
                    toReturn[1] = jdex;
                    return toReturn;
                }
            }
        }
        return toReturn;
    }

    /**
     * Returns the index of the max value of an array. In the case of a tie,
     * returns the earliest index.
     * 
     * @param array
     *            the array to read
     * @return the index of the largest element in the array
     */
    protected <T extends Comparable<T>> byte maxInArray(T[] array) {
        byte currentMax = 0;
        for (byte index = 0; index < array.length; index++) {
            currentMax = array[index].compareTo(array[currentMax]) > 0 ? index : currentMax;
        }
        return currentMax;
    }
}

command.txt

cd bots/family_farmer && java FamilyFarmers

มันสามารถรวบรวมได้

javac FamilyFarmer.java

ควรมีไฟล์ว่างอีกไฟล์หนึ่งคือ family_billboard.txt ในโฟลเดอร์ bots / family_farmer


หากคุณได้รับ RandomAndo จาก GitHub สถานะปัจจุบันก็ใช้ได้ดีสำหรับฉัน
นาธานเมอร์ริล

นอกจากนี้ยังเป็นไปตามกฎที่บอทของคุณจะทำงานร่วมกับตัวเองได้อย่างแน่นอน อย่างไรก็ตามคุณจะไม่ถูกจับคู่กับพวกเขาตลอดเวลาในระหว่างการซื้อขาย
นาธานเมอร์ริลล์

อืมมม ฉันเพิ่งตรวจสอบล่าสุดและนำบอทของฉันออก การสุ่ม Ando ไม่ทำให้เกิดข้อผิดพลาดอีกต่อไป แต่ฉันไม่ได้เอาท์พุทจากโปรแกรมอย่างใดอย่างหนึ่ง ... ด้วยบอทของฉันอย่างน้อยก็บอกฉันว่ากำลังส่งผลผลิตดั้งเดิมไปยังบอทของฉัน! ฉันรู้ว่า Python 2.6.6 ค่อนข้างเก่า คุณใช้เวอร์ชั่นอะไร
Sompom

2.7.6 ฉันได้รับข้อผิดพลาดจากบอทของคุณคุณต้องส่งสิ่งที่คุณต้องการสร้างก่อนจากนั้น (ในบรรทัดถัดไป) สิ่งที่คุณจะยอมรับ
Nathan Merrill

อา. ความเข้าใจผิดของฉัน มีความสุขการแก้ไข
แฮ็

2

Introvert - Java

บอทนี้เก็บตัวมากมันจะค่อนข้างตายกว่าคุยกับใครก็ได้ในการซื้อขายดังนั้นมันจะออกจากตลาดทันทีหากมี อย่างไรก็ตามมันไม่ต้องการที่จะตายดังนั้นจึงพยายามที่จะรักษาเสบียงของมันให้นานที่สุด

Introvert.java

import java.util.Scanner;

public class Introvert{

    static int[] current = {10,10,10,10,10};
    static int[] potentialProduction = new int[5];
    static boolean alive = true;

    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        String input = s.nextLine();
        String[] inputArray = input.split(",");
        for(int i = 0; i < 5; i++){
            potentialProduction[i] = Integer.parseInt(inputArray[i].replaceAll("\\D+",""));
        }

        while(alive){
            int pos = decideProduction();
            produce(pos);
            System.out.println("L");
            for(int i = 0; i < 5; i++){
                current[i] -= 2;
                if(current[i] < 0)
                    alive = false;
            }
        }
        s.nextLine(); //read final `q` message
    }

    public static int decideProduction(){
        int lowestPotential = 9999;
        int lowestPotentialPosition = 9999;
        for(int i = 0; i < 5; i++){
            if(current[i] == 2 || current[i] == 3){
                lowestPotentialPosition = i;
                break;
            }
            int potential = current[i] + potentialProduction[i];
            if(potential < lowestPotential){
                lowestPotential = potential;
                lowestPotentialPosition = i;
            }
        }
        switch(lowestPotentialPosition){
            case 0: System.out.println("A"); return 0;
            case 1: System.out.println("B"); return 1;
            case 2: System.out.println("C"); return 2;
            case 3: System.out.println("D"); return 3;
            case 4: System.out.println("E"); return 4;
            default: System.out.println("A"); return 0;
        }
    }

    public static void produce(int pos){
        current[pos] += potentialProduction[pos];
    }

}

command.txt

java Introvert

รวบรวมกับ

javac Introvert.java

หมายเหตุ: ฉันทำสิ่งนี้ในช่วงพักเที่ยงและคอมพิวเตอร์ที่ทำงานของฉันไม่มี jdk หรือ python ดังนั้นฉันจึงไม่สามารถทดสอบได้เลย ถ้ามันไม่ทำงานให้ฉันรู้และฉันจะพยายามแก้ไข


Introvert.java:47: ข้อผิดพลาด: ไม่มีข้อความสั่งคืน
Nathan Merrill

@NathanMerrill เพิ่มกรณีเริ่มต้นเพื่อแก้ไขปัญหานั้นและทำการเปลี่ยนแปลงเล็กน้อยอื่น ๆ เพื่อแก้ไขข้อบกพร่องที่ฉันสังเกตเห็น หวังว่าควรทำงานตอนนี้จะติดตั้ง python เพื่อทดสอบในอีกสักครู่
jollywalrus

Introvert.java:18: ไม่สามารถหาสัญลักษณ์รอบ ++;
Nathan Merrill

ตกลงฉันไม่เห็นคุณใช้รอบใดดังนั้นฉันลบมัน ... ไม่ทำงานกับข้อผิดพลาดอื่น .. ไม่แน่ใจว่ามันเป็นความผิดของคุณหรือของฉัน
Nathan Merrill

ตกลง. สิ่งที่กำลังทำงานอยู่ ฉันลบลูปในขณะที่คุณ (จริง) ทั้งหมดและฉันมีโปรแกรมของคุณรับการป้อนข้อมูลในตอนท้ายสุด (เพื่อยอมรับqข้อความของฉัน) รหัสที่แก้ไขของคุณอยู่ใน GitHub (กับโครงการหลัก)
นาธานเมอร์ริลล์

1

สุ่ม Ando

KOTH ทุกคนควรมีบอทสุ่ม รหัสหวังว่ามันจะไม่ทำข้อเสนอที่ไม่ถูกต้อง (เช่นพยายามขายมากกว่าที่มีในสต็อก)

--RandomAndo

math.randomseed(os.time()) math.random()math.random()math.random()

ITEMS = {"A", "B", "C","D", "E"}
MARKETOPTION = {"P", "S"}
MyGoods = {0,0,0,0,0}

local function readline() -- checks for the dying "Q" or just reads line
    local line = io.read("*l")
    if line == "Q" then
        os.exit()
    end

    return line
end

local function getCurrentTurn() -- asks for M,T,P
    print("T")
    return readline()
end

local function getRandom(array) -- returns for a random element in array
    local r=math.random(#array)
    return array[r]
end

local function getRandomMyItems() -- make a list of items I have and return a random one (no more than one of)
    local rgood=math.random(5)
    local amount=1
    while MyGoods[rgood] <= 0 do
        rgood=math.random(5)
    end
    return amount.."-"..ITEMS[rgood]
end

local function parseGoods(goodString) -- specialized to getMyGoods atm
    local goods={0,0,0,0,0}
    local c = 1
    example = "5-A,6-B,3-C,12-D,4-E"
    for good in goodString:gmatch("%d+%p[ABCDE]") do
        goods[c]=goods[c]+good:match("%d+")
        c=c+1
    end

    return goods
end

local function getMyGoods() -- asks for my goods
    print("G")
    local temp = parseGoods(readline())
    for i=1,5 do
        MyGoods[i]=temp[i]
    end
end


productivity = readline() -- doesn't matter

while true==true do

    print(getRandom(ITEMS)) -- produce random item

    while getCurrentTurn()=="M" do
        getMyGoods()

        local action=getRandom(MARKETOPTION) -- make a random market decision
        if action == "S" then -- offer to sell 1 of a random item I  have in stock, will take any 2 offered
            print("S")
            if readline()=="T" then
                print(getRandomMyItems())
                print("2-A,2-B,2-C,2-D,2-E")
            end
        elseif action == "P" then -- if I can do the deal, I will
            print("P")
            if readline()=="T" then
                local offered=readline()
                local accepted =readline()
                local taccepted={}
                for i in accepted:gmatch("%d+%p[ABCDE]") do
                    oitem =i:match("[ABCDE]")
                    oamount = i:match("%d+")
                    for k=1,5 do
                        if ITEMS[k]==oitem and MyGoods[k]>=tonumber(oamount) then
                            table.insert(taccepted, oitem)
                        end
                    end
                    if #taccepted>=1 then
                        print(getRandom(taccepted))
                    else
                        print("X")
                    end
                end
            end
        elseif action == "L" then
            print("L")
        end
    end
end

command.txt ควรเป็น:

lua RandomAndo.lua

command.txt ควรมีลักษณะอย่างไร
Nathan Merrill

@NathanMerrill อ๋อขอโทษเพิ่มไปที่ด้านล่าง
AndoDaan

ฉันพบปัญหาในการใช้งานบอทของคุณจากตัวควบคุม: "ระบบไม่พบไฟล์ที่ระบุ" อย่างไรก็ตามในขณะที่ฉันพยายามที่จะทำงานโปรแกรมของคุณไม่ทำงาน - เมื่อฉันเรียกใช้จากบรรทัดคำสั่งฉันได้รับ: bad argument #1 to 'randomseed' (number expected, got no value)ในบรรทัดที่ 3
นาธานเมอร์ริ

@NathanMerrill เป็นใบ้ความผิดพลาด แก้ไขแล้ว.
AndoDaan

ตกลง. ดูเหมือนว่ารหัสของคุณกำลังทำงานและฉันได้รับการแก้ไขในตอนท้ายของฉัน ... แต่ตอนนี้ฉันไม่ได้รับผลลัพธ์จากโปรแกรมของคุณ (อาจจะไม่ได้รับผลลัพธ์ของฉันฉันไม่แน่ใจ) ยังไงก็ตามฉัน จะพยายามแก้ไขพรุ่งนี้ฉันต้องนอน
Nathan Merrill
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.