এটি নিন বা ছেড়ে দিন II: কম্পিউটারের জন্য একটি গেম শো


20

এই ধাঁধা সিরিজের মধ্যে এটি দ্বিতীয় যা আমি প্রতি সোমবার মধ্যরাতে পিএসটি পোস্ট করব। প্রথম ধাঁধা অবস্থিত এখানে

প্রসঙ্গ:

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

এই সপ্তাহের খেলা:

হোস্ট আপনাকে 10,000 ডিজিটাল খামের স্ট্যাকের এপিআই অ্যাক্সেস সরবরাহ করে। এই খামগুলি এলোমেলোভাবে বাছাই করা হয় এবং এগুলির মধ্যে ডলারের মূল্য $ 1 এবং 10,000 ডলারের মধ্যে থাকে (কোনও দুটি খামে একই ডলারের মূল্য থাকে না)।

আপনার কাছে আপনার 4 টি কমান্ড রয়েছে:

  1. পড়ুন (): স্ট্যাকের শীর্ষে খামে ডলারের চিত্রটি পড়ুন।

  2. নিন (): আপনার গেম শো ওয়ালেটে খামে ডলারের চিত্র যোগ করুন এবং খামটিকে স্ট্যাকের বাইরে রেখে দিন।

  3. পাস (): স্ট্যাকের শীর্ষে খামটি পপ করুন।

  4. ওরাকল (এম): স্ট্যাকের পরবর্তী এম খামগুলিতে গড় মান প্রদান করে, আপনি বর্তমানে পড়তে পারেন এমনটি অন্তর্ভুক্ত করে না।

নিয়ম:

  1. আপনি যদি একটি খামে পাস () ব্যবহার করেন তবে এর মধ্যে থাকা অর্থ চিরতরে নষ্ট হয়ে যাবে।

  2. আপনি যদি সেই জায়গা থেকে $ এক্সযুক্ত খামে টেক () ব্যবহার করেন তবে আপনি কখনই <$ এক্সযুক্ত খামে টেক () ব্যবহার করতে পারবেন না। এই খামগুলির মধ্যে একটিতে () নিন আপনার মানিব্যাগে $ 0 যুক্ত হবে।

  3. আপনি যদি টার্ন টি তে ওরাকল (এম) ব্যবহার করেন তবে টি + এম এর মধ্য দিয়ে টি + 1 খামগুলি ফিরে আসবে। ওরাকল () টি + এম ঘুরিয়ে দেওয়া পর্যন্ত অক্ষম করা আছে।

একটি অ্যালগরিদম লিখুন যা সর্বাধিক অর্থের সাহায্যে গেমটি শেষ করে।

আপনি যদি পাইথনে আপনার অ্যালগরিদম লিখছেন তবে @ মাল্টেসেন সরবরাহ করেছেন: এই কন্ট্রোলারটি নির্দ্বিধায় ব্যবহার করুন: https://gist.github.com/livinginformation/70ae3f2a57ecba4387b5

নোট 1: "সর্বাধিক" এক্ষেত্রে N> = 1000 রান করার পরে আপনার ওয়ালেটে মধ্যমানের মান বোঝায়। আমি প্রত্যাশা করি, যদিও আমি ভুল প্রমাণিত হতে পছন্দ করব, যে প্রদত্ত অ্যালগরিদমের জন্য মধ্যমানের মান N বাড়ানোর সাথে সাথে অনন্ততায় রূপান্তরিত হবে। পরিবর্তে গড় সর্বাধিকতর চেষ্টা করার জন্য নির্দ্বিধায়, তবে আমার অনুভূতি আছে যে মাঝারিটির চেয়ে সামান্য এন দ্বারা এই উপায়টি ছুঁড়ে ফেলার সম্ভাবনা বেশি।

দ্রষ্টব্য 2: এই ধাঁধার আগের অংশের সমস্ত সমাধান যেমন এখানে বৈধ, সেগুলি পুনরায় পোস্ট করার কোনও মূল্য নেই। পূর্ববর্তী ধাঁধাগুলির কেবলমাত্র অ্যালগরিদমিক উন্নতিগুলি দ্বিতীয় খণ্ডের জন্য বিবেচনা করা হবে।

সম্পাদনা করুন: মেটা সম্পর্কিত এই পোস্টের আলোকে পুরষ্কারের শর্তটি সরানো হয়েছে ।


বাহ, আমি বিশ্বাস করতে পারি না যে আমি ওভারসিলেট করেছি: ও
বিটা ডেক

@ বেটা ক্ষয় ঘড়িতে টিক দিচ্ছে! :)
লিভিংইনফরমেশন

দৌড়ের অনুভূতি কী? পূর্ববর্তী সমস্ত পঠিত খামের সংখ্যার পরিমাণ রেখে আপনি নিজের বিনামূল্যে ওরাকল তৈরি করতে পারেন। আমার কী ভুল হচ্ছে?
লুইস মেন্ডো

1
@ লুইস মেন্ডো আপনার নিজের শুল্কের সাহায্যে, আপনি কেবলমাত্র সমস্ত অবশিষ্ট মানের অর্থ জানতে পারবেন । ওরাকল দিয়ে আপনি পরবর্তী Mমানগুলির গড়টি পেতে পারেন , যেখানে আপনি চয়ন করতে পারেন M
রেটো কোরাডি

1
যেহেতু আপনার পূর্ববর্তী চ্যালেঞ্জের সমস্ত সমাধানও এই চ্যালেঞ্জের বৈধ সমাধান, তাই আমরা কি সেগুলি স্পষ্টভাবে জমা দেওয়া বিবেচনা করতে পারি?
রেটো কোরাডি

উত্তর:


9

গ্রোভি $ 713337 $ 817829 $ 818227

বুটস্ট্র্যাপ কোড:

class Instance {
    List values = new ArrayList(1..10000); {
        Collections.shuffle(values)
    }
    int i = 0
    int value = 0
    int max = 0
    int nextOracle = 0

    def pass() {
        if (i >= 10000)
            throw new NoSuchElementException()
        i++
    }

    def take() {
        if (i >= 10000)
            throw new NoSuchElementException()
        int v = values[i]
        if (v > max) {
            max = v
            value += v
        }
        i++
    }

    double oracle(int m) {
        if (m <= 0 || i < nextOracle || i + m >= 10000)
            throw new NoSuchElementException()

        nextOracle = i + m
        values.subList(i + 1, i + m + 1).stream().reduce { l, r -> r+l }.get() / m
    }

    int read() {
        if (i >= 10000)
            throw new NoSuchElementException()
        values[i]
    }
}

অ্যালগরিদম

double square(double v) { v * v }
final double factor = Math.pow(1.5, 1.1)
int attempts = 5000
(1..attempts).stream().parallel().mapToLong {
    def puzzle = new Instance()

    int[] memory = 1..10000 // We will remember every envelope
    int memStart = 0

    while (memStart < 10000 - 3) {
        int value = puzzle.read()
        int i = Arrays.binarySearch(memory, memStart, 10000, value) - memStart
        if (i < 0) { // We can't use the money
            puzzle.pass()
            continue
        }
        if (i == 0) { // Of course we take the lowest
            puzzle.take()
            memStart++
            continue
        }
        int remaining = Arrays.stream(memory, i + 1 + memStart, 10000).sum() // Money we could win if taken
        int losing = Arrays.stream(memory, memStart, memStart + i).sum() // Money we cna't win if taken
        if (value > losing) { // If we pass, we lose money automatically
            puzzle.take()
            memStart += i + 1
        } else if ((losing - value * 16 / 7) * square(Math.log(i)) > remaining / factor) {
            System.arraycopy(memory, memStart, memory, ++memStart, i)
            puzzle.pass()
        } else {
            puzzle.take()
            memStart += i + 1
        }
    }

    // It's broken down to last three elements
    List values = Arrays.copyOfRange(memory, 10000 - 3, 10000)
    while (!values.contains(puzzle.read())) // Skip values we can't use
        puzzle.pass()
    int value1 = puzzle.read()
    int value2 = puzzle.oracle(1)
    if (value1 == values.max() && (
            values.contains(value2)
            ? (value1 * 2 < values.sum() && values.min() == value2)
            : (value1 < values.min() / 2 + (values - [value1]).max())
            )) {
        puzzle.pass()
    }

    // Finish it
    while (puzzle.i < puzzle.values.size()) {
        puzzle.take()
    }

    puzzle.value as Long
}.sum() / attempts // Sum runs and average

আমি বাকী মানগুলি সম্ভাব্য মানগুলির সাথে তুলনা করি। এই স্ক্রিপ্টটি দ্রুত নয় (1000x সিমুলেশনগুলির প্রতি 1 মিনিট সময় নেয়) ... তবে এটি একই সাথে সিমুলেশনগুলি সম্পাদন করবে।

আমার অ্যালগরিদম কেন কাজ করে সে সম্পর্কে আমার কোনও ধারণা নেই তবে এটি ছিল কেবল পরীক্ষা এবং ত্রুটি: গাণিতিক ক্রিয়াকলাপকে একসাথে লম্পিং করা এবং ধ্রুবকগুলি পরিচালনা করে। স্কোরের ওঠানামা হ্রাস করার প্রয়াসে আমি এটি বর্তমান স্কোরের জন্য 5000x দৌড়েছি (এটি পুনরুক্তির গণনার উপর নির্ভর করে এটি +/- $ 4000)।

এমনকি শেষে ওরাকল ব্যতীত, এটি এখনও পূর্বের ধাঁধাটির জন্য @ অরলপের দ্রবণটি (সবে) পেটানো উচিত ।


7

সি # - 3 803.603 এখন -> 4 804.760 (ওরাকল সহ)

বুটস্ট্র্যাপ কোড

public static class ShuffleExtension
{
    private static Random rng = new Random();  

    public static void Shuffle<T>(this IList<T> list)  
    {  
        int n = list.Count;
        while (n > 1) {  
            n--;  
            int k = rng.Next(n + 1);  
            T value = list[k];  
            list[k] = list[n];  
            list[n] = value;  
        }  
    }
}

public class Puzzle
{
    public List<int> Values = new List<int>(10000);

    public Puzzle()
    {
        for ( int i = 1; i <= 10000; i++ )
        {
            Values.Add(i);
        }
        Values.Shuffle();
    }

    public int i = 0;
    public int value = 0;
    public int max = 0;
    public int nextOracle = 0;

    public void Pass() {
        if ( i >= Values.Count )
            throw new IndexOutOfRangeException();
        i++;
    }

    public void Take() {
        if (i >= Values.Count )
            throw new IndexOutOfRangeException();
        int v = Values[i];
        if (v > max) {
            max = v;
            value += v;
        }
        i++;
    }

    public double oracle(int m) {
    if (m <= 0) { 
        throw new IndexOutOfRangeException();
    }
    if ( i < nextOracle ) {
        throw new IndexOutOfRangeException();
    }
    if ( i + 1 + m > Values.Count ) {
        throw new IndexOutOfRangeException();
    }

    nextOracle = i + m;
    var oracleValues = new List<int>();
    for ( int l = 0; l < m; l++ )
    {
        oracleValues.Add(Values[i + 1 + l]);
    }
    return oracleValues.Average (v => v);
}

    public int Read() {
        if (i >= Values.Count )
            throw new IndexOutOfRangeException();
        return Values[i];
    }
}

গেম কোড:

    void Main()
{
    var m = 0;
    for ( int l = 0; l < 1000; l++ )
    {
        var game = new Puzzle();
        var maxVal = 0;
        var lastOracle = 0;
        var lastOracleValue = 0.0m;
        var oracleValueForIOf = 0;

        for ( int i = 0; i < 10000; i++ )
        {
            var val = game.Read();
            var oracleStep = 1;
            var canUseOracle = (i - lastOracle >= oracleStep) && i + oracleStep + 1 <= 10000;
            if ( canUseOracle )
            {
                var oracle = game.oracle(oracleStep);
                lastOracle = i;
                lastOracleValue = (decimal)oracle;
                oracleValueForIOf = i + 1;
            }
            if ( TakeTheMoney(val, maxVal, oracleValueForIOf, lastOracleValue, i) )
            {
                maxVal = val;
                game.Take();
            }
            else
            {
                game.Pass();
            }
        }
        m += game.value;
    }
    ((int)(m / 1000)).Dump();
}

private bool TakeTheMoney(int val, int maxVal, int oracleValueForIOf, decimal lastOracleValue, int i)
{
    if ( val > maxVal )
    {
        if ( oracleValueForIOf != i + 1
            &&
            (val < 466.7m + (0.9352m * maxVal) + (0.0275m * i))
            )
        {
            return true;
        }

        if (oracleValueForIOf == i + 1)
        {
            if ( val < 466.7m + (0.9352m * maxVal) + (0.0275m * i) )
            {
                return true;
            }
            if ( lastOracleValue > 466.7m + (0.9352m * val) + (0.0275m * i + 1) )
            {
                if ( val < 466.7m + (0.9352m * maxVal) + (0.0275m * i + 1) )
                {
                    return true;
                }
            }
        }
    }
    return false;
}

ক্রেডিট রেটো কোরাডি ( /codegolf//a/54181/30910 ) এর অন্তর্গত

সম্পাদনা করুন: ওরাকলের বেসিক ব্যবহার কার্যকর করা হয়েছে। যদি পরের ওরাকলটি বর্তমান খামটিকে ওরাকল সূচকের সূচকে প্রসারিত করতে প্রান্তিকের উপরে থাকে। এটি প্রায়শই আঘাত করে না তবে এটি একটি উন্নতি ;-)


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

দয়া করে ডাউনভোটিং বন্ধ করুন :) নোট নম্বর 2 আমার জমা দেওয়ার পরে যুক্ত করা হয়েছিল। এবং এটি অন্যান্য সমাধানগুলির চেয়ে কার্যকর হিসাবে - আমি এটি এখানে পোস্ট করেছি। বিদ্যমান সমাধানগুলি বীট করতে ওরাকল ব্যবহার করার দরকার নেই।
স্টিফান শিনকেল

আপনি যদি বর্তমান স্কোরটি উন্নত করতে ওরাকলকে অন্তর্ভুক্ত করতে চান তবে @ স্টেফেনশিন্কেল আপনার আমার উপন্যাস রয়েছে। এমনকি মাত্র $ 1 দ্বারা।
ডোরাস

@ বেটাডেখে ঠিক কি এটিই আবার সম্প্রদায় দ্বারা চিহ্নিত করা হয়েছে? আমি সবেমাত্র বিকল্পটি থেকে প্রশ্নটি অনুসরণ করেছি। আমার জমা দেওয়ার পরে আবার নোট 2 নম্বর যুক্ত করা হয়েছিল।
স্টিফান শিনকেল

কুইজের প্রথম অংশ থেকে কোনও সমাধান ব্যবহার না করা।
স্টিফান শিনকেল 3'15

4

পাইথন - 1 74112

কেবলমাত্র নিন, যদি বর্তমান মান পরবর্তী মানের চেয়ে কম হয় (যেমন আপনি উভয়ই নিতে পারেন)।

def algo():
  try:
    o=oracle(1)
  except ValueError:
    take()
  r=read()
  if r>o:
    passe()
  else:
    take()

পাইথন - (এখনও গড় গণনা করা হচ্ছে)

এই উত্তর গণনা করতে অনেক বেশি সময় নেয়। এটা তোলে প্রায় ছুঁয়েছে 670,000 $ । আমি দেখেছি প্রতিটি খাম মনে আছে। যতবারই আমাকে সিদ্ধান্ত নিতে হয়, আমি অবশিষ্ট খামের দুটি তালিকা উত্পন্ন করি যা আমি আমার মানিব্যাগে সংযুক্ত করতে পারি যদি আমি বর্তমান খামটি গ্রহণ করি বা যথাক্রমে তা রেখে যাই।

আমি কোডটি অপ্টিমাইজ করিনি।

def algo_2():
  global max_taken, past
  weight=0.92 #Empirically chosen.
  r=read()
  if len(past)==0:
    past.append(r)
    passe()
    return
  if r<max_taken:
    past.append(r)
    take() #the same as passe
    return
  coming=[x for x in range(1,10001) if x not in past and x>max_taken and x!=r ]
  comingIfTake=[x for x in range(1,10001) if x not in past and x>r ]
  if sum(coming)*weight<=sum(comingIfTake)+r:
    past.append(r)
    take()
  else:
    past.append(r)
    passe()

এবং init_game এর শুরু হয়:

def init_game():
    global stack, wallet, max_taken, oracle_turns, past
    past=[]

3
আপনি যদি অতীত, আগত এবং আগত আইফটেক উপস্থাপন করতে এবং ছেদগুলি ব্যবহার করার জন্য সেট ব্যবহার করেন তবে আপনার কোডটি আরও দ্রুত হবে।
নাথান মেরিল

4

সি # - 80 780.176

পরবর্তী মানটি বাকী সমস্ত মানের 5% এর নীচে রয়েছে কিনা তা পরীক্ষা করুন। আমরা শেষের সাথে সাথে আরও স্বাচ্ছন্দ্য বজায় রাখি।

public class Taker
{
    private List<int> remaining;
    private Game game;

    public Taker(Game game)
    {
        this.game = game;
        remaining = Enumerable.Range(1, game.Size + 100).ToList();
    }

    int score = 0;

    public int PlayGame()
    {
        for (int i = 0; i < game.Size; i++)
        {
            if (game.Read() < game.Max ||
                game.Read() > selectThreshold() ||
                doOracle()
                )
            {
                remaining.Remove(game.Read());
                game.Pass();
                continue;
            }
            remaining = remaining.SkipWhile(j => j < game.Read()).ToList();
            score += game.Take();
        }
        return score;
    }

    private bool doOracle()
    {
        return game.Oracle(1) < game.Read() &&
            game.Oracle(1) > game.Max;
    }

    private int selectThreshold()
    {
        int selector = (int)(remaining.Count * 0.05);
        return remaining.ElementAt(selector);
    }
}

এবং আমার গেমের ক্লাসটি, খুব কুরুচিপূর্ণ, গেম ক্লাসটি এমনকি ওরাকল অনুমোদিত থাকলেও বৈধতা দেয় না, তবে যেহেতু আমি কেবল ওরাকল (1) ব্যবহার করি যা কোনও সমস্যা হওয়া উচিত নয়।

public class Game
{
    private int[] list;
    private int position = 0;
    private int max = 0;
    public int Max { get { return max; } }
    public int Size { get { return list.Length; } }

    public Game(int[] list)
    {
        this.list = list;
    }

    public int Read()
    {
        return list[position];
    }

    public int Take()
    {
        if (list[position] < max)
        {
            position++;
            return 0;
        }
        max = list[position];
        return list[position++];
    }

    public void Pass()
    {
        position++;
    }

    public int Oracle(int M)
    {
        int next = position + 1;
        M = Math.Max(0, Math.Min(M, list.Length - next));
        return new ArraySegment<int>(list, next, M).Sum();
    }
}

4

জাভা, 4 804,991

স্কোরটি 1001 রাউন্ডের। এই উত্তর এবং স্টিফান শিনকেলের মধ্যে সম্ভবত যোগাযোগের খুব কাছাকাছি ।

এটি পূর্ববর্তী চ্যালেঞ্জের আমার উত্তরের উপর ভিত্তি করে তৈরি হয়েছে, এতে পে-অফগুলি অনুমান করার জন্য এটি একই এনট্রপি-ভিত্তিক গণনা ব্যবহার করে। মূল পার্থক্যটি হ'ল এটি এখন জোড়ায় খামগুলি নিয়ে যায় (1 এবং 2, তারপর 3 এবং 4, ইত্যাদি) এবং গ্রহণ, গ্রহণ, পাস-নেওয়া ইত্যাদির সম্ভাব্য সংমিশ্রণগুলিও দেখে এটি গণনা করে বৈধ খামের সংখ্যা সত্যই কম হলে সঠিক অনুমানযোগ্য স্কোর।

আমি যে "র‍্যাপার" লিখেছি তা সত্যিকারের আসল র‌্যাপার নয়, এটি কেবল Oracle(1)প্রতিটি রাউন্ডে কোনও ফাংশন কল করার পরিবর্তে জোড়াতে খাম দেয় ।

সামগ্রিকভাবে, আমি বলব, বর্ধিত জটিলতা থাকা সত্ত্বেও, এই বটটি আমার আগেরটির চেয়ে সত্যই ভাল নয়।

খেলোয়াড়

import java.lang.Math;
public class Player2
{
    public int[] V;

    public Player2(int s)
    {
        V = new int[s];
        for(int i = 0; i<V.length; i++)
        {
            V[i] = i+1;
        }
        ////System.out.println();
    }

    public boolean [] takeQ(int x, int y)
    {
        //System.out.println("Look: " + x + " " + y);
        boolean [] move = new boolean[]{false,false};
        double max = 0;
        double val = 0;
        int[] nextV = V;

        ////System.out.println("look " + x);
        int i = find(V,x);
        if(i >= 0)  //if found
        {
            //try taking first envelope
            int[] newVt = takeSlice(V,i);
            //System.out.println("  T: " + ats(newVt));
            int j = find(newVt,y);
            if(j >= 0)
            {
                //try taking first and second
                int[] newVtt = takeSlice(newVt,j);
                val = x + y + calcVal(newVtt);
                //System.out.println("  TT: " + ats(newVtt) + " " + val);
                if(val > max)
                {
                    move = new boolean[]{true,true};
                    max = val;
                    nextV = newVtt;
                }
            }
            //try taking first and passing second
            int[] newVtp = passSlice(newVt,j);

            val = x + calcVal(newVtp);
            //System.out.println("  TP: " + ats(newVtp) + " " + val);
            if(val > max)
            {
                move = new boolean[]{true,false};
                max = val;
                nextV = newVtp;
            }
        }
        int[] newVp = passSlice(V,i);
        //System.out.println("  V: " + ats(V));
        //System.out.println("  P: " + ats(newVp));
        int j = find(newVp,y);
        if(j >= 0)
        {
            //try passing first and taking second
            int[] newVpt = takeSlice(newVp,j);
            val = y + calcVal(newVpt);
            //System.out.println("  PT: " + ats(newVpt) + " " + val);
            if(val > max)
            {
                move = new boolean[]{false,true};
                max = val;
                nextV = newVpt;
            }
        }
        //try taking first and passing second
        int[] newVpp = passSlice(newVp,j);

        val = calcVal(newVpp);
        //System.out.println("  PP: " + ats(newVpp) + " " + val);
        if(val > max)
        {
            move = new boolean[]{false,false};
            max = val;
            nextV = newVpp;
        }
        V = nextV;
        //System.out.println("  NEW: " + ats(V));
        return move;
    }

    public static String ats(int [] a)
    {
        String s = "";
        for(int i = 0; i < a.length; i++)
        {
            s += a[i] + ",";
        }
        return s;
    }

    public static int[] takeSlice (int[] list, int loc)
    {
        int [] newlist = new int[list.length - loc - 1];
        for(int j = loc + 1; j < list.length; j++)
        {
            newlist[j - loc - 1] = list[j];
        }
        return newlist;
    }

    public static int[] passSlice (int[] list, int loc)
    {
        int [] newlist = list;
        if(loc >= 0)
        {
            newlist = new int[list.length-1];
            for(int k = 0; k < loc; k++)
            {
                newlist[k] = list[k];
            }
            for(int k = loc + 1; k < list.length; k++)
            {
                newlist[k-1] = list[k];
            }
        }
        return newlist;
    }

    public static double calcVal(int [] list)
    {
        if(list.length < 8)
        {
            for(int i : list)
            {
                ////System.out.print(i + ",");
            }

                ////System.out.println();
            return computeMean(list);

        }
        return smoothEstimate(list);
    }

    public static double computeMean(int[] V)
    {
        if(V.length == 1)
        {
            return V[0];
        }
        else if(V.length > 1)
        {
            double[] Es = new double[V.length];
            for(int i = 0; i < V.length; i++)
            {
                int[] newVp = new int[V.length - 1];
                for(int j = 0; j < i; j++)
                {
                    newVp[j] = V[j];
                }
                for(int j = i + 1; j < V.length; j++)
                {
                    newVp[j-1] = V[j];
                }
                double pass = computeMean(newVp);
                int[] newVt = new int[V.length - i - 1];
                for(int j = i + 1; j < V.length; j++)
                {
                    newVt[j - i - 1] = V[j];
                }
                double take = V[i] + computeMean(newVt);
                if(take > pass)
                {
                    Es[i] = take;
                }
                else
                {
                    Es[i] = pass;
                }
            }
            double sum = 0;
            for(double d : Es)
            {
                sum += d;
            }
            return sum/V.length;
        }
        else
        {
            return 0;
        }
    }

    public static double smoothEstimate(int [] list)
    {
        double total = 0;
        for(int i : list)
        {
            total+=i;
        }
        double ent = 0;
        for(int i : list)
        {
            if(i > 0)
            {
                ent -= i/total * Math.log(i/total);
            }
        }
        ////System.out.println("      total " + total);
        ////System.out.println("      entro " + Math.exp(ent));
        ////System.out.println("      count " + list.length);
        return total * Math.pow(Math.exp(ent),-0.5) * 4.0/3;// * 1.1287 + 0.05284);
    }

    public static int find(int[] list, int search)
    {
        int first  = 0;
        int last   = list.length - 1;
        int middle = (first + last)/2;

        while( first <= last )
        {
            if ( list[middle] < search )
                first = middle + 1;    
            else if ( list[middle] == search )
                break;
            else
                last = middle - 1;

            middle = (first + last)/2;
        }

        if(first > last)
        {
            return -1;
        }
        return middle;
    }
}

নিয়ামক

import java.lang.Math;
import java.util.Random;
import java.util.ArrayList;
import java.util.Collections;
public class Controller2
{
    public static void main(String [] args)
    {
        int size = 10000;
        int rounds = 1001;
        ArrayList<Integer> results = new ArrayList<Integer>();
        for(int round = 0; round < rounds; round++)
        {
            int[] envelopes = new int[size];
            for(int i = 0; i<envelopes.length; i++)
            {
                envelopes[i] = i+1;
            }
            shuffleArray(envelopes);
            Player2 p = new Player2(size);
            int cutoff = 0;
            int winnings = 0;
            for(int i = 0; i<envelopes.length; i+=2)
            {
                boolean [] take = p.takeQ(envelopes[i],envelopes[i+1]);
                if(take[0] && envelopes[i] >= cutoff)
                {
                    winnings += envelopes[i];
                    cutoff = envelopes[i];
                }
                if(take[1] && envelopes[i+1] >= cutoff)
                {
                    winnings += envelopes[i+1];
                    cutoff = envelopes[i+1];
                }
            }
            results.add(winnings);
        }
        Collections.sort(results);
        System.out.println(rounds + " rounds, median is " + results.get(results.size()/2));

    }

    //stol... I mean borrowed from http://stackoverflow.com/questions/1519736/random-shuffling-of-an-array
    static void shuffleArray(int[] ar)
    {
        Random rnd = new Random();
        for (int i = ar.length - 1; i > 0; i--)
        {
            int index = rnd.nextInt(i + 1);
            // Simple swap
            int a = ar[index];
            ar[index] = ar[i];
            ar[i] = a;
        }
    }
}

বিটকয়েন ঠিকানা: 1BVBs9ZEP8YY4EpV868nxi2R23YfL7hdMq


3

পাইথন 3 - 15 615570

আসলে ওরাকল ব্যবহার করে না ... এহ :)

def algo():
    global prevs

    try:
        prevs.append(read())
    except NameError:
        prevs = [read()]

    if len(prevs) > 10000:
        prevs = [prevs[-1]]

    if read() < round(len(prevs),-1):
        take()
    else:
        passe()

পূর্ববর্তী সমস্ত খামগুলির একটি তালিকা তৈরি করে এবং পরীক্ষা করুন যে বর্তমান খামটি 10 ​​খামের ইনক্রিমেন্টে পূর্ববর্তী খামগুলির সংখ্যার তুলনায় কম কিনা।


0

পাইথন, 87,424

এখানে একটি সরল এবং সহজ অ্যালগরিদম, ভাগ্যবান সাত।

def LuckyNumber7():
Test = read()
if "7" in str(Test):
    take()
else:
    passe()

test(LuckyNumber7)

মূলত এটি যা করে তা হ'ল এটি পাঠকে (স্ট্রিং) রূপান্তর করে এবং এর মধ্যে সাতটি আছে কিনা তা পরীক্ষা করে if যদি থাকে তবে এটি খামটি নেয়। যদি না হয়, এটি পাস করে।

এটির গড় গড় ৮১,০০০, আমি ট্র্যাক রাখছি না।


সুতরাং এটি দেখায় যে ভাগ্যের উপর নির্ভর করা কোনও সফল কৌশল নয়? ;)
রেটো কোরাডি

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