どれくらい小さくできますか?


42

整数正始まるN、整数最小見つける「N繰り返し割ることによって計算することができる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

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、つまりをd分割するかどうかを確認しnます。
  • チェックが成功した場合、分割ndて再帰的に適用し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](1つ|または2つが必要かどうかに応じて)2または3バイトを保存するために使用できますか?
ニール

@Neil残念ながら、ルビーはvalue%zeroゼロによる除算として扱われるため、短絡は機能しません。また、0はルビーの真実の値です(falseyの値はfalseとnilのみです)。
ユニヘドロン

だから、それは2で動作し||ますか?
ニール

いいえ、0は真であると見なされるため、と一緒になりますが>0、同じ文字カウントです。
ユニヘドロン

申し訳ありませんが、0使用していない場合はどこに来るのかわかりません|か?
ニール

5

Common 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へようこそ!
ライコニ

@ライコニありがとう!ない最小の提出が、それでもかなり楽しい1
トラウト

@Laikoni私の間違い、修正。ありがとうございました!
トラット

気づいてくれてありがとう!スニペットを修正し、リンクを変更しました。
トラット

本当に@ライコニ!私はそれを205bまで下げました。
トラット


4

Wolfram言語(Mathematica)、44バイト

ミーシャ・ラブロフのおかげで-7バイト。

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

オンラインでお試しください!


1
ややゴルファーは、このキャラクターをに使用した44バイトのソリューションですIntersection。しかし、メモリ生成が不足するため、処理できない大きなケースがありますRange[#-1]
ミシャラヴロフ

1
メモリの問題を回避するMost@Divisors@#代わりに使用できますRange[#-1]が、結果は49バイトです。
ミシャラヴロフ

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Ṃ

オンラインでお試しください!

私はその߀部分がエリックの答えから借りられたことを認めなければなりません。残りの部分は個別に開発されますが、その理由の1つはとにかくその答えの残りの部分がどのように機能するかさえ理解していないためです。

使い方?

Æ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

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 a N = Sに置き換えることができると思います。(また、テストする方法があれば、最初の本能はスペースを削除できるかどうかを確認することです。)
ØrjanJohansen

2

APL(Dyalog)、33バイト

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

オンラインでお試しください!

どうやって?

⍎¨⍕⍵ -の数字をつかむ n

1~⍨1-s を除く

o/⍨ -フィルター

0=⍵|⍨o- n桁ごとの可分性

⍬≡...:⍵ -空の場合、戻ります n

⌊/ -それ以外の場合、最小値を返します

∇¨ -の各数値の再帰

⍵÷d- n上記でフィルタリングされた各数字による除算




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.