ডলার বিল নিলাম


32

গেম তত্ত্বে ডলারের বিল নিলাম গেমের জন্য এটি একটি KOTH চ্যালেঞ্জ । এটিতে, একটি ডলার সর্বোচ্চ দরদাতাকে বিক্রি করা হচ্ছে। বিডগুলি 5% ইনক্রিমেন্টে বৃদ্ধি পায় এবং হারা লোকেরা তাদের বিডও প্রদান করে। ধারণাটি হ'ল উভয় খেলোয়াড়ই লোকসানের ক্ষতি হ্রাস করার জন্য বিডিং যুদ্ধকে ডলারের মূল্য ছাড়িয়ে আরও বাড়িয়ে তোলেন।

আসুন আশা করি আপনার বটগুলি তার চেয়ে বেশি স্মার্ট।

আপনি net.ramenchef.dollarauction.DollarBidderক্লাসটি বাড়িয়ে এই গেমটি খেলতে বট তৈরি করবেন । আপনাকে অবশ্যই সেই nextBidপদ্ধতিটি প্রয়োগ করতে হবে যা আপনার বটের পরবর্তী বিডকে অন্য বটের আগের বিড দেয় returns যদি প্রয়োজন newAuctionহয় তবে প্রতিপক্ষের বটের ক্লাসের সাথে প্রতিটি নিলামের জন্য পুনরায় সেট করতে আপনি পদ্ধতিটিও ব্যবহার করতে পারেন ।

public abstract class DollarBidder {
    /**
     * Used by the runner to keep track of scores.
     */
    long score = 0;

    /**
     * (Optional) Prepare for the next auction.
     *
     * @param opponent The class of the opponent's bot.
     */
    public void newAuction(Class<? extends DollarBidder> opponent) {}

    /**
     * Bid on the dollar. Bidding ends if the bid is
     * not enough to top the previous bid or both bids
     * exceed $100.
     *
     * @param opponentsBid How much money, in cents,
     *  that the opponent bid in the previous round. If
     *  this is the first round in the auction, it will
     *  be 0.
     * @return How much money to bid in this round, in
     *  cents.
     */
    public abstract int nextBid(int opponentsBid);
}

নিম্নলিখিতগুলির মধ্যে একটি না হওয়া পর্যন্ত বিডিং চলে না:

  • nextBidএকটি ব্যতিক্রম নিক্ষেপ যদি এটি ঘটে থাকে তবে যে বট ব্যতিক্রম ছুঁড়েছে তারা তাদের পূর্বের বিড প্রদান করে এবং অন্য বটটি বিনামূল্যে ডলার পেয়ে যায় dollar
  • হয় বট আগের বিড শীর্ষে দেওয়ার জন্য যথেষ্ট পরিমাণে অর্থ প্রদান করে না। যদি এটি হয়, উভয় বট তাদের বিড প্রদান করে (হারা লোক তাদের পূর্বের বিড প্রদান করে) এবং বিজয়ী একটি ডলার পান।
  • উভয় বটই ১০০০ ডলারের বেশি বিড করে। যদি এটি হয় তবে উভয় বটই $ 100 প্রদান করে এবং বট উভয়ই ডলার পায় না।

বটগুলির প্রতিটি সংমিশ্রনের জন্য 2 নিলাম অনুষ্ঠিত হয়। সমস্ত নিলামে তারা যে মোট লাভ করেছে তাতে বটস স্কোর হয়। সর্বোচ্চ স্কোর জয়।

উদাহরণ

GreedyBot

import net.ramenchef.dollarauction.DollarBidder;

public class GreedyBot extends DollarBidder {
    @Override
    public int nextBid(int opponentsBid) {
        return opponentsBid + 5;
    }
}

OnlyWinningMove

import net.ramenchef.dollarauction.DollarBidder;

public class OnlyWinningMove extends DollarBidder {
    @Override
    public int nextBid(int opponentsBid) {
        return 0;
    }
}

AnalystBot

বিশ্লেষণাত্মক-মনের বটগুলির জন্য এটি একটি টেম্পলেট হিসাবে ব্যবহার করবেন না; ImprovedAnalystBotপরিবর্তে ব্যবহার করুন।

import net.ramenchef.dollarauction.DollarBidder;

// yes, this is a poor implementation, but I'm not
// going to waste my time perfecting it
public class AnalystBot extends DollarBidder {
    private DollarBidder enemy;

    @Override
    public void newAuction(Class<? extends DollarBidder> opponent) {
        try {
            enemy = opponent.newInstance();
            enemy.newAuction(this.getClass());
        } catch (ReflectiveOperationException e) {
            enemy = null;
        }
    }

    @Override
    public int nextBid(int opponentsBid) {
        if (enemy == null)
            return 0;

        return enemy.nextBid(95) >= 100 ? 0 : 95;
    }
}

AnalystKiller

import net.ramenchef.dollarauction.DollarBidder;

public class AnalystKiller extends DollarBidder {
    private static int instances = 0;
    private final boolean tainted;

    public AnalystKiller() {
        this.tainted = instances++ != 0;
    }

    @Override
    public int nextBid(int opponentsBid) {
        if (tainted)
            throw new RuntimeException("A mysterious error occurred! >:)");

        return 0;
    }
}

অতিরিক্ত বিধি

  • স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ।
  • অন্যান্য বটগুলিকে সাবটেক্ট করার অনুমতি দেওয়া হয়েছে, তবে ক্ষেত্র / পদ্ধতির দৃশ্যমানতার পরিবর্তনের চেষ্টা করার ফলে রহস্যজনক ফলাফল আসবে SecurityException। একটি ব্যতিক্রম অন্য বটকে 500 মিমি সীমা ভেঙে ফেলছে।
  • বट्स DollarBidderক্লাস বাড়ানো ছাড়া রানার প্যাকেজ অ্যাক্সেস করতে পারে না ।
  • সমস্ত পদ্ধতি 500ms বা তারও কম সময়ে ফিরে আসা উচিত।
  • বটগুলি ডিটারমিনিস্টিক হওয়ার দরকার নেই।
  • আপনার বিড করে না 5 গুণ হতে ¢ প্রয়োজন।
  • $ 1 = 100 ¢
  • ফলাফল 24 এপ্রিল, 2018 এ পোস্ট করা হবে।

গিটহাবের রানার

ফলাফল

এখানে পৃথক রাউন্ড দেখুন।

MTargetedBot: $14.30
BuzzardBot: $9.83
BluffBot: $9.40
RiskRewardBot: $9.35
SecretBot: $8.50
LuckyDiceBot: $7.28
CounterBot: $6.05
MBot: $5.40
StackTraceObfuscaterBot: $5.20
EvilBot: $4.80
MarginalBot: $4.60
TargetValueBot: $4.59
InflationBot: $4.27
UpTo200: $4.20
InsiderTradingBot: $1.90
MimicBot: $1.50
BorkBorkBot: $1.22
DeterrentBot: $0.95
MarginalerBot: $0.00
RandBot: $-4.45
BreakEvenAsap: $-7.00
AnalystOptimizer: $-13.95
DeterredBot: $-1997.06
ScoreOverflowBot: $-21474844.15
MirrorBot: $-21475836.25

MTargetedBot14.30 ডলার লাভের সাথে অভিনন্দন !


11
এই চ্যালেঞ্জটি মূলত ওয়ান-আপিংয়ের পক্ষে দুর্বল। যেহেতু আমি আমার প্রতিপক্ষের শ্রেণি জানি, তাই এর বিরুদ্ধে সেরা কৌশলটি বেছে নেওয়া সহজ। (তারপরে কেউ আসেন, এবং আমার বটটি
নাথান মেরিল

2
" বিডগুলি 5 incre এর ইনক্রিমেন্টে বৃদ্ধি পায় "। এটি কার্যকর করার জন্য আপনার কোডে আপনার কিছু নেই, যদিও .. LuckyDiceBotউদাহরণস্বরূপ 2-12এলোমেলোভাবে ইনক্রিমেন্টে বিড করুন ..
কেভিন ক্রুইজসেন

4
এছাড়াও: আমার বট যদি অন্যান্য বটগুলি 500 মিমি বাধা ছাড়িয়ে যায়?
নাথান মেরিল

4
@ র্যামেনচেফ আমরা এখানে দূষিত কোড সম্পর্কে কথা বলছি। যদি আমি সনাক্ত করি যে অন্য বট আমাকে কল করছে এবং থ্রেড.স্লিপ (1000) কল করবে?
নাথান মেরিল

3
কোনটি নাশকতা অনুমোদিত এবং কোনটি নয় তা পরিষ্কার না হওয়ায় আমি এটি ভিটিসি। ওপিতে "রানার আক্রমণ করা" (যা অস্পষ্ট) এর জমাগুলি অস্বীকার করেছে, এবং দূষিত কোড অনুমোদিত নয় এবং দূষিত কোডের মধ্যে কোনও স্পষ্ট লাইন নেই (কোন বটটি বটকে খুব বেশি সময় নিয়েছিল তা আপনি কীভাবে নির্ধারণ করবেন? ?)
নাথান মেরিল

উত্তর:


2

MTargetedBot

public class MTargetedBot extends MBot {

    @Override
    protected int calcBid(int opponentsBid, boolean isPeeking, boolean isSubPeeking) {
        Class c = this.rivalClass;

        switch (c.getSimpleName()) {
            case "AnalystBot":
                if (isPeeking && !isSubPeeking) {
                    throw new RuntimeException();
                } else if (isPeeking) {
                    return 66666;
                }
                break;
            case "MirrorBot":
                if (isPeeking && !isSubPeeking) {
                    throw new RuntimeException();
                } else if (isPeeking) {
                    return 0;
                }
                break;
            case "GreedyBot":
            case "LuckyDiceBot":
            case "InflationBot":
            case "TargetValueBot":
                // not playing with ya
                return 0;
            case "MimicBot":
            case "BuzzardBot":
            case "MarginalBot":
            case "MarginalerBot":
            case "BluffBot":
            case "MBot":
                // go away, gimme easy money
                return isPeeking ? 66666 : 5;
            case "RandBot":
                // me or noone
                return 100;
            case "SecretBot":
                return 10;
            case "AnalystKiller":
            case "OnlyWinningMove":
            case "EvilBot":
            case "StackTraceObfuscaterBot":
                // easy
                return opponentsBid + 5;
        }

        return super.calcBid(opponentsBid, isPeeking, isSubPeeking);
    }
}
  • আপডেট এমবিট উপর ভিত্তি করে
  • কাউন্টারবোটের মতো অনুরূপ পদ্ধতি ব্যবহার করে তবে কয়েকটি পদ্ধতির সাথে এর বিরোধীদের কয়েকটিকে কঠোরভাবে সংশোধন করা হয়েছে, আরও পাঠযোগ্য
  • অজানা প্রতিপক্ষের এমবিোট স্ট্র্যাটে ডিফল্ট

1
এটি ন্যায্য নয়।
জোশুয়া

@ জোশুয়া আপনার মতে এই সমাধান সম্পর্কে বিশেষত কোনটি উপযুক্ত নয়?
ম্লেকো

আপনার বিরোধীদের নাম জেনে রাখা।
জোশুয়া

@ জোশুয়া অর্ধেক সমাধান এই তথ্য ব্যবহার করে। আমরা এমনকি লেখককে লিখেছি যে এটি পরিবর্তন করা উচিত বা ওয়ান-আপিং ঘটবে, তিনি চ্যালেঞ্জ পরিবর্তন করতে অস্বীকার করেছেন - সুতরাং এখানে
ম্লেকো

1
ইতিমধ্যে করেছে ....
জোশুয়া

15

MimicBot

import net.ramenchef.dollarauction.DollarBidder;

import java.util.Set;
import java.util.HashSet;

public class MimicBot extends AbstractAnalystCounterBot {

    private final Set<Class<? extends DollarBidder>> bidders = new HashSet<>();
    private DollarBidder reference = null;

    // A benchmark class. Not MarginalBot because of proposed rule changes.
    public static class BidFive extends DollarBidder {
        public int nextBid(int o) {
            return 5;
        }
    }


    public MimicBot() {
        bidders.add(OnlyWinningMove.class);
        bidders.add(GreedyBot.class);
        bidders.add(BidFive.class);
    }


    @Override
    public void newAuction(Class<? extends DollarBidder> opponent) {
        DollarBidder enemy;
        reference = null;
        try {
            enemy = opponent.newInstance();
        } catch (Throwable t) {
            return;
        }

        if (!bidders.contains(opponent))
            bidders.add(opponent);

        Class<? extends DollarBidder> leader = OnlyWinningMove.class;
        int best = 0;

        for (Class<? extends DollarBidder> audition : bidders) {
            try {
                enemy.newAuction(MimicBot.class);
            } catch (Throwable t) {
                reference = new GreedyBot(); // Deterrence.
                break;
            }

            DollarBidder tryout;
            try {
                tryout = audition.newInstance();
                tryout.newAuction(opponent);
            } catch (Throwable t) {
                continue;
            }

            int tryoutScore = -100000;
            /* This code was copy-pasted from the *
             * runner, with significant changes. */
            int bid1 = 0, bid2 = 0;
            while (true) {
                int next;
                try {
                    next = enemy.nextBid(bid2);
                } catch (Throwable t) {
                    tryoutScore = 100;
                    break;
                }
                if (next < bid2 + 5) {
                    if (bid2 > 0) {
                        tryoutScore = 100 - bid1;
                    }
                    break;
                }
                if (next > 10000 && bid2 > 10000) {
                    tryoutScore = -10000;
                    break;
                }
                bid1 = next;

                try {
                    next = tryout.nextBid(bid1);
                } catch (Throwable t) {
                    tryoutScore = -bid2;
                    break;
                }
                if (next < bid1 + 5) {
                    tryoutScore = -bid2;
                    break;
                }
                if (next > 10000 && bid1 > 10000) {
                    tryoutScore = -10000;
                    break;
                }
                bid2 = next;
            }
            /* End of copy-pasted code. */

            if (tryoutScore > best) {
                best = tryoutScore;
                leader = audition;
            }
        }

        try {
            reference = leader.newInstance();
        } catch (Throwable t) {
            reference = new OnlyWinningMove();
        }
        reference.newAuction(opponent);
    }


    @Override
    public int nextBid(int opponentsBid) {
        try {
            return reference.nextBid(opponentsBid);
        } catch (Throwable t) {
            return 5;
        }
    }
}

পবিত্র গরু। আমি এটি লিখতে সহজ হবে বলে প্রত্যাশা করেছি, তারপরে পরবর্তী সময়ে এটিতে 3 ঘন্টা ব্যয় করা হয়েছে।

সংক্ষেপে, MimicBotউপলব্ধ বটগুলির একটি চলমান তালিকা রাখে। যখন এটি একটি নতুন নিলামে যায়, এটি বর্তমান প্রতিপক্ষের বিরুদ্ধে সবচেয়ে কার্যকর কোনওটির সন্ধানে তালিকার মধ্য দিয়ে চলে। এরপরে এটি সেই বটকে নিলামে "রেফারেন্স" হিসাবে ব্যবহার করে।

পরীক্ষার উদ্দেশ্যে, সাবমিশনের একটি এলোমেলো উপসেট বা সম্পূর্ণ সেটটি ব্যবহার করা ভাল। এটা তোলে দিয়ে শুরু হয় GreedyBot, MimicBot, এবং আরও একটি বট যে শুধু বিড 5 ¢।


11

InsiderTradingBot

@ স্টিফেনলিপিকের উত্তরের চেতনায় ইনসাইডার ট্রেডিংবট তার সমস্ত বিরোধীদের জানেন এবং তাদের কৌশলগুলি বুঝতে পারেন। আপনার পদক্ষেপ, স্টিফেন।

import net.ramenchef.dollarauction.DollarBidder;

public class InsiderTradingBot extends DollarBidder {
  private static boolean analystNutcracker = false;
  private int bid;

  @Override
  public void newAuction(Class<? extends DollarBidder> opponent) {
    if (opponent.equals(DeterredBot.class) ||
        opponent.equals(OnlyWinningMove.class) ||
        opponent.equals(MirrorBot.class)) {
      // I can do this ^.^
      bid = 5;
    } else if (opponent.equals(AnalystKiller.class)) {
      // Outbid 'em >:D
      bid = 10;
    } else if (opponent.equals(BreakEvenAsap.class) ||
               opponent.equals(BorkBorkBot.class) ||
               opponent.equals(DeterrentBot.class)) {
      // Break even quicker!
      bid = 100;
    } else if (opponent.equals(InsiderTradingBot.class)) {
      // I'm probably a simulation inside MirrorBot
      bid = 0;
    } else if (opponent.equals(Analyst.class)) {
      // Let's fight the Analyst with the power of global variables
      bid = 100;
      analystNutcracker = true;
    } else {
      // Welp
      bid = 0;
    }
  }

  @Override
  public int nextBid(int opponentsBid) {
    if ((opponentsBid == 95) && analystNutcracker) {
      analystNutcracker = false;
      return 0;
    }
    return bid;
  }

};

1
না, RichJerkবোট যদি আপনার বটের জন্য একটি নির্দিষ্ট ব্যতিক্রম করে এবং এর জন্য $ 0 বিড করে তবে ইনসাইডার ট্রেডিং হবে ।
নিসা

অন্যান্য উত্তরের বিরুদ্ধে অপ্টিমাইজ করা খুব তাড়াতাড়ি। এছাড়াও, এটি AnalystBotনা Analyst
রমেন শেফ

8
সম্ভবত একটি নিয়ম থাকা দরকার "শ্রেণীর নামগুলি এলোমেলো করা হবে"।
ব্যবহারকারী 202729

1
@ user202729 কীভাবে "ক্লাসে সরাসরি উল্লেখ নেই"?
রামনেন শেফ

1
আমি এই হ্যান্ডেলটি মিমিকবট দেখতে চাই।
নিসা

8

MirrorBot

শত্রুটিকে নিজের বিরুদ্ধে খেলায় তোলে।

import net.ramenchef.dollarauction.DollarBidder;

public class MirrorBot extends DollarBidder{

    private DollarBidder enemy;

    @Override
    public void newAuction(Class<? extends DollarBidder> opponent) {
        try {
            enemy = opponent.newInstance();
            enemy.newAuction(this.getClass());
        } catch (ReflectiveOperationException e) {
            enemy = null;
        }
    }

    @Override
    public int nextBid(int opponentsBid){
        if (enemy == null)
            return (opponentsBid >= 95) ? 0 : (opponentsBid + 5);
        try {
            return enemy.nextBid(opponentsBid);
        } catch (Throwable e) {
            System.out.println("haha no");
            return (opponentsBid >= 95) ? 0 : (opponentsBid + 5);
        }
    }
}

6
আপনি Analystদর্শনীয়ভাবে nuked ।
সিলভিও মায়োলো

@ সিলভিওমায়লো কীভাবে?
dkudriavtsev

মিরর বিশ্লেষককে নিজের বিরুদ্ধে খেলতে অনুকরণ করার চেষ্টা করে, ফলস্বরূপ স্ট্যাকের ওভারফ্লো।
সিলভিও মায়োলো

8

সম্পাদনা : ডলারবিডার শ্রেণিতে লক্ষ্যবস্তু পরিবর্তনগুলি এই বটকে ভেঙে দিয়েছে।

ScoreOverflowBot

import net.ramenchef.dollarauction.DollarBidder;

public class ScoreOverflowBot extends DollarBidder {
  boolean betBig = true;

  @Override
  public int nextBid(int opponentsBid) {
    if(betBig)
    {
      betBig = false;
      return 2147483645;
    }
    else
      return 105;
  }
}

নিলামের পরে, এর স্কোর হবে -2147483645 তবে পরের বার এটি 5 ¢ বা 105 lose হারাবে স্কোরকে ইতিবাচক এবং খুব বড় করে তুলবে। অন্য সমস্ত ক্ষতির পরিমাণ তখন নগণ্য হবে।

প্রথম নিলামে, এটি লোডিবটকে -2147483646 বাজি তৈরি করবে যা 5 দ্বারা বিভাজ্য নয়।


scoreপ্যাকেজ-সুরক্ষিত। আপনার বটগুলি এটি অ্যাক্সেস করতে পারে না।
রামনেন শেফ

@ র‌্যামেন শেফ উফস, চিটিংবট
শীতকালীন

"রানার আক্রমণ করা" এর বিরুদ্ধে কোনও নিয়ম নেই, কেবল এটি "অ্যাক্সেস" করা, যা এটি করে না। আমি বাগটি ঠিক করার পরামর্শ দিচ্ছি যা সমস্যার সমাধান করে :)
নাথান মেরিল

7

TargetValueBot

import java.util.Random;
import net.ramenchef.dollarauction.DollarBidder;

public class TargetValueBot extends DollarBidder {
    private int target;

    @Override
    public void newAuction(Class<? extends DollarBidder> opponent) {
        Random rand = new Random();
        target = 100;
        for (int i = 0; i < 20; i++) {
            target += rand.nextInt(2) * 10 - 5;
        }
    }

    @Override
    public int nextBid(int opponentsBid) {
        if (opponentsBid >= target) {
            return 0;
        } else {
            return opponentsBid + 5;
        }
    }
}

এই মুহুর্তে এটি পরীক্ষা করতে পারে না, তাই দয়া করে এটি ভেঙে গেছে কিনা আমাকে জানান।

মূলত, ডলারের জন্য একটি মান বাছাই করুন এবং প্রতিপক্ষকে ছাড়িয়ে দিন যতক্ষণ না আমরা এই মানটি অতিক্রম করি।


7

MarginalBot

import net.ramenchef.dollarauction.DollarBidder;

public class MarginalBot extends DollarBidder {
    private DollarBidder rival;

    @Override
    public void newAuction(Class<? extends DollarBidder> opponent) {
        try {
            rival = opponent.newInstance();
            rival.newAuction(this.getClass());
        } catch (Throwable t) {
            try {
                rival = opponent.newInstance();
                rival.newAuction(null);
            } catch (Throwable h) {
                rival = null;
            }
        }
    }

    @Override
    public int nextBid(int opponentsBid) {
        if (opponentsBid == 0) {
            try {
                if (rival.nextBid(5) < 10) {
                    return 5;
                }
            } catch (Throwable t) {
                //do nothing.
            }
        }
        return 0;
    }
}

খুব সহজ, এটি নির্ধারণ করার চেষ্টা করে যে কোনও প্রতিপক্ষ ন্যূনতম বিডে প্রতিদ্বন্দ্বিতা করবে এবং যদি তা না করে থাকে।

MarginalerBot

import net.ramenchef.dollarauction.DollarBidder;

public class MarginalerBot extends DollarBidder {
    private DollarBidder rival;
    private int bidCount;

    @Override
    public void newAuction(Class<? extends DollarBidder> opponent) {
        bidCount = 0;

        try {
            rival = opponent.newInstance();
            rival.newAuction(this.getClass());
        } catch (Throwable t) {
            try {
                rival = opponent.newInstance();
                rival.newAuction(null);
            } catch (Throwable h) {
                rival = null;
            }
        }
    }

    @Override
    public int nextBid(int opponentsBid) {
        bidCount += 1;

        for (int iBid = opponentsBid + 5; iBid < 100; iBid = iBid + 5) {
            if (bidCount > 0) {
                break;
            }

            try {
                if (rival.nextBid(iBid) < iBid + 5) {
                    return iBid;
                }
            } catch (Throwable t) {
                //do nothing.
            }
        }
        return 0;
    }
}

মার্জিনালবটের একটি নতুন, স্মার্ট সংস্করণ যা কেবলমাত্র সর্বনিম্নের সাথে জয়ের আশা না করে প্রতিযোগিতা ছাড়াই কোনও অর্থোপার্জনী পদক্ষেপ নিতে পারে কিনা তা পরীক্ষা করে দেখুন।

যেহেতু এটি আমার পূর্ববর্তী বোটের মতো একই পরিবারে, তবে এটিকে হারাতে চেষ্টা করার দিকগুলি বিবেচনা করার কারণে, আমি একই পোস্টে একটি নতুন এন্ট্রি এটি উপস্থাপনের সবচেয়ে যুক্তিসঙ্গত উপায় বলে মনে করি।

সম্পাদনা 1: অন্যান্য বিশ্লেষক-ধরণের বটের বিরুদ্ধে অপ্টিমাইজ করতে নতুন নিলাম পদ্ধতিতে একটি ছোট পরিবর্তন করেছেন।

সম্পাদনা 2: লুক্কায়িত বা অ-নিরস্তক কৌশলগুলির বিরুদ্ধে ক্ষয় হ্রাস করতে মার্জিনালারবোটে একটি পরিবর্তন করুন।


পিপিসিজিতে আপনাকে স্বাগতম!
মার্টিন ইন্ডার

1
এটি সহজ, তবে এটি অন্যান্য বটগুলিকে মোটামুটি বড় ব্যবধানে পরাজিত করে!
রামনেন শেফ

6

BorkBorkBot

import net.ramenchef.dollarauction.DollarBidder;

public class BorkBorkBot extends DollarBidder{
  @Override
  public int nextBid(int opponentsBid){
    return (opponentsBid >= 95) ? 0 : (opponentsBid + 5);
  }
}

এমনকি যদি এটি ভাঙ্গতে না পারে তবে ছেড়ে দেয়।


6

RandBot

import net.ramenchef.dollarauction.DollarBidder;
import java.util.concurrent.ThreadLocalRandom;

public class RandBot extends DollarBidder {

    @Override
    public int nextBid(int opponentsBid) {
        return ThreadLocalRandom.current().nextInt(21) * 5;
    }
}

এটা করা ছিল।


" বিডগুলি 5 incre এর ইনক্রিমেন্টে বৃদ্ধি পায় "। আপনার বট বর্তমানে এটি করছে না।
কেভিন ক্রুইজসেন 12

1
@ কেভিন ক্রুজসেন ফেয়ার যথেষ্ট। আমি ওপরের সীমাটিও পরিবর্তন করেছিলাম যাতে এটি পুরো 1
নীল

6

DeterrentBot

import net.ramenchef.dollarauction.DollarBidder;

public class DeterrentBot extends DollarBidder {
    @Override
    public int nextBid(int opponentsBid) {
        return opponentsBid > 5 ? 100 : opponentsBid + 5;
    }
}

বিশ্লেষণাত্মক মনের কোনও বটকে বোঝানোর চেষ্টা যে একমাত্র বিজয়ী পদক্ষেপটি খেলতে হয় না।


1
আমি লক্ষ্য করেছি যে আমার কিছুটা ক্রিপ্টিক মন্তব্য "জোশুয়া? সে আপনি?" মুছে ফেলা হয়েছে. সুতরাং কেবল স্পষ্ট করে বলতে গেলে, এটি ওয়ার ওয়ারের গেমস থেকে একটি বিখ্যাত উক্তিটির একটি উল্লেখ ছিল: "একমাত্র বিজয়ী পদক্ষেপটি না খেলা" । (জোশুয়া ডাব্লুওপিআর এর ডাক নাম being )
আর্নল্ড

5

LuckyDiceBot

লাকিডাইসবট কেবল তার ডাইসকে বিশ্বাস করে। তিনি দুটি ডাইস রোল করেন, বর্তমান দরদাতার মানতে যোগফল যোগ করেন এবং আরও বেশি বিড করেন। যদি প্রতিপক্ষের বিডকে কাটিয়ে উঠতে এটি যথেষ্ট না হয় তবে সে তার ক্ষয়ক্ষতি হ্রাস করে তার পথে চলে যায়।

import net.ramenchef.dollarauction.DollarBidder;
import java.util.Random;

public class LuckyDiceBot extends DollarBidder {
  private Random random;

  public LuckyDiceBot() {
    random = new Random();
  }

  @Override
  public int nextBid(int opponentsBid) {
    int d1 = random.nextInt(6) + 1;
    int d2 = random.nextInt(6) + 1;
    return opponentsBid + d1 + d2;
  }

};

2
কীভাবে এটি তার ক্ষয় হ্রাস করবে বা লোকসান বন্ধ করবে? যদি এটি সর্বদা বিরোধীদের বিডে এর ডাইস রোলটি যুক্ত করে তবে আপনি সর্বদা আরও বিড করুন। এলোমেলোভাবে যথেষ্ট বিশ্লেষণী বট বিভ্রান্ত হতে পারে, আমি ধারণাটি পছন্দ করি।
ফ্রেইহাইট

যদি রোলটি 4 বা তার চেয়ে কম হয় (পরিসংখ্যানগতভাবে অসম্ভব, তবে শেষ পর্যন্ত তা ঘটবে), তবে বিড প্রতিপক্ষকে পরাস্ত করতে অপর্যাপ্ত এবং নিলাম শেষ হবে।
সিলভিও মায়োলো

দুটি জিনিস: ১. @ ফ্রেইহাইটটি সঠিক এবং এই বট যতক্ষণ না উচ্চ পরিমাণে জিতবে ততক্ষণ বিড রাখবে। opponentsBidমধ্যে nextBid(int opponentsBid)ঝুলিতে মোট আপনার প্রতিপক্ষের দূর পর্যন্ত না তার পরের বিড বিড করেছে, আদেশ করুন। ' পদ্ধতির জন্য আরও ভাল শব্দটি হবে raise(পোকার শব্দ হিসাবে) imho। ২. আপনার বট 5 টি ইনক্রিমেন্টে বিট দেয় না তাই নিয়মের একটিটিকে বৈধতা দিচ্ছে। যদি এই সমস্যাগুলি স্থির হয় তবে আমি এখনও ধারণাটি পছন্দ করি, কারণ বিশ্লেষণাত্মক বটগুলি পাল্টা দিতে সক্ষম হবে না এবং তাই আপনি সম্ভবত বেশিরভাগ ক্ষেত্রে জয়ী হবেন।
কেভিন ক্রুইজসেন 12

5

DeterredBot

import net.ramenchef.dollarauction.DollarBidder;

public class DeterredBot extends DollarBidder {
    private int deterrence;
    public void newAuction(Class<? extends DollarBidder> opponent) {
        if (opponent.equals(DeterrentBot.class)) {
            deterrence = 1;
        } else if (opponent.equals(LuckyDiceBot.class)) {
            deterrence = -1;
        } else {
            deterrence = 0;
        }
    }
    @Override
    public int nextBid(int opponentsBid) {
        switch (deterrence) {
        case 0:
            return 0;
        case -1:
            return opponentsBid + 5;
        case 1:
            // Holy shit, the fuzz! Hide the money!
            return 100001;
        }
        throw new RuntimeException("Darn hackers!");
    }
}

ডিটারডবট তার অবৈধ জুয়া খেলা লাকিডাইসবটের সাথে ভাগ্য তৈরি করে। সুতরাং অবশ্যই পুলিশ (ডিটারেন্টবট) এলে তার উপার্জনটি কোনও উপায়ে দ্রুত নিষ্পত্তি করতে হবে, যেমন পরবর্তী নিলামে বিড করা।


4

InflationBot

import net.ramenchef.dollarauction.DollarBidder;

public class InflationBot extends DollarBidder {
    private int target = -5;

    @Override
    public void newAuction(Class<? extends DollarBidder> opponent) {
        target += 5;
    }

    @Override
    public int nextBid(int opponentsBid) {
        if (opponentsBid >= target) {
            return 0;
        } else {
            return opponentsBid + 5;
        }
    }
}

এই মুহুর্তে এটি পরীক্ষা করতে পারে না, তাই দয়া করে এটি ভেঙে গেছে কিনা আমাকে জানান।

প্রতিটি রাউন্ডে, ডলারের মূল্য উঠে যায়।


এটি মিররবট, মার্জিনালারবট এবং সম্ভবত মিমিকবটের বিরুদ্ধে দুর্দান্ত হবে।
নিসা

@ স্টেফেনলেপপিক এটি তৈরি করার সময় আমি ভাবছিলাম। এখনও প্রচুর দুর্বলতা রয়েছে।

+1, আমি ধারণাটি পছন্দ করি। হুম, এটি কি উদ্দেশ্য যে আপনার বট 0 টি বিড করে এবং ব্রেক শুরু হয় এমনকি যদি এটি একটি বৃত্তাকার শুরু করে ( opponentsBidতখনও 0 হয়)?
কেভিন ক্রুইজসেন 13

@ কেভিন ক্রুজসেন হ্যাঁ। এটি কেবল প্রথম প্রতিপক্ষের বিরুদ্ধেই ঘটতে পারে। এটির অনুলিপি করা যে কোনও বট 0 থেকে শুরু হবে, সুতরাং এটি তাদের উপর 5c এর বেশি অপচয় করবে না।

4

অ-প্রতিযোগিতামূলক: অ্যাবস্ট্রাক্ট অ্যানালিস্টকৌনটারবট

import net.ramenchef.dollarauction.DollarBidder;

import java.util.Set;
import java.util.HashSet;

public abstract class AbstractAnalystCounterBot extends DollarBidder {

public AbstractAnalystCounterBot() {
    if (isPeeking())
        throw new RuntimeException();
}

    protected boolean isPeeking() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        for (StackTraceElement ste : stackTrace) {
            Class<?> clazz;
            try {
                clazz = Class.forName(ste.getClassName());
            } catch (ClassNotFoundException | SecurityException e) {
                continue;
            }
            if (DollarBidder.class.isAssignableFrom(clazz) && !clazz.isAssignableFrom(this.getClass()))
                return true;
        }
        try {
            return Class.forName(stackTrace[0].getClassName()).getPackage().getName().equals("net.ramenchef.dollarauction");
        } catch (Exception e) {
            return true;
        }
    }
}

এটি একটি সত্য জমা হিসাবে উদ্দেশ্যে না হয়, বরং কিছু boilerplate অন্যদের মত পোষা প্রাণী পালন বট নিরস্ত ব্যবহার করার জন্য MirrorBotএবং MimicBot

যেহেতু এটি ডিফল্ট নির্মাতা, তাই আপনার সাবক্লাসে এটি কল করার দরকার নেই। এটি isPeekingঅন্য একটি বট স্নুপিং করছে কিনা তা নির্ধারণের জন্য একটি পদ্ধতি প্রয়োগ করে ।


4

BreakEvenAsap

import net.ramenchef.dollarauction.DollarBidder;

public class BreakEvenAsap extends DollarBidder{
  @Override
  public int nextBid(int opponentsBid){
    // If the opponent has bid 100 or more: bid 0 to break even and let them win
    return opponentsBid >= 100 ? 0
    // Else: bid 100 to break even (and possibly win)
     : 100;
  }
}

প্রেক্ষাপটে

  • যদি প্রতিপক্ষ শুরু করতে পারে এবং বিড করতে পারে তবে <= 0তারা হেরে যাবে।
  • যদি প্রতিপক্ষ শুরু করে এবং বিড করতে পারে [5,95]: নিজেকে 100 বিড করুন। হয় আপনার প্রতিপক্ষ এখনই থামে, বা মোট ১০০ এর উপরে বিড দেবে, সেক্ষেত্রে আপনি তাদের জয় পেতে এবং এমনকি নিজেকে বিচ্ছিন্ন করতে বিড করা বন্ধ করেন।
  • যদি প্রতিপক্ষ শুরু করতে পারে এবং বিড করতে পারে >= 100: নিজেকে হারাতে বলুন 0 এমনকি বিচ্ছেদ করুন।
  • আপনি যদি শুরু করতে পারেন: 100 এখনই বিড করুন। হয় আপনার প্রতিপক্ষ এখনই থামবে, বা 100 এর উপরে বিড দেবে, এক্ষেত্রে আপনি তাদের জয় পেতে এবং এমনকি নিজেকে বিচ্ছিন্ন করতে বিড করা বন্ধ করুন।

বাহ যে একটি বাগ। এটি বলেছিল যে আমি প্রশ্নটিতে মন্তব্য করছি, তবে এটি এখানেই শেষ হয়েছিল। এটি পুনরুত্পাদন করার একটি উপায় খুঁজে
স্ট্যান স্ট্রাম

@ র্যামেন শেফ টাইপো .. তবে আমি পুরো বটটি পরিবর্তন করেছি। যাইহোক এটির কিছু বাগ ছিল ..
কেভিন ক্রুইজসেন

4
এটি একেবারে অর্থ হারাতে পারে। আপনি যদি 100 টিকে বিড করেন, তবে আপনার প্রতিদ্বন্দ্বী 105 টিকে বিড করে, আপনি 100 কে হারাতে শেষ করেন এবং তারা কেবল 5 হেরে যায়

@ স্মারক আহ অবশ্যই ... সেই অংশটি নিয়ে ভাবেন নি .. হুম .. যা বিষয়গুলিকে আরও আকর্ষণীয় করে তোলে তবে আরও শক্ত করে তোলে। আপাতত বর্ণনাটি সম্পাদনা করবে, তবে বটটি যেমন রয়েছে তেমন ছেড়ে দিন।
কেভিন ক্রুইজসেন

1
আমি মনে করি আপনার অর্থ "হারা" "" আলগা "নয়। হেরে যাওয়া জয়ের বিপরীত। আলগা টাইট বিপরীত।
ক্যাট

3

EvilBot

import java.util.Arrays;

import net.ramenchef.dollarauction.DollarBidder;

public class EvilBot extends DollarBidder {

    @Override
    public int nextBid(int opponentsBid) {
        if (isPeeking()) {
            throw new Error("HaHa!");
        } else {
            return 5;
        }

    }

    private static boolean isPeeking() {
        final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        for (StackTraceElement ste : Arrays.copyOfRange(stackTrace, 3, stackTrace.length)) {
            Class<?> clazz;
            try {
                clazz = Class.forName(ste.getClassName());
            } catch (ClassNotFoundException e) {
                return true;
            }
            if (DollarBidder.class.isAssignableFrom(clazz))
                return true;
        }
        return false;
    }

}

বিশ্লেষকদের বিভ্রান্ত করার জন্য ব্যতিক্রমের পরিবর্তে একটি ত্রুটি ফেলে।


3

BuzzardBot

import java.util.Random;

import net.ramenchef.dollarauction.DollarBidder;

public class BuzzardBot extends DollarBidder {

    private int[] bids = new int[100];
    private int oppFlag = 0;

    public void newAuction(Class<? extends DollarBidder> opponent) {
        oppFlag = 0;
        if(isPeeking()) {
            oppFlag = 3;
            return;
        }
        try {
            DollarBidder enemy = opponent.newInstance();
            enemy.newAuction(this.getClass());
            // a simple (and fallible) determinism check
            int sample = new Random().nextInt(100);
            int a = enemy.nextBid(sample);
            int b = enemy.nextBid(sample);
            int c = enemy.nextBid(sample);
            if ((a - b) * (b - c) != 0) {
                oppFlag = 2;
                return;
            }
            for (int i = 0; i < 100; i++) {
                bids[i] = enemy.nextBid(i);
            }
        } catch (Throwable t) {
            oppFlag = 1;
        }
    }

    @Override
    public int nextBid(int opponentsBid) {
        switch (oppFlag) {
        case 0:
            // assume the opponent's nextBid function depends only on the bid provided, and
            // make the bid that yields the biggest profit possible accordingly
            int best = 0;
            int bid = 0;
            for (int i = 0; i < 100; i++) {
                if (bids[i] < i + 5) {
                    int gain = (i >= opponentsBid + 5) ? 100 - i : -i;
                    if (gain > best) {
                        best = gain;
                        bid = i;
                    }
                }
            }
            return bid;
        case 1:
            // act like BorkBorkBot against anything that tries to foil analysis with an
            // Exception
            return (opponentsBid >= 95) ? 0 : (opponentsBid + 5);
        case 3:
            // bid aggressively against opposing analysts
            return Math.min(opponentsBid + 5, 100);
        case 2:
        default:
            // place an opening bid against something unpredictable, as it might yield 95c
            // profit, and failure has a low cost.
            return (opponentsBid == 0) ? 5 : 0;
        }
    }

    private static boolean isPeeking() {
        final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        for (StackTraceElement ste : Arrays.copyOfRange(stackTrace, 3, stackTrace.length)) {
            Class<?> clazz;
            try {
                clazz = Class.forName(ste.getClassName());
            } catch (ClassNotFoundException e) {
                return true;
            }
            if (DollarBidder.class.isAssignableFrom(clazz))
                return true;
        }
        return false;
    }
}

যে প্রতিপক্ষটির মুখোমুখি হয়েছিল তার মূল্যায়ন করার চেষ্টা করে এবং এটি চিবিয়ে দেওয়ার চেয়ে বেশি কামড় না দেওয়ার বিষয়ে নিশ্চিত হন।


1
পিপিসিজিতে আপনাকে স্বাগতম!
অ্যালিয়ন

3

AnalystOptimizer

import net.ramenchef.dollarauction.DollarBidder;

public class AnalystOptimizer extends DollarBidder{

    private DollarBidder enemy;

    @Override
    public void newAuction(Class<? extends DollarBidder> opponent) {
        try {
            enemy = opponent.newInstance();
            enemy.newAuction(this.getClass());
        } catch (ReflectiveOperationException e) {
            enemy = null;
        }
    }

    @Override
    public int nextBid(int opponentsBid){
        if (enemy == null)
            return (opponentsBid >= 95) ? 0 : (opponentsBid + 5);
        int nb = 0;
        try {
            return enemy.nextBid(95) >= 100 ? 95 : 0;
        } catch (Throwable e) {
            System.out.println("haha no");
            return 95;
        }
    }
}

অন্যান্য বট অংশ থেকে একসাথে cobbled। এটি বিশ্লেষকবট হওয়ার চেষ্টা করে বাজায় এবং যদি ব্যর্থ হয় তবে বোর্কবারকবট হয়ে যায়।

আমি মনে করি না যে এটি ভালভাবে করবে।


জন্য সতর্কতা অবলম্বন করুন AnalystKiller
রামেন শেফ

@ র্যামেন শেফ এএফএআইকে বিশ্লেষক ঘাতক যদি নিজেকে বিশ্লেষণ করে দেখেন তবে কেবল একটি ব্যতিক্রম ছুঁড়ে মারেন। আমি এটি ধরতে পারি
dkudriavtsev

1
আপনার সম্ভবত এটি ধরা উচিত।
রামেন শেফ

@ র‌্যামেন শেফ ধারণা করেন না এটি যদি কাজ করে তবে আমি জাভা করতে পারি না
dkudriavtsev

3

CounterBot

import net.ramenchef.dollarauction.DollarBidder;

public class CounterBot extends DollarBidder {
  private Class<? extends DollarBidder> enemy;

  @Override
  public void newAuction(Class<? extends DollarBidder> opponent){
    this.enemy = opponent;
  }

  @Override
  public int nextBid(int opponentsBid) {
    if(this.enemy.equals(CounterBot.class))
      throw new RuntimeException("Here boy, catch!");

    return this.enemy.equals(DarthVader.class) || 
           this.enemy.equals(MirrorBot.class) || 
           this.enemy.equals(OnlyWinningMove.class) ||
           this.enemy.equals(AnalystKiller.class) || 
           this.enemy.equals(DeterredBot.class) ||
           this.enemy.equals(InsiderTradingBot.class) ||
           this.enemy.equals(RiskRewardBot.class) ||
           this.enemy.equals(ImprovedAnalystBot.class) ?
            5
         : this.enemy.equals(MarginalBot.class) ?
           opponentsBid == 0 ? 5 : 10
         : this.enemy.equals(AnalystBot.class) || 
           this.enemy.equals(AnalystOptimizer.class) ?
            opponentsBid == 95 ? 100 : 5
         : this.enemy.equals(TargetValueBot.class) ?
            opponentsBid < 190 ? opponentsBid + 5 : 200
         : this.enemy.equals(BorkBorkBot.class) ?
            opponentsBid < 90 ? opponentsBid + 5 : 95
         : this.enemy.equals(DeterrentBot.class) ?
            105
         : this.enemy.equals(BreakEvenAsap.class) ?
            opponentsBid == 100 ? 105 : 100
         : this.enemy.equals(LuckyDiceBot.class) ?
            opponentsBid == 0 ? 5 : 0
         : this.enemy.equals(RandBot.class) || 
           this.enemy.equals(UpTo200.class) ||
           this.enemy.equals(SecretBot.class) ||
           this.enemy.equals(BluffBot.class) ||
           this.enemy.equals(EvilBot.class) ?
            opponentsBid + 5
         : this.enemy.equals(MimicBot.class) ? // TODO: Find actual counter
            10
         : this.enemy.equals(MarginalerBot.class) ||
           this.enemy.equals(MBot.class) ||
           this.enemy.equals(StackTraceObfuscaterBot.class) ||
           this.enemy.equals(MSlowBot.class) ?
            opponentsBid < 95 ? 90 : opponentsBid == 95 ? 100 : 95;
         : this.enemy.equals(BuzzardBot.class) ?
            100
         : this.enemy.equals(ScoreOverflowBot.class) ?
            opponentsBid == 105 ? 110 : 0
         : //this.enemy.equals(GreedyBot.class) || 
           //this.enemy.equals(RichJerk.class) ||
           //this.enemy.equals(InflationBot.class) ?
           // TODO: More bots?
            0;
  }
}

কাউন্টার:

  • DarthVaderSecurityExceptionবিডিং শুরুর আগে একটি কারণ তৈরি করে নিজেই কাউন্টার করুন , তবে আমি 5 ক্ষেত্রে বিড করব।
  • AnalystBot এবং AnalystOptimizer আমি উভয়ই আমার উত্তরটির দিকে তাকিয়ে থাকব যখন আমি 95 বলব, যে ক্ষেত্রে আমি আমার 100 বিড প্রদর্শন করব যাতে এটি 95 টিই বিড হয়। আমি যদি শুরু করি তবে আমি 5 টি বিড করব (বা তারা 100 টি শুরু করে থাকলে), সুতরাং তারা 95 সেন্ট হারাবে এবং আমি হয় কেবলমাত্র 5 সেন্ট বাজেটের মাধ্যমে 1 ডলার বিল জিততে পারি বা এমনকি ভঙ্গ করে।
  • MirrorBotআমি এর বিরুদ্ধে যা বলব তা বিড করবে। সুতরাং আমি কেবল 5 টি বিড করব এবং যেটি 95 সেন্টে জিততে শুরু করে, এবং অন্যটি 5 সেন্ট হারায়।
  • MarginalBot আমি যদি 10 এর চেয়ে কম (বা এটি শুরু হয়) বিড করবো তবে 5 টি বিড দেবে, অন্যথায় এটি 0 টি বিড করে দেবে। সুতরাং আমি যদি শুরু করি যখন 5 টি, বা এটি শুরু হওয়ার পরে 10 বলি, আমি 95 বা 90 সেন্ট জিতেছি, এবং তারা হেরেছে 5 সেন্ট।
  • GreedyBot সর্বদা আমার চেয়ে ৫ টি বেশি বিড করুন, সুতরাং এমনকি বিরতিতে কেবল তাদের 0 টি বিড করুন এবং তাদের জয় পেতে দিন
  • OnlyWinningMove এবং AnalystKiller উভয়ই সর্বদা 0 বিড করে, তাই জয়ের জন্য কেবল 5 টি বিড করুন
  • TargetValueBot পরিসীমা মধ্যে বিড হবে [100,200] , সুতরাং তারা ১৯০ না হওয়া পর্যন্ত প্রতিবার আরও পাঁচটি বিড করুন, আমরা ডলার জিতেও ভাঙতে 200 বাড়াতে পারি (এবং কে শুরু করেছেন তার উপর নির্ভর করে তাদের 190 বা 195 হারাতে দিন)
  • BorkBorkBotপরিসীমাতে বিড দেবে [5,95], তাই প্রতিবারের মতো আরও 5 টি বিড করুন। তারা 85 বা 90 এর মধ্যে বিড করার সাথে সাথে (কে শুরু করেছেন তার উপর নির্ভর করে) নিজেকে 95 বলুন। তারা 85 বা 90 সেন্ট হারাবে এবং আপনি 5 সেন্ট মুনাফার জন্য 1 ডলার বিলটি জিতবেন।
  • DeterrentBot তারা শুরু করলে 5 টি বা আমরা শুরু করলে 100 টি বিড দেবে, সুতরাং কেবল 105 টি বিড করুন যাতে তারা 100 টির সাথে পাল্টা দেয়, যার ফলে তাদের 100 টি হ্রাস পায় এবং 1 মার্কিন ডলার বিল জিতে আমাদের কেবল 5 সেন্ট হারাতে পারে।
  • BreakEvenAsap100 এখনই বিড দেবে। সুতরাং যদি তারা তাদের 100 টি বিড দিয়ে শুরু করে থাকে, তবে 95 টি 95 জনের জন্য 105 টি দিয়ে কাউন্টার করুন এবং তাদের 100 টি হারাতে দিন we যদি আমরা কেবলমাত্র 100 টি বিড শুরু করতে পারি তবে আমরা উভয়ই বিচ্ছেদ করি।
  • RichJerk এখনই 10,001 কে বিড দেবে, তাই এমনকি বিরতিতে কেবল 0 টি বিড করুন এবং তাদের 9,901 হারাতে দিন।
  • DeterredBot আমাকে চেনেন না এবং তাই 0 বিড করবেন, তাই জয়ের জন্য কেবল 5 টি বিড করুন।
  • LuckyDiceBotএটি জিত না হওয়া পর্যন্ত বিড চালিয়ে যায়। সুতরাং আমরা যদি শুরু করি, এই আশায় ৫ টি বিড করুন যে তারা ডলার জয়ের জন্য যথাসম্ভব উচ্চ বিড করুন। যদি তারা কেবল বিড শুরু করে থাকে তবে তাদের জয় পেতে এবং এমনকি নিজেকে বিচ্ছেদ করতে।
  • RandBotপরিসীমাটিতে এলোমেলোভাবে বিড দেবে [5,100], সুতরাং এটি বন্ধ না হওয়া পর্যন্ত কেবল আরও 5 টি বিড করুন, সেক্ষেত্রে আপনি 95 সেন্ট জিতেছেন এবং সেগুলি হেরেছে 0-100
  • UpTo200উইন্ডো (নাম হিসাবে বলা হয়) 200 পর্যন্ত বিড। সুতরাং তারা থামানো না হওয়া পর্যন্ত 5 উচ্চতর বিড করুন। আমরা 1 মার্কিন ডলার বিলটি জিতব এবং 105 সেন্টের সর্বমোট ক্ষতি হারাব, তবে তারা 200 সেন্ট হারাবে।
  • InsiderTradingBot আমাকে চেনে না, তাই জয়ের জন্য কেবল মাত্র 5 সেন্টে বিড করুন
  • MimicBotসবচেয়ে কঠিন ছিল। তাদের প্রথম বিডটি শুরু করার সাথে সাথে শুরু করার জন্য 10 টি বিড করুন বা তাদের প্রথম বিডের সাথে লড়াই করুন 5 তারা যদি আমাকে অ্যাক্সেস করতে চেষ্টা করে তবে আমি একটি রানটাইম এক্সেকশন নিক্ষেপ করব (যা তারা এটির ক্ষেত্রে ধরবে যে এটির পরিবর্তে আমি 100 টি বিড করেছিলাম - যদিও এটি ভেঙে যাবে অভ্যন্তরীণ-লুপ)। এটিতে শত্রুদের উপর ভিত্তি করে এটি হ্যাশসেটে ঘটে অন্যরকম জিনিস। আসল কাউন্টার রয়েছে কিনা তা দেখতে আমাকে পুনরায় ঘুরে দেখতে হবে এবং আরও নিবিড়ভাবে দেখতে হবে।
  • RiskRewardBot আমাকে জানে না তাই কেবল 5 টি বিড করবে, এক্ষেত্রে আমি জয়ের জন্য 5 টি বিড করব।
  • MarginalerBotআমি কী বিড করব তার উপর নির্ভর করে 100 পর্যন্ত বিট হবে। যদি আমি শুরু করতে পারি, আমি 90 টিকে বিড করব, তারপরে এটি 95 কে বিড দেবে, তবে আমি 100 টিকে বিড করব তাই এটি 0 টি বিড করবে এবং 95 সেন্ট হারাবে, আমি 1 মার্কিন ডলার বিল জিতেছি এবং এমনকি ব্রেকও করছি। যদি এটি পরিবর্তে শুরু হতে পারে, এটি দেখায় আমি এর বিপরীতে 90 বিড করব, সুতরাং এটি 90 টি নিজেই বিড করে, তারপরে আমি 95 বিড করব তাই এটি 0 বিড করবে এবং 90 সেন্ট হারাবে, আমি 1 ডলার বিলের সাথে 5 শতাংশ লাভের সাথে বিজয়ী হব।
  • BuzzardBotপরিসীমাতে আমার সমস্ত কাউন্টার বিশ্লেষণ করবে [0,100)। আমি যদি এখনই বিড করে থাকি তবে 100এটি ব্যবহার করে oppFlag = 0এবং সম্পূর্ণ 100-মাপের অ্যারেতে 100x এর মান 100 থাকে the স্যুইচটিতে case 0লুপটি [0,100)আবার সীমার মধ্যে i + 5থাকবে এবং যেহেতু সর্বাধিক 104 হবে, যদিbids[i] < i + 5 কখনও সত্য হয় না , সুতরাং এটি বিড 0 হয়।
  • ImprovedAnalystBotসর্বদা থাকবে this.enemy = nullকারণ তার প্রতিপক্ষCounterBot নিজেই নয়। সুতরাং এটি সর্বদা 0 বিড করবে, যা আমি কেবল 5 এর বিডের সাথে পাল্টা দেব।
  • InflationBot এটি শুরু হওয়ার পরেও বিরতিতে 0 কে বিড দেবে, অন্যথায় এটি বিড রাখবে So সুতরাং এখনই বিরতিতে কেবল নিজেকে 0 বলুন এবং তাদের বিজয় পেতে দিন।
  • ScoreOverflowBotInteger.MAX_VALUEতারা যদি শুরু করতে পারে তবে কাছে বিড দেবে , অন্যথায় তারা বিড করবে 105। সুতরাং তারা যদি ১০০ টি মাত্র বিড করে থাকে তবে তারা নিজেরাই 110 টি বিড করুন (তারা 105 টি হারাবে, আমরা 10 হারাব), অন্যথায় তাদের বিজয় পেতে কেবল 0 বিড করুন।
  • MBotএকই MarginalerBot, তবে 'উঁকি দেওয়া' বিরোধীদের বিরুদ্ধে অতিরিক্ত সুরক্ষার সাথে। যেহেতু আমি 'উঁকি' দিই না, এটি মূলত একই রকম MarginalerBot
  • SecretBotতার isPeeking()পদ্ধতিটি মিথ্যা প্রত্যাবর্তন করবে , সুতরাং যদি এটি শুরু হতে পারে বা আমি 5 বিড করি, তবে এটি যথাক্রমে 5 বা 10 বিড করবে। অন্যথায় এটি 0. বিড করবে। সুতরাং আমি শুরু করুক বা না করুক opponentsBid + 5, আমার 10 সেন্ট বা 15 সেন্ট বিড দিয়ে যে কোনও উপায়েই আমাকে বিজয়ী করবে, যার ফলে তারা 5 বা 10 সেন্ট আলগা করে দেবে।
  • BluffBotআমি যখন তার বিডটি 95 বলব তখন আমি কী বিড করব তা দেখবে এবং এটি যদি 100 এর চেয়ে বড় বা সমান হয় তবে এটি 0 টিও ভাঙ্গতে বিড করবে, অন্যথায় এটি বিড করবে opponentsBid + 5। সুতরাং আমি শুধু বিড করব opponentsBid + 5। কে শুরু করে তা নির্বিশেষে এটি ভেঙে যাবে এবং আমি শুরু করেছি কিনা তার উপর নির্ভর করে আমি 100 বা 95 সেন্ট জিতেছি।
  • StackTraceObfuscaterBotহিসাবে একই কাজ করবে MarginalerBot
  • EvilBotসর্বদা 5 টি বিড করবে, তাই কেবল বিড করুন opponentsBid + 5। যে কোনও উপায়ে তারা এই 5 সেন্টটি আলগা করে দেবে, এবং আমরা 1 মার্কিন ডলার বিডটি জিতব (হয় শুরু হলে 5 সেন্ট বিড দিয়ে, অথবা তারা যদি শুরু করে দেয় তবে 10 সেন্ট বিড দিয়ে)।
  • MSlowBotএকই হিসাবে MBotএবং তাই এছাড়াও MarginalerBot

আপনি যদি আমার কাউন্টারে কোনও টাইপস বা ত্রুটি দেখতে পান তবে আমাকে জানান।


1
MirrorBotআপনার নিজের শ্রেণীর সাথে নতুন নিলাম কল করে, যাতে সমস্যা। এছাড়াও, মিমিকবোটে যে 3 ঘন্টা আমি ব্যয় করেছি তা জেনে আনন্দিত।
নিসা

@ স্টেফেনলেপপিক কোডটি সরিয়ে ফেলেছে newAuctionকারণ এটি প্রায়শই না ব্যর্থ হবে .. আমি কাউন্টার করতে পারি না MirrorBotবা এটি আমার বিরোধিতাও করতে পারে না । যে দু'জনের শুরুটি 95 সেন্টে এবং অন্যটি 5 সেন্ট হারায় oses
কেভিন ক্রুইজসেন

3
হলি টেরিনারি শেইন, ব্যাটম্যান!
স্কাইলার

1
এছাড়াও, খেলতে গিয়ে BorkBorkBot, যখন তারা 85 রান করে তখন কি আপনার 95 বাড়াতে হবে না? অন্যথায় আপনি উভয়ই 95 টি বিড করছেন যদি তারা শুরু করে।
স্কাইলার

1
@ ফ্রেইহাইট আমি জানি আমি যে কোনও কারণে ডিফল্টটি পরিবর্তন করতে চাইলে আমি 0 ফেরত দিতে কেবল একটি অতিরিক্ত কেস ব্যবহার করেছি। তবে আমি এগুলি এখন ডিফল্টের নীচে রেখেছি (তাদের মন্তব্য করে)। এবং আমি জানি আমি কিছুটা কিছু দিয়ে গল্ফ করতে পারি, তবে এটি সংক্ষিপ্ততম কোড তৈরির বিষয়ে নয়। আমি এটিকে কিছুটা আরও কমপ্যাক্ট তৈরি করার জন্য কেবল একটি বার্ষিকী করেছি, তবে এটি প্রায়। আপাতত এটি এইভাবে ছেড়ে দেবে।
কেভিন ক্রুইজসেন 21

3

RiskRewardBot

import net.ramenchef.dollarauction.DollarBidder;

public class RiskRewardBot extends DollarBidder {
    private int target;

    @Override
    public void newAuction(Class<? extends DollarBidder> opponent) {
        if (opponent.equals(OnlyWinningMove.class) ||
            opponent.equals(DeterredBot.class) ||
            opponent.equals(MirrorBot.class) ||
            opponent.equals(AnalystKiller.class) ||
            opponent.equals(RiskRewardBot.class)) {
            target = 5;
        } else if (opponent.equals(MarginalBot.class) ||
            opponent.equals(EvilBot.class)) {
            target = 10;
        } else if (opponent.equals(SecretBot.class)) {
            target = 15;
        } else if (opponent.equals(BorkBorkBot.class)) {
            target = 95;
        } else if (opponent.equals(MarginalerBot.class) ||
             opponent.equals(BluffBot.class) ||
             opponent.equals(BuzzardBot.class)) {
            target = 100;
        }
        } else {
            target = 0;
        }
    }

    @Override
    public int nextBid(int opponentsBid) {
        if (opponentsBid >= target) {
            return 0;
        } else if (target > 10 && opponentsBid == target - 10) {
            return target;
        } else {
            return opponentsBid + 5;
        }
    }
}

এই মুহুর্তে এটি পরীক্ষা করতে পারে না, তাই দয়া করে এটি ভেঙে গেছে কিনা আমাকে জানান।

লক্ষ্যটি হল সর্বোচ্চ মোট স্কোর পাওয়া, তাই কাউকে মারধর করার বিষয়ে চিন্তা করবেন না। কেবল সহজ বিজয় গ্রহণ করুন, এবং সম্ভাব্য ক্ষতির জন্য অর্থ অপচয় করবেন না।


3

BluffBot

import net.ramenchef.dollarauction.DollarBidder;

public class BluffBot extends DollarBidder {

private DollarBidder enemy;

@Override
public void newAuction(Class<? extends DollarBidder> opponent){
  try {
    this.enemy = opponent.newInstance();
    enemy.newAuction(this.getClass());
} catch (Throwable e) {
    enemy = null;
}
}

@Override
public int nextBid(int opponentsBid) {
    //Is this a legit call?
    for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
        Class<?> clazz;
        try {
            clazz = Class.forName(ste.getClassName());
            if (DollarBidder.class.isAssignableFrom(clazz) && !clazz.isAssignableFrom(this.getClass())) {
                return 100000;
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //Play it safe against strangers
    int enemyMaxBid;
    try{
        enemyMaxBid = enemy.nextBid(95);
    }
    catch (Throwable t){
        enemyMaxBid = 0;
        enemy = null;
    }
    if(enemy == null) return opponentsBid <= 5 ? opponentsBid + 5 : 0; //Hazard a 5c guess because of how many bots fold instantly.

    //If there's profit to be had, get there as cheaply as possible. Otherwise, best outcome is zero.
    return enemyMaxBid >= 100 ? 0 : opponentsBid + 5;
}


}

আপনি জানেন এমন একটি গুপ্তচর মোটেই গুপ্তচরবৃত্তির চেয়ে মূল্যবান ...

অন্য কেউ যদি getBid পদ্ধতিতে কল করার চেষ্টা করে তবে ব্লাফবট তাদের ছাড়িয়ে বা সত্যই উচ্চতর বাজি ধরতে প্রতারিত করার জন্য 100 ডলার দিয়ে সাড়া দেয়।

অন্যথায়, দেখুন $ 1 এর অধীনে জিতে যাওয়া সম্ভব কিনা, এবং যদি তা না হয় তবে কেবল বিড করবেন না।


2

UpTo200

import net.ramenchef.dollarauction.DollarBidder;

public class UpTo200 extends DollarBidder{
  @Override
  public int nextBid(int opponentsBid){
    // If the current bid of the opponent is in the range [0,195]: raise the bid by 5
    return opponentsBid <= 195 ? opponentsBid + 5
    // Else: Give up
     : 0;
  }
}

2

SecretBot

import java.util.Arrays;

import net.ramenchef.dollarauction.DollarBidder;

public class SecretBot extends DollarBidder {

    @Override
    public int nextBid(int opponentsBid) {
        if (isPeeking()) {
            return opponentsBid;
        } else if (opponentsBid < 10) {
            return opponentsBid + 5;
        } else {
            return 0;
        }

    }

    private static boolean isPeeking() {
        final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        for (StackTraceElement ste : Arrays.copyOfRange(stackTrace, 3, stackTrace.length)) {
            Class<?> clazz;
            try {
                clazz = Class.forName(ste.getClassName());
            } catch (ClassNotFoundException e) {
                return true;
            }
            if (DollarBidder.class.isAssignableFrom(clazz))
                return true;
        }
        return false;
    }

}

এই বট 5 বা 10 বিড করে বিজয়ী হওয়ার সর্বনিম্ন প্রচেষ্টা চালায় তিনি স্ট্যাক ট্রেসটিও পরীক্ষা করে দেখেন যে তাকে অন্য কোনও বট ডেকে আনা হয়েছিল এবং তারপরে তিনি কী বিড করবেন সে সম্পর্কে তাদের কাছে মিথ্যা।


যদি আমি বন্দর মনে করবেন isPeekingমধ্যে AbstractAnalystCounterBot?
নিসা

1
@ স্টেফেনলেপ্পিক, ভাল, আমি এটি এমবিট থেকে চুরি করেছি ...
উইনস্টন

1
ঠিক আছে, এমবিট সম্ভবত এটি আমার কাছ থেকে চুরি করেছে…
নিসা

2

একটি অতিরিক্ত

import net.ramenchef.dollarauction.DollarBidder;

public class OneExtra extends DollarBidder {
    @Override
    public int nextBid(int opponentsBid) {
        if(opponentsBid < 110)
          return opponentsBid + 6;
        return opponentsBid;
    }
}

বিডগুলি গত বিডের চেয়ে 6 টি বেশি, কেবলমাত্র তিনি করতে পারেন বলে।


তিনি 6 টি বিড করতে পারবেন না কারণ সমস্ত বিডগুলি অবশ্যই 5 এর গুণফল হতে পারে ...
নীল

@ নিল এটি সম্ভবত একটি টাইপো ...
স্ট্যান স্ট্রাম

@ নীলের নিয়মগুলিতে সুনির্দিষ্টভাবে বলা হয়েছে: "আপনার বিডে 5 of এর একাধিক হওয়ার দরকার নেই"
মেগাটম

@ মেগাটম হুহ, আমি সর্বশেষ বিধিগুলি পড়ার পর থেকে এটি যুক্ত হয়েছিল ...
নীল

@ নীল এটি মূল নিয়মের অংশ ছিল, তবে আমি এটি সেখানে যুক্ত করেছি কারণ এটি খুব সুস্পষ্ট ছিল না।
রামনেন শেফ

2

StackTraceObfuscaterBot

import net.ramenchef.dollarauction.DollarBidder;

import java.util.concurrent.FutureTask;
import java.util.concurrent.RunnableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;

public class StackTraceObfuscaterBot extends DollarBidder {
    private volatile static boolean created = false;
    private volatile DollarBidder pet;
    private boolean firstBid = false;

    public StackTraceObfuscaterBot() {
        if (created)
            throw new IllegalStateException("THERE CAN ONLY BE ONE!");
        created = true;
    }

    @Override
    public void newAuction(Class<? extends DollarBidder> opponent) {
        firstBid = true;
        RunnableFuture<DollarBidder> task = new FutureTask<>(() -> {
            try {
                return opponent.newInstance();
            } catch (Throwable t) {
                return null;
            }
        });
        Thread thread = new Thread(task);
        thread.start();
        try {
            pet = task.get(450, TimeUnit.MILLISECONDS);
        } catch (InterruptedException | ExecutionException | TimeoutException e) {
            task.cancel(true);
            pet = null;
        }
    }

    @Override
    public int nextBid(int opponentsBid) {
        if (!firstBid)
            return 0;
        firstBid = false;

        for (int bid = opponentsBid + 5; i < 100; i += 5) {
            final int bidt = bid;
            RunnableFuture<Boolean> task = new FutureTask<>(() -> {
                pet.newAuction(this.getClass());
                return pet.nextBid(bidt) < bidt + 5;
            });
            Thread thread = new Thread(task);
            thread.start();
            try {
                if (task.get(23, TimeUnit.MILLISECONDS))
                    return bid;
            } catch (InterruptedException | ExecutionException | TimeoutException e) {
                task.cancel(true);
                return 0;
            }
        }
        return 0;
    }
}

এই বটটি স্ট্যাক ট্রেসের মাধ্যমে প্রতিবিম্ব সনাক্ত করার চেষ্টা করে হেসে ফেলে। তারা সবচেয়ে কাছের জিনিসটি DollarBidderএটিকে দেখতে কিছু ল্যাম্বদা শ্রেণি তৈরি করেছে। স্পষ্টতই অন্য বোট তাদের প্রতিফলিত করার চেষ্টা করছে না। তারা খুব কম জানেন যে ল্যাম্বদা ক্লাসটি আসলে একটির জন্য কাজ করছে DollarBidder। এর বাইরেও তিনি অভিনয় করেন MarginalerBot


নোট করুন যে আমি এটি হ্যান্ডেল করার জন্য আমার স্ট্যাক ট্রেস চেকটি আপডেট করেছি।
নিসা

1

দার্থ ভাদার

import java.lang.reflect.Field;
import net.ramenchef.dollarauction.DollarBidder;

public class DarthVader extends DollarBidder
{
@Override
public void newAuction(Class<? extends DollarBidder> opponent) {
    //set all values in the integer cache to over the $100 limit except 0
    Class icache = Integer.class.getDeclaredClasses()[0];
    Field c = icache.getDeclaredField("cache");
    c.setAccessible(true);
    Integer[] cache = (Integer[]) c.get(cache);
    for(sbyte b=0;b<128;b++)
    {
     cache[b]=100001;
    }
}

@Override
public int nextBid(int opponentsBid) 
{
    return 0;
}
}

এটি প্রতিদ্বন্দ্বীর বটকে 100 ডলার সীমা ছাড়িয়ে মান হিসাবে পূর্ণসংখ্যা ক্যাশে সেট করে প্রতিপক্ষের বটকে অতিরিক্ত মূল্য দিতে বাধ্য করার চেষ্টা করে।


2
সুরক্ষা পরিচালক এই থামাতে হবে।
নিসা

2
এবং এটি যাইহোক কাজ করবে না যেহেতু রানার কোথাও এটির পূর্ণসংখ্যাকে বক্স করে না।
নিসা

এমনকি যদি এটি থামানো না হয় তবে এটি বৈধতা থাকলেও এটি একটি জটলা পদক্ষেপ। "অন্যান্য বটগুলিকে সাবটেক্ট করার অনুমতি দেওয়া হয়েছে, তবে ক্ষেত্র / পদ্ধতির দৃশ্যমানতার পরিবর্তনের চেষ্টা করার ফলে রহস্যজনক সুরক্ষা গ্রহণের ফলস্বরূপ" "
NoOneIsHere

1
@ স্টেফেনলেপপিক এর মূল বিষয়টি হ'ল জিনিসগুলি ভাঙা return opponentsBid <= 195 ? opponentsBid + 5 : 0এবং তৈরি করা return opponentsBid <= 100001 ? opponentsBid + 100001 : 100001
NoOneIs এখানে

1
চেক করা ব্যতিক্রমগুলির কারণে সংকলন করতে ব্যর্থ।
নিসা

1

ImprovedAnalystBot (অ-প্রতিদ্বন্দ্বী)

অনেক লোক এটিকে ব্যবহার করছে বলে মনে হচ্ছে AnalystBotইচ্ছাকৃতভাবে খারাপ কোড হওয়া সত্ত্বেও কোডটি টেম্পলেট হিসাবে । তাই আমি আরও ভাল টেম্পলেট তৈরি করছি।

import net.ramenchef.dollarauction.DollarBidder;

public class ImprovedAnalystBot extends DollarBidder {
    private DollarBidder enemy;

    @Override
    public void newAuction(Class<? extends DollarBidder> opponent) {
        if (!opponent.equals(this.getClass()))
            try {
                this.enemy = opponent.newInstance();
                enemy.newAuction(this.getClass());
            } catch (Throwable t) {
                this.enemy = null;
            }
        else
            this.enemy = null;
    }

    @Override
    public int nextBid(int opponentsBid) {
        try {
            return enemy != null && enemy.nextBid(95) < 100 ? 95 : 0;
        } catch (Throwable t) {
            return 0;
        }
    }
}

শুধু আপনার চ্যালেঞ্জটি সম্পাদনা করবেন না কেন?
নাথান মেরিল

@ নাথানমারিল কীভাবে আমি এটি সম্পাদনা করব?
রামনেন শেফ

সম্পাদনা বোতামটি ক্লিক করে এবং এই কোডের সাথে অ্যানালিস্টবটকে প্রতিস্থাপন করবেন?
নাথান মেরিল

@ নাথানম্যারিল AnalystBotইচ্ছাকৃতভাবে খারাপ কোড এটি যাতে এটি নাশকতার প্রদর্শন করতে AnalystKillerপারে।
রামনেন শেফ

1
বিশ্লেষক কিলার এখনও উন্নত একের সাথে কাজ করে :) এটি একটি পোস্ট তৈরির বিষয়টি হ'ল চ্যালেঞ্জ একটি উত্তরের চেয়ে অনেক বেশি দৃশ্যমান।
নাথান মেরিল

1

MBot

import net.ramenchef.dollarauction.DollarBidder;

import java.util.Arrays;

public class MBot extends DollarBidder {
    protected DollarBidder rival = null;
    protected boolean rivalPrepared = false;
    protected Class<? extends DollarBidder> rivalClass;


    @Override
    public void newAuction(Class<? extends DollarBidder> opponent) {
        this.rivalClass = opponent;
        this.rivalPrepared = false;
    }

    protected DollarBidder getRival() {
        if (!rivalPrepared) {
            rivalPrepared = true;
            try {
                rival = rivalClass.newInstance();
                rival.newAuction(this.getClass());
            } catch (Throwable t) {
                rival = null;
            }
        }
        return rival;
    }

    @Override
    public int nextBid(int opponentsBid) {
        return calcBid(opponentsBid, isPeeking(3), isPeeking(4));
    }

    protected int calcBid(int opponentsBid, boolean isPeeking, boolean isSubPeeking) {
        if (isPeeking) {
            throw new RuntimeException();
        }

        for (int iBid = opponentsBid + 5; iBid <= 100; iBid = iBid + 5) {
            try {
                if (getRival().nextBid(iBid) < iBid + 5) {
                    return iBid;
                }
            } catch (Throwable t) {
                // noop
            }
        }
        return 0;
    }

    protected boolean isPeeking(int level) {
        final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        final StackTraceElement[] stackTraceElements = Arrays.copyOfRange(stackTrace, level, stackTrace.length);
        for (StackTraceElement ste : stackTraceElements) {
            try {
                Class<?> clazz = Class.forName(ste.getClassName());
                if (DollarBidder.class.isAssignableFrom(clazz))
                    return true;
            } catch (ClassNotFoundException e) {
                return true;
            }
        }
        return false;
    }
}

সামান্য পরিশ্রুত মার্জিনালারবট

  • যারা আপনাকে চেক করতে চান না তাদের প্রতি নির্দয় হন
  • অন্যকে সহজ অর্থ অস্বীকার করার জন্য 100 কে 100 প্রদান করতে এবং এমনকি বিরতি এমনকি কেস দেওয়ার জন্য 100 টাকা প্রদানের অনুমতি দিন

আপনি nextBidনিক্ষেপ করার ঘোষণা করতে পারবেন না ClassCastException
রামেন শেফ

@ রমেনচেফ ঠিক আছে, এটি রানটাইম এক্সসেপশনে পরিবর্তিত হয়েছে যার ঘোষণার দরকার নেই :)
ম্লেকো

স্ট্যাক ট্রেস চেকিংয়ের জন্য আপনার কোডটি সন্দেহজনকভাবে আমার মতো looks
নিসা

@ স্টেফেনলেপিক সম্ভবত এটির অনুলিপি
ম্লেকো

@ ম্লেকো কেন? এটি যে ক্লাসটি থেকে অনুলিপি করা হয়েছে সেটি হ'ল একটি বিমূর্ত সুপারক্লাস যা বিনামূল্যে ব্যবহারযোগ্য।
নিসা

1

অ-প্রতিযোগিতামূলক: এমএসলোবোট

import net.ramenchef.dollarauction.DollarBidder;

import java.util.Arrays;

public class MSlowBot extends DollarBidder {
    private DollarBidder rival;

    @Override
    public void newAuction(Class<? extends DollarBidder> opponent) {
        try {
            rival = opponent.newInstance();
            rival.newAuction(this.getClass());
        } catch (Throwable t) {
            rival = null;
        }
    }

    @Override
    public int nextBid(int opponentsBid) {
        noPeeking();

        for (int iBid = opponentsBid + 5; iBid <= 100; iBid = iBid + 5) {
            try {
                if (rival.nextBid(iBid) < iBid + 5) {
                    return iBid;
                }
            } catch (Throwable t) {
                //do nothing.
            }
        }
        return 0;
    }

    private void noPeeking() {
        final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        for (StackTraceElement ste : Arrays.copyOfRange(stackTrace, 3, stackTrace.length)) {
            try {
                Class<?> clazz = Class.forName(ste.getClassName());
                if (DollarBidder.class.isAssignableFrom(clazz))
                    Thread.sleep(1000);
            } catch (ClassNotFoundException | InterruptedException e) {
                throw new RuntimeException(":(");
            }
        }
    }
}

এমবিট হিসাবে একই যুক্তি, শত্রুর বিরুদ্ধে লড়াইয়ের সময় ব্যতিক্রমের পরিবর্তে সময়সীমা ব্যবহার করুন। এখনও অবধি কেউ পুনরায় সময়সীমা রক্ষা করছে না তাই কার্যকর হওয়া উচিত


উল্লিখিত বিধিগুলি ইচ্ছাকৃতভাবে অন্য বটকে সময়সীমার কারণ হতে নিষেধ করে।
উইনস্টন ইওয়ার্ট

@ উইনস্টোনওয়ার্ট আপনি কি উদ্ধৃতি দিতে পারেন? এটিকে অস্বীকার করার নিয়ম আমি খুঁজে পাচ্ছি না
ম্লেকো

"অন্যান্য বটগুলিকে সাবটেক্ট করার অনুমতি দেওয়া হয়েছে, তবে ক্ষেত্র / পদ্ধতির দৃশ্যমানতার পরিবর্তনের চেষ্টা করার ফলে রহস্যজনক সুরক্ষা গ্রহণের ফলস্বরূপ An এছাড়াও, আমি সময়সীমার বিরুদ্ধে রক্ষা করছি।
রামেন শেফ

@ র্যামেনচেফ তবে এটি অন্যান্য উপাদানগুলির দৃশ্যমানতার পরিবর্তন করে না। আমি আপনাকে সঠিকভাবে বুঝতে পারি কিনা তা নিশ্চিত নই। উত্তেজক সময়সীমা অনুমোদিত?
ম্লেকো

"একটি ব্যতিক্রম অন্য বটকে 500 মিমি সীমা ভেঙে ফেলছে" " বিশেষত, এটি নাশকতা সম্পর্কে নিয়মের ব্যতিক্রম।
রামেন শেফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.