এটি কতটা ছোট হতে পারে?


42

ধনাত্মক পূর্ণসংখ্যার এন দিয়ে শুরু করে , ক্ষুদ্রতম পূর্ণসংখ্যক এন ' খুঁজে বার করুন যা এনকে তার এক অঙ্কের দ্বারা বার বার ভাগ করে গণনা করা যেতে পারে (বেস -10)। প্রতিটি নির্বাচিত অঙ্ক অবশ্যই 1 এর চেয়ে বড় এন এর বিভাজক হতে হবে ।

উদাহরণ # 1

N = 230 এর প্রত্যাশিত আউটপুট হ'ল এন '= 23 :

230/2 = 115, 115/5 = 23

উদাহরণ # 2

এন = 129528 এর প্রত্যাশিত আউটপুট হ'ল এন '= 257 :

129528/8 = 16191, 16191/9 = 1799, 1799/7 = 257

অপ-অনুকূল পাথ থেকে সাবধান!

আমরা 129528/9 = 14392 দিয়ে শুরু করতে পারি , তবে এটি ক্ষুদ্রতম সম্ভাব্য ফলাফলের দিকে নিয়ে যায় না । আমরা প্রথমে 9 দ্বারা ভাগ করে নিলে আমরা সেরাটি হ'ল:

129528/9 = 14392, 14392/2 = 7196, 7196/7 = 1028, 1028/2 = 514 -> ভুল!

বিধি

  • ইনপুট যেকোন যুক্তিসঙ্গত বিন্যাসে নেওয়া যেতে পারে (পূর্ণসংখ্যা, স্ট্রিং, অঙ্কগুলির অ্যারে, ...)।
  • এটি , তাই বাইটের মধ্যে সংক্ষিপ্ত উত্তর!

পরীক্ষার মামলা

1         --> 1
7         --> 1
10        --> 10
24        --> 1
230       --> 23
234       --> 78
10800     --> 1
10801     --> 10801
50976     --> 118
129500    --> 37
129528    --> 257
8377128   --> 38783
655294464 --> 1111

1
আমি অবাক হই যদি এই সিরিজটি (1, 1, ..., 10, 11, 1, 13, ..., 1, ...) এর একটি OEIS এন্ট্রি থাকে
Draco18s

এটি (এখনও) নয়, এএএএএফএস।
GNiklasch

উত্তর:


11

হাস্কেল , 67 61 বাইট

f n=minimum$n:[f$div n d|d<-read.pure<$>show n,d>1,mod n d<1]

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

ব্যাখ্যা:

  • read.pure<$>show nইনপুট পূর্ণসংখ্যাকে nঅঙ্কের তালিকায় রূপান্তর করে ।
  • dএই তালিকা থেকে প্রতিটি অঙ্কের জন্য , আমরা পরীক্ষা করে দেখি d>1এবং mod n d<1এটিই dভাগ হয় কিনা n
  • চেক সফল হন, আমরা বিভক্ত nদ্বারা dএবং যাও recursively আবেদন f: f$div n d
  • সামগ্রিকভাবে, এর সমস্ত উপ-গাছ থেকে ন্যূনতম পূর্ণসংখ্যার একটি তালিকা পাওয়া যায় n
  • তালিকাটি খালি থাকতে পারে, আমরা এতে যুক্ত nহয়ে minimumতালিকার ফিরে আসি ।

11

জেলি , 8 বাইট

÷DfḶ߀Ṃo

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

বিকল্প সংস্করণ, আরও দ্রুত, 9 বাইট

÷DfÆḌ߀Ṃo

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

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

÷DfḶ߀Ṃo  Main link. Argument: n

 D        Decimal; yield the digits of n.
÷         Divide n by each of its digits.
   Ḷ      Unlength; yield [0, ..., n-1].
  f       Filter; keep quotients that belong to the range.
    ߀    Recursively map this link over the resulting list.
      Ṃ   Take the minimum. This yields 0 if the list is empty.
       o  Logical OR; replace 0 with n.


5

রুবি ,52 47 বাইট

বহিরাগত ভাষা গ্রুপের জন্য প্রতিযোগিতা! (দ্রষ্টব্য: গল্ফিং না হলে একটি ভাল ধারণা .uniqপরে যুক্ত করা হবে .digitsকারণ সমস্ত অনুরূপ শাখাগুলির একই ফলাফল রয়েছে)

f=->n{n.digits.map{|x|x>1&&n%x<1?f[n/x]:n}.min}

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

ব্যাখ্যা

f=->n{      # Function "f" n ->
   n.digits # n's digits (in reverse order (<- doesn't matter))
            # fun fact: all numbers always have at least one digit
    .map{|x|# Map function for every digit "x" ->
       x>1&&    # x is 2-9 and
       n%x<1    # n mod x == 0, or, "n is divisible by x"
       ? f[n/x] # then recursively find smallest of f[n/x]
       : n      # otherwise: n (no shortest path in tree)
     }.min  # Smallest option out of the above
            # if we reach a dead end, we should get n in this step
}

আপনি x<2|n%x?n:f[n/x]দুটি বা তিনটি বাইট সংরক্ষণ করতে ব্যবহার করতে পারেন (আপনার এক |বা দুটি প্রয়োজন কিনা তার উপর নির্ভর করে )?
নীল

@ নীল দুর্ভাগ্যক্রমে, রুবি value%zeroশূন্য দ্বারা বিভাজন হিসাবে বিবেচনা করে, তাই সংক্ষিপ্ত-সার্কিট কাজ করবে না। এছাড়াও, 0রুবিতে সত্যবাদী মান (একমাত্র মিথ্যা মানগুলি মিথ্যা এবং শূন্য হয়)।
ইউনিহীড্রন

সুতরাং এটি দুটি ||এস সঙ্গে কাজ করবে ?
নীল

নাহ, কারণ 0 টি সত্য বলে বিবেচিত হয়, এটি সাথেই থাকবে >0তবে তারপরে এটি একই চর গণনা।
ইউনিহীড্রন

দুঃখিত, 0আপনি যদি ব্যবহার না করেন তবে আমি কোথায় আসছি তা দেখছি না |?
নীল

5

কমন লিস্প , 136 বাইট

(defun f(n)(apply 'min(or(loop for z in(map'list #'digit-char-p(write-to-string n))if(and(> z 1)(<(mod n z)1))collect(f(/ n z)))`(,n))))

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

পঠনযোগ্য সংস্করণ:

(defun f (n)
  (apply 'min
         (or (loop for z in (map 'list
                                 #'digit-char-p
                                 (write-to-string n))
                   if (and (> z 1)
                           (< (mod n z) 1))
                   collect (f (/ n z)))
             `(,n))))

3
পিপিসিজিতে আপনাকে স্বাগতম!
লাইকনি

@ লাইকনি ধন্যবাদ! ক্ষুদ্রতম
জমাটি

@ লাইকনি আমার ভুল, স্থির। ধন্যবাদ!
ট্রট

@ আরনাউল্ড লক্ষ্য করার জন্য ধন্যবাদ! আমি স্নিপেট স্থির করে লিঙ্কটি পরিবর্তন করেছি।
ট্রুট

@ লাইকনি সত্যই! আমি এটি 205 বি তে নেমে এসেছি।
ট্রুট


4

ওল্ফ্রাম ল্যাঙ্গুয়েজ (ম্যাথমেটিকা) , 44 বাইট

মিশা লাভরভকে ধন্যবাদ -7 বাইটস

Min[#0/@(#/IntegerDigits@#⋂Range[#-1]),#]&

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


1
কিছুটা গল্ফিয়ার হ'ল এই চরিত্রটি ব্যবহারের উপর ভিত্তি করে এই 44-বাইট সমাধানIntersection । তবে বড় আকারের কেসগুলি এটি আর হ্যান্ডেল করতে পারে না কারণ এটি মেমরি উত্পন্ন হওয়ার বাইরে চলে Range[#-1]
মিশা লাভরভ

1
মেমরি সমস্যাটি এড়াতে আমরা Most@Divisors@#পরিবর্তে ব্যবহার করতে পারি Range[#-1], তবে ফলাফলটি 49 বাইট
মিশা লাভরভ

4

জাভাস্ক্রিপ্ট (ফায়ারফক্স 30-57), 49 বাইট

f=n=>Math.min(...(for(c of''+n)c<2|n%c?n:f(n/c)))

ES6- সামঞ্জস্যপূর্ণ সংস্করণ, 52 বাইট:

f=n=>Math.min(...[...''+n].map(c=>c<2|n%c?n:f(n/c)))
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

মূলত আমি অপ্রাসঙ্গিক অঙ্কগুলি ফিল্টার করার চেষ্টা করেছি তবে এটি 54 বাইটে কিছুটা লম্বা হবে:

f=n=>Math.min(n,...(for(c of''+n)if(c>1&n%c<1)f(n/c)))

3

কোটলিন , 100 99 বাইট

fun f(i:Int):Int{return i.toString().map{it.toInt()-48}.filter{it>1&&i%it<1}.map{f(i/it)}.min()?:i}

শোভিত

fun f(i:Int):Int{
    return i.toString()
        .map { it.toInt()-48 }
        .filter { it >1 && i % it < 1}
        .map { f(i/it) }
        .min() ?: i
}

পরীক্ষা

fun f(i:Int):Int{return i.toString().map{it.toInt()-48}.filter{it>1&&i%it<1}.map{f(i/it)}.min()?:i}

val tests = listOf(
        1 to 1,
        7 to 1,
        10 to 10,
        24 to 1,
        230 to 23,
        234 to 78,
        10800 to 1,
        10801 to 10801,
        50976 to 118,
        129500 to 37,
        129528 to 257,
        8377128 to 38783,
        655294464 to 1111)

fun main(args: Array<String>) {
    for ( test in tests) {
        val computed = f(test.first)
        val expected = test.second
        if (computed != expected) {
            throw AssertionError("$computed != $expected")
        }
    }
}

সম্পাদনাগুলি


3

জেলি , 15 বাইট

ÆDḊfD
:Ç߀µÇ¡FṂ

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

আমাকে অবশ্যই স্বীকার করতে হবে যে ߀অংশটি এরিকের উত্তর থেকে ধার করা হয়েছে । বাকীগুলি পৃথকভাবে বিকশিত হয়েছে, আংশিক কারণ যে এমনকি উত্তরটি কীভাবে কার্যকর হয় তা আমি বুঝতেও পারি না: পি।

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

ÆDḊfD ~ Helper link (monadic). I'll call the argument N.

ÆD    ~ Take the divisors.
  Ḋ   ~ Dequeue (drop the first element). This serves the purpose of removing 1.
   fD ~ Take the intersection with the decimal digits.

:Ç߀µÇ¡FṂ ~ Main link.

 Ç        ~ Apply the helper link to the first input.
:         ~ And perform element-wise integer division.
     Ç¡   ~ If the helper link applied again is non-empty*, then...
  ߀µ     ~ Apply this link to each (recurse).
       FṂ ~ Flatten and get the maximum.

* আমি আনন্দের সাথে অবাক হয়েছি ¡যে তালিকায় এর মতো কাজ করে, কারণ এর সাধারণ অর্থ এই এন বার প্রয়োগ হয় ।

ডেনিস কেন ߀শর্তাধীন প্রয়োজন তা ব্যাখ্যা করার পরে , আমাদের কাছে এই 12-বাইটার বা তার 8 বাইট সংস্করণ রয়েছে: পি।



3

এক্সেল ভিবিএ, 153 বাইট

আমার জানা একমাত্র ভাষায় প্রথমবারের মতো কোড-গল্ফ :( ঠিক গল্ফ-বান্ধব নয় ...

Function S(X)
S = X
For I = 1 To Len(CStr(X))
A = Mid(X, I, 1)
If A > 1 Then If X Mod A = 0 Then N = S(X / A)
If N < S And N > 0 Then S = N
Next I
End Function

এভাবে কল করুন:

Sub callS()

result = S(655294464)

MsgBox result

End Sub

অনলাইনে এটি কোথায় পরীক্ষা করতে হবে তা সম্পর্কে আমার কোনও ধারণা নেই।


1
পিপিসিজিতে আপনাকে স্বাগতম! আমি সত্যিই VBA জানি না কিন্তু আমি সন্দেহ আপনি প্রতিস্থাপন করতে পারেন And N > 0 একটি সঙ্গে N = Sএকটি পূর্ববর্তী লাইনে। (এছাড়াও, যদি আমি এটি পরীক্ষা করার উপায় রাখি তবে আমার প্রথম প্রবৃত্তিটি কোনও স্থান সরিয়ে ফেলতে পারে কিনা তা পরীক্ষা করা উচিত))
আরজান জোহানসেন

2

এপিএল (ডায়ালগ) , 33 বাইট

{⍬≡do/⍨0=⍵|⍨o1~⍨⍎¨⍕⍵:⍵⋄⌊/∇¨⍵÷d}

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

কিভাবে?

⍎¨⍕⍵ - অঙ্ক দখল n

1~⍨- 1এস বাদে

o/⍨ - দ্বারা ফিল্টার করুন

0=⍵|⍨o- nঅঙ্ক দ্বারা বিভাজ্যতা

⍬≡...:⍵ - খালি থাকলে ফিরে আসুন n

⌊/ - অন্যথায়, সর্বনিম্ন ফেরত

∇¨ - প্রতিটি সংখ্যার জন্য পুনরাবৃত্তি

⍵÷d- nউপরের ফিল্টার হওয়া প্রতিটি অঙ্কের বিভাজন



2

পিএইচপি, 120 বাইট

<?php function f($n){$r=array_map(function($x)use($n){return$x>1&&!($n%$x)?f($n/$x):$n;},str_split($n));return min($r);}

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


3
সাইটে স্বাগতম! :)
ডিজেএমসিএমহেম

2
আপনি খোলার পিএইচপি ট্যাগগুলি বাদ দিতে পারেন এবং 6 বাইট সংরক্ষণ করতে পারেন :-)
ড্যানিয়েল ডাব্লু।

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