एक पूर्णांक n
दिया गया, मैं लंबाई n^2
की सभी सूचियों वाली सूची कैसे बना सकता हूं जिसमें प्रत्येक पूर्णांक x < n
की n
प्रतियां शामिल हैं? उदाहरण के लिए, n = 2
के लिए, हमने:प्रत्येक `x <n` की` n` प्रतियों वाली लंबाई 'n^2` की सभी सूचियों को कुशलतापूर्वक कैसे उत्पन्न करें?
[0,0,1,1], [0,1,0,1], [1,0,0,1], [0,1,1,0], [1,0,1,0], [1,1,0,0]
यह आसानी से permutations
और nub
संयोजन किया जा सकता है:
f :: Int -> [[Int]]
f n = nub . permutations $ concatMap (replicate n) [0..n-1]
लेकिन उस तरह से भी अक्षम है। क्या कुशल/प्रत्यक्ष एल्गोरिदम एन्कोड करने का कोई आसान तरीका है?
मैं तत्काल कोई विधि के बारे में सोच सकता है, लेकिन मैं लिख 'interleavings शुरू कर दूं :: [एक] -> [एक] -> [[एक] ] '। इसके बाद, मैं कुछ (untested) 'f n = go n कहां उपयोग करूंगा जहां m = interleavings (n n replize) = << go (m-1); 0 = [प्रतिकृति एन 0] 'जाओ। (बहुत सुरुचिपूर्ण नहीं, मैं सहमत हूं।) – chi