มันจะมีขนาดเล็กแค่ไหน?


42

เริ่มต้นด้วยเลขจำนวนเต็มบวกNให้หาจำนวนเต็มที่น้อยที่สุดN 'ซึ่งสามารถคำนวณได้โดยการหารNซ้ำโดยหนึ่งในหลัก (ในฐาน -10) แต่ละหลักที่เลือกจะต้องเป็นตัวหารของNมากกว่า1 1

ตัวอย่างที่ 1

ผลลัพธ์ที่คาดหวังสำหรับN = 230คือN '= 23 :

230/2 = 115, 115/5 = 23

ตัวอย่างที่ 2

ผลลัพธ์ที่คาดหวังสำหรับN = 129528คือN '= 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

มันยังไม่ (AFAICS)
GNiklasch

คำตอบ:


11

Haskell , 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นั่นคือไม่ว่าจะแบ่งdn
  • หากการตรวจสอบจะประสบความสำเร็จเราแบ่งnโดยdและซ้ำใช้:ff$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]เพื่อบันทึกสองหรือสามไบต์ (ขึ้นอยู่กับว่าคุณต้องการหนึ่ง|หรือสอง)?
Neil

@ Neil แต่น่าเสียดายที่ ruby ​​ถือว่าการvalue%zeroหารด้วยศูนย์ดังนั้นการลัดวงจรจะไม่ทำงาน นอกจากนี้ยัง0เป็นค่าความจริงในทับทิม (ค่าเท็จเท่านั้นเป็นเท็จและไม่มี)
Unihedron

ดังนั้นมันจะทำงานกับสอง||s?
Neil

ไม่เพราะ 0 ถือว่าเป็นจริงมันจะอยู่ด้วย>0แต่ก็นับถ่านเหมือนกัน
Unihedron

ขออภัยฉันไม่เห็นว่าสิ่งที่0มาถ้าคุณไม่ได้ใช้|?
Neil

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!
Laikoni

@Laikoni ขอบคุณ! ไม่ใช่การส่งที่เล็กที่สุด แต่ก็สนุกดี
Traut

@Laikoni ความผิดพลาดของฉันคงที่ ขอขอบคุณ!
Traut

@Arnauld ขอบคุณสำหรับการสังเกต! ฉันแก้ไขส่วนย่อยและเปลี่ยนลิงค์
Traut

@Laikoni แน่นอน! ฉันได้ลงไปที่ 205b
Traut


4

ภาษา Wolfram (Mathematica)ขนาด 44 ไบต์

-7 ไบต์ขอบคุณ Misha Lavrov

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

ลองออนไลน์!


1
ค่อนข้าง golfier คือการแก้ปัญหานี้ 44 ไบต์อยู่บนพื้นฐานของการใช้ตัวอักษรสำหรับ Intersectionแต่มีกรณีขนาดใหญ่ที่ไม่สามารถจัดการได้อีกต่อไปเพราะหน่วยความจำRange[#-1]ไม่เพียงพอ
Misha Lavrov

1
เราสามารถใช้Most@Divisors@#แทนRange[#-1]เพื่อหลีกเลี่ยงปัญหาหน่วยความจำ แต่ผลที่ได้คือ49 ไบต์
Misha Lavrov

4

JavaScript (Firefox 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

Kotlin , 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Ṃ

ลองออนไลน์!

ผมต้องยอมรับว่า߀ส่วนหนึ่งเป็นที่ยืมมาจากคำตอบของเอริค ส่วนที่เหลือได้รับการพัฒนาแยกต่างหากส่วนหนึ่งเป็นเพราะฉันไม่เข้าใจว่าส่วนที่เหลือของคำตอบนั้นทำงานอย่างไร: P

มันทำงานอย่างไร?

Æ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 ไบต์รุ่น: P


3

R , 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

Excel 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ในบรรทัดก่อนหน้า (นอกจากนี้หากฉันมีวิธีทดสอบสัญชาตญาณแรกของฉันก็คือตรวจสอบว่ามีช่องว่างใด ๆ ที่สามารถลบออกได้หรือไม่)
Ørjan Johansen

2

APL (Dyalog) 33 ไบต์

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

ลองออนไลน์!

อย่างไร?

⍎¨⍕⍵ - คว้าตัวเลขของ n

1~⍨- ไม่รวม1s

o/⍨ - กรองตาม

0=⍵|⍨o- การหารnด้วยหลัก

⍬≡...:⍵ - หากว่างเปล่าส่งคืน n

⌊/ - มิฉะนั้นส่งคืนขั้นต่ำของ

∇¨ - การสอบถามซ้ำสำหรับแต่ละหมายเลขใน

⍵÷d- การหารnด้วยตัวเลขแต่ละตัวที่ถูกกรองด้านบน




โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.