ধনাত্মক পূর্ণসংখ্যার আংশিক কারণ


23

ধনাত্মক পূর্ণসংখ্যার সংকলন যদি ধনাত্মক পূর্ণসংখ্যার d_1 d_2 ... d_kএকটি গুণক হয় nif

d_1 * d_2 * ... * d_k = n

প্রতিটি ধনাত্মক পূর্ণসংখ্যার একটি অনন্য মৌলিক গুণক রয়েছে , তবে সাধারণভাবে তাদেরও রয়েছে কারণগুলি যার মধ্যে কয়েকটি পদ সম্মিলিত। যেমন

12 = 6 * 2 = 4 * 3 = 3 * 2 * 2

একটি প্রোগ্রাম, ফাংশন, ক্রিয়া বা অনুরূপ লিখুন যা ইনপুট হিসাবে একক ধনাত্মক পূর্ণসংখ্যার গ্রহণ করে এবং তার স্বতন্ত্র কারণগুলির সম্পূর্ণ তালিকাটি প্রিন্ট বা মুদ্রণ করে। কারণগুলি কোনও ক্রমে উত্পাদিত হতে পারে এবং তাদের পদগুলি কোনও ক্রমে হতে পারে তবে দু'জনকে একে অপরের অনুমতি দেওয়া উচিত নয়। কারখানাগুলি 1দুটি ব্যাতিক্রমের সাথে অন্তর্ভুক্ত নাও হতে পারে : ইনপুট জন্য nআপনি n*1পরিবর্তে গুণক দিতে পারেন n; এবং ইনপুট জন্য 1আপনি 1খালি তালিকার পরিবর্তে গুণক দিতে পারেন ।

আপনি ধরে নিতে পারেন যে ইনপুটটি একটি স্বাক্ষরিত 32-বিট পূর্ণসংখ্যার মধ্যে থাকবে। যদি আউটপুটটি একটি স্ট্রিং হিসাবে থাকে তবে একটি অনুকরণের মধ্যে সংখ্যার সীমিতকরণ এবং গুণনীয়কের সীমানার মধ্যে একটি স্পষ্ট পার্থক্য থাকা উচিত, তবে কারণগুলির সাথে একটি যুক্ত হওয়ার জন্য এটি প্রয়োজনীয় নয় (উদাহরণস্বরূপ) *

আপনার কোডটি একটি যুক্তিসঙ্গত ডেস্কটপ মেশিনে 10 মিনিটের মধ্যে কোনও বৈধ ইনপুট পরিচালনা করতে সক্ষম হওয়া উচিত।

উদাহরণ

1                  [[]]
                or [[1]]
                or [[1 1]]

7                  [[7]]
                or [[7 1]]
                or [[1 7]]

12                 [[12] [6 2] [4 3] [2 3 2]]
                or variants

16                 [[2 2 2 2] [2 2 4] [2 8] [4 4] [16]]
                or variants

901800900          a list of 198091 factorisations

1338557220         a list of 246218 factorisations

তোমাদের মধ্যে factorisations তালিকা পোস্ট করতে পারি 901800900এবং 1338557220কোথাও যেখানে আমরা তাদের পরীক্ষা করতে পারবেন? আমার কোডটি আমাকে যথাক্রমে এই সংখ্যাগুলির জন্য 2048 এবং 1024 ফ্যাক্টরিফিকেশন দিচ্ছে এবং আমি কেন তা নিশ্চিত নই।
শার্লক 9

@ শেরলক 9, আমি বাড়ি এলে তা করবে। আমি একটি অনলাইন জেনারেটরের সাথে যা করতে পারি তা হ'ল 5336100 এর জন্য আপনাকে একটি বৈধ আউটপুট দেওয়া
পিটার টেলর

3
এটি আমাকে প্রজেক্টএলারের চ্যালেঞ্জের কথা মনে করিয়ে দেয় (দুর্ভাগ্যক্রমে আমি কোনটি মনে করি না)। তবে সেখানে তালিকাভুক্ত না করে আপনাকে কারণগুলির সংখ্যা গণনা করতে হয়েছিল ।
flawr

সম্পর্কিত ওইআইএস
শার্লক 9

উত্তর:


12

হাস্কেল, 56 বাইট

_!1=[[]]
i!n=[j:f|j<-[i..n],mod n j<1,f<-j!div n j]
(2!)

(2!)(1338557220::Int)আমার ল্যাপটপে পাঁচ মিনিটের মধ্যে মুদ্রণ, যখন সংকলিত হয় ghc -O3

হাস্কেল, 62 বাইট, তবে আরও দ্রুত

i!n|i*i>n=[[n]]|0<1=[i:f|mod n i<1,f<-i!div n i]++(i+1)!n
(2!)

(2!)(1338557220::Int)আমার ল্যাপটপে এক সেকেন্ডের ত্রৈমাসিকে ছাপে যখন সঙ্গে কম্পাইল ghc -O3


আমি এটি কীভাবে পরীক্ষা করব? ghcআমাকে দেয় Parse error: naked expression at top levelএবং ghciদেয়parse error on input `='
পিটার টেলর

@ পিটারটেলর (2!)প্রোগ্রামটির সাথে ফাংশনটি প্রতিস্থাপন করুন main = print ((2!) (1338557220::Int)), সংকলন করুন ghc -O3 factor.hsএবং সাথে চালান ./factor
অ্যান্ডারস কাসের্গ

7

পাইথ, 29 বাইট

Msam+Ldgd/Hdf!%HT>S@H2tG]]Hg2

M                                def g(G, H):
                   @H2             square root of H
                  S                1-indexed range up to floor
                 >    tG           all but first G − 1 elements
            f                      filter for elements T such that:
              %HT                    H mod T
             !                       is false (0)
   m                               map for elements d:
       gd/Hd                         g(d, H/d)
    +Ld                              prepend d to each element
  a                     ]]H        append [[H]]
 s                                 concatenate
                           g2Q   print g(2, input)

এটি অনলাইনে চেষ্টা করুন

1338557220আমার ল্যাপটপে বিশ সেকেন্ডের মধ্যে চলে ।


@ পিটারটেলর স্বাভাবিক উপায়: pyth factor.pyth(বা pyth -c 'Msam+Ldgd/Hdf!%HT>S@H2tG]]Hg2'), স্টিডিন সরবরাহ 16করে। নিশ্চিত করুন যে আপনি পাইথের একটি বর্তমান সংস্করণ ব্যবহার করছেন; অন্তর্ভুক্ত Qমার্চ মাসে যোগ করা হয়েছিল। যদিও আপনি কীভাবে শূন্যের সাথে ভাগ পেয়ে যাচ্ছেন তা আমি ভাবতে পারি না।
অ্যান্ডারস কাসের্গ

Arrrrgh। আমি "পরিবর্তে ব্যবহার করছিলাম ', এবং বাশ !%অন্য কিছুতে প্রসারিত করছিল ।
পিটার টেলর 21

6

পাইথন , 252 313 312 311 145 141 137 135 103 84 83 বাইট

এটি মূলত অ্যান্ডারস ক্যাসরগের পাইথ উত্তরের উপর ভিত্তি করে । কোন গল্ফিং পরামর্শ স্বাগত জানাই। এটি অনলাইন চেষ্টা করুন!

সম্পাদনা করুন: 19 বাইট গল্ফযুক্ত ডেনিসকে ধন্যবাদ জানায় কোডে একটি টাইপো স্থির করে একটি টিআইও লিঙ্ক যুক্ত করেছে।

g=lambda n,m=2:[[n]]+[j+[d]for d in range(m,int(n**.5)+1)if n%d<1for j in g(n/d,d)]

Ungolfed:

def g(n, m=2):
    a = [[n]]
    s = int(n**.5) + 1
    for d in range(m, s):
        if n%d == 0:
            for j in g(n/d, d):
                a.append([d]+j)
    return a

1
**.5আমদানি থেকে মুক্তি পান।
ডেনিস

4

জাভাস্ক্রিপ্ট (ES6), 83 বাইট

f=(n,a=[],m=2,i=m)=>{for(;i*i<=n;i++)n%i<1&&f(n/i,[...a,i],i);console.log(...a,n)}

কেবলমাত্র অ্যান্ডারস ক্যাসরগের বর্গমূলের কৌশলটি ধার করা হয়েছে কারণ এটি আমার বাইটগুলি সামগ্রিকভাবে সংরক্ষণ করে। এর 1ইনপুট জন্য 1মুদ্রণ, অন্যথায় 1গুলি প্রিন্ট না ।


1

রুবি 1.9+, 87 89 87 বাইট

এই উত্তর উপর ভিত্তি করে অ্যান্ডারস ক্যাসরগের পাইথ । এই কোডটি কেবল রুবি ১.৯-এর পরে সংস্করণগুলির জন্য কাজ করে, কারণ ছুরিকাঘাতের ল্যাম্বডাস ->কেবল ১.৯-এ চালু হয়েছিল। কোনও গল্ফিং পরামর্শ স্বাগত are

g=->n,m=2{(m..Math.sqrt(n)).select{|i|n%i<1}.flat_map{|d|g[n/d,d].map{|j|[d]+j}}+[[n]]}

Ungolfed:

def g(n, m=2)
  a = [[n]]
  s = (m..Math.sqrt(n))
  t = s.select{|i|n%i<1}
  t.each do |d|
    g[n/d,d].each do |j|
      a.push([d]+j)
    end
  end
  return a
end

এর জন্য কি রুবির একটি বিশেষ সংস্করণ প্রয়োজন? 1.8.7 এর সাথে আমি সম্পর্কে একটি অভিযোগ পেয়েছি g[n/d,d]:wrong number of arguments (0 for 1)
পিটার টেলর

স্পষ্টতই ছুরিকাঘাতের ল্যাম্বডাস रुবি ->১.৯-এ চালু হয়েছিল। প্রয়োজনীয় সংস্করণ নম্বরটি দেখানোর জন্য আমি উত্তরটি সম্পাদনা করব।
শার্লক 9

ঠিক আছে ধন্যবাদ. আমি এখনও আগ্রহী g[n/d,d]g(n/d,d)আরও পিছনে সামঞ্জস্যপূর্ণ।
পিটার টেলর

1
আহ, f[n]সাধারণভাবে সাধারণভাবে লম্পট ল্যাম্বডাস এবং রুবি ল্যাম্বডাসকে কল করতে হবে। f(n)এবং f nকল প্রয়োজন defএবং endএখানে এবং এখানে
শার্লক 9

1

জে, 52 বাইট

[:~.q:<@/:~@(*//.)"$~#@q:_&(;@]<@(,~"{~0,#\@~.)"1)}:

এটি এতটা দক্ষ না যেহেতু কিছু কারণগুলি পুনরাবৃত্তি হতে পারে এবং প্রতিটি ফ্যাক্টেরাইজেশন বাছাই করার পরে একটি চূড়ান্ত পাস করতে হবে এবং তারপরে ডি-ডুপ্লিকেট করা হবে।

এটি অনলাইন চেষ্টা করুন!(তবে ইনপুট মানগুলি ছোট রাখার চেষ্টা করুন)।

আমার ডেস্কটপে সময়গুলি হ'ল

   f =: [:~.q:<@/:~@(*//.)"$~#@q:_&(;@]<@(,~"{~0,#\@~.)"1)}:
   timex 'r =: f 1338557220'
3.14172
   # r
246218
   timex 'r =: f 901800900'
16.3849
   # r
198091

ব্যাখ্যা

এই পদ্ধতিটি ইনপুট পূর্ণসংখ্যা এন এর মূল কারণগুলির জন্য সমস্ত সেট পার্টিশন তৈরির উপর নির্ভর করে । পারফরম্যান্স সেরা হয় যখন এন বর্গমুক্ত হয়, অন্যথায় সদৃশ ফ্যাক্টরীকরণ তৈরি করা হবে।

[:~.q:<@/:~@(*//.)"$~#@q:_&(;@]<@(,~"{~0,#\@~.)"1)}:  Input: integer n
                                                  }:  Curtail, forms an empty array
                       q:                             Prime factorization
                     #@                               Length, C = count prime factors
                         _&(                     )    Repeat that many times on x = []
                                 (            )"1       For each row
                                            ~.            Unique
                                         #\@              Enumerate starting at 1
                                       0,                 Prepend 0
                                  ,~"{~                   Append each of those to a
                                                          copy of the row
                               <@                         Box it
                            ;&]                         Set x as the raze of those boxes
                                                      These are now the restricted growth
                                                      strings of order C
    q:                                                Prime factorization
            (    )"$~                                 For each RGS
               /.                                       Partition it
             */                                         Get the product of each block
        /:~@                                            Sort it
      <@                                                Box it
[:~.                                                  Deduplicate
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.