Làm thế nào nhỏ nó có thể nhận được?


42

Bắt đầu với số nguyên dương N , tìm số nguyên nhỏ nhất N ' có thể được tính bằng cách liên tục chia N cho một trong các chữ số của nó (trong cơ sở 10). Mỗi chữ số được chọn phải là ước của N lớn hơn 1 .

Ví dụ 1

Sản lượng dự kiến ​​cho N = 230N '= 23 :

230/2 = 115, 115/5 = 23

Ví dụ # 2

Sản lượng dự kiến ​​cho N = 129528N '= 257 :

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

Coi chừng những con đường không tối ưu!

Chúng ta có thể bắt đầu với 129528/9 = 14392 , nhưng điều đó sẽ không dẫn đến kết quả nhỏ nhất có thể. Điều tốt nhất chúng ta có thể làm nếu lần đầu tiên chia cho 9 là:

129528/9 = 14392, 14392/2 = 7196, 7196/7 = 1028, 1028/2 = 514 -> sai!

Quy tắc

  • Đầu vào có thể được lấy ở bất kỳ định dạng hợp lý nào (số nguyên, chuỗi, mảng chữ số, ...).
  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng!

Các trường hợp thử nghiệm

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
Tôi tự hỏi nếu loạt bài này (1, 1, ..., 10, 11, 1, 13, ..., 1, ...) có mục OEIS
Draco18s

Nó không (chưa), AFAICS.
GNiklasch

Câu trả lời:


11

Haskell , 67 61 byte

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

Hãy thử trực tuyến!

Giải trình:

  • read.pure<$>show nbiến đổi số nguyên đầu nvào thành một danh sách các chữ số.
  • Đối với mỗi chữ số dtừ danh sách này, chúng tôi kiểm tra d>1mod n d<1đó là liệu có dchia không n.
  • Nếu kiểm tra thành công, chúng tôi chia nbằng dvà đệ quy áp dụng f: f$div n d.
  • Nhìn chung, điều này mang lại một danh sách các số nguyên tối thiểu từ tất cả các cây con của n.
  • Vì danh sách có thể trống, chúng tôi sẽ thêm nvào minimumdanh sách và trả về danh sách.

11

Thạch , 8 byte

÷DfḶ߀Ṃo

Hãy thử trực tuyến!

Phiên bản thay thế, nhanh hơn nhiều, 9 byte

÷DfÆḌ߀Ṃo

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

÷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

ruby ,52 47 byte

Cạnh tranh cho nhóm ngôn ngữ không kỳ lạ! (Lưu ý: một ý tưởng hay, nếu không chơi gôn, là thêm .uniqsau .digitsvì tất cả các nhánh tương tự đều có kết quả tương tự)

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

Hãy thử trực tuyến!

Giải trình

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
}

Bạn có thể sử dụng x<2|n%x?n:f[n/x]để lưu hai hoặc ba byte (tùy thuộc vào việc bạn cần một |hoặc hai)?
Neil

@Neil Thật không may, ruby ​​coi việc value%zerochia cho số 0, do đó, ngắn mạch sẽ không hoạt động. Ngoài ra, 0là một giá trị trung thực trong ruby ​​(giá trị falsey duy nhất là sai và không).
Unihedron

Vì vậy, nó sẽ làm việc với hai ||s?
Neil

Không, bởi vì 0 được coi là đúng, nó sẽ đúng với nó >0, nhưng sau đó nó là cùng một số char.
Unihedron

Xin lỗi, tôi không thấy nơi nào 0đến nếu bạn không sử dụng |?
Neil

5

Lisp thông thường , 136 byte

(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))))

Hãy thử trực tuyến!

Phiên bản dễ đọc:

(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
Chào mừng đến với PPCG!
Laikoni

@Laikoni cảm ơn! Không phải là bài nộp nhỏ nhất nhưng vẫn khá thú vị
Traut

@Laikoni lỗi của tôi, đã sửa. cảm ơn bạn!
Traut

@Arnauld cảm ơn vì đã chú ý! Tôi đã sửa đoạn mã và thay đổi liên kết.
Traut

@Laikoni thật đấy! Tôi đã nhận nó xuống 205b.
Traut


4

Ngôn ngữ Wolfram (Mathicala) , 44 byte

-7 byte nhờ Misha Lavrov.

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

Hãy thử trực tuyến!


1
Phần nào golfier là giải pháp 44 byte này dựa trên việc sử dụng ký tự cho Intersection. Nhưng có những trường hợp lớn nó không thể xử lý được nữa vì nó hết bộ nhớ Range[#-1].
Misha Lavrov

1
Chúng ta có thể sử dụng Most@Divisors@#thay vì Range[#-1]để tránh vấn đề bộ nhớ, nhưng kết quả là 49 byte .
Misha Lavrov

4

JavaScript (Firefox 30-57), 49 byte

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

Phiên bản tương thích ES6, 52 byte:

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>

Ban đầu tôi đã thử lọc các chữ số không liên quan nhưng hóa ra nó dài hơn một chút ở mức 54 byte:

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

3

Kotlin , 100 99 byte

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

Làm đẹp

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

Kiểm tra

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")
        }
    }
}

Chỉnh sửa


3

Thạch , 15 byte

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

Hãy thử trực tuyến!

Tôi phải thừa nhận rằng ߀phần đó được mượn từ câu trả lời của Erik . Phần còn lại được phát triển riêng, một phần vì tôi thậm chí không hiểu phần còn lại của câu trả lời đó hoạt động như thế nào: P.

Làm thế nào nó hoạt động?

Æ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.

* Tôi ngạc nhiên khi thấy nó ¡hoạt động như thế trong danh sách, bởi vì ý nghĩa thông thường của nó được áp dụng lần này n lần .

Sau khi Dennis giải thích lý do tại sao ߀không cần một điều kiện, chúng tôi có điều này 12-byter , hoặc phiên bản 8 byte của mình: P.


3

R , 101 98 byte

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)

Hãy thử trực tuyến!

Một tấn byte đi vào trích xuất các chữ số và phân chia các chữ số x; có lẽ một cách tiếp cận khác là cần thiết.


3

Excel Vba, 153 byte

Lần đầu tiên chơi golf bằng ngôn ngữ duy nhất tôi biết :( Không chính xác là thân thiện với golf ...

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

Gọi như thế này:

Sub callS()

result = S(655294464)

MsgBox result

End Sub

Tôi không có manh mối để kiểm tra trực tuyến này.


1
Chào mừng đến với PPCG! Tôi không thực sự biết Vba nhưng tôi nghi ngờ bạn có thể thay thế And N > 0 bằng một N = Sdòng trên trước đó. (Ngoài ra, nếu tôi có cách kiểm tra thì bản năng đầu tiên của tôi sẽ là kiểm tra xem có bất kỳ khoảng trống nào có thể được xóa không.)
Ørjan Johansen

2

APL (Dyalog) , 33 byte

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

Hãy thử trực tuyến!

Làm sao?

⍎¨⍕⍵ - lấy các chữ số của n

1~⍨ - không bao gồm 1 s

o/⍨ - lọc bởi

0=⍵|⍨o - tính phân chia của n cho chữ số

⍬≡...:⍵ - nếu trống, quay trở lại n

⌊/ - nếu không, trả lại tối thiểu là

∇¨ - đệ quy cho mỗi số trong

⍵÷d- sự phân chia của ntừng chữ số được lọc ở trên




Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.