अजीब सिक्कों के साथ एक अनुकूलन चुनौती


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
मैं अपने हाथों को कुछ एंटी-ग्रेविटी सिक्कों पर प्राप्त करना पसंद करूंगा।
mbomb007

2
मेरे पास एक समाधान है जो कभी मशीन का उपयोग नहीं करता है: प्रत्येक सिक्के को पकड़ो और देखें कि कौन से आपके हाथ को ऊपर खींचते हैं, और जो आपके हाथ को नीचे खींचते हैं।
निधि मोनिका का मुकदमा

1
साइड नोट के रूप में, यह लिखना बेहतर होगा "यदि आप बी के माध्यम से सिक्कों का वजन करते हैं, तो अगली बार आपको बी + 1 के माध्यम से + 1 करना होगा" (शायद एक 'कम से कम' के साथ भी फेंका गया हो) और बेहतर प्रारूपण) के बजाय सिक्के संख्या को दर्शाती सदस्यता के। इससे ऐसा लगता है कि यह सिक्के के बजाय कुछ संपत्ति या सिक्के _ की मात्रा है।
निधि मोनिका का मुकदमा

1
@ mbomb007 प्रत्येक वजन पर आप सिक्के का वजन 0 चुन सकते हैं और साथ ही साथ अन्य सभी सिक्कों का वजन कर सकते हैं। दूसरे शब्दों में, आपके पास प्रत्येक तौल के लिए नया विकल्प है।

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 

row N यह दर्शाता है कि आप माप के पैमाने पर किन सिक्कों को लगाते हैं। आपको जो भी वेटिंग के परिणाम मिलते हैं, जाहिर है कि सिक्के के कुछ मूल्य निर्धारित होते हैं जो उस वज़न को देते हैं। यदि एक और संयोजन भी है (समाधान अद्वितीय नहीं है) विचार करें कि वे कैसे भिन्न हैं। आप भार सिक्के का एक सेट बदलना होगा 1भार सिक्के द्वारा -1। यह कॉलम का एक सेट देता है जो उस फ्लिप के अनुरूप होता है। -1आपके द्वारा प्रतिस्थापित किए जाने वाले सिक्कों के भार का भी एक सेट है 1। वह कॉलम का एक और सेट है। क्योंकि माप दो समाधानों के बीच नहीं बदलते हैं, जिसका अर्थ है कि दो सेटों का कॉलम सम होना चाहिए। लेकिन मैट्रिक्स संपत्ति एक्स के समाधान पर दोबारा गौर किया गया (या एक्स की खुशी) वास्तव में ये मैट्रेस हैं जहां ऐसे कॉलम सेट मौजूद नहीं हैं, इसलिए कोई डुप्लिकेट नहीं हैं और प्रत्येक समाधान अद्वितीय है।

माप का प्रत्येक वास्तविक सेट कुछ 0/1मैट्रिक्स द्वारा वर्णित किया जा सकता है । लेकिन फिर भी अगर कुछ कॉलम समान वैक्टर के लिए राशि निर्धारित करते हैं तो यह हो सकता है कि उम्मीदवार समाधान सिक्का मूल्यों के संकेत वास्तव में इस तरह के सेट के अनुरूप नहीं हैं। इसलिए मुझे नहीं पता कि क्या मैट्रिसेस जैसे कि ऊपर वाले इष्टतम हैं। लेकिन कम से कम वे एक कम बाउंड प्रदान करते हैं। तो संभावना है कि 31 सिक्के कम से कम किए जा सकते हैं कि 15 माप अभी भी खुले हैं।

ध्यान दें कि यह केवल एक गैर-निश्चित रणनीति के लिए सही है जहां 0तराजू पर सिक्का डालने का आपका निर्णय पिछले भार के परिणाम पर निर्भर करता है। नहीं तो आप होगा समाधान जहां सिक्के के संकेत सेट है कि उसी स्तंभ राशि के साथ अनुरूप है।


वर्तमान विश्व रिकॉर्ड :)

2 को प्राप्त करने के लिए आपको कितनी तेजी से एक कंप्यूटर का अनुमान होगा?

@ लेम्बिक मैं आश्वस्त नहीं हूँ 2 संभव है। मुझे नहीं पता कि क्यों, लेकिन वर्तमान परिणाम बताते हैं कि आप केवल 2 मनमाने ढंग से करीब पहुंच सकते हैं वह भी बिना पहुंच के
टन हास्पेल

क्या आपको 25 सर्कुलर मैट्रिक्स मैं 25 को सत्यापित करने का मौका मिला जिसे मैंने 2 दिया था? 010110111000101110000000001100111110011010100011010 सर्कुलर मैट्रिक्स की पहली पंक्ति के रूप में।

मैं नहीं जानता कि कैसे उस मैट्रिक्स को भी एक समर्पित कार्यक्रम लिखने के बिना जाँचें जो लंबे समय तक चलेगा
टन हास्पेल

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करना मूल रूप से नो-ऑप है, है ना?
डिस्प्ले नेम

@SargeBorsch इस कार्यक्रम के उद्देश्य के लिए , यह है। लेकिन यह वास्तव में कुछ करता है।
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

मिच श्वार्ट्ज के लिए बहुत धन्यवादक्विक-रिजेक्ट के पहले संस्करण में बग को इंगित ।

यह कुछ काफी बुनियादी तकनीकों का उपयोग करता है जिन्हें मैं कड़ाई से उचित नहीं ठहरा सकता। यह क्रूरता-शक्ति है, लेकिन केवल वजन के संचालन को शुरू करने के लिए, जो अधिकांश सिक्कों के आधे हिस्से में उपयोग होता है: ऐसे अनुक्रम जो आधे से अधिक सिक्कों का उपयोग करते हैं, वे सीधे पूरक वजन के लिए हस्तांतरणीय नहीं हैं (क्योंकि हम कुल वजन नहीं जानते हैं), लेकिन एक हाथ से लहराते स्तर पर समान जानकारी के बारे में होना चाहिए। इसमें शामिल किए गए सिक्कों की संख्या के आधार पर वेटिंग शुरू करने के माध्यम से भी इसका पता चलता है, इस तरह से यह फैलाव वाले वेटिंग को कवर करता है (जो उम्मीद करता है कि शीर्ष अंत के बारे में जानकारी अपेक्षाकृत जल्दी दे) एक गुच्छा के माध्यम से क्रॉल किए बिना जो एक सबसेट के साथ शुरू होता है नीचे का अंत।

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 मूल्यों के लिए सभी स्थिर सॉल्वरों के माध्यम से खोज करता है (ये सॉल्वर हमेशा एक ही सिक्के सेट का वजन करते हैं, इसलिए "स्थिर" नाम) और बस जाँच करके उनके सबसे खराब मामले की संख्या निर्धारित करता है कि उनके माप परिणाम केवल एक मिलान सिक्के की अनुमति देते हैं सभी मामलों में सेट। इसके अलावा, यह अब तक पाए गए सर्वश्रेष्ठ स्कोर का पता लगाता है और शुरुआती prunes सॉल्वरों ने दिखाया है कि वे निश्चित रूप से उन लोगों की तुलना में बदतर हैं जो पहले पाए गए थे। यह एक महत्वपूर्ण अनुकूलन था, अन्यथा मैं 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
PS मैंने इसे लिखा था जबकि मेरे घर में बिजली का स्रोत टूट गया था, इसलिए मेरे पास बैटरी पावर और बिना इंटरनेट कनेक्टिविटी के एक लैपटॉप था, और मेरे पास कुछ पहेलियों को क्रैक करने की तुलना में कोई बेहतर काम नहीं था। मुझे लगता है कि मैं परेशान नहीं होता अगर सब ठीक होता: D
डिस्प्ले नेम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.