সত্যই অনন্য যে অ্যারে গণনা করুন


9

এটি অনন্য সেটগুলি তৈরি করে এমন গণনা অ্যারে অনুসরণ করে । উল্লেখযোগ্য পার্থক্যটি স্বতন্ত্রতার সংজ্ঞা।

Aদৈর্ঘ্যের অ্যারে বিবেচনা করুন n। অ্যারেতে কেবল ধনাত্মক পূর্ণসংখ্যা থাকে। উদাহরণস্বরূপ A = (1,1,2,2)। আসুন f(A)এর সমস্ত শূন্য খালি মিলিত সাবহারির সমষ্টিগুলির সেট হিসাবে সংজ্ঞায়িত করি A। এই ক্ষেত্রে f(A) = {1,2,3,4,5,6}। উত্পাদনের পদক্ষেপগুলি f(A) নিম্নরূপ:

এর subarrays 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 অনন্য বলি যদি Bএকই দৈর্ঘ্যের আর কোনও অ্যারে না থাকে f(A) = f(B)তবে অ্যারেটি Aবিপরীত হয়। উদাহরণ হিসাবে, f((1,2,3)) = f((3,2,1)) = {1,2,3,5,6}তবে দৈর্ঘ্যের অন্য কোনও অ্যারে নেই 3যা একই সংখ্যার যোগফল তৈরি করে।

কার্য

একটি নির্দিষ্ট কাজের জন্য nএবং sসেই দৈর্ঘ্যের অনন্য অ্যারেগুলির সংখ্যা গণনা করা। আপনি অনুমান করতে পারেন sমধ্যে 1এবং 9। আপনাকে কেবল অ্যারে গণনা করতে হবে যেখানে উপাদানগুলি একটি প্রদত্ত পূর্ণসংখ্যা sবা হয় s+1। যেমন s=1আপনি যে অ্যারে গণনা করছেন সেগুলিতে কেবল 1এবং রয়েছে 2। যাইহোক, স্বতন্ত্রতার সংজ্ঞা একই দৈর্ঘ্যের অন্য কোনও অ্যারে সম্মানের সাথে। একটি কংক্রিট উদাহরণ হিসাবে [1, 2, 2, 2]হয় না যেমন যেমন অঙ্কের একই সেট দেয় অনন্য [1, 1, 2, 3]

আপনার অ্যারের বিপরীত হিসাবে একই হিসাবে নিজেও গণনা করা উচিত (যতক্ষণ না অ্যারে অবশ্যই প্যালিনড্রোম না থাকে)।

উদাহরণ

s = 1, n = 2,3,4,5,6,7,8,9 এর উত্তরগুলি হ'ল:

4, 3, 3, 4, 4, 5, 5, 6

জন্য s = 1, দৈর্ঘ্য 4 অনন্য অ্যারে

(1, 1, 1, 1)
(2, 1, 1, 2)
(2, 2, 2, 2)

s = 2, n = 2,3,4,5,6,7,8,9 এর উত্তরগুলি হ'ল:

4, 8, 16, 32, 46, 69, 121, 177

এর সাথে অনন্য নয় এমন একটি অ্যারের উদাহরণ s = 2হ'ল:

(3, 2, 2, 3, 3, 3). 

এতে উভয়ের সমান পরিমাণ সমান রয়েছে: (3, 2, 2, 2, 4, 3)এবং (3, 2, 2, 4, 2, 3)

s = 8, n = 2,3,4,5,6,7,8,9 এর উত্তরগুলি হ'ল:

4, 8, 16, 32, 64, 120, 244, 472

স্কোর

একটি প্রদত্ত জন্য nআপনার কোড সব মানের জন্য আউটপুট উত্তর দিতে sথেকে 1থেকে 9। আপনার স্কোর সর্বোচ্চ মান nযার জন্য এটি এক মিনিটের মধ্যে পূর্ণ হয়।

পরীক্ষামূলক

আমার উবুন্টু মেশিনে আপনার কোডটি চালানো দরকার তাই আপনার কোডটি কীভাবে সংকলন করতে এবং চালাতে হয় তার জন্য যথাসম্ভব বিস্তারিত নির্দেশাবলী অন্তর্ভুক্ত করুন।

লিডারবোর্ড

  • এন = 13 খ্রিস্টান Sievers দ্বারা Haskell, (42 সেকেন্ড)

আমাদের কত স্মৃতি গ্রাস করতে দেওয়া হয়?
কালো আউল কাই

@ ব্লাকওলকাই আমার মেশিনটিতে 8 গিগাবাইট রয়েছে তাই আমি অনুমান করি 6 জিবি নিরাপদ?
আনুশ

আমি মনে করি উদাহরণগুলির মধ্যে সর্বশেষ সংখ্যাটি 427 এর পরিবর্তে 472 হওয়া উচিত।
খ্রিস্টান সিভর্স

@ ক্রিশ্চিয়ানসিভার্স আপনাকে ধন্যবাদ এখনই স্থির।
আনুশ

কী s? এটি কি উপস্থাপন করে?
গিগাফ্লপ

উত্তর:


5

Haskell,

import Control.Monad (replicateM)
import Data.List (tails)
import qualified Data.IntSet as S
import qualified Data.Map.Strict as M
import qualified Data.Vector.Unboxed as V
import Data.Vector.Unboxed.Mutable (write)
import System.Environment (getArgs)
import Control.Parallel.Strategies

orig:: Int -> Int -> M.Map S.IntSet (Maybe Int)
orig n s = M.fromListWith (\ _ _ -> Nothing) 
               [(sums l, Just $! head l) | 
                   l <- replicateM n [s, s+1],
                   l <= reverse l ]

sums :: [Int] -> S.IntSet
sums l = S.fromList [ hi-lo | (lo:r) <- tails $ scanl (+) 0 l, hi <- r ]

construct :: Int -> Int -> S.IntSet -> [Int]
construct n start set =
   setmax `seq` setmin `seq` setv `seq`
   [ weight r | r <- map (start:) $ constr (del start setlist)
                                           (V.singleton start)
                                           (n-1)
                                           (setmax - start),
                r <= reverse r ]
  where
    setlist = S.toList set
    setmin = S.findMin set
    setmax = S.findMax set
    setv = V.modify (\v -> mapM_ (\p -> write v p True) setlist)
                    (V.replicate (1+setmax) False)

    constr :: [Int] -> V.Vector Int -> Int -> Int -> [[Int]]
    constr m _ 0 _ | null m    = [[]]
                   | otherwise = []
    constr m a i x =
         [ v:r | v <- takeWhile (x-(i-1)*setmin >=) setlist,
                 V.all (V.unsafeIndex setv . (v+)) a,
                 let new = V.cons v $ V.map (v+) a,
                 r <- (constr (m \\\ new) $! new) (i-1) $! (x-v) ]

del x [] = []
del x yl@(y:ys) = if x==y then ys else if y<x then y : del x ys else yl

(\\\) = V.foldl (flip del)

weight l = if l==reverse l then 1 else 2

count n s = sum ( map value [ x | x@(_, Just _) <- M.toList $ orig n s]
                      `using` parBuffer 128 rseq )
  where 
    value (sms, Just st) = uniqueval $ construct n st sms
    uniqueval [w] = w
    uniqueval _   = 0


main = do
  [ n ] <- getArgs
  mapM_ print ( map (count (read n)) [1..9]
                    `using` parBuffer 2 r0 )

origফাংশন দৈর্ঘ্যের সমস্ত তালিকা তৈরি করে nএন্ট্রিগুলির সাথে sবা s+1তাদের রাখে যদি তারা আসে তাদের বিপরীত আগে, তাদের sublist নির্ণয় sumsএবং রাখে একটি মানচিত্র যা তালিকার প্রথম উপাদান স্মরণ ঐ। একই অঙ্কের সমষ্টি যখন একাধিকবার পাওয়া যায়, তখন প্রথম উপাদানটি প্রতিস্থাপন করা হয় Nothing, তাই আমরা জানি যে এই পরিমাণগুলি পাওয়ার জন্য আমাদের অন্য উপায়গুলি খুঁজতে হবে না।

constructপ্রদত্ত দৈর্ঘ্যের তালিকার জন্য ফাংশন অনুসন্ধানে এবং প্রদত্ত শুরু মান আছে sublist অঙ্কের একটি প্রদত্ত সেট। তার রিকার্সিভ অংশ constrমূলত হিসাবে একই লজিক অনুসরণ এই , কিন্তু সমষ্টি অবশিষ্ট তালিকা এন্ট্রি থাকতে হবে দান একটি অতিরিক্ত যুক্তি আছে। এটি ক্ষুদ্রতম সম্ভাব্য মানগুলিও এই অঙ্কটি পাওয়ার জন্য খুব বড় হয়ে গেলে তাড়াতাড়ি থামতে দেয় যা একটি বিশাল কর্মক্ষমতা উন্নতি করেছে। এই পরীক্ষাটি আগের জায়গায় (সংস্করণ 2) স্থানান্তরিত করে এবং বর্তমান অঙ্কের তালিকাটি একটি Vector(সংস্করণ 3 (ভাঙা) এবং 4 (অতিরিক্ত কঠোরতার সাথে) দ্বারা প্রতিস্থাপন করে আরও বড় উন্নতি লাভ করা হয়েছিল । সর্বশেষতম সংস্করণটি সন্ধানের সারণির সাহায্যে সেট সদস্যপদ পরীক্ষা করে এবং আরও কিছু কঠোরতা এবং সমান্তরালতা যুক্ত করে।

যখন constructএকটি তালিকা পাওয়া গেছে যা সাবলিস্টটি যোগফল দেয় এবং তার বিপরীতে ছোট হয়, এটি এটিকে ফিরিয়ে দিতে পারে তবে আমরা এতে সত্যিই আগ্রহী নই। এটি কেবলমাত্র ()তার অস্তিত্ব নির্দেশ করতে ফিরে আসার জন্য যথেষ্ট হবে , তবে আমাদের এটি দুটি বার গণনা করতে হবে কিনা তা আমাদের জানতে হবে (কারণ এটি কোনও প্যালিনড্রোম নয় এবং আমরা এর বিপরীতটি কখনই পরিচালনা করব না)। সুতরাং আমরা weightফলাফলের তালিকায় এটি 1 বা 2 রাখি ।

ফাংশন countএই অংশগুলি একসাথে রাখে। সাবস্টিস্টের প্রতিটি সংখ্যার জন্য (আগত orig) যা কেবলমাত্র তালিকাভুক্ত তালিকার মধ্যেই অনন্য ছিল sএবং s+1এটি কল করে value, যা কল করে constructএবং এর মাধ্যমে uniquevalকেবলমাত্র একটি ফলাফল রয়েছে কিনা তা পরীক্ষা করে। যদি তা হয় তবে আমাদের ওজনটি এটিই গণনা করতে হবে, অন্যথায় অঙ্কের সেটটি অনন্য ছিল না এবং শূন্য ফিরে আসল। মনে রাখবেন যে অলসতার কারণে, constructযখন এটি দুটি ফলাফল পেয়েছে তখন থামবে।

mainফাংশন হ্যান্ডলগুলি আই এবং লুপ s1 থেকে 9।

সংকলন এবং চলমান

ডিবিয়ান উপর এটি প্যাকেজ প্রয়োজন ghc, libghc-vector-devএবং libghc-parallel-dev। প্রোগ্রামটি একটি ফাইলে সংরক্ষণ করুন prog.hsএবং এটি সংকলন করুন ghc -threaded -feager-blackholing -O2 -o prog prog.hs। অ্যারে দৈর্ঘ্য ./prog <n> +RTS -Nযেখানে, <n>তার সাথে আমরা দৌড় দাও যার জন্য আমরা অনন্য অ্যারে গণনা করতে চাই।


এই কোডটি বেশ আশ্চর্যজনক (এবং সংক্ষিপ্ত!)। আপনি যদি কিছু ব্যাখ্যা যোগ করতে পারেন তবে আমি নিশ্চিত যে আপনারা যা করেছেন তা লোকেরা বুঝতে পছন্দ করবে।
আনুশ

আপনার নতুন সংস্করণটি আমার জন্য সংকলন করে না। আমি পেতে bpaste.net/show/c96c4cbdc02e
Anush

দুঃখিত, বড় কোড মুছে ফেলা এবং পেস্ট করা এতটা অস্বস্তিকর যে আমি মাঝে মাঝে হাতে কয়েক লাইনের পরিবর্তন করি। অবশ্যই আমি একটি ভুল করেছি ... এখনই স্থির (আমি আশা করি), এবং আরও একটি উন্নতি যুক্ত করেছি, এবার কেবল কয়েক শতাংশের জন্য। অন্যান্য পরিবর্তনগুলি অনেক বেশি গুরুত্বপূর্ণ ছিল।
খ্রিস্টান সিভারস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.