얼마나 작아 질 수 있습니까?


42

양의 정수 N으로 시작하여 N 을 자릿수 중 하나로 10 을 반복해서 계산하여 계산할 수있는 가장 작은 정수 N ' 을 찾습니다 (10 진법). 선택한 각 숫자는 1 보다 큰 N 의 제수 여야합니다 .

실시 예 # 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

하스켈 , 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]두 개 또는 세 개의 바이트를 저장 하는 데 사용할 수 있습니까 (하나 |또는 두 개가 필요한지 여부에 따라 다름 )?
Neil

@Neil 불행하게도, 루비는 value%zero0으로 나누는 것으로 취급 하므로 단락이 작동하지 않습니다. 또한 0루비의 값은 참입니다 (오직 값은 거짓과 nil입니다).
Unihedron

그래서 두 가지로 작동 ||합니까?
Neil

아니요, 0은 true로 간주되기 때문에와 >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 Language (Mathematica) , 44 바이트

Misha Lavrov 덕분에 -7 바이트

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

온라인으로 사용해보십시오!


1
다소 골퍼는 의 문자 사용을 기반으로하는 이 44 바이트 솔루션 입니다 Intersection. 그러나 메모리 생성이 부족하여 더 이상 처리 할 수없는 큰 경우가 있습니다 Range[#-1].
Misha Lavrov

1
메모리 문제를 피하기 위해 Most@Divisors@#대신 사용할 수 Range[#-1]있지만 결과는 49 바이트 입니다.
Misha Lavrov

4

자바 스크립트 (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

코 틀린 , 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Ṃ

온라인으로 사용해보십시오!

나는 그 ߀부분이 Erik의 대답 에서 빌려온 것을 인정해야한다 . 나머지는 부분적으로 개발되었습니다. 왜냐하면 나머지 답변이 어떻게 작동하는지 이해하지 못하기 때문입니다 .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적용 되기 때문에 목록에서 이와 같이 작동 하는 것이 유쾌 합니다.

Dennis가 왜 ߀조건부가 필요하지 않은지 설명한 후에 , 우리는이 12 바이트 또는 그의 8 바이트 버전을 갖습니다.


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 요한센

2

APL (Dyalog) , 33 바이트

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

온라인으로 사용해보십시오!

어떻게?

⍎¨⍕⍵ -의 자리를 잡아 n

1~⍨- 제외 1

o/⍨ -필터링

0=⍵|⍨o- n숫자로 나눌 수 있음

⍬≡...:⍵ -비어있는 경우 반환 n

⌊/ -그렇지 않으면 최소값을 반환

∇¨ -각 숫자의 재귀

⍵÷d- n위에서 필터링 된 각 숫자로 나누기




당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.