यह कितना छोटा हो सकता है?


42

एक सकारात्मक पूर्णांक एन के साथ शुरू करते हुए , सबसे छोटे पूर्णांक N 'को खोजें, जिसे बार-बार N को उसके एक अंक (आधार -10 में) से विभाजित करके गणना की जा सकती है । प्रत्येक चयनित अंक को 1 से अधिक N का भाजक होना चाहिए ।

उदाहरण 1

के लिए उम्मीद उत्पादन एन = 230 है एन '= 23 :

230/2 = 115, 115/5 = 23

उदाहरण # 2

के लिए उम्मीद उत्पादन एन = 129,528 है एन '= 257 :

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

गैर-इष्टतम रास्तों से सावधान रहें!

हम १२ ९ ५२95 / ९ = १४३ ९ २ के साथ शुरू कर सकते हैं , लेकिन इससे सबसे छोटा परिणाम संभव नहीं होगा । यदि हम पहली बार 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और रिकर्सिवली लागू 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रूबी में एक सत्य मूल्य है (केवल गलत मूल्य झूठे और शून्य हैं)।
अनहाइड्रोन

तो यह दो ||s के साथ काम करेगा ?
नील

नहीं, क्योंकि 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
PPCG में आपका स्वागत है!
लिकोनी

@ लायकोनी धन्यवाद! सबसे छोटा सबमिशन नहीं, लेकिन फिर भी बहुत मज़ेदार एक है
Traut

@ लायकोनी मेरी गलती, तय। धन्यवाद!
त्रूट

@Arnauld ध्यान देने के लिए धन्यवाद! मैंने स्निपेट तय किया और लिंक बदल दिया।
Traut

@ लैकोनी वास्तव में! मैं इसे 205 बी पर ले गया।
Traut


4

वोल्फ्राम लैंग्वेज (मैथमेटिका) , 44 बाइट्स

-7 बाइट्स मीशा लावरोव को धन्यवाद।

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

इसे ऑनलाइन आज़माएं!


1
कुछ हद तक गोल्फ खिलाड़ी के लिए चरित्र का उपयोग करने के आधार पर यह 44-बाइट समाधान है । लेकिन ऐसे बड़े मामले हैं जो इसे अब नहीं संभाल सकते क्योंकि यह मेमोरी जनरेटिंग से बाहर है । IntersectionRange[#-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.

* मैं सुखद आश्चर्यचकित हूं ¡जो सूचियों पर उस तरह काम करता है, क्योंकि इसका सामान्य अर्थ इस n समय पर लागू होता है

डेनिस ने बताया कि ߀सशर्त की आवश्यकता क्यों नहीं है, हमारे पास यह 12-बटर , या उसका 8 बाइट संस्करण है: पी।


3

आर , 101 98 बाइट्स

f=function(x,e=(d=x%/%10^(0:nchar(x))%%10)[d>1])"if"(sum(y<-which(!x%%e)),min(sapply(x/e[y],f)),x)

इसे ऑनलाइन आज़माएं!

एक टन बाइट्स अंकों को निकालने में जाते हैं और जो विभाजित होते हैं x; शायद एक और दृष्टिकोण आवश्यक है।


3

एक्सेल Vba, 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
PPCG में आपका स्वागत है! मैं वास्तव में VBA पता नहीं है, लेकिन मुझे लगता है आप बदल सकते हैं And N > 0 एक साथ N = Sपिछले एक लाइन पर। (इसके अलावा, अगर मेरे पास इसका परीक्षण करने का एक तरीका है, तो मेरी पहली वृत्ति यह जांचने के लिए होगी कि क्या कोई रिक्त स्थान हटाया जा सकता है।)
अर्जन जोहानसन

2

APL (Dyalog) , 33 बाइट्स

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

इसे ऑनलाइन आज़माएं!

कैसे?

⍎¨⍕⍵ - के अंक पकड़ो n

1~⍨- सिवाय 1s

o/⍨ - के द्वारा छनित

0=⍵|⍨o- nअंक द्वारा विभाजन

⍬≡...:⍵ - अगर खाली है, तो वापस लौटें n

⌊/ - अन्यथा, कम से कम लौटें

∇¨ - प्रत्येक संख्या के लिए पुनरावृत्ति

⍵÷d- nऊपर फ़िल्टर किए गए प्रत्येक अंक द्वारा विभाजन



2

PHP, 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
साइट पर आपका स्वागत है! :)
DJMcMayhem

2
आप खुलने वाले PHP टैग को छोड़ सकते हैं और 6 बाइट्स बचा सकते हैं :-)
डैनियल डब्ल्यू।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.