বিভাজন হ্রাস


21

একটি সংখ্যা একজন ভাজক এন যে সমানভাবে ভাগ কোন সংখ্যা হয় এন 1 এবং সহ, এন নিজেই। বিভাজকের সংখ্যা ডি (এন) হ'ল একটি সংখ্যার কতগুলি বিভাজন রয়েছে। প্রথম দম্পতি এন এর জন্য ডি (এন) এখানে রয়েছে :

n    divisors    d(n)
1    1           1
2    1, 2        2
3    1, 3        2
4    1, 2, 4     3
5    1, 5        2
6    1, 2, 3, 6  4

আমরা বারবার একটি সংখ্যা থেকে বিভাজকের সংখ্যা বিয়োগ করতে পারি। উদাহরণ স্বরূপ:

16                  = 16
16 - d(16) = 16 - 5 = 11
11 - d(11) = 11 - 2 = 9
 9 - d( 9) =  9 - 3 = 6
 6 - d( 6) =  6 - 4 = 2
 2 - d( 2) =  2 - 2 = 0

এই ক্ষেত্রে এটি 0 এ পেতে 5 টি পদক্ষেপ নিয়েছে।


একটি প্রোগ্রাম বা ফাংশন লিখুন যা একটি নন-সংকেতসংখ্যা প্রদান করেছে এন বিভাজকের সংখ্যার বারবার বিয়োগ দ্বারা এটি 0 এ হ্রাস করতে নেওয়া পদক্ষেপের সংখ্যা প্রদান করে।

উদাহরণ:

0, 0
1, 1
6, 2
16, 5
100, 19
100000, 7534

5
বাধ্যতামূলক OEIS লিঙ্ক: A155043
Sp3000

উত্তর:


1

জেলি, 10 9 বাইট

1 বাইট ধন্যবাদ ডেনিস ♦

পাইথ আমার উত্তর পোর্ট ।

ÆDLạµÐĿL’

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

পরীক্ষা স্যুট.

ব্যাখ্যা

_ÆDL$$ÐĿL’
      ÐĿ    Repeat the following until result no longer unique:
 ÆD             Yield the array of the divisors
   L            Yield the length of the array
_               Subtract that from the number
        L   Number of iterations
         ’  Minus one.

6

পাইথন, 49 বাইট

f=lambda n:n and-~f(sum(n%~x<0for x in range(n)))

orlp একটি বাইট বাঁচাতে সাহায্য করেছিল! এবং Sp3000 আরও দুটি সংরক্ষণ করেছে saved ধন্যবাদ!


1
-~মধ্যে স্থানান্তরিত করে এবং n%-~kসীমার নীচের সীমানা সরিয়ে জিনিসগুলিকে সংক্ষিপ্ত করতে সক্ষম হওয়া উচিত ।
orlp


4

পাইথ, 10 বাইট

tl.ulf%NTS

পরীক্ষা স্যুট.

ব্যাখ্যা

tl.ulf%NTS
tl.ulf%NTSNQ  implicit variables at the end
           Q  obtain the input number
  .u      N   repeat the following until result no longer unique:
         S        generate range from 1 to N
     f            filter for:
      %NT             T in that range, which N%T is truthy (not zero)
    l             length of that list
                  that means, we found the number of "non-divisors" of N
tl            number of iterations, minus 1.

3

জুলিয়া, 31 বাইট

f(n)=n<1?0:f(sum(n%(1:n).>0))+1

সোজা পুনরাবৃত্তি বাস্তবায়ন।



2

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

f=n=>n&&[...Array(m=n)].map((_,i)=>m-=n%++i<1)|f(m)+1

আমাকে কেন জিজ্ঞাসা করবেন না কেন আমি অযথা টেল রিকার্সন ব্যবহার করছিলাম।



1

05AB1E, 12 10 বাইট

কোড:

[Ð>#Ñg-¼]¾

ব্যাখ্যা:

[           # start infinite loop
 Ð          # triplicate current number
  >#        # increase by 1 and break if true
    Ñg      # get number of divisors
      -     # subtract number of divisors from number
       ¼    # increase counter
        ]   # end loop
         ¾  # print counter

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

সম্পাদনা: 2 বাইট সংরক্ষিত এবং ইনপুট সহ একটি বাগ 0 অ্যাডনানকে ধন্যবাদ ধন্যবাদ


খুব সুন্দর! আমি গলফ একটু চেষ্টা করে, এবং 10 বাইট এটিকে নিচে করেছেন: [Ð>#Ñg-¼]¾। যদিও এটি আরও খাটো করার একটি উপায় থাকতে হবে ...
আদনান

@ লুইস মেন্ডো হ্যাঁ, কারণ D0Q#অংশটি কাউন্টার বাড়ানোর পরে is [Ð>#Ñg-¼]¾কোড কাজ করা উচিত 0, যদিও :)।
আদনান

@ আদনান: আমি এন অবধি সমস্ত সংখ্যা তৈরি করে সূচক থেকে মূল্য সূচকে মূল্য এবং গণনা অবলম্বনের উপর ভিত্তি করে একটি সংস্করণ চেষ্টা করেছি, তবে সেভাবে এটি আরও সংক্ষিপ্ত হয়ে উঠতে পারে নি।
Emigna


1

ম্যাথক্যাড, [টিবিডি] বাইটস

এখানে চিত্র বর্ণনা লিখুন


ম্যাথক্যাড বাইট সমতুল্য প্রকল্পটি এখনও নির্ধারিত হয়নি। মোটামুটি কীস্ট্রোক সমতুল্যতা ব্যবহার করে প্রোগ্রামটি প্রায় 39 "বাইট" ব্যবহার করে। নোট করুন যে যখন এবং প্রোগ্রামিং অপারেটরগুলি কেবল প্রতিটি ইনপুট (সিটিএল-] এবং সিটিএল-শफ्ट- #, যথাক্রমে প্রতিটি কীবোর্ড অপারেশন নেয় - প্রকৃতপক্ষে, এগুলি কেবল কীবোর্ড থেকে প্রবেশ করা যেতে পারে।

আপনি যা দেখছেন তা হ'ল ম্যাথক্যাড কার্যপত্রকটিতে ঠিক কী লেখা হয়। ম্যাথক্যাড সমীকরণ / প্রোগ্রামগুলি মূল্যায়ন করে এবং একই শীটে আউটপুট রাখে (যেমন, '=' মূল্যায়ন অপারেটরের পরে বা প্লটের উপরে)।



1

গণিত, 35 বাইট

If[#<1,0,#0[#-0~DivisorSigma~#]+1]&

ভাল পুরানো ব্যবহার করা DivisorSigma। @ মার্টিনব্যাটনার নিম্নলিখিত বিকল্পগুলি নোট করেছেন:

If[#<1,0,#0[#-DivisorSum[#,1&]]+1]&
f@0=0;f@n_:=f[n-DivisorSum[n,1&]]+1

1

হুন , 93 76 বাইট

|=
r/@
?~
r
0
+($(r (sub r (lent (skim (gulf 1^r) |=(@ =(0 (mod r +<))))))))

Ungolfed:

|=  r/@
?~  r
  0
=+  (skim (gulf 1^r) |=(@ =(0 (mod r +<))))
+($(r (sub r (lent -))))

একটি ফাংশন দেয় যা একটি পরমাণু নেয় r,। একটি মধ্যবর্তী মান তৈরি করুন যাতে সমস্ত বিচক্ষণকারী থাকে r(তালিকা তৈরি করুন [1..n], কেবলমাত্র সেই উপাদানগুলি রাখুন যেখানে (মোড রি) == 0)। যদি rশূন্য ফেরত শূন্য হয়, অন্যথায় r সমান আর- (দৈর্ঘ্য বিভাজক) এর সাথে পুনরাবৃত্তির বর্ধিত মানটি প্রদান করুন।

কোডটি এন = 100.000 এর মূল্যায়ন করতে বোকামি পরিমাণ সময় নেয়, পুরোপুরি কারণ বড় সংখ্যার জন্য বিচক্ষণকারীদের সন্ধান করা একটি বিশাল তালিকা তৈরি করে এবং এটির উপরে মানচিত্র তৈরি করে। বিভাজকদের স্মরণ করিয়ে দিয়ে এন = 10.000 এর জন্য সঠিক আউটপুট পাওয়া যায়, তবে আমি 100.000 এর অপেক্ষায় বিরক্ত করি না


1

হাস্কেল, 43 40 39 বাইট

g 0=0;g n=1+g(sum$min 1.mod n<$>[1..n])

সহজ পুনরাবৃত্তি পদ্ধতির। ব্যবহারের উদাহরণ: g 16-> 5

সম্পাদনা করুন: @ লিন 3 4 বাইট সংরক্ষণ করেছেন । ধন্যবাদ!


কীভাবে g(sum$signum.mod n<$>[1..n])?
লিন

ওহ, এবং min 1আসলে একাধিক বাইট খাটো signumএমনকি
লিন

1

পাওয়ারশেল ভি 2 +, 74 67 বাইট

param($n)for($o=0;$n-gt0){$a=0;1..$n|%{$a+=!($n%$_)};$n-=$a;$o++}$o

অন্যান্য উত্তরগুলির তুলনায় বেশ লম্বা মনে হচ্ছে ...

ইনপুট নেয় $n, তার চেয়ে বড় forঅবস্থার সাথে একটি লুপ প্রবেশ করে । প্রতিটি লুপ পুনরাবৃত্তির আমরা সেট সাহায্যকারী , তারপর থেকে সংখ্যা মাধ্যেমে লুপ পর্যন্ত । প্রতিটি অভ্যন্তরীণ লুপ আমরা প্রতিটি সংখ্যার বিপরীতে পরীক্ষা করে দেখি যে এটি কোনও বিভাজক কিনা এবং যদি তাই হয় তবে আমরা আমাদের সহায়ককে বাড়িয়ে তুলি (বুলিয়ান অবহেলা এবং অন্তর্নিহিত -ালাই ব্যবহার করে)। তারপরে, আমরা কতগুলি বিভাজন পেয়েছি তা বিয়োগ করে আমাদের কাউন্টারকে বাড়িয়ে তুলি । অবশেষে, আমরা আউটপুট ।$n0$a1$n$a$n-=$a$o++$o

এটি কার্যকর করার জন্য একটি দীর্ঘ সময় নেয় , কারণ এটি একটি গুরুত্বপূর্ণ লুপ নির্মাণের জন্য। উদাহরণস্বরূপ, n = 10,000আমার মেশিনে চালানো (1 বছরের পুরানো কোর আই 5) প্রায় 3 মিনিট সময় নেয়।


1

র‌্যাকেট - 126 বাইট ডাউন 98 বাইট 91 বাইট

একটি চূড়ান্ত নিষ্পাপ সমাধান - সম্ভবত একটি শালীন অ্যালগরিদম এবং কিছু লিসপ ট্রিকস যা আমি জানি না তার সাহায্যে অনেকগুলি কেটে যেতে পারে

(define(g x[c 0][d 0][i 2])(cond[(= x 0)c][(= i x)(g d(+ 1 c))][(=(modulo x i)0)(g x c d(+ 1 i))][else(g x c(+ 1 d)(+ 1 i))]))

সম্পাদনা করুন: অনুরোধ দ্বারা ব্যাখ্যা। যেমনটি আমি বলেছিলাম, এটি একটি চূড়ান্ত পুনরাবৃত্তি সমাধান এবং এটি আরও অনেক কম হতে পারে।

(define (g x [c 0] [d 0] [i 2]) ;g is the name of the function - arguments are x (input), c (counter for steps), d (non-divisor counter), i (iterator)
  (cond
    [(= x 0) c] ;once x gets to 0 c is outputted
    [(= i x) (g d (+ 1 c))] ;if iterator reaches x then we recurse with d as input and add 1 to c
    [(= (modulo x i) 0) (g x c d (+ 1 i))] ;checks if iterator is non divisor, then adds it to d and increments iterator
    [else(g x c (+ 1 d) (+ 1 i))])) ;otherwise just increments iterator

কম বোবা অ্যালগরিদম সহ 2: 98 বাইট সংস্করণ সম্পাদনা করুন (এখনও বেশ বোবা যদিও কম এবং ছোটও হতে পারে)

(define(g x)(if(< x 1)0(+ 1(g(length(filter(λ(y)(>(modulo x y)0))(cdr(build-list x values))))))))

ব্যাখ্যা:

(define (g x) ;function name g, input x
  (if (< x 1)
      0 ;returns 0 if x < 1 (base case)
      (+ 1 ;simple recursion - adds 1 to output for each time we're looping
         (g (length ;the input we're passing is the length of... 
              (filter (λ (y) (> (modulo x y) 0)) ;the list where all numbers which are 0 modulo x are 0 are filtered out from...
                             (cdr (build-list x values)))))))) ;the list of all integers up to x, not including 0

সম্পাদনা করুন 3: প্রতিস্থাপন 7 বাইট সংরক্ষিত (cdr(build-list x values))সঙ্গে(build-list x add1)

(define(g x)(if(< x 1)0(+ 1(g(length(filter(λ(y)(>(modulo x y)0))(build-list x add1)))))))

হ্যালো, এবং পিপিসিজিতে আপনাকে স্বাগতম! দুর্দান্ত পোস্ট! আপনি দয়া করে আপনার সমাধান ব্যাখ্যা করতে পারেন? (পিএস আমি
লিস্পকে

@ নন আইইন এখানে সম্পাদনা করেছেন
ক্রনিকোমেজ

0

> <> , 52 + 2 = 54 বাইট

প্রোগ্রাম শুরুর সময় ইনপুট নম্বরটি স্ট্যাকটিতে উপস্থিত থাকা দরকার, সুতরাং -vপতাকাটির জন্য +2 বাইট রয়েছে । এটি অনলাইন চেষ্টা করুন!

:0)?v~ln;>~$-]
03[}\::
@@:$<    v?=0:-1}+{~$?@@01%@:

প্রান্তিককরণ বিষয়গুলিতে 4 বিরক্তিকর বাইটগুলি নষ্ট করা হয়। বাঃ।

এই এক থেকে ক্রম নির্মাণের দ্বারা কাজ nকরার জন্য0 স্ট্যাক। একবার 0 পৌঁছে যাওয়ার পরে, এটি পপ এবং অবশিষ্ট স্ট্যাকের দৈর্ঘ্য আউটপুট করুন।

যাইহোক, এটি O(n^2)সময়ে চালিত হয় , তাই আমি চেষ্টা করব নাn = 100000 ...


-vএকটি বাইট, না দুটি।
নাহইহই এখানে


0

রুবি, 42 বাইট

f=->n{n<1?0:1+f[n-(1..n).count{|i|n%i<1}]}

বৃহত্তম পরীক্ষার ক্ষেত্রে স্ট্যাক ওভারফ্লো ত্রুটি রয়েছে 100000, সুতরাং এখানে 49 বাইটের মধ্যে একটি পুনরাবৃত্তি সংস্করণ রয়েছে । O(N^2)জটিলতা বিবেচনা করে কিছুটা সময় নেয় ।

->n{c=0;c+=1 while 0<n-=(1..n).count{|i|n%i<1};c}

0

পার্ল 5, 40 বাইট

sub f{@_?(1,f((1)x grep@_%$_,1..@_)):()}

ইনপুট এবং আউটপুট হ'ল অনুলিপিগুলির প্রয়োজনীয় সংখ্যার তালিকা হিসাবে 1



0

আসলে, 17 বাইট

";╗R`╜%`░l;"£╬klD

এটি অনলাইন চেষ্টা করুন! (দ্রষ্টব্য: শেষ পরীক্ষার কেস টিআইও-তে শেষ হয়েছে)

ব্যাখ্যা:

";╗R`╜%`░l;"£╬klD
"          "£╬     while top of stack is truthy, call the function:
 ;╗                  push a copy of n to reg0
   R                 range(1,n+1) ([1,n])
    `  `░l             push the number of values where the following is truthy:
     ╜%                  k mod n
                       (this computes the number of non-divisors of n)
          ;            make a copy
              klD  push entire stack as list, count number of items, subtract 1
                   (the result is the number of times the function was called)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.