काउंट ऐरे जो अद्वितीय सेट बनाते हैं


11

इस सवाल का एक समान सेट अप खोजने के लिए एक सरणी है जो एक सेट के योग को फिट बैठता है, हालांकि इसके लक्ष्यों में काफी भिन्न है।

Aलंबाई की एक सरणी पर विचार करें n। सरणी में केवल धनात्मक पूर्णांक होते हैं। उदाहरण के लिए A = (1,1,2,2)। आइए हम f(A)सभी गैर-रिक्त सन्निहित उपसमूह के योगों के समूह के रूप में परिभाषित करते हैं A। इस मामले में f(A) = {1,2,3,4,5,6}। उत्पादन के चरण f(A) इस प्रकार हैं:

की अधीनताएँ Aहैं (1), (1), (2), (2), (1,1), (1,2), (2,2), (1,1,2), (1,2,2), (1,1,2,2)। उनके संबंधित योग हैं 1,1,2,2,2,3,4,4,5,6। इस सूची से आपको जो सेट मिलता है, वह इसलिए है {1,2,3,4,5,6}

यदि किसी सरणी को उलटा करने के लिए छोड़कर कोई समान लंबाई का कोई अन्य सरणी नहीं है, तो हम एक सरणी को A अद्वितीय कहते हैं । एक उदाहरण के रूप में, लेकिन लंबाई का कोई अन्य सरणी नहीं है जो समान सेट का उत्पादन करता है।Bf(A) = f(B)Af((1,2,3)) = f((3,2,1)) = {1,2,3,5,6}3

हम केवल एरे पर विचार करेंगे जहां तत्व या तो दिए गए पूर्णांक हैं sया s+1। उदाहरण के लिए यदि s=1सरणियों में केवल 1और होगा 2

कार्य

कार्य, दिए गए nऔर sउस लंबाई के अद्वितीय सरणियों की संख्या की गणना करना है। आप मान सकते हैं कि sबीच में है 1और 9

आपको किसी सरणी के साथ ही सरणी के रिवर्स की गणना नहीं करनी चाहिए।

उदाहरण

s = 1जवाब हमेशा है n+1

s = 2n = 1ऊपर से गिनती के जवाब हैं:

2,3,6,10,20,32,52,86

s = 8n = 1ऊपर से गिनती के जवाब हैं:

2,3,6,10,20,36,68,130

स्कोर

किसी दिए गए के लिए n, अपने कोड के सभी मानों के लिए उत्पादन में उत्तर देना चाहिए sसे 1करने के लिए 9। आपका स्कोर उच्चतम मूल्य है nजिसके लिए यह एक मिनट में पूरा होता है।

परिक्षण

मुझे अपने कोड को मेरे ubuntu मशीन पर चलाने की आवश्यकता होगी इसलिए कृपया अपने कोड को संकलित करने और चलाने के लिए यथासंभव विस्तृत निर्देश शामिल करें।

लीडरबोर्ड

  • एन = 24 में एंडर्स Kaseorg से जंग (34 सेकंड)
  • साफ में Ourous द्वारा n = 16 (36 सेकंड)
  • N = 14 द्वारा JRowan में आम लिस्प (49 सेकंड)

तो अगर s = 8 तो 8 और 9 के सभी संभावित संयोजनों की एक सरणी, और कुछ नहीं?
जेरवान

@JRowan नहीं। आप उन सरणियों में से किसी की भी गिनती नहीं करते हैं, जो किसी अन्य सरणी के समान राशि का सेट है।
अनुष्का

यह हिस्सा मैं थोड़ा उलझन में हूं हम केवल एरे पर विचार करेंगे जहां तत्व या तो दिए गए पूर्णांक s या s + 1 हैं। जैसे यदि s = 1 सरणियों में केवल 1 और 2 शामिल होंगे, तो यदि n 2 है और s 3 है, तो सरणियों का परीक्षण क्या होगा?
जेवराण

[३,३] के बारे में क्या है और वर्तमान में सूचियों के रिवर्स को हटा रहा है जैसे। [३,४] -> [४,३]
जेवराण २४'१

2
@RosLuP सबसे पहले, आप का मतलब है कि दूसरे प्रश्न पर पोस्ट करें , और दूसरी बात, [3, 5, 4] एक उपसमुच्चय है, लेकिन [3, 5, 1, 4] का उपश्रेणी नहीं है
एंडर्स कासोर्ग

जवाबों:


5

जंग , एन ≈ 24

सुविधाजनक reverse_bitsसुविधा के लिए रात्रिकालीन जंग की आवश्यकता है । के साथ संकलित करें rustc -O unique.rsऔर साथ चलें (जैसे) ./unique 24

#![feature(reverse_bits)]
use std::{collections::HashMap, env, mem, process};

type T = u32;
const BITS: u32 = mem::size_of::<T>() as u32 * 8;

fn main() {
    let args = env::args().collect::<Vec<_>>();
    assert!(args.len() == 2);
    let n: u32 = args[1].parse().unwrap();
    assert!(n > 0);
    assert!(n <= BITS);
    let mut unique = (2..=9).map(|_| HashMap::new()).collect::<Vec<_>>();
    let mut sums = vec![0 as T; n as usize];
    for a in 0 as T..=!0 >> (BITS - n) {
        if a <= a.reverse_bits() >> (BITS - n) {
            for v in &mut sums {
                *v = 0;
            }
            for i in 0..n {
                let mut bit = 1;
                for j in i..n {
                    bit <<= a >> j & 1;
                    sums[(j - i) as usize] |= bit;
                }
            }
            for s in 2..=9 {
                let mut sums_s =
                    vec![0 as T; ((n + (n - 1) * s) / BITS + 1) as usize].into_boxed_slice();
                let mut pos = 0;
                let mut shift = 0;
                let mut lo = 0;
                let mut hi = 0;
                for &v in &sums {
                    lo |= v << shift;
                    if BITS - shift < n {
                        hi |= v >> (BITS - shift);
                    }
                    shift += s;
                    if shift >= BITS {
                        shift -= BITS;
                        sums_s[pos] = lo;
                        pos += 1;
                        lo = hi;
                        hi = 0;
                    }
                }
                if lo != 0 || hi != 0 {
                    sums_s[pos] = lo;
                    pos += 1;
                    if hi != 0 {
                        sums_s[pos] = hi;
                    }
                }
                unique[s as usize - 2]
                    .entry(sums_s)
                    .and_modify(|u| *u = false)
                    .or_insert(true);
            }
        }
    }
    let mut counts = vec![n + 1];
    counts.extend(
        unique
            .iter()
            .map(|m| m.values().map(|&u| u as T).sum::<T>())
            .collect::<Vec<_>>(),
    );
    println!("{:?}", counts);
    process::exit(0); // Avoid running destructors.
}

यह बहुत अच्छा है, धन्यवाद। यह लगभग 90 सेकंड में n = 25 के लिए पूरा होता है। लेकिन मुख्य समस्या यह है कि यह मेरे 8GB रैम के 70% का उपयोग करता है।
आयुष

मुझे अचानक किसी बात की चिंता हुई है। क्या आप जाँच रहे हैं कि सरणियाँ अन्य सभी संभावित सरणियों के संबंध में अद्वितीय हैं, या केवल मूल्यों के साथ sऔर s+1उनमें सरणियाँ हैं?
अनुष्का

@Anush हाँ, मैंने गति के लिए कुछ मेमोरी उपयोग का कारोबार किया है। मैं उन सरणियों की गिनती कर रहा हूं, जो मूल्यों के साथ अद्वितीय आरटी अन्य सरणियाँ हैं sऔर s + 1(क्योंकि आपने कहा था कि केवल वही सरणियाँ हैं जिन पर हम विचार करेंगे), हालांकि यह तुरंत स्पष्ट नहीं है कि क्या इससे कोई फर्क पड़ेगा।
एंडर्स कासोर्ग

1
मुझे लगता है कि मुझे कल इस पर काम करने की आवश्यकता होगी। सरणियाँ 1,1,2,2 और 1,1,1,3 दोनों ही 1,2,3,4,5,6 रकम का सेट देती हैं। हालांकि पूर्व केवल 1 और 2 के साथ सरणियों के बीच अद्वितीय नहीं है इसलिए मैं थोड़ा भ्रमित हूं अगर यह अब फर्क करता है।
आशु

2
@ आंसू इससे फर्क पड़ता है: [1, 2, 2, 2] के योग 1 और 2 की लंबाई वाले सरणियों के बीच अद्वितीय हैं, लेकिन [1, 1, 2, 3] के योगों के बराबर हैं।
एंडर्स कासोर्ग

2

आम लिस्प एसबीसीएल, एन = 14

कॉल फ़ंक्शन (goahead ns)

    (defun sub-lists(l m &optional(x 0)(y 0))
  (cond; ((and(= y (length l))(= x (length l)))nil)
        ((= y (length l))m)
        ((= x (length l))(sub-lists l m 0(1+ y)))
    (t (sub-lists l (cons(loop for a from x to (+ x y)

             when (and(nth (+ x y)l)(nth a l)(< (+ x y)(length l)))
                ;   while (nth a l)
             ;while(and(< (+ x y)(length l))(nth a l))
                    collect (nth a l))m) (1+ x)y))
    ))
(defun permutations(size elements)
  (if (zerop size)'(())
 (mapcan (lambda (p)
                    (map 'list (lambda (e)
                           (cons e p))
                         elements))
     (permutations (1- size) elements))))
(defun remove-reverse(l m)
  (cond ((endp l)m)
    ((member (reverse (first l))(rest l) :test #'equal)(remove-reverse (rest l)m))
    (t (remove-reverse (rest l)(cons (first l)m)))))
(defun main(n s)
  (let((l (remove-reverse (permutations n `(,s ,(1+ s)))nil)))

  (loop for x in l
     for j = (remove 'nil (sub-lists x nil))
       collect(sort (make-set(loop for y in j
        collect (apply '+ y))nil)#'<)
     )
  ))
(defun remove-dups(l m n)
  (cond ((endp l)n)
        ((member (first l) (rest l) :test #'equal)(remove-dups(rest l)(cons (first l) m) n))
    ((member (first l) m :test #'equal)(remove-dups(rest l)m n))
    (t(remove-dups (rest l) m (cons (first l) n))))

  )
(defun goahead(n s)
  (loop for a from 1 to s
  collect(length (remove-dups(main n a)nil nil))))
(defun make-set (L m)
  "Returns a set from a list. Duplicate elements are removed."
  (cond ((endp L) m)
    ((member (first L) (rest L)) (make-set (rest L)m))
    ( t (make-set (rest L)(cons (first l)m)))))

यहाँ रन समय है

CL-USER> (time (goahead 14 9))
Evaluation took:
  34.342 seconds of real time
  34.295000 seconds of total run time (34.103012 user, 0.191988 system)
  [ Run times consist of 0.263 seconds GC time, and 34.032 seconds non-GC time. ]
  99.86% CPU
  103,024,254,028 processor cycles
  1,473,099,744 bytes consed

(15 1047 4893 6864 7270 7324 7328 7328 7328)
CL-USER> (time (goahead 15 9))
Evaluation took:
  138.639 seconds of real time
  138.511089 seconds of total run time (137.923824 user, 0.587265 system)
  [ Run times consist of 0.630 seconds GC time, and 137.882 seconds non-GC time. ]
  99.91% CPU
  415,915,271,830 processor cycles
  3,453,394,576 bytes consed

(16 1502 8848 13336 14418 14578 14594 14594 14594)

मैं इसे कैसे चलाऊं? क्या मैं आपके कोड को किसी फ़ाइल में कॉपी करूं और sbclकिसी तरह से कॉल करूं?
अनुष्का

1
मैं emacs और कीचड़ का उपयोग करता हूं, लेकिन आप इसे एक फ़ाइल में कह सकते हैं test.lisp और sbcl promp में आपकी निर्देशिका कॉल (लोड "test.lisp") पर और फिर फ़ंक्शन को कॉल करें कि मेरे पास यह कैसे है
JRNan

2

स्वच्छ

निश्चित रूप से सबसे कुशल दृष्टिकोण नहीं है, लेकिन मुझे यह देखने में दिलचस्पी है कि कितना अच्छा एक अच्छा बाय-वैल्यू फ़िल्टर होता है।

उस ने कहा, इस पद्धति का उपयोग करके अभी भी थोड़ा सुधार किया जाना है।

module main
import StdEnv, Data.List, System.CommandLine

f l = sort (nub [sum t \\ i <- inits l, t <- tails i])

Start w
	# ([_:args], w) = getCommandLine w
	= case map toInt args of
		[n] = map (flip countUniques n) [1..9]
		_ = abort "Wrong number of arguments!"

countUniques 1 n = inc n
countUniques s n = length uniques
where
	lists = [[s + ((i >> p) bitand 1) \\ p <- [0..dec n]] \\ i <- [0..2^n-1]]
	pairs = sortBy (\(a,_) (b,_) = a < b) (zip (map f lists, lists))
	groups = map (snd o unzip) (groupBy (\(a,_) (b,_) = a == b) pairs)
	uniques = filter (\section = case section of [a, b] = a == reverse b; [_] = True; _ = False) groups

नामित फ़ाइल में रखें main.iclया शीर्ष पंक्ति को इसमें बदलेंmodule <your_file_name_here>

संकलन clm -h 1500m -s 50m -fusion -t -IL Dynamics -IL StdEnv -IL Platform main

आप शीर्षक से लिंक से TIO (और खुद का) उपयोग प्राप्त कर सकते हैं, या यहाँ से हाल ही में एक ।


मुझे नहीं लगता कि यह कोड सही आउटपुट देता है। मैंने इसे s = 8 के साथ आज़माया और यह [9,86,126,130,130,130,130,130,130]
Anush

@ अशुम हम्म मुझे पता है मैंने इसका परीक्षण किया है। मैं देखूंगा कि क्या मैंने उस और पोस्ट किए गए के बीच कुछ भी बदला है, मुझे कुछ घंटे दें और मैं इसे अपने ब्रेक पर कर सकता हूं।
Οurous

@ आंसू आप क्यों प्रदान कर रहे हैं s? प्रश्न में आप कहते हैं " किसी दिए गए n के लिए , आपके कोड को 1 से 9 तक के सभी मूल्यों के उत्तर का उत्पादन करना चाहिए।"
Οurous

1
मुझे लगता है कि जिसे आप मेरे हिस्से पर ब्रेन फ़्रीज कहते हैं :) मैं अब आपके कोड का समय दूंगा।
अनुष्का
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.