অদ্ভুত মুদ্রা সহ একটি অপ্টিমাইজেশন চ্যালেঞ্জ


17

আপনার কাছে nকয়েন যা প্রতিটি পারেন তৌল করা -1 বা 1. প্রতিটি থেকে লেবেল করা 0থেকে n-1যাতে আপনি কয়েন আলাদা করে বলতে পারবেন না। আপনার পাশাপাশি একটি (যাদু) ওজনযুক্ত ডিভাইস রয়েছে। প্রথম দিকে আপনি ওজন ডিভাইসে আপনার পছন্দ মতো অনেকগুলি কয়েন রাখতে পারেন যা নেতিবাচক এবং ধনাত্মক উভয় ওজনকেই মাপতে সক্ষম এবং এটি আপনাকে কতটা ওজনের ঠিক তা বলে দেবে।

যাইহোক, ওজন ডিভাইস সম্পর্কে সত্যিই অদ্ভুত কিছু আছে। আপনি যদি x_1, x_2, ..., x_jপ্রথমবার ডিভাইসে কয়েন রাখেন, তবে পরের বার আপনাকে (x_1+1), (x_2+1) , ..., (x_j+1)ব্যতিক্রম সহ স্কেলতে কয়েন রাখতে হবে যে আপনি অবশ্যই এর চেয়ে বেশি সংখ্যক মুদ্রা রাখতে পারবেন না n-1। শুধু তাই নয়, প্রতিটি নতুন ওজনের জন্য আপনি যদি স্কেলতেও মুদ্রা 0রাখতে চান তবে তা চয়ন করতে পারেন ।

এই নিয়মের অধীনে, সর্বনিম্ন ওজনের সংখ্যাটি কী যা সর্বদা আপনাকে জানায় যে কোন মুদ্রার ওজন 1 এবং কোনটির ওজন -1?

স্পষ্টতই আপনি 0প্রথম বারে কেবলমাত্র ডিভাইসে মুদ্রা রাখতে পারেন এবং তারপরে nসমস্যাটি সমাধান করতে ঠিক ওজন নিতে হবে ।

ভাষা ও গ্রন্থাগার

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

স্কোর

কোনও প্রদত্ত ক্ষেত্রে nআপনার স্কোরটি nসবচেয়ে খারাপ ক্ষেত্রে আপনার প্রয়োজন ওজনের সংখ্যা দ্বারা বিভক্ত। উচ্চতর স্কোরগুলি আরও ভাল। এই ধাঁধাতে কোনও ইনপুট নেই তবে আপনার লক্ষ্যটি এমন একটি সন্ধান nকরা যার জন্য আপনি সর্বোচ্চ স্কোর পেতে পারেন।

যদি টাই থাকে তবে প্রথম উত্তরটি জিতবে। অত্যন্ত অসম্ভব পরিস্থিতিতে যেখানে কেউ অসীম স্কোর পাওয়ার জন্য কোনও উপায় খুঁজে পায়, সেই ব্যক্তি তত্ক্ষণাত জয়ী হন।

কার্য

আপনার টাস্কটি কেবল কোডটি লেখাই যা সর্বোচ্চ স্কোর পায়। আপনার কোড উভয়ই চতুরতার সাথে একটি এন নির্বাচন করতে হবে এবং তারপরে ওজনের সংখ্যাও অনুকূলিত করবে n

নেতৃস্থানীয় এন্ট্রি

  • পাইথনে 4/3 7/5 সার্জে বর্শ্চ দ্বারা
  • 26/14 জাভাতে পিটার টেলর লিখেছেন

8
আমি কিছু গ্র্যাভিটি বিরোধী কয়েনের উপর হাত পেতে চাই love
mbomb007

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

1
পাশাপাশি, একটি পার্শ্ব নোট হিসাবে, এটি লিখতে ভাল হতে পারে "আপনি যদি খ এর মাধ্যমে কয়েনগুলি ওজন করেন, তবে পরের বার আপনাকে বি + 1 এর মাধ্যমে একটি + 1 করতে হবে" (সম্ভবত 'কমপক্ষে'ও ফেলে দেওয়া হবে, এবং আরও ভাল ফর্ম্যাটিং) মুদ্রার নম্বরটি বোঝায় সাবস্ক্রিপ্টগুলির পরিবর্তে। এটি দেখে মনে হয় এটি মুদ্রার পরিবর্তে এটি মুদ্রার কিছু সম্পত্তি বা পরিমাণ _।
ফান্ড মনিকার লসুইট

1
@ mbomb007 প্রতিটি ওজনে আপনি মুদ্রা 0 ওজনের পাশাপাশি আপনার ওজন করা অন্যান্য সমস্ত কয়েন বেছে নিতে পারেন। অন্য কথায়, আপনার নিজের প্রতিটি ওজনের জন্য নতুন পছন্দ রয়েছে have

3
@ mbomb007 @QPaysTaxes স্বরলিপি সম্পর্কিত x_i: আমাদের উদাহরণস্বরূপ প্রথম (x_1, x_2, x_3) = (3, 2, 7) ওজন হতে পারে এবং তারপরে দ্বিতীয় ওজন হয় (4, 3, 8) বা ( 0, 4, 3, 8)। মুদ্রা লেবেল পরপর প্রয়োজন হবে না, এবং সূচক iমধ্যে x_iমুদ্রা লেবেল পড়ুন না।
মিচ শোয়ার্জ

উত্তর:


3

সি ++, স্কোর 23/12 25/13 27/14 28/14 = 2 31/15

এই সমস্যার সমাধান হিসাবে ম্যাট্রিক্স সম্পত্তি এক্স এর পুনর্বিবেচিত (বা এক্স অফ জয়) এর সমাধানগুলি সরাসরি ব্যবহারযোগ্য। যেমন 31 সারি 15 কলামের সমাধান:

1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 1 1 1 0 1 1 0 
1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 1 1 1 0 1 1 
1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 1 1 1 0 1 
1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 1 1 1 0 
1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 1 1 1 
0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 1 1 
0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 1 
1 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 
0 1 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 
0 0 1 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 0 
0 0 0 1 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 
1 0 0 0 1 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 
0 1 0 0 0 1 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 
0 0 1 0 0 0 1 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 
1 0 0 1 0 0 0 1 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 

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

পরিমাপের প্রতিটি প্রকৃত সেট কিছু 0/1ম্যাট্রিক্স দ্বারা বর্ণিত হতে পারে । এমনকি যদি কিছু কলাম একই ভেক্টরগুলিতে সমষ্টি নির্ধারণ করে তবে এটি এমনও হতে পারে যে প্রার্থীর সমাধান মুদ্রার মানগুলির লক্ষণগুলি এই জাতীয় সেটটির সাথে ঠিক মিল নয় correspond সুতরাং আমি জানি না উপরের মতো ম্যাট্রিকগুলি অনুকূল কিনা if তবে কমপক্ষে তারা নিম্ন সীমা সরবরাহ করে। সুতরাং 31 টি কয়েন কম করা যায় যে 15 টি পরিমাপ এখনও খোলা আছে possibility

লক্ষ্য করুন যে এটি কেবলমাত্র অ স্থির কৌশল হিসাবে সত্য যেখানে আপনার 0আইশের উপর মুদ্রা রাখার সিদ্ধান্তটি পূর্ববর্তী ওজনগুলির ফলাফলের উপর নির্ভর করে। অন্যথায় আপনার সমাধান হবে যেখানে মুদ্রার চিহ্নগুলি একই কলামের সমষ্টিযুক্ত সেটের সাথে মিল রাখে।


বর্তমান বিশ্ব রেকর্ড :)

আপনার কম্পিউটারটি অনুমান করে কত দ্রুত 2 তে উঠতে হবে?

@ ল্যাম্বিক আমি নিশ্চিত না যে 2 টি সম্ভব is কেন জানি না, তবে বর্তমান ফলাফলগুলি বলে যে আপনি কেবল 2
টির

আমি যা দিয়েছি 25 টি 50 দ্বারা প্রচারিত ম্যাট্রিক্স যা 2 দিতে হবে তা যাচাই করার সুযোগ পেয়েছেন? 01011011100010111101000001100111110011010100011010 একটি সার্কুল্যান্ট ম্যাট্রিক্সের প্রথম সারি হিসাবে।

আমি জানি না যে কীভাবে কোনও ডেডিকেটেড প্রোগ্রাম না
লিখেও

5

পাইথন 2, স্কোর = 1.0

এটি সহজ স্কোর, যদি কেউ আরও ভাল স্কোর না পায় (সন্দেহজনক)। nপ্রতিটি জন্য ওজন n

import antigravity
import random

def weigh(coins, indices):
    return sum(coins[i] for i in indices)

def main(n):
    coins = [random.choice([-1,1]) for i in range(n)]
    for i in range(len(coins)):
        print weigh(coins, [i]),

main(4)

আমি আমদানি করেছি antigravityযাতে প্রোগ্রামটি নেতিবাচক ওজন নিয়ে কাজ করতে পারে।


খুব উপকারী. আপনাকে ধন্যবাদ :)

আমদানি করা antigravityকি মূলত কোনও অপ-অপ, তাই না?
নাম প্রদর্শন করুন

@ সার্জবার্চ এই প্রোগ্রামটির প্রয়োজনে এটি। তবে এটি আসলে কিছু করে।
mbomb007

5

স্কোর = 26/14 ~ = 1.857

import java.util.*;

public class LembikWeighingOptimisation {

    public static void main(String[] args) {
        float best = 0;
        int opt = 1;
        for (int n = 6; n < 32; n+=2) {
            long start = System.nanoTime();
            System.out.format("%d\t", n);
            opt = optimise(n, n / 2 + 1);
            float score = n / (float)opt;
            System.out.format("%d\t%f", opt, score);
            if (score > best) {
                best = score;
                System.out.print('*');
            }
            System.out.format(" in %d seconds", (System.nanoTime() - start) / 1000000000);
            System.out.println();
        }
    }

    private static int optimise(int numCoins, int minN) {
        MaskRange.N = numCoins;
        Set<MaskRange> coinSets = new HashSet<MaskRange>();
        coinSets.add(new MaskRange(0, 0));

        int allCoins = (1 << numCoins) - 1;

        for (int n = minN; n < numCoins; n++) {
            for (int startCoins = 1; startCoins * 2 <= numCoins; startCoins++) {
                for (int mask = (1 << startCoins) - 1; mask < (1 << numCoins); ) {
                    // Quick-reject: in n turns, do we cover the entire set?
                    int qr = (1 << (n-1)) - 1;
                    for (int j = 0; j < n; j++) qr |= mask << j;
                    if ((qr & allCoins) == allCoins && canDistinguishInNTurns(mask, coinSets, n)) {
                        System.out.print("[" + Integer.toBinaryString(mask) + "] ");
                        return n;
                    }

                    // Gosper's hack to update
                    int c = mask & -mask;
                    int r = mask + c;
                    mask = (((r^mask) >>> 2) / c) | r;
                }
            }
        }

        return numCoins;
    }

    private static boolean canDistinguishInNTurns(int mask, Set<MaskRange> coinsets, int n) {
        if (n < 0) throw new IllegalArgumentException("n");
        int count = 0;
        for (MaskRange mr : coinsets) count += mr.size();
        if (count <= 1) return true;
        if (n == 0) return false;

        // Partition.
        Set<MaskRange>[] p = new Set[Integer.bitCount(mask) + 1];
        for (int i = 0; i < p.length; i++) p[i] = new HashSet<MaskRange>();
        for (MaskRange range : coinsets) range.partition(mask, p);

        for (int d = 0; d < 2; d++) {
            boolean ok = true;
            for (Set<MaskRange> s : p) {
                if (!canDistinguishInNTurns((mask << 1) + d, s, n - 1)) {
                    ok = false;
                    break;
                }
            }

            if (ok) return true;
        }

        return false;
    }

    static class MaskRange {
        public static int N;
        public final int mask, value;

        public MaskRange(int mask, int value) {
            this.mask = mask;
            this.value = value & mask;
            if (this.value != value) throw new IllegalArgumentException();
        }

        public int size() {
            return 1 << (N - Integer.bitCount(mask));
        }

        public void partition(int otherMask, Set<MaskRange>[] p) {
            otherMask &= (1 << N) - 1;

            int baseline = Integer.bitCount(value & otherMask);
            int variables = otherMask & ~mask;
            int union = mask | otherMask;
            partitionInner(value, union, variables, baseline, p);
        }

        private static void partitionInner(int v, int m, int var, int baseline, Set<MaskRange>[] p) {
            if (var == 0) {
                p[baseline].add(new MaskRange(m, v));
            }
            else {
                int lowest = var & (1 + ~var);
                partitionInner(v,          m, var & ~lowest, baseline, p);
                partitionInner(v | lowest, m, var & ~lowest, baseline + 1, p);
            }
        }

        @Override
        public String toString() {
            return String.format("(x & %x = %x)", mask, value);
        }
    }
}

হিসাবে সংরক্ষণ করুন, হিসাবে LembikWeighingOptimisation.javaসংকলন, হিসাবে javac LembikWeighingOptimisation.javaচালানো java LembikWeighingOptimisation

মিচ শোয়ার্জকে দ্রুত-প্রত্যাখ্যানের প্রথম সংস্করণে একটি বাগ নির্দেশ করার জন্য অনেক ধন্যবাদ ।

এটি কিছু মোটামুটি বেসিক কৌশল ব্যবহার করে যা আমি দৃor়ভাবে ন্যায়সঙ্গত করতে পারি না। এটি নষ্ট করে দেয় - তবে কেবলমাত্র কয়েনের অর্ধেকের বেশি ব্যবহার করে ওজন পরিচালনা শুরু করতে: সিকোয়েন্সগুলি যেগুলি অর্ধেকের বেশি কয়েন ব্যবহার করে তা পরিপূরক ওজনের সরাসরি স্থানান্তরযোগ্য নয় (কারণ আমরা মোট ওজন জানি না), তবে হ্যান্ড-ওয়েভাই লেভেলে প্রায় একই পরিমাণের তথ্য থাকতে হবে। এটি জড়িত মুদ্রার সংখ্যার ক্রম অনুসারে ওজন শুরু করার মাধ্যমে পুনরুক্তি করে, সেই ভিত্তিতে এটি ছড়িয়ে পড়া ওজনকে (যা আশা করি তুলনামূলকভাবে প্রথম দিকে শীর্ষ প্রান্ত সম্পর্কে তথ্য দেয়) প্রথমে একটি গুচ্ছের মাধ্যমে ক্রল না করে যা ঘন সাবসেট দিয়ে শুরু হয় which নীচের প্রান্ত।

MaskRangeবর্গ মেমোরি ব্যবহার পরিপ্রেক্ষিতে পূর্ববর্তী সংস্করণ উপর ব্যাপক উন্নতি, এবং একটি বোতলের হওয়া থেকে জিসি সরিয়ে ফেলা হয়।

20      [11101001010] 11        1.818182* in 5364 seconds
22      [110110101000] 12       1.833333* in 33116 seconds
24      [1000011001001] 13      1.846154* in 12181 seconds                                                                                                            
26      [100101001100000] 14    1.857143* in 73890 seconds  

আপনি কি অবশ্যই 12/7 পাবেন না? আমি বেশ নিশ্চিত যে কাজ করে। এছাড়াও, 19/10 সম্পর্কে কীভাবে? আমি ভেবেছিলাম আমার কোড আমাকে একবার দিয়েছে তবে আমি এখন এটি পুনরুত্পাদন করতে পারি না।

@ ল্যাম্বিক, আমি 12/7 তালিকাভুক্ত করেছি, তবে 19 এর মধ্যে আমি সবচেয়ে ভাল করতে পারি তা 19/11।
পিটার টেলর

ওহ হ্যাঁ দুঃখিত আপনার হিউরিস্টিক কিছু সমাধান দূরে নিক্ষেপ করা সম্ভব? আমি বেশ নিশ্চিত যে 19/10-তেও কাজ করা উচিত।

এটি সম্ভব , হ্যাঁ, যদি একমাত্র সমাধানটির অর্ধেকেরও বেশি কয়েনের সাথে প্রাথমিক ওজন হয়। যদিও আমি মৃদুভাবে অবাক হব।
পিটার টেলর

এটি অর্ধেকের প্রান্তিকের চেয়ে অর্ধেকের চেয়ে সামান্য-বেশি-অর্ধেক বাড়ানো কি কেবল দেখার জন্য?

2

পাইথন 3, স্কোর = 4/3 = 1.33… (এন = 4) স্কোর = 1.4 (এন = 7)

আপডেট: "স্থিতিশীল" সলভার সেটগুলিতে ব্রুট-ফোর্স অনুসন্ধান কার্যকর করা হয়েছে এবং একটি নতুন ফলাফল পেয়েছে

আমি মনে করি গতিশীল সমাধানকারীদের অনুসন্ধান করে এটি আরও উন্নত করা যেতে পারে, যা আরও সিদ্ধান্তের জন্য ভারী ফলাফল ব্যবহার করতে পারে।

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

এটি কীভাবে কাজ করে তা পরিষ্কার না থাকলে প্রশ্ন জিজ্ঞাসা করতে নির্দ্বিধায় ...

#!/usr/bin/env python3
import itertools
from functools import partial


def get_all_possible_coinsets(n):
    return tuple(itertools.product(*itertools.repeat((-1, 1), n)))


def weigh(coinset, indexes_to_weigh):
    return sum(coinset[x] for x in indexes_to_weigh)


# made_measurements: [(indexes, weight)]
def filter_by_measurements(coinsets, made_measurements):
    return filter(lambda cs: all(w == weigh(cs, indexes) for indexes, w in made_measurements), coinsets)


class Position(object):
    def __init__(self, all_coinsets, coinset, made_measurements=()):
        self.all_coinsets = all_coinsets
        self.made_measurements = made_measurements
        self.coins = coinset

    def possible_coinsets(self):
        return tuple(filter_by_measurements(self.all_coinsets, self.made_measurements))

    def is_final(self):
        possible_coinsets = self.possible_coinsets()
        return (len(possible_coinsets) == 1) and possible_coinsets[0] == self.coins

    def move(self, measurement_indexes):
        measure_result = (measurement_indexes, weigh(self.coins, measurement_indexes))
        return Position(self.all_coinsets, self.coins, self.made_measurements + (measure_result,))


def get_all_start_positions(coinsets):
    for cs in coinsets:
        yield Position(coinsets, cs)


def average(xs):
    return sum(xs) / len(xs)


class StaticSolver(object):
    def __init__(self, measurements):
        self.measurements = measurements

    def choose_move(self, position: Position):
        index = len(position.made_measurements)
        return self.measurements[index]

    def __str__(self, *args, **kwargs):
        return 'StaticSolver({})'.format(', '.join(map(lambda x: '{' + ','.join(map(str, x)) + '}', self.measurements)))

    def __repr__(self):
        return str(self)


class FailedSolver(Exception):
    pass


def test_solvers(solvers, start_positions, max_steps):
    for solver in solvers:
        try:
            test_results = tuple(map(partial(test_solver, solver=solver, max_steps=max_steps), start_positions))
            yield (solver, max(test_results))
        except FailedSolver:
            continue


def all_measurement_starts(n):
    for i in range(1, n + 1):
        yield from itertools.combinations(range(n), i)


def next_measurement(n, measurement, include_zero):
    shifted = filter(lambda x: x < n, map(lambda x: x + 1, measurement))
    if include_zero:
        return tuple(itertools.chain((0,), shifted))
    else:
        return tuple(shifted)


def make_measurement_sequence(n, start, zero_decisions):
    yield start
    m = start
    for zero_decision in zero_decisions:
        m = next_measurement(n, m, zero_decision)
        yield m


def measurement_sequences_from_start(n, start, max_steps):
    continuations = itertools.product(*itertools.repeat((True, False), max_steps - 1))
    for c in continuations:
        yield tuple(make_measurement_sequence(n, start, c))


def all_measurement_sequences(n, max_steps):
    starts = all_measurement_starts(n)
    for start in starts:
        yield from measurement_sequences_from_start(n, start, max_steps)


def all_static_solvers(n, max_steps):
    return map(StaticSolver, all_measurement_sequences(n, max_steps))


def main():
    best_score = 1.0
    for n in range(1, 11):
        print('Searching with N = {}:'.format(n))
        coinsets = get_all_possible_coinsets(n)
        start_positions = tuple(get_all_start_positions(coinsets))


        # we are not interested in solvers with worst case number of steps bigger than this
        max_steps = int(n / best_score)

        solvers = all_static_solvers(n, max_steps)
        succeeded_solvers = test_solvers(solvers, start_positions, max_steps)

        try:
            best = min(succeeded_solvers, key=lambda x: x[1])
        except ValueError:  # no successful solvers
            continue
        score = n / best[1]
        best_score = max(score, best_score)
        print('{}, score = {}/{} = {}'.format(best, n, best[1], score))
    print('That\'s all!')


def test_solver(start_position: Position, solver, max_steps):
    p = start_position
    steps = 0
    try:
        while not p.is_final():
            steps += 1
            if steps > max_steps:
                raise FailedSolver
            p = p.move(solver.choose_move(p))
        return steps
    except IndexError:  # solution was not found after given steps — this solver failed to beat score 1
        raise FailedSolver


if __name__ == '__main__':
    main()

আউটপুট:

Searching with N = 1:
(StaticSolver({0}), 1), score = 1/1 = 1.0
Searching with N = 2:
(StaticSolver({0}, {0,1}), 2), score = 2/2 = 1.0
Searching with N = 3:
(StaticSolver({0}, {0,1}, {0,1,2}), 3), score = 3/3 = 1.0
Searching with N = 4:
(StaticSolver({0,1}, {1,2}, {0,2,3}, {0,1,3}), 3), score = 4/3 = 1.3333333333333333
Searching with N = 5:
Searching with N = 6:
Searching with N = 7:
(StaticSolver({0,2}, {0,1,3}, {0,1,2,4}, {1,2,3,5}, {0,2,3,4,6}), 5), score = 7/5 = 1.4
Searching with N = 8:
Searching with N = 9:
(I gave up waiting at this moment)

এই লাইনটি (StaticSolver({0,2}, {0,1,3}, {0,1,2,4}, {1,2,3,5}, {0,2,3,4,6}), 5), score = 7/5 = 1.4পাওয়া সেরা সমাধানকারীটিকে উন্মোচিত করে। {}ধনুর্বন্ধনী মধ্যে সংখ্যা হ'ল প্রতিটি পদক্ষেপে ওজন ডিভাইস রাখা কয়েন সূচক।


4
পিএস আমি এটি লিখেছিলাম যখন আমার বাড়ির বিদ্যুতের উত্সটি নষ্ট হয়ে গিয়েছিল, তাই আমার কাছে ব্যাটারি পাওয়ারের সাথে একটি ল্যাপটপ ছিল এবং কোনও ইন্টারনেট সংযোগ ছিল না, এবং কিছু ধাঁধা ফাটানোর চেয়ে আমার আর ভাল কিছু করার ছিল না। আমার ধারণা, সবকিছু ঠিকঠাক থাকলে আমি বিরক্ত করতাম না: ডি
ডিসপ্লে নাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.