可以多小?


42

以正整数N开头,找到最小的整数N',可以通过将N除以其一位数字(以10为底)来计算得出。每个选定的数字必须是N的除数大于1

例子1

预期的输出为N = 230N” = 23

230/2 = 115、115 / 5 = 23

范例#2

预期的输出为N = 129528N” = 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

AFAICS还没有。
GNiklasch

Answers:


11

Haskell67 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>1mod 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不幸的是,红宝石value%zero被零除,因此短路将无法工作。同样,0是ruby中的真实值(唯一的false值为false和nil)。
Unihedron

那用2 ||s 可以工作吗?
尼尔,

不,因为0被认为是true,所以它与在一起>0,但是它的字符数相同。
Unihedron

抱歉,0如果您不使用它,我看不到哪里来|
尼尔,

5

普通Lisp,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我的错误已修正。谢谢!
鳟鱼

@Arnauld感谢您的注意!我修复了代码段并更改了链接。
鳟鱼

确实是@Laikoni!我将其降至205b。
鳟鱼



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

Kotlin100 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字节的版本:P。


3

R101 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的前一行。(此外,如果我有办法对其进行测试,我的第一个直觉是检查是否可以删除任何空格。)
ØrjanJohansen

2

APL(Dyalog),33字节

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

在线尝试!

怎么样?

⍎¨⍕⍵ -抓住 n

1~⍨-不包括1s

o/⍨ - 过滤

0=⍵|⍨o- n由数字可除

⍬≡...:⍵ -如果为空,请返回 n

⌊/ -否则,返回最小值

∇¨ -递归中的每个数字

⍵÷d-除以n上面过滤的每个数字




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.