Pseudofactorial


39

একটি কৌতূহলী সংখ্যা রয়েছে যা কখনও কখনও গণিত সমস্যা বা ধাঁধাতে দেখা যায়। সিউডোফ্যাক্টরিয়াল (এন) হ'ল এন এর মাধ্যমে 1 সংখ্যার সর্বনিম্ন (অর্থাত্ সর্বনিম্ন) সাধারণ একক; অন্য কথায়, এটি সর্বনিম্ন সংখ্যা যা 1 থেকে এন এর মাধ্যমে সমস্ত সংখ্যা রয়েছে কারণ হিসাবে।

উদাহরণস্বরূপ সিউডোফ্যাক্টরিয়াল (7) = 3 * 4 * 5 * 7, যা 7 এর সমান! 2 এবং 6 বাদে অপসারণ করা হয়েছে কারণ এগুলি অন্য পদগুলিতে রয়েছে।

সিউডোফ্যাক্টোরিয়াল (এন) এবং সর্বদা হিসাবে সংক্ষিপ্ততম কোড জয়ের জন্য একটি প্রোগ্রাম লিখুন।

আপনার ব্যবহারের জন্য এখানে একটি সংক্ষিপ্ত তালিকা রয়েছে। A003418 এর অধীনে আরও পরীক্ষার কেসগুলি OEIS এ পাওয়া যাবে

গৌণিক:

  1. 1
  2. 2
  3. 6
  4. 24
  5. 120
  6. 720
  7. 5040

Pseudofactorial:

  1. 1
  2. 2
  3. 6
  4. 12
  5. 60
  6. 60
  7. 420

6
আমি নিশ্চিত না কেন আমি বুঝতে পেরেছি 2এবং কেন 6গুণকের তালিকা থেকে সরানো হয়েছিল। আপনি দয়া করে নিয়ম পরিষ্কার করতে পারেন?
মাল্টেসেন

2
@ ম্যাটিসেন, স্যুইচুডফ্যাকটোরিয়াল (এন) হ'ল সংখ্যায় সবচেয়ে কম সংখ্যা যার উপাদানগুলি হিসাবে এন এর মাধ্যমে 1 নম্বর রয়েছে (এই সংখ্যাগুলির মধ্যে সর্বনিম্ন সাধারণ একাধিক)। এটি প্রযুক্তিগত সংজ্ঞা, তবে আমি এটি যেভাবে লিখেছি তা কিছুটা পরামর্শদায়ক ছিল যে এটি কোনও ফ্যাকটোরিয়াল এর অনুরূপ।
টনি রুথ


4
প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ স্বাগতম! এটি একটি দুর্দান্ত প্রথম চ্যালেঞ্জ!
অ্যালেক্স এ।

1
আপনার প্রথম চ্যালেঞ্জ এইচএনকিউয়ের শীর্ষে উঠেছে। নিস!
ড্যানিয়েল এম

উত্তর:


19

ডায়ালগ এপিএল , 3 বাইট

∧/⍳

এপিএল জেলিকে ats

1 যদিও তর্ক

∧/ LCM জুড়ে


10
সেই আন্তঃবাবাং এত সেক্সি।
shooqie

1
হে মানুষ আপনি ডেনিসকে পরাজিত করেছেন ...
মামা ফান রোল

1
চিত্তাকর্ষক, তবে এই 3 বাইট কেমন?
পাল্টে ক্লকওয়্যারটি বন্ধ করে দেওয়া হয়েছে



8

সি (x86 সহ), 52 বাইট

d(n,k,b,t){for(b=k=1;b;++k)for(t=n,b=0;t;b+=k%t--);}

1 থেকে উপরে দিকে নম্বরগুলি পরীক্ষা করে। প্রতিটি সংখ্যার জন্য, এটিকে n থেকে 1 পর্যন্ত সমস্ত সংখ্যায় ভাগ করে এবং অবশিষ্টাংশের যোগফল দেয়। যোগফল 0 হলে থামে ops

ব্যবহার:

main()
{
    printf("%d\n", d(7)); // outputs 420
}

এটি কীভাবে কোনও মূল্য ফেরায় তা স্পষ্ট নয় (কোনও returnবিবৃতি নেই)।

X86 এর জন্য কলিং কনভেনশন বলছে যে ফাংশনটি অবশ্যই eaxরেজিস্টারে তার মানটি ফিরিয়ে আনবে। সুবিধার্থে, বিভাগ নির্দেশ idivতার ইনপুটটি প্রত্যাশা করে eaxএবং ফলাফলটি eax(ভাগফল) এবং edx(অবশিষ্ট) ফলাফলকে আউটপুট করে । শেষ পুনরাবৃত্তিটি ভাগ kকরে 1, সুতরাং eaxফাংশনটি প্রস্থান করার সময় সঠিক মান থাকবে।

এটি কেবলমাত্র (ডিবাগ-মোডে, এটি আউটপুটগুলিতে 421) অনুকূলকরণের সাথে কাজ করে ।


এন, কে, বি, এবং টি টাইপ না করে আপনি কীভাবে পালাতে পারবেন?
টনি রুথ

সিটির ডিফল্ট-অন্তর্ভুক্ত নিয়ম রয়েছে - সমস্ত বাদ দেওয়া প্রকারগুলি intডিফল্টরূপে হয় (ফেরতের মান সহ)। এটি তথাকথিত "পুরাতন-স্টাইল" সিনট্যাক্স ব্যবহার করে ঘোষণা করা হলে এটি ফাংশন আর্গুমেন্টগুলির জন্য কাজ করে। সুস্পষ্টভাবে সংজ্ঞায়িত int d(n,k,b,t) int n,k,b,t; {...}
ধরনেরগুলির

আপনি যদি কোনও কলিং কনভেনশনের সুযোগ নিচ্ছেন তবে এটি কেবল "সি" না দিয়ে "সি (সিডিকেল)" হিসাবে চিহ্নিত করা উচিত
স্টিভ কক্স

@ স্টিভকক্স উভয়ই cdeclএবং stdcallরিটার্ন-ভ্যালুতে একই পদ্ধতি ব্যবহার করুন, তাই আমার ধারণা x86যথেষ্ট
অ্যানাটোলিগ

7

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

f x=foldr1 lcm[1..x]

ব্যবহারের উদাহরণ: map f [1..7]-> [1,2,6,12,60,60,420]

lcmমধ্যে Haskell কৌতুক।


6

পাইথন + সিমপি, 45 বাইট

import sympy
lambda n:sympy.lcm(range(1,n+1))

মোটামুটি স্ব-ব্যাখ্যামূলক।


পাইথন 2, 57 54 বাইট

i=r=input();exec't=r\nwhile r%i:r+=t\ni-=1;'*r;print r

আইডিয়নে এটি পরীক্ষা করুন ।

কিভাবে এটা কাজ করে

ইনপুটটি ভেরিয়েবল i এবং r এ সংরক্ষণ করা হয় ।

execনিম্নলিখিত কোডটি r বার কার্যকর করে।

t=r
while r%i:r+=t
i-=1

যদিও আমি থেকে পরিবর্তিত হয় করার 1 , আমরা প্রাথমিক মান যোগ (সঞ্চিত টি হিসাবে) অনেকবার প্রয়োজনীয় হিসাবে নিজেই একটি একাধিক তৈরি করতে আমি । ফলাফলটি হ'ল স্পষ্টতই, একাধিক টি

চূড়ান্ত মান এইভাবে সীমার মধ্যে সব পূর্ণসংখ্যার একটি একাধিক [1, ..., এন] , যেখানে n হল ইনপুট হয়।


1
তৃতীয় পক্ষের লাইব্রেরি বা execকৌশল ব্যবহার না করে একটি 78 বাইট সমাধান রয়েছে: from fractions import*;lambda n:reduce(lambda x,y:x*y/gcd(x,y),range(1,n+1),1) সত্যটি ব্যবহার করে lcm(x,y) = x*y/gcd(x,y)
বাকুরিউ

6

পাইথন, 46 বাইট

g=lambda n,c=0:n<1or(c%n<1)*c or g(n,c+g(n-1))

একাধিক জন্যে cএর g(n-1)সরাসরি। আমার যদিও আগে ছিল যে এই পদ্ধতিটি ভুলভাবে 0 টিকে কোনও কিছুর একাধিক হিসাবে খুঁজে পাবে, তবে orশর্ট সার্কিট বা (c%n<1)*cএড়িয়ে c==0যাবে কারণ 0 ফ্যালসি।


50 বাইট:

g=lambda n,i=1:n<1or(i*n%g(n-1)<1)*i*n or g(n,i+1)

ডেনিসের সমাধানের মতো তবে একটি পুনরাবৃত্ত ফাংশন হিসাবে। গণনা করা g(n-1), এর মধ্যে ক্ষুদ্রতম একাধিক i*nজন্য nএছাড়াও একাধিক g(n-1)। সত্যিই ধীর।

ডেনিসকে 4 বাইটের nপরিবর্তে এর গুণকগুলি দেখে ধন্যবাদ জানাই g(n-1)


5

জে, 9 বাইট

[:*./1+i.

সোজা-এগিয়ে পদ্ধতির। সংখ্যার ব্যাপ্তি তৈরি করে [0, ..., n-1], তারপরে প্রত্যেকটিতে একটি করে যুক্ত করে এবং এলসিএম ব্যবহার করে এটি হ্রাস করে।

ব্যবহার

   f =: [:*./1+i.
   f 7
420


4

গণিত, 13 বাইট

LCM@@Range@#&

এটি কি শুধু রচনা LCMএবং এর Rangeসাথে সমান নয় @*?
মাল্টেসেন

1
LCMএকটি তালিকায় উপাদান অনুসারে পরিচালিত হয়, যা দ্বারা পাস করা Rangeহবে যার অর্থ এটি কেবলমাত্র 1 থেকে n এর মাধ্যমে x এর জন্য lcm ( x ) প্রদান করবে । এছাড়াও, একটি অনুপস্থিত রয়েছে যা বেনামি ফাংশনটি বন্ধ করে দেবে। 13 বাইটের মতো কিছু কাজ করবে। &LCM@@Range@#&
মাইল


3

পাইথ - 8 বাইট

এটি দ্বারা বিভাজ্য এমন কোনও সন্ধান না পাওয়া পর্যন্ত সমস্ত নম্বর পরীক্ষা করে [1..N]

f!s%LTSQ

টেস্ট স্যুট


3

অক্টাভা, 27 বাইট

@(x)lcm(1,num2cell(1:x){:})

হিসাবে পরিচিত হতে পারে এমন একটি বেনামী ফাংশন তৈরি করে ans(N)

অনলাইন ডেমো

ব্যাখ্যা

এই সমাধানটি 1এবং x( 1:x) এর মধ্যে সমস্ত সংখ্যার একটি তালিকা তৈরি করে , তাদের সাথে একটি ঘর অ্যারে রূপান্তর করে num2cell। তারপরে {:}সূচকটি কমা-বিচ্ছিন্ন-তালিকা তৈরি করে যা lcmসর্বনিম্ন সাধারণ একাধিক গণনা করার জন্য একাধিক ইনপুট আর্গুমেন্ট হিসাবে প্রেরণ করা হয়। একটি 1 সর্বদা প্রথম আর্গুমেন্ট হিসাবে পাস করা হয় lcmকারণ lcmসর্বদা কমপক্ষে দুটি ইনপুট আর্গুমেন্ট প্রয়োজন।


1
সুতরাং lcmঅক্টোবায় 2 টিরও বেশি ইনপুট গ্রহণ করে! আকর্ষণীয়
লুইস মেন্ডো

@ লুইসমেডো ইয়ুপ 2+
স্যুভার

3

ম্যাটল্যাব, 49 বাইট

@(x)find(~any(bsxfun(@rem,1:prod(1:x),(1:x)')),1)

+1 এর জন্যbsxfun
flawr

3

পার্ল 6 , 13 বাইট

{[lcm] 1..$_}

বেনামি কোড ব্লক যা 1 থেকে ইনপুট (অন্তর্ভুক্ত) পর্যন্ত একটি ব্যাপ্তি তৈরি করে এবং এর সাথে এটি হ্রাস করে &infix:<lcm>

উদাহরণ:

#! /usr/bin/env perl6
use v6.c;

my &postfix:<p!> = {[lcm] 1..$_}

say 1p!; # 1
say 2p!; # 2
say 3p!; # 6
say 4p!; # 12
say 5p!; # 60
say 6p!; # 60
say 7p!; # 420

say 10000p!; # 5793339670287642968692270879...
# the result from this is 4349 digits long


2

জাভাস্ক্রিপ্ট (ES6), 92 88 80 74 69 বাইট:

ধন্যবাদ @ কনরওব্রায়ান এবং @ নীল

y=>(g=(a,b)=>b?g(b,a%b):a,[...Array(y)].map((_,i)=>y=y*++i/g(y,i)),y)

b?g(b,a%b):aএকটি বাইট সংরক্ষণ করে।
নিল

y*++i/g(y,i)আরও কিছু বাইট সাশ্রয় করে।
নিল

1

05 এ বি 1 ই, 20 বাইট

Lpvyi¹LÒN>¢àN>*ˆ}}¯P

ব্যাখ্যা

Lpv                    # for each item in isprime(range(1,N)): N=7 -> [0,1,1,0,1,0,1]
   yi                  # if prime
     ¹LÒN>¢            # count occurrences of the prime 
                         in the prime-factorization of range(1,N):
                         p=2 -> [0,1,0,2,0,1,0]
           àN>*ˆ       # add max occurrence of that prime multiplied by the prime 
                         to global array: N=7 -> [4,3,5,7]
                }}     # end if/loop
                  ¯P   # get product of global array

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


1

মিনকোলাং 0.15 , 12 বাইট

আমার কাছে দুটি 12-বাইট সমাধান রয়েছে এবং সেগুলি উভয়ই অন্তর্ভুক্ত করেছি।

1n[i1+4$M]N.

এখানে চেষ্টা করুন!

ব্যাখ্যা

1               Push 1
 n              Take number from input
  [             For loop that repeats n times
   i1+          Push loop counter + 1
      4$M       Pop b, a and push lcm(a,b)
         ]      Close for loop
          N.    Output as number and stop.

এটি যত সহজ সরল gets


11nLd[4$M]N.

এখানে চেষ্টা করুন!

ব্যাখ্যা

11              Push two 1s
  n             Take number from input
   L            Pop b, a and push range from a to b, inclusive
    d           Duplicate top of stack (n)
     [4$M]      Pop b, a and push lcm(a,b), n times
          N.    Output as number and stop.

তৃতীয় সমাধান এটি থেকে উদ্ভূত হতে পারে: এটিকে সরান 1এবং স্রোতের dপরে একটি যুক্ত করুন d। উভয় ক্ষেত্রেই অতিরিক্ত সংখ্যাটি প্রয়োজন কারণ লুপটির জন্য লুপটি একাধিকবার চলে এবং এটিকে কম সময় চালানোতে দুটি বাইট লাগে ( 1-ঠিক আগে [)।


1

রুবি, 25 বাইট

g=->n{(1..n).reduce :lcm}

রুবি, 25 বাইট

g=->n{n<1?1:a[n-1].lcm n}

1
হ্যালো, এবং পিপিসিজিতে আপনাকে স্বাগতম! দুর্দান্ত প্রথম পোস্ট! আপনার ফাংশনটির নাম রাখতে হবে না, তাই আপনি মুছে ফেলতে পারেন g=
নন ইনিহির

বেনামে ফাংশন অনুমোদিত।
এরিক আউটগলফার

1

গেমমেকার ল্যাঙ্গুয়েজ, 60 বাইট

for(b=k=1;b;++k){b=0for(t=argument0;t;b+=k mod t--)}return k

অ্যানাটলিগের উত্তরের যুক্তির ভিত্তিতে।


1

পিএইচপি, 61 52 48 বাইট

লুপগুলিকে মার্জ করে 4 বাইট @ ইউজার59178, 9 টি বাইট সংরক্ষণ করেছে

functionমূল শব্দের কারণে পিএইচপি-তে পুনরাবৃত্তি বিশাল ; তাই আমি পুনরাবৃত্তি ব্যবহার করি।
এবং একটি "ছোট" কয়েক ঠাট সঙ্গে, আমি এখন এমনকি বীট Arnauld's জাতীয়

while(++$k%++$i?$i>$argv[1]?0:$i=1:$k--);echo$k;

কমান্ড লাইন আর্গুমেন্ট থেকে ইনপুট নেয়। সাথে চালাও -r

ভাঙ্গন

while(++$k%++$i?    # loop $i up; if it does not divide $k
    $i>$argv[1]?0       # break if $i (smallest non-divisor of $k) is larger than input
    :$i=1               # while not, reset $i and continue loop with incremented $k
    :$k--);         # undo increment while $i divides $k
echo$k;         # print $k

ungolfed

এটি আসলে একটিতে দুটি লুপ:

while($i<=$argv[1]) # loop while $i (smallest non-divisor of $k) is not larger than input
    for($k++,       # loop $k up from 1
        $i=0;$k%++$i<1;);   # loop $i up from 1 while it divides $k
echo$k;             # print $k

দ্রষ্টব্য: সদৃশটিতে আমার উত্তরটি অনুলিপি করা হয়েছে


1

এডাব্লুকে, 42 বাইট

{for(x=n=1;n<=$1;)if(x%n++){x++;n=1}$0=x}1

কমান্ড লাইন ব্যবহার:

awk '{for(x=n=2;n<=$1;)if(x%n++){x++;n=2}$0=x}1' <<< NUM

আমি AWKগতকাল সবেমাত্র পোস্টটি পেয়েছি এমন কোনও সমাধান এবং প্রশ্নের সদৃশটি দেখতে পেলাম না , তাই আমি ভেবেছিলাম যে আমি এটি এক সাথে ফেলে দেব। এটি বরং 19আমার বাক্সে ধীরে ধীরে সমাধান বা এটি বড়, তবে এটি কার্যকর।




0

হুন , 67 বাইট

|*
*
(roll (gulf 1 +<) |=({a/@ b/_1} (div (mul a b) d:(egcd a b))))

তালিকা তৈরি করুন, তালিকাটি [1..n]LCM দিয়ে ভাঁজ করুন। দুর্ভাগ্যক্রমে, আমি ব্যবহার করতে পারি হুন স্ট্ডলিবের একটি পূর্ব-নির্মিত একটি নেই: /



0

কিউবিআইসি , 35 32 বাইট

এটি আমাকে এখানে এনেছে।

:{p=0[a|~q%b|p=1]]~p=0|_Xq\q=q+1

ব্যাখ্যা:

:        Get cmd line param as number 'a'
{        Start an infinite DO loop
p=0      Sets a flag that shows if divisions failed
[a|      FOR (b=1; b<=a; b++)
~q%b     IF 'q' (which starts at 1 in QBIC) is not cleanly divisible by 'b'
|p=1     THEN Set the flag
]]   Close the FOR loop and the IF, leave the DO open
~p=0     IF 'q' didn't get flagged
|_Xq     THEN quit, printing 'q'
\q=q+1   ELSE raise 'q', redo
         [DO Loop implicitly closed by QBIC]

এখানে এমন একটি সংস্করণ যা টেস্টিং বন্ধ করে দেয় qযখন bএটি পরিষ্কারভাবে ভাগ না করে। এছাড়াও, টেস্টিং ক্রম bএর বিরুদ্ধে qধৃষ্টতা মধ্যে বিপরীত হয় যে উচ্চতর bএর ডিভাইড কঠিন হতে হবে (নিন 2, 3, 4উদাহরণস্বরূপ: যদি %2=0, %4হতে পারে !0। তদ্বিপরীত না, তাই অনেক ...)।

:{p=0[a,2,-1|~q%b|p=1┘b=2]]~p=0|_Xq\q=q+1

0

অ্যাক্সিয়োম, 35 বাইট

f(x)==reduce(lcm,[i for i in 1..x])

পরীক্ষার কোড এবং ফলাফল

(25) -> [[i,f(i)] for i in [1,6,19,22,30]]
   (25)  [[1,1],[6,60],[19,232792560],[22,232792560],[30,2329089562800]]
                                                  Type: List List Integer

আমি কেবলমাত্র সর্বনিম্ন ইতিবাচক পূর্ণসংখ্যার সমাধানটি প্রস্তুত করি যা 1 থেকে n পর্যন্ত সমস্ত পূর্ণসংখ্যার কারণ হিসাবে আপনি বলে থাকেন এটি দ্বিগুণ হয়েছে আমি এটি এখানে পোস্ট করছি



0

8 ম , 23 বাইট

কোড

1 ' lcm rot 2 swap loop

এই কোডটি TOS- এ ফলাফলের সিউডোফ্যাক্টরিয়াল ছেড়ে দেয়

ব্যবহার এবং উদাহরণ

ok> 7 1 ' lcm rot 2 swap loop .
420

বা আরও পরিষ্কারভাবে

ok> : pseudofact 1 ' n:lcm rot 2 swap loop ;

ok> 7 pseudofact .
420
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.