Mang nó hoặc rời khỏi nó II: Một game Show cho máy tính


20

Đây là phần thứ hai trong một loạt các câu đố mà tôi sẽ đăng vào mỗi thứ Hai tại Midnight PST. Câu đố đầu tiên được đặt ở đây .

Bối cảnh:

Một tỷ phú ẩn dật đã tạo ra một game show để thu hút các lập trình viên giỏi nhất và sáng giá nhất thế giới. Vào thứ Hai vào lúc nửa đêm, anh ấy chọn một người trong nhóm ứng viên làm thí sinh của tuần và cung cấp cho họ một trò chơi. Bạn là thí sinh may mắn tuần này!

Trò chơi tuần này:

Máy chủ cung cấp cho bạn quyền truy cập API vào một chồng 10.000 phong bì kỹ thuật số. Những phong bì này được sắp xếp ngẫu nhiên và chứa trong chúng một giá trị đô la, từ 1 đến 10.000 đô la (không có hai phong bì chứa cùng một giá trị đô la).

Bạn có 4 lệnh theo ý của bạn:

  1. Đọc (): Đọc số đô la trong phong bì ở đầu ngăn xếp.

  2. Lấy (): Thêm hình đô la trong phong bì vào ví chương trình trò chơi của bạn và bật phong bì ra khỏi ngăn xếp.

  3. Pass (): Bật tắt phong bì trên đỉnh của ngăn xếp.

  4. Oracle (M): Trả về giá trị trung bình của các phong bì M tiếp theo trong ngăn xếp, không bao gồm giá trị hiện tại bạn có thể đọc ().

Những quy định:

  1. Nếu bạn sử dụng Pass () trên một phong bì, tiền trong đó sẽ bị mất vĩnh viễn.

  2. Nếu bạn sử dụng Take () trên một phong bì chứa $ X, từ thời điểm đó trở đi, bạn không bao giờ có thể sử dụng Take () trên một phong bì chứa <$ X. Lấy () trên một trong những phong bì này sẽ thêm $ 0 vào ví của bạn.

  3. Nếu bạn sử dụng Oracle (M) trên lượt T, phong bì có nghĩa là T + 1 đến T + M sẽ được trả về. Oracle () bị vô hiệu hóa cho đến khi bật T + M.

Viết một thuật toán kết thúc trò chơi với số tiền tối đa.

Nếu bạn đang viết thuật toán của mình bằng Python, vui lòng sử dụng bộ điều khiển này được cung cấp bởi @Maltysen: https://gist.github.com/livinginif/70ae3f2a57ecba4387b5

Lưu ý 1: "Tối đa" trong trường hợp này có nghĩa là giá trị trung bình trong ví của bạn sau khi N> = 1000 chạy. Tôi hy vọng, mặc dù tôi rất muốn được chứng minh là sai, rằng giá trị trung bình cho một thuật toán nhất định sẽ hội tụ khi N tăng lên vô cùng. Thay vào đó, hãy cố gắng tối đa hóa giá trị trung bình, nhưng tôi có cảm giác rằng giá trị trung bình có nhiều khả năng bị bỏ đi bởi một N nhỏ hơn so với trung bình.

Lưu ý 2: vì tất cả các giải pháp cho phần trước của câu đố này đều hợp lệ ở đây, việc đăng lại chúng có rất ít giá trị. Chỉ cải thiện thuật toán của các câu đố trước sẽ được xem xét cho phần II.

Chỉnh sửa: Điều kiện giải thưởng đã bị xóa, trong bài đăng này trên meta.


Ồ, tôi không thể tin rằng mình ngủ quên: O
Beta Decay

@Beta Decay đồng hồ đang tích tắc! :)
Thông tin sinh hoạt

Ý nghĩa của rracle là gì? Bạn có thể xây dựng nhà tiên tri miễn phí của riêng mình bằng cách chỉ cần kiểm đếm tất cả các phong bì đã đọc trước đó. Tôi đang làm gì sai?
Luis Mendo

1
@LuisMendo Với kiểm đếm của riêng bạn, bạn chỉ có thể biết giá trị trung bình của tất cả các giá trị còn lại. Với lời tiên tri, bạn có thể lấy Mgiá trị trung bình của các giá trị tiếp theo , nơi bạn có thể chọn M.
Reto Koradi

1
Vì tất cả các giải pháp cho thử thách trước đó của bạn cũng là giải pháp hợp lệ cho thử thách này, chúng tôi có thể xem xét chúng được gửi ngầm không?
Reto Koradi

Câu trả lời:


9

Groovy $ 713337 $ 817829 $ 818227

Mã bootstrap:

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]
    }
}

Thuật toán

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

Tôi so sánh các giá trị còn lại với các giá trị có thể. Kịch bản này không nhanh (mất 1 phút trên 1000 lần mô phỏng) ... nhưng nó sẽ thực hiện mô phỏng đồng thời.

Tôi không biết tại sao thuật toán của tôi hoạt động, nhưng đó chỉ là thử nghiệm và lỗi: gộp các hoạt động toán học lại với nhau và thao tác các hằng số. Tôi đã chạy 5000x cho điểm số hiện tại, trong nỗ lực giảm dao động của điểm số (đó là +/- $ 4000 tùy thuộc vào số lần lặp).

Ngay cả khi không có lời sấm truyền ở cuối, nó vẫn nên (hầu như) đánh bại giải pháp của @ orlp cho câu đố trước.


7

C # - $ 803.603 ngay bây giờ -> $ 804,760 (có lời tiên tri)

Mã Bootstrap

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];
    }
}

Mã trò chơ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;
}

Tín dụng thuộc về Reto Koradi ( /codegolf//a/54181/30910 )

Chỉnh sửa: Sử dụng cơ bản của Oracle thực hiện. Nếu nhà tiên tri tiếp theo vượt quá ngưỡng để sử dụng, hãy mở rộng đường bao hiện tại đến chỉ mục của Chỉ mục Oracle. Điều này không xảy ra thường xuyên nhưng CNTT là một cải tiến ;-)


4
Tôi không nghĩ sẽ rất hữu ích khi đăng lại các giải pháp từ thử thách trước đó. Tất cả chúng ta đều nhận ra rằng những giải pháp đó có thể được sử dụng làm cơ sở cho thách thức này và tôi đã để lại một bình luận cho OP hỏi chúng ta nên xử lý vấn đề đó như thế nào. Ý tưởng là bạn đưa ra giải pháp của riêng bạn, lý tưởng hơn là giải pháp cho thử thách trước đó.
Reto Koradi

xin vui lòng ngừng tải xuống :) lưu ý số 2 đã được thêm sau khi tôi gửi. và vì nó hiệu quả hơn các giải pháp khác - tôi đã đăng nó ở đây. không cần sử dụng lời tiên tri để đánh bại các giải pháp hiện có.
Stephan Schinkel

@StephanSchinkel Bạn có upvote của tôi nếu bạn quản lý để bao gồm Oracle để cải thiện điểm số hiện tại. Thậm chí chỉ bằng 1 đô la.
Dorus

@BetaDecay chính xác thì cái gì lại bị cộng đồng cau mày? Tôi chỉ làm theo câu hỏi từ op. Một lần nữa Lưu ý số 2 đã được thêm vào SAU khi tôi gửi.
Stephan Schinkel

Để không sử dụng một giải pháp từ phần I của bài kiểm tra.
Stephan Schinkel

4

Con trăn - $ 74112

Chỉ lấy, nếu giá trị hiện tại thấp hơn giá trị tiếp theo (tức là bạn có thể lấy cả hai).

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

Python - (vẫn đang tính giá trị trung bình)

Câu trả lời này mất RẤT DÀI để tính toán. Nó đạt khoảng 670.000 $ . Tôi nhớ từng phong bì tôi thấy. Mỗi lần tôi phải đưa ra quyết định, tôi tạo ra hai danh sách các phong bì còn lại mà tôi có khả năng có thể thêm vào ví của mình nếu tôi lấy phong bì hiện tại hoặc để lại tương ứng.

Tôi đã không tối ưu hóa mã.

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()

Và init_game bắt đầu như thế này:

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

3
Nếu bạn sử dụng các bộ để thể hiện quá khứ, sắp tới và đến IfTake và sử dụng các giao điểm, mã của bạn sẽ nhanh hơn nhiều.
Nathan Merrill

4

C # - $ 780.176

Kiểm tra xem giá trị tiếp theo có nằm trong 5% thấp hơn của tất cả các giá trị còn lại không. Hãy thư giãn hơn khi chúng ta đi đến cuối cùng.

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);
    }
}

Và lớp trò chơi của tôi, rất xấu, lớp trò chơi thậm chí không xác nhận nếu oracle được cho phép, nhưng vì tôi chỉ sử dụng Oracle (1) nên không phải là vấn đề.

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

Java, $ 804,991

Điểm số là từ 1001 vòng. Có lẽ quá gần để gọi giữa câu trả lời này và của Stephan Schinkel .

Điều này dựa trên câu trả lời của tôi trong thử thách trước đó, ở chỗ nó sử dụng phép tính dựa trên entropy tương tự để ước tính số tiền chi trả. Sự khác biệt chính là bây giờ đơn giản chỉ cần lấy phong bì theo cặp (1 & 2, sau đó là 3 & 4, v.v.) và xem xét các kết hợp có thể có của Take-Take, Take-pass, pass-Take, v.v. Nó cũng tính toán điểm ước tính chính xác khi số lượng phong bì hợp lệ là rất nhỏ.

"Trình bao bọc" mà tôi đã viết không thực sự là một trình bao bọc thực sự, nó chỉ cung cấp các phong bì theo cặp thay vì gọi một Oracle(1)chức năng mỗi vòng khác.

Nhìn chung, tôi sẽ nói rằng, mặc dù độ phức tạp tăng lên, bot này thực sự không tốt hơn so với trước đây của tôi.

Người chơi

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;
    }
}

Bộ điều khiển

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;
        }
    }
}

Địa chỉ bitcoin: 1BVBs9ZEP8YY4EpV868nxi2R23YfL7hdMq


3

Con trăn 3 - $ 615570

Không thực sự sử dụng lời sấm truyền ... Eh :)

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()

Xây dựng một danh sách tất cả các phong bì trước đó và kiểm tra xem phong bì hiện tại có nhỏ hơn số lượng phong bì trước đó trong 10 lần tăng phong bì không.


0

Con trăn, 87.424

Đây là một thuật toán đơn giản và dễ dàng, bảy may mắn.

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

test(LuckyNumber7)

Về cơ bản những gì nó làm là nó chuyển đổi read () thành một chuỗi và kiểm tra xem có bảy trong chuỗi đó không. Nếu có, nó lấy phong bì. Nếu không, nó vượt qua nó.

Trung bình khoảng 81.000, tôi đã không theo dõi.


Vì vậy, điều này cho thấy dựa vào may mắn không phải là một chiến lược thành công? ;)
Reto Koradi

@RetoKoradi Yep: D
The_Basset_Hound
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.