最小電力ルート


22

数の最小電力反復は、次のように定義されます。n

MPIn:=nn

つまり、の最下位桁に上げ。たとえば、およびです。nnMPI32=322=1024MPI1234=12341=1234

数の最小のべき根は、固定点が見つかるまで繰り返し適用して得られる数として定義され。以下は、1から25までの数値の最小電力根の表です。nMPI

   n              MPR(n)
--------------------------
   1                   1
   2                   1
   3              531441
   4                   1
   5                3125
   6 4738381338321616896
   7                   1
   8            16777216
   9                   1
  10                   1
  11                  11
  12                  12
  13                  13
  14                  14
  15                  15
  16                  16
  17                  17
  18                  18
  19                  19
  20                   1
  21                  21
  22                   1
  23              279841
  24                   1
  25                   1

課題:最小電力根が1またはそれ自体に等しくない数値を生成します。

このシーケンスの最初の50個の数値は次のとおりです。

3、5、6、8、23、26、27、29、35、36、39、42、47、53、59、64、72、76、78、82、83、84、92、222、223、 227、228、229、233、237、239、254、263、267、268、269、273、276、277、278、279、285、286、287、289、296、335、338、339、342

ルール

  • nこのシーケンスの最初の数(0または1のインデックス)を生成し、nth項を生成し、これらの項を計算するジェネレーターを作成し、それらの多くを無限に出力することができます。
  • 入力を受け取り、任意のベースで出力を行うことができますが、MPRの計算は10をベースにする必要があります。たとえば、入力###(単項)および出力### ##### ######(単項)を取ることができます
  • 数値を生成する必要あります。"3", "5", "6"これらは文字列であるため、(たとえば)outputを使用することはできません。3, 5, 6そして3 5 6ただし、両方とも有効です。を出力2 3する"23"、またはtwenty-threeすべての番号の無効な表現と見なされます23。(繰り返しますが、これらの数値を表すために任意のベースを使用できます。)
  • これはであるため、最短のコード(バイト単位)が優先されます。

2
不思議なことに、すべてのnに対して固定小数点が最終的​​に見つかることをどのように証明できますか?
nwellnhof

1
@nwellnhof(大まかな証明。)の不動点がない、つまりMPR x が存在しないと仮定します。みましょうのx iのことI番目の反復のMPIを超える機能Xを。このシーケンスは、厳密以来、増加しているB > のB 、CのすべてのためのA B C 2。厳密に増加しているため、x iが0または1になる数字が0になる確率は、x i∞になる傾向があるためです。バツMPRバツバツMPIバツab>abca,b,c2xixi
コナーオブライエン

ほら oeisにはこのシーケンスはありません。
Draco18s

@ ConorO'Brienそれはあなたの仮説がもっともらしいことを示していますが、それを証明していません。
カスペルド

1
@kasperdしたがって、その前の「大まかな証拠」です。
コナーオブライエン

回答:


5

05AB1E、8バイト

n番目の数値1を生成します

µNÐΔWm}‹

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

説明

µ          # run until counter equals input
 NÐ        # push 3 copies of the current iteration index (1-based)
   Δ  }    # run this code until the result no longer changes     
    Wm     # raise the number to the power of its minimum digit
       ‹   # check if greater than the index

オプションで、同じバイトカウントの無限リストとして:

∞ʒDΔWm}‹

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


待ち時間は、あるものすべて...それルックス私はそれが可能だろうと思ったよりもそんなにsimpeler ..>>私は、私の答えを削除するだろう、それはですので、より多くの倍の長よりも..?。
ケビンCruijssen

@KevinCruijssen:私は少し驚いています。タスクを見ると、12バイトほどかかると思いました。
エミグナ

1
チャレンジが投稿された直後にいじってµΔまったく同じ答えを得ましたが、なぜうまくいかなかったのかと思っていました... 固定小数点関数で1つのコピーが使用されるDと思ったためではなくÐ、もう1つは「より小さい」関数によるものですが、別のコピーが必要であることを考慮していません。エニグマ、私のエニンガを解決してくれてありがとう。
ミスターXcoder

6

Perl 6、49バイト

{grep {($_,{$_**.comb.min}...*==*).tail>$_},1..*}

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

無限シーケンスを返します。次の45バイトバージョンも機能すると思いますが、n回の反復後に常に固定小数点が見つかることを証明することはできません。

{grep {($_,{$_**.comb.min}...*)[$_]>$_},3..*}

5

J41 39 37バイト

(>:[echo^:(<(^0".@{/:~@":)^:_))^:_]1x

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

これは、無限のシーケンスを印刷する完全なプログラムです。完全なプログラムがJの動詞に勝る非常にまれな機会

使い方

(>:[echo^:(<mpi_fix))^:_]1x    Using the mpi_fix below; it finds the MPI fixpoint
          (<mpi_fix)           Is mpi_fix greater than the input?
    echo^:                     If so, apply echo; do nothing otherwise
                               echo returns an empty array
 >:[                           Discard the above and return input+1
(                   )^:_       Repeat the above infinitely (increment has no fixpoint)
                        ]1x    starting from arbitrary-precision number 1

J41 39バイト

>:^:(>:(^0".@{/:~@":)^:_)^:_@>:@]^:[&0x

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

単項動詞。1から始まるインデックスを指定すると、そのインデックスの番号を返します。フッターは、最初の20の用語が正しいことを確認します。

「定点」という言葉を読んで、私はすぐに「ああ、そう^:_だ、すばらしい仕事をするだろう」と思った。それから私は、怒りと悲しみの顔のこの憎悪に終わりました。そして、それは列車でもなく、単一の動詞です。

Ungolfed&仕組み

nth_term =: >:^:(>:(^0".@{/:~@":)^:_)^:_@>:@]^:[&0x

mpi =: ^0".@{/:~@":    Find the MPI
             /:~@":    Sort the string representation
        0   {          Take first item
         ".@           Convert back to number
       ^               Raise the input to the power of above

mpi_fix =: mpi^:_      Find the MPI fixpoint

next_term =: >:^:(>:mpi_fix)^:_@>:    Given a number, find the next term
                               @>:    Increment once, and then...
                  >:mpi_fix           Is mpi_fix not greater than input?
             >:^:           ^:_       Increment while the above is true

nth_term =: next_term@]^:[&0x    Given one-based index, find the nth term
            next_term@]          Apply next_term monadically
                       ^:[       n times
                          &0x    to the starting value of zero

任意の精度の整数0xは、たとえば6のように、固定点を正確に計算するために必要です。


すばらしいです!それはたくさんあります^:、私の頭はそれらの2番目に苦しみ始めます:)
ガレン・イワノフ


33バイト:_&(_&(]]+]>:(^{.@/:~&.":)^:_)>:)*入力を拡張整数として取得
マイル

4

Pyth、10バイト

.f>u^GshS`

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

nGZZQ.fQu^GshS`GZ

最小電力のルートコードuは、現在の数値Gを最小桁の累乗に固定する固定小数点を見つけることによって機能します。これは、h辞書式にソートされた最初の桁()と同じで(S)、その後整数に変換されます(s)。


4

ゼリー、10 バイト

*DṂƊƬḊCȦµ#

I最初のIエントリを生成するSTDINから整数を取得するモナドリンク。

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

*DṂƊƬṪ%@µ#10でも動作します)

どうやって?

モナド関数の真実の結果に遭遇するn=0までをカウントアップし、inputそれらを生成しnます。

関数は、結果が一意でなくなるまで、別のモナド関数を繰り返し適用x=nし、の値を収集しますx。(例:19yields [19]; 23yields [23,529,279841]; 24yields [24, 576, 63403380965376, 1]; etc ...)そして結果をデキュー(左端の値を削除)し、すべての値を補完(1-x)して、リストにゼロがある場合や空の場合Ȧにyieldするため0に使用します。

最も内側の関数は、現在の桁xすべての桁に上げてからx最小値を維持します(これは、最初に最小桁を見つけることでバイトを節約します)。

*DṂƊƬḊCȦµ# - Link (call the input number I)
         # - count up from 0 and yield the first I for which this yields a truthy value:
        µ  -   a monadic chain:
    Ƭ      -     collect until results are not unique:
   Ɗ       -       last three links as a monad:
 D         -         convert to a list of decimal digits
*          -         exponentiate
  Ṃ        -         minimum
     Ḋ     -     dequeue
      C    -     compliment
       Ȧ   -     any-and-all?

ƬḊCȦあそこの賢い使い方 。:-)
エリックアウトゴルファー

Ṫ>ピックアップ0:(
ジョナサンアラン

4

Mathematica、59 51バイト

Misha Lavrovのおかげで-8バイト。

Select[Range@#,#<(#//.x_:>x^Min@IntegerDigits@x)&]&

純粋な機能。入力として数値を受け取り、その数値までの用語のリストを出力として返します。ここではそれほど複雑なことはありません。


FixedPoint通常、コードゴルフの//.(の略ReplaceRepeated)ほど良くありません。ここでは、で数バイトを節約できますSelect[Range@#,1<(#//.x_:>x^Min@IntegerDigits@x)!=#&]&
ミシャラブロフ

また、MPI(x)が1でもxでもない場合、それは常にxよりも大きいため、さらに短い解はSelect[Range@#,#<(#//.x_:>x^Min@IntegerDigits@x)&]&です。
ミシャラヴロフ

3

Pythonの390の 88バイト

@mypetlionによる-2バイト

def F(x):m=x**int(min(str(x)));return[int,F][m>x](m)
x=1
while 1:x<F(x)and print(x);x+=1

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

printifはPython 2のステートメントを使用することで2バイトを節約しますF。MPIフィックスポイントを計算します。残りは無限のシーケンスをSTDOUTに与えます。


に変更return m>x and F(m)or mreturn[int,F][m>x](m)て、2バイトを保存します。
マイペトリオン




2

Java 10、178 173バイト

v->{for(int x=1,m;;){var b=new java.math.BigInteger(++x+"");for(m=9;m>1;)b=b.pow(m=(b+"").chars().min().orElse(0)-48);if(b.compareTo(b.valueOf(x))>0)System.out.println(x);}}

@GBのRuby回答のポート。したがって、無期限に出力されます。

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

説明:

v->{             // Method with empty unused parameter and no return-type
  for(int x=1,   //  Start an integer `x` at 1
      m;         //  Temp integer for the smallest digit, starting uninitialized
      ;){        //  Loop indefinitely
    var b=new java.math.BigInteger(++x 
                 //   Increase `x` by 1 first
          +"");  //   And create a BigInteger `b` for the new `x`
    for(m=9;     //   Reset `m` to 9
        m>1;)    //   Loop as long as the smallest digit is not 0 nor 1
      b=b.pow(m=(b+"").chars().min().orElse(0)-48
                 //    Set `m` to the smallest digit in `b`
              ); //    Set `b` to `b` to the power of digit `m`
    if(b.compareTo(b.valueOf(x))>0)
                 //   If `b` is larger than `x`:
      System.out.println(x);}}
                 //    Print `x` with a trailing newline


1

JavaScript(Node.js)98 90 89 86バイト

-3バイト、@ Conor O'Brienに感謝

function*(){for(n=0n;;x>n&&(yield n))for(x=++n;(b=Math.min(...""+x))-1;)x**=BigInt(b)}

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

あるという事実を使用してMPRn>nMPRn{1n}

ジェネレータはn数値の配列を返すよりも短いように見えますか?

または無限に印刷する-72バイト

for(n=0n;;x>n&&alert(n))for(x=++n;(b=Math.min(...""+x))-1;)x**=BigInt(b)

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


制御フローの一部を移動して中括弧を削除することにより、86バイト。(主に:if(x>n)yield nx>n&&(yield n)式のように)
コナー・オブライエン


0

JavaScript(Chrome)、78 77バイト

F=x=>(m=x**BigInt(Math.min(...''+x)))>x?F(m):m
for(x=0n;++x;)x<F(x)&&alert(x)

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

私自身のPython 3ソリューションの移植版。Chromeの最新バージョンがサポートBigIntされています(PCでテスト済み)。ただし、ブラウザでこのコードをそのまま使用しないでください。


笑は私の答えをゴルフしようとしていたが、あなたはリードを得た。77バイト また77バイト、私の予定のゴルフ
浅本しえる

0

ラケット270、257の 233バイト

(define(f n)(local((define(m x)(expt x(-(first(sort(map char->integer(string->list(~v x)))<))48)))(define(g y)(if(= y(m y))y(g(m y))))(define(k x l)(if(=(length l)n)l(if(< x(g x))(k(+ x 1)(cons x l))(k(+ x 1)l)))))(reverse(k 1'()))))

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

これは私の最初のラケット提出であるため、間違いなくはるかにさらにゴルフすることができます。それにもかかわらず、少なくともタスクを解決するために管理するために、私はやや満足しています。

より読みやすい:

(define (f n)
  (local ((define (m x)
           (expt x
                 (- (first (sort (map char->integer (string->list (~v x)))
                                 <))
                    48)))
         (define (g y)
           (if
             (= y (m y))
             y
             (g (m y))))
         (define (k x l)
           (if (= (length l) n)
               l
               (if (< x (g x))
                   (k (+ x 1) (cons x l))
                   (k (+ x 1) l))))
    (reverse (k 1 '()))))

0

公理、168バイト

u(x)==(y:=x::String;x^reduce(min,[ord(y.i)-48 for i in 1..#y])::NNI)
q(a:PI):PI==(b:=a;repeat(c:=u(b);c=b=>break;b:=c);b)
z(x)==[i for i in 1..x|(m:=q(i))~=1 and m~=i]

使用する関数はz()です。ここでは、それ自体ではなく、1ではなく1の対応を持ち、その引数より小さい番号を出力します。

(6) -> z 1000
 (6)
 [3, 5, 6, 8, 23, 26, 27, 29, 35, 36, 39, 42, 47, 53, 59, 64, 72, 76, 78, 82,
  83, 84, 92, 222, 223, 227, 228, 229, 233, 237, 239, 254, 263, 267, 268,
  269, 273, 276, 277, 278, 279, 285, 286, 287, 289, 296, 335, 338, 339, 342,
  346, 347, 348, 354, 358, 363, 365, 372, 373, 374, 376, 382, 383, 386, 392,
  394, 395, 399, 423, 424, 426, 427, 428, 432, 433, 435, 436, 442, 447, 459,
  462, 464, 466, 467, 468, 469, 476, 477, 479, 483, 487, 488, 489, 493, 494,
  523, 524, 527, 529, 533, 537, 542, 546, 553, 556, 557, 562, 563, 572, 573,
  577, 582, 583, 584, 594, 595, 598, 623, 626, 627, 629, 632, 633, 642, 646,
  647, 648, 663, 664, 669, 672, 676, 682, 683, 684, 693, 694, 695, 698, 722,
  724, 729, 736, 759, 763, 773, 775, 782, 786, 823, 829, 835, 846, 847, 856,
  873, 876, 885, 893, 894, 896, 923, 924, 928, 933, 953, 954, 962, 969, 973,
  974, 984, 993, 994, 995]
                                               Type: List PositiveInteger

0

Visual Basic .NET(.NET Core)、290バイト(インポートを含む)

Iterator Function A()As System.Collections.IEnumerable
Dim i=B.One,q=i,p=i
While 1=1
q=i-1
p=i
While q<>p
For j=0To 9
If p.ToString.Contains(j)Then
q=p
p=B.Pow(p,j)
Exit For
End If
Next
End While
If p>1And p<>i Then Yield i
i+=1
End While
End Function

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

次のインポートが必要です。

Imports B = System.Numerics.BigInteger

これは、イテレータ関数を使用して、基準を満たす整数の無限(遅延ロード)リストを返します。BigInteger特に中間計算で、サイズ制限を回避するために使用します。

ゴルフをしていない:

Iterator Function A() As System.Collections.IEnumerable
    Dim i As B = 1
    While True
        Dim prevProduct As B = 0
        Dim product As B = i
        While prevProduct <> product
            For j = 0 To 9
                If product.ToString.Contains(j) Then
                    prevProduct = product
                    product = B.Pow(product, j)
                    Exit For
                End If
            Next
        End While
        If product <> 1 And product <> i Then
            Yield i
        End If
        i += 1
    End While
End Function


0

APL(NARS)、96文字、192バイト

r←f w;k;i;a
   r←⍬⋄k←1
A: i←k
B: →C×⍳i=a←i*⌊/⍎¨⍕i⋄i←a⋄→B
C: →D×⍳(a=k)∨a=1⋄r←r,k
D: k+←1⋄→A×⍳k≤w

テスト(引数22の部分的な結果は非常に大きいようであるため、<21引数は大丈夫かどうかわからない)

  f 21
3 5 6 8 

0

Python 3、102バイト

x=int(input())
a=c=0
while x:
 a+=1;b=a
 while b-c:b,c=b**int(min(str(b))),b
 x-=b!=1and b!=a
print(a)

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

シーケンスのn番目の項を直接出力するPython 3ソリューションを試すことにしました。


Python 3の機能を使用していないようです。Python 2でのクイックゴルフは87バイトになります。
バブラー


0

C(clang) + -DL=long long -lm、213バイト

q(char*a,char*b){return*a>*b;}L f(L a){char*c;asprintf(&c,"%lld",a);qsort(c,strlen(c),1,q);L b=pow(a,*c-48);return b>a?f(b):b;}i;g(j){for(i=0;j;i++){L x=f(i);x!=i&x!=1&x>0&&printf("%d\n",i)&&j--;}}

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

関数は、シーケンスのg(j)最初のj項を出力します。


で戻り、a=...1ダースほどのバイトを保存します。

そして、x>1代わりにx!=1&x>0

ただし、最初のものはGCCの変更が​​必要です。

0

16 12 10バイト

fS>ωṠ^o▼dN

H.PWizのおかげで6バイト節約されました。
オンラインでお試しください!

説明

fS>ωṠ^o▼dN
f        N       Filter the natural numbers where...
   ω             ... the fixed point...
    Ṡ^o▼d        ... of raising the number to its smallest digit...
 S>              ... is greater than the number.

ここで変更できますS>。これにより、すべてを1行に収めることができます。また、以前のtioリンク
-H.PWiz

0

Japt、44バイト


_ì ñ g
_gV ¥1?Z:ZpZgV)gW
@@[1X]øXgW}fXÄ}gUÄ

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

他のJaptの回答とは大幅に異なります。

説明:

                        Empty line preserves the input

_ì ñ g                Function V finds the smallest digit in a number Z
 ì                          Get the digits of Z
   ñ                        Sort the digits
     g                      Get the first (smallest) digit


_gV ¥1?Z:ZpZgV)gW     Function W finds the MPR of a number Z
 gV ¥1?Z                    If V(Z) is 1, then it's stable; return it
        :ZpZgV)             Otherwise get MPI of Z...
               gW           And call W on it ( MPR(Z) == MPR(MPI(Z)) )

@@[1X]øXgW}fXÄ}gUÄ    Main program
@             }gUÄ      Get the nth number by repeatedly applying...    
 @        }fXÄ              Find the next smallest number X which returns false to...
       XgW                    MPR(X)
      ø                       is either...
  [1X]                        1 or X

将来のゴルフの可能性に関しては、数字の関数を手動で多く呼び出しますが、これを減らすことができると思われますが、どうすればよいかわかりません。

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