আপনার দূরত্ব রাখুন!


15

প্রত্যেক খেলোয়াড়ের একটি নম্বর রয়েছে। আপনারা কি সব থেকে দূরে হতে পারেন?

আবশ্যকতা

একটি জাভা, পাইথন 2 বা রুবি ফাংশন লিখুন choose()যা তিনটি আর্গুমেন্ট গ্রহণ করে:

  • একটি পূর্ণসংখ্যা - ইতিমধ্যে সম্পন্ন রাউন্ডগুলির সংখ্যা
  • একটি পূর্ণসংখ্যা - খেলোয়াড়ের সংখ্যা
  • স্ট্রিংগুলির একটি অ্যারে - প্রতিটি পূর্ববর্তী রাউন্ডের ফলাফল
    • প্রতিটি স্ট্রিং হল একটি পৃথক পূর্ণসংখ্যার তালিকা পৃথকীকরণ, নিম্ন থেকে সর্বোচ্চে বাছাই করা

উদাহরণস্বরূপ, এর choose(2, 4, ["4 93 93 174", "1 84 234 555"])অর্থ:

  • ইতিমধ্যে দুটি রাউন্ড ছিল (এটি তৃতীয় রাউন্ড)
  • মোট চারজন খেলোয়াড় রয়েছে
  • প্রথম রাউন্ডে, নির্বাচিত সংখ্যাগুলি ছিল 4, 93, 93, 174
  • দ্বিতীয় রাউন্ডে, নির্বাচিত সংখ্যাগুলি 1, 84, 234, 555 ছিল

আপনাকে অবশ্যই 1 থেকে 999 (সমেত) থেকে পুরো সংখ্যাটি ফেরত দিতে হবে।

একে অপরের খেলোয়াড়ের জন্য, আপনার স্কোর হ'ল আপনার সংখ্যা এবং তাদের মধ্যে দূরত্বের বর্গমূল। রাউন্ডের জন্য আপনার স্কোর এই সমস্ত স্কোরের মোট।

100 রাউন্ড খেলা হবে। সর্বোচ্চ স্কোর জয়!

বিধি

  • আপনার কোডটি কনসোল, ফাইল, নেটওয়ার্ক ইত্যাদি সহ কোনও আই / ও ব্যবহার করতে পারে না
  • আপনি নিয়ন্ত্রণ প্রোগ্রাম বা অন্য কোনও খেলোয়াড়ের সাথে হস্তক্ষেপ না করতে পারেন।
  • যে প্রোগ্রামগুলি দেখে মনে হয় যে তারা উপরোক্ত বিধিগুলি লঙ্ঘন করছে তাদের বাদ দেওয়া হবে।
  • কোনও ফাংশনের প্রতিটি কল আমার কম্পিউটারে পাঁচ সেকেন্ডের মধ্যে নেওয়া উচিত (8 গিগাবাইট র‌্যামের সাথে ইন্টেল কোর আই 5 2450 এম)।
  • যদি কোনও প্রোগ্রাম একটি ব্যতিক্রম ছুঁড়ে ফেলে বা একটি অবৈধ মান ফেরত দেয় তবে এটি 1 হিসাবে ফিরে আসার মতো আচরণ করা হবে।
  • প্রতিটি ব্যবহারকারী সর্বাধিক একটি প্রোগ্রাম জমা দিতে পারে।

বিবিধ

  • কন্ট্রোল প্রোগ্রামটি গিটহাবে রয়েছে
  • তিনটি অন্তর্নির্মিত খেলোয়াড় রয়েছে। তারা এই উত্তর পাওয়া যাবে ।
  • বিজয়ী 28 জানুয়ারী নির্বাচিত করা হবে।

লিডারবোর্ড

বিজয়ী কনজারভেটর

অ-ধ্রুবক কৌশলযুক্ত সর্বোচ্চ স্কোরিং খেলোয়াড় গুস্তাভের প্রতি শ্রদ্ধাজনক উল্লেখ ।

  • সংরক্ষণক - 36226
  • উচ্চ - 36115
  • ফ্লোরহাগার - 35880
  • নাম্বার - 35791
  • Overestimator - 35791
  • গুস্তাভ - 35484
  • Ianতিহাসিক - 35201
  • স্যাম্পলার - 34960
  • বৃদ্ধিকারী - 34351
  • জাম্পরাইটআইন - 34074
  • ভিক্রি - 34020
  • কিশোর - 33907
  • রেন্ডু - 33891
  • ভারোত্তোলক - 33682
  • মিডলম্যান - 33647
  • বাউন্সইওয়ার্ডস - 33529
  • কদর্য গণিতবিদ - 33292
  • জাম্পার - 33244
  • কপির্যাট - 33049

সম্পূর্ণ ফলাফল এখানে পাওয়া যাবে । (আমি পাঠ্য মোড়ানো অক্ষম করার পরামর্শ দিই))


পূর্ববর্তী রাউন্ডগুলিতে আমার নিজের নম্বরটি কী ছিল তা বলার কোনও উপায় আছে?
মার্টিন এেন্ডার

@ মার্টিনব্যাটনার নং
Ypnypn

1
আমি সেগুলির কোনও ভাষা জানি না :( আপনি কি জাভাস্ক্রিপ্ট যুক্ত করতে পারবেন? পছন্দ করুন,
নোড.জেএস

1
@ দ্যফোবফেট, আমি তাদের কোনওটিই জানি না। পাইথন এন্ট্রি করা থেকে আমাকে বাধা দেয়নি।
চিহ্নিত করুন

7
আমি মনে করি স্থানটি যদি একটি বৃত্ত / লুপ থাকে তবে এটি 1 এবং 999 এর মধ্যে দূরত্ব 1 হয় That "প্রান্তগুলি" না থাকায় এটি "প্রতি একক সংখ্যাকেই" অনুভূতি থেকে রক্ষা করবে I পার্ক করা। অবশ্যই এখন পরিবর্তিত হতে খুব দেরি হয়েছে;)
জিওবিটস

উত্তর:


9

পাইথন, সংরক্ষণক

def choose(round, players, scores):
    return 999

যেহেতু প্রতিটি ব্যতিক্রম 1 নিক্ষেপ করে, এটি এটি থেকে যথাসম্ভব দূরে থাকে। দুর্বলদের ব্যয়ে নিজের ভাগ্য তৈরি করে।

মজাদার ঘটনা: আমি এটির উন্নতি করার কথা ভেবেছিলাম, তবে কেবল কোনও কোণে লুকিয়ে থাকার চেয়ে ভাল কোনও উপায় খুঁজে পাইনি।


1
দেখে মনে হচ্ছে আমি ভুল কোণটি বেছে নিয়েছি। :(
TheNumberOne

এটি একটি সাধারণ কারণে ভাল: অন্যরা আপনাকে দূরত্ব হ্রাস করার চেষ্টা করে। তারা স্বয়ংক্রিয়ভাবে আপনার স্কোর আরও ভাল করবে। গেম চেঞ্জার এমন একটি প্রতিপক্ষ হবে যিনি যতটা সম্ভব আপনার কাছাকাছি যাওয়ার চেষ্টা করে।
মার্টিন থোমা

1
ইও ... পাইথনের একটি সেমিকোলন?
কেএসএফটি

@ কেএসএফটি হি আমি পাইথনের উপরে মরিচা, আর যাই হউক না কেন আমি এই বিশেষজ্ঞ
ছিলাম

6

এক নম্বর, জাভা

নামটি এটিকে পুরোপুরি ব্যাখ্যা করে।

public static int choose(int round, int players, String[] args) {
    return 1;
}

1
কেন ডাউন ভোট?
TheNumberOne

5
আমি বিশেষত পছন্দ করি যে কীভাবে ব্যবহারকারীর নাম জমা দেওয়ার সাথে সম্পর্কযুক্ত
ব্রায়ান জে

5

পাইথন, প্রাচীন ইতিহাসবিদ

দৃirm়ভাবে বিশ্বাস করে যে ভবিষ্যত ঠিক অতীতের মতো হবে, তবে বিশ্বাস করে যে শেষ রাউন্ডটি হিস্টি হিসাবে খুব সাম্প্রতিক, তাই এটি কেবল 1 - 999 এর মধ্য দিয়ে যায় এবং শেষের রাউন্ডগুলি সেরাটি কী হতে পারে তা বেছে নেয়। প্রথম 2 রাউন্ড 500 রিটার্ন দেয়।

def choose(round, players, scores):
    calc = lambda n, scores: sum([abs(int(i)-n)**.5 for i in scores.split(' ')])
    return max(range(1, 1000), key=lambda n: sum([calc(n, j) for j in scores[1:]])) if round>1 else 500

4

পাইথন, ভিক্রে

def choose(rounds, players, results):        
    if not results:
        return (id(0)/7)%999 + 1

    def best(array):
        score = lambda x: sum(abs(x-y)**.5 for y in array)
        m = max(score(x) for x in range(1, 1000))
        return [x for x in range(1, 1000) if score(x) == m]

    def second_best(array):
        array.extend(best(array))
        options = best(array)
        return options[(id(0)/7) % len(options)]

    results = [map(int, s.split()) for s in results]
    counts = {}

    for round_ in results:
        for number in round_:
            counts[number] = counts.get(number, 0) + 1

    most_common = sorted([(c, n) for n,c in counts.items()], reverse=True)
    to_avoid = [t[1] for t in most_common[:players]]

    return second_best(to_avoid)

সংখ্যার একটি তালিকা তৈরি করে যা প্রায়শই খেলেছে, ধরে নেওয়া হয় যে প্রত্যেকে প্রত্যেকে অনুকূলভাবে খেলবে এবং তালিকাটি প্রদানের পরে দ্বিতীয় সেরা পছন্দটি বেছে নেবে।

উদাহরণস্বরূপ, যদি সর্বাধিক প্রচলিত সংখ্যা হয় [1, 990, 999], তবে ভিক্রি সেরা খেলতে 200 দিতে serোকায় [1, 200, 990, 999], তারপরে নতুন অ্যারের জন্য সেরা বিকল্পটি বেছে নিয়েছে (যা 556)।


4

জাভা, Overestimator

নামটি যেমন বোঝায়, এই প্রোগ্রামটি ধরে নিয়েছে যে অন্য সমস্ত প্রোগ্রামগুলি সর্বশেষ রাউন্ডের ভিত্তিতে সেরা উত্তরটি বেছে নিয়ে "ভাল" খেলার চেষ্টা করবে - সুতরাং এই "ওভারস্টিমেটর" সর্বদা পূর্ববর্তী রাউন্ডের ভিত্তিতে সবচেয়ে খারাপ সম্ভাব্য অবস্থানটি তুলবে।

 public static int choose(int round, int players, String[] args) {
     String[] lastRoundStrings = args[args.length - 1].split(" ");
     int[] lastRound = new int[lastRoundStrings.length];
     int worstSelection = 0;
     for (int i = 0; i < lastRound.length; i++) {
         double worstScore = Double.MAX_VALUE;
         for (int j = 1; j < 999; j++) {
             double computedScore = score(j, lastRound);
             if (computedScore < worstScore) {
                 worstScore = computedScore;
                 worstSelection = j;
             }
         }
     }
     return worstSelection;
 }

 public static double score(int position, int[] otherPositions) {
     double total = 0;
     for (int i = 0; i < otherPositions.length; i++) {
         total += Math.sqrt(Math.abs(otherPositions[i] - position));
     }
     return total;
 }

এটি কীভাবে একটি ধ্রুবক "1" খেলে? একটি বাগ ছিল? মনে মনে, "1" খেলা বেশ সফল বলে প্রমাণিত হয়েছিল। :)
এমিল

দুঃখজনকভাবে কোডটিতে একটি বাগ রয়েছে, হ্যাঁ - এটি আসলে শেষ পর্বে যে স্কোরগুলি পড়ে তা কখনই পার্স করে না। (তবে আমি এটি অনেক দেরিতে বুঝতে পেরেছিলাম এবং ততক্ষণে একটি জমা সম্পাদনা করা ভুল বলে মনে হয়েছে, এবং আপনি যেমন বলেছেন যে এটি বেশ ভাল করছে ... যাই হোক না কেন: পি)
অ্যালেক্স ওয়াকার

4

জাভা - ভারোত্তোলক

প্রতিটি রাউন্ডের জন্য সেরা হবে তা নির্ধারণ করতে 1-999 এর মধ্য দিয়ে লুপগুলি। আধ্যাত্মিকতা অনুসারে এগুলি ওজন করে (সাম্প্রতিক রাউন্ডগুলিতে আরও ওজন রয়েছে) এবং এটির সর্বোত্তম সামগ্রিক অনুমান দেয়। আশা করি যদি পরের রাউন্ডে নিদর্শনগুলি তৈরি হয় তবে এটি এটি গ্রহণ করতে সক্ষম হবে।

সম্পাদনা: এখন + ইনফ% আরও পুনরাবৃত্তি সহ! পূর্ববর্তী রাউন্ডগুলিতে আপনি যা পছন্দ করেছেন তা সংরক্ষণ / সংরক্ষণ / দেখতে সক্ষম হচ্ছেন না এমন একটি টানুন। অন্যেরা কী করতে চলেছে তা নির্ধারণ করার চেষ্টা করার সময় অ্যাকাউন্টে নিজের নিজস্ব ইনপুট গ্রহণ করা আপনাকে বিভ্রান্ত করে তোলে । তো, এর গণনা করা যাক! এটি এখন আগের রাউন্ডে কী বেছে নিয়েছিল তা বের করার জন্য পুনরাবৃত্তি করবে এবং পরবর্তী পদক্ষেপের গণনা করার সময় তা উপেক্ষা করবে।

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

int choose(int rounds, int players, String[] hist){
    if(rounds < 1)
        return 1;

    int lastChoice = choose(rounds-1,players,java.util.Arrays.copyOf(hist, hist.length-1));

    int[][] history = new int[hist.length][players];
    for(int i=0;i<hist.length;i++){
        String[] tokens = hist[i].split(" ");
        boolean flag = false;
        for(int j=0;j<tokens.length;j++){
            history[i][j] = Integer.parseInt(tokens[j]);
            if(i==history.length-1 && history[i][j]==lastChoice && !flag){
                flag = true;
                history[i][j] = -1;
            }
        }
    }

    double best = 0;
    int guess = 1;
    for(int i=1;i<1000;i++){
        double score = 0;
        for(int j=0;j<history.length;j++){
            double weight = (double)(j+1)/history.length;
            for(int k=0;k<history[j].length;k++){
                if(history[j][k] > 0)
                    score += Math.sqrt(Math.abs(history[j][k]-i)) * weight;
            }
        }
        if(score > best){
            best = score;
            guess = i;
        }
    }
    return guess;
}

দ্রষ্টব্য: এমনকি 100 রাউন্ডে, এটি আমার কিছুটা ধীর পিসিতে এক সেকেন্ডের অধীনে সম্পূর্ণ হয়। যদি কোনও কারণে আপনার পক্ষে এটি খুব বেশি সময় নেয় তবে আমাকে জানান যাতে আমি পুনরাবৃত্তি সীমাবদ্ধ করতে পারি।
Geobits

এটি আমার মেশিনেও খুব দ্রুত।
Ypnypn

3

রুবি, কপির্যাট

কেবল গতবার যেকোন সংখ্যাটি জিতেছে

def choose r, p, hist
  last = hist.last.split.map &:to_i
  scores = last.map{|n| last.map{|m| (n-m).abs ** 0.5 }.inject :+ }
  last[scores.index scores.max]
end

1
এটি প্রথম রাউন্ডের জন্য কী ফিরে আসে? ওহ কিছু মনে করো না. ব্যতিক্রমগুলি ১ ফিরে আসবে
mbomb007

3

রুবি, জাম্পরাইটআইন

def choose(round, players, args)
    return 500 if args.size == 0
    last_round = args[-1].split.map(&:to_i) + [1000]
    max_gap = 0
    last = 0
    move = 1
    last_round.each { |i|
        gap = i - last - 1
        if gap > max_gap
            max_gap = gap
            move = (i + last)/2
        end
        last = i
    }
    move
end

এটি সম্ভবত সবচেয়ে সোজা-এগিয়ে কৌশল। এটি সর্বশেষ রাউন্ডের বৃহত্তম ব্যবধানটি সন্ধান করে এবং সেই ফাঁকের মাঝখানে ঠিক নম্বরটি পছন্দ করে।


এটি প্রথম রাউন্ডের জন্য কী ফিরে আসে? 1?
mbomb007

@ mbomb007 ওহ, আমি সবসময় এই উদ্বেগজনক প্রাথমিক রাউন্ডগুলি ভুলে যাই। ধন্যবাদ, এটি এখন 500 ফিরিয়ে দেয়
মার্টিন এন্ডার

3

গুস্তাভ (পাইথন 2)

এটি একটি দুর্দান্ত সোজা ফরোয়ার্ড মেটা কৌশল, নির্লজ্জভাবে অনুরূপ কোটএইচ চ্যালেঞ্জে আমার পুরানো উত্তরগুলির একটি থেকে অনুলিপি করে। এটি কয়েকটি সাধারণ কৌশল বিবেচনা করে, তারা আগের সমস্ত রাউন্ডে কীভাবে পারফর্ম করত তা দেখে এবং তারপরে পরবর্তী রাউন্ডের জন্য সর্বোচ্চ স্কোরিংয়ের একটি অনুসরণ করে।

def choose(k, N, h):
    if k<2: return 999
    H = [[int(x) for x in l.split()] for l in h]
    score = lambda x,l: sum(abs(x-y)**.5 for y in l)
    S = [range(1,1000)
         + [max(range(1,1000), key=lambda x: score(x, H[i-1]))]
         + [max(range(1,1000), key=lambda x: score(x, H[i-2]))]
         + [min(range(1,1000), key=lambda x: score(x, H[i-1]))]
         + [min(range(1,1000), key=lambda x: score(x, H[i-2]))]
         for i in range(2,k+1)]
    scores = [sum(score(s[j],l) for s,l in zip(S[:-1], H[2:]))
              for j in range(len(S[0]))]
    return max(zip(scores, S[-1]))[1]

আমি এখন বুঝতে পারি যে অ্যালগরিদমের এখনও কিছু ত্রুটি রয়েছে। উদাহরণস্বরূপ, এটি "নিজেকে তাড়া করে" রাখতে পারে কারণ এটি তার নিজস্ব চালগুলি বিরোধীদের থেকে আলাদা করে না। যাইহোক, আমি এটি আপাতত এটি ছেড়ে দেব।



1

নিম্নলিখিত তিনটি প্রোগ্রাম অন্তর্নির্মিত।

উচ্চ (রুবি)

def choose(round, players, args)
    return 990
end

বৃদ্ধিকারী (জাভা)

public static int choose(int round, int players, String[] args) {
    return round * 10 + 5;
}

ফ্লোরহাগার (পাইথন)

def choose(round, players, args):
    if len(args) == 0:
        return 10
    last = args[-1].split();

# next line from http://stackoverflow.com/a/7368801/3148067
    last = map(int, last)

    dist = 0
    for i in range(1, 999):
        if i in last:
            dist = 0
        else:
            dist = dist + 1
            if dist == 10:
                return i
    return 500

1

পাইথন, স্যাম্পলার

জায়গাগুলির তালিকার বাইরে, পূর্ববর্তী পালাটিকে উপেক্ষা করে সম্প্রতি ব্যবহৃত নম্বর থেকে দূরে অবস্থিত একটি বেছে নিন।

def choose(turn, players, history):
    sample = map(int, (' '.join( history[-5:-1] )).split())
    def distance(x): return sum(abs(x-y)**0.5 for y in sample)
    places = range(1, 1000, 13)
    score, place = max((distance(x), x) for x in places)
    return place

1

জাভা, বাউন্সইওয়ার্ডস

1 থেকে শুরু করে, এটি উচ্চ এবং নিম্ন বিকল্পের মধ্যে বাউন্স করার সময় ধীরে ধীরে 500 এর কাছাকাছি যায়।

public static int choose(int round, int players, String[] args) {
    return round%2 == 0 ? round * 5 : 1000 - round * 5;
}

1

কদর্য গণিতবিদ (জাভা)

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

public static int choose(int round, int players, String[] args) {
    if (round == 0) {
        return 999;
    }

    int[][] results = new int[args.length][players];

    // parse input
    for (int i = 0; i < args.length; i++) {
        String[] rounds = args[i].split(" ");
        for (int j = 0; j < rounds.length; j++) {
            results[i][j] = Integer.parseInt(rounds[j]);
        }
    }

    int bestNumber = 0;
    double bestScore = -1;

    // get the best number for the last round
    for (int i = 1; i < 1000; i++) {
        double score = 0;
        for (int result : results[results.length - 1]) {
            score += Math.sqrt(Math.abs(i - result));
        }
        if (score >= bestScore) {
            bestScore = score;
            bestNumber = i;
        }
    }

    if (round == 1) {
        return bestNumber;
    }

    int bestNumber2 = 0;
    double bestScore2 = -1;

    // get the best number for the second last round
    for (int i = 1; i < 1000; i++) {
        double score = 0;
        for (int result : results[results.length - 2]) {
            score += Math.sqrt(Math.abs(i - result));
        }
        if (score > bestScore2) {
            bestScore2 = score;
            bestNumber2 = i;
        }
    }

    // add the difference between last round and second last round to get this rounds best number
    int difference = bestNumber - bestNumber2;
    bestNumber = bestNumber + difference;

    return bestNumber > 999 ? 999 : bestNumber;
}

1

পাইথন - আমি একটি নাম ভাবতে চাই না ...

পূর্ববর্তী রাউন্ডগুলিতে নির্বাচিত সংখ্যার গড় যদি 500 এরও কম হয় তবে এটি 999 বাছাই করে otherwise অন্যথায় এটি 1 বাছাই করে।

def choose(a,b,c):
    total=0
    for i in c:
        for j in i.split(" "):
            total+=int(i)
    average=total/(a*b)
    if average<500:
        return 999
    return 1

0

পাইথন, মিডলম্যান (@ ক্লাবিচিয়ো দ্বারা সংরক্ষক ভিত্তিক)

def choose(round, players, scores):
    return 500;

আমি যখন লক্ষ্য করেছি যে উপরের প্রান্তটি স্কোরগুলি উচ্চতর (এবং নিম্ন প্রান্তকে ছাড়িয়ে গেছে), আমি ভাবলাম যে কেবল মাঝখানে ধরা পাওয়ার চেয়ে আরও খারাপ কিছু হতে পারে কিনা।


0

জাম্পার (রুবি)

def choose(round, players, args)
    495*(round%3)+5
end

নীচে, মাঝারি এবং শীর্ষের মধ্যে বিকল্প। (5,500,995)

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