Minimalna moc rootowania


22

Minimalna siła iteracji pewnej liczby jest zdefiniowany w następujący sposób:n

MPI(n):=nmin(digits(n))

Oznacza to, że podniesione do najniższej cyfry w . Na przykład a .nnMPI(32)=322=1024MPI(1234)=12341=1234

Minimalne głównego zasilania pewnej liczby jest zdefiniowany jako liczba otrzymana z wielokrotne zastosowanie aż do punktu stałego znajduje. Oto tabela minimalnych pierwiastków władzy liczb od 1 do 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

Wyzwanie: Wygeneruj liczby, których minimalny pierwiastek mocy nie jest równy 1 lub sam.

Oto pierwsze 50 liczb w tej sekwencji:

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

Zasady

  • Możesz wygenerować pierwsze nliczby z tej sekwencji (indeksowane 0 lub 1), wygenerować nth termin, stworzyć generator, który oblicza te warunki, generować nieskończenie wiele z nich itp.
  • Możesz przyjmować dane wejściowe i dawać dane wyjściowe w dowolnej bazie, ale obliczenia dla MPR muszą być w bazie 10. Na przykład możesz wziąć dane wejściowe ###(jednostkowe) i wyjściowe ### ##### ######(jednostkowe)
  • Państwo musi uzyskując liczb. Nie możesz (np.) Wyprowadzać "3", "5", "6", ponieważ są to ciągi znaków. 3, 5, 6i 3 5 6oba są jednak ważne. Wyprowadzanie 2 3, "23"lub twenty-threewszystkie są uważane za nieprawidłowe reprezentacje liczby 23. (Ponownie możesz użyć dowolnej bazy do przedstawienia tych liczb).
  • To jest , więc wygrywa najkrótszy kod (w bajtach).

2
Ciekawe, jak możesz udowodnić, że w końcu znaleziono punkt stały dla wszystkich n?
nwellnhof

1
@nwellnhof (Rough proof.) Załóżmy, że nie ma stałego punktu , tzn. nie istnieje. Niech będzie iteracją funkcji nad . Ta sekwencja rośnie, ponieważ dla wszystkich . Będąc ściśle rosnącym, prawdopodobieństwo braku cyfry w wynoszącej 0 lub 1 zmierza w kierunku 0, gdy zmierza w kierunku . MPR ( x ) x i i MPI x a b > a b c a , b , c 2 x i x ixMPR(x)xiiMPIxab>abca,b,c2xixi
Conor O'Brien

Huh Oeis nie ma tej sekwencji.
Draco18s,

@ ConorO'Brien To pokazuje, że twoja hipoteza jest wiarygodna, ale to nie dowodzi.
kasperd

1
@kasperd Zatem „szorstki dowód” przed nim.
Conor O'Brien

Odpowiedzi:


5

05AB1E , 8 bajtów

Generuje n-tą liczbę 1 -indexed

µNÐΔWm}‹

Wypróbuj online!

Wyjaśnienie

µ          # 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

Opcjonalnie jako nieskończona lista o tej samej liczbie bajtów:

∞ʒDΔWm}‹

Wypróbuj online!


Zaraz, czy to wszystko? .. To wygląda o wiele szybciej niż myślałem, że będzie ...>.> Skasuję moją odpowiedź, ponieważ jest ona ponad dwa razy dłuższa ..
Kevin Cruijssen

@KevinCruijssen: Sam jestem trochę zaskoczony. Myślałem, że zajmie to około 12 bajtów, patrząc na zadanie.
Emigna

1
Przekręciłem się µi Δzaraz po opublikowaniu wyzwania otrzymałem tę samą odpowiedź, ale zastanawiałem się, dlaczego to nie zadziałało ... Użyłem Draczej niż Ðdlatego, że myślałem, że jedna kopia byłaby użyta przez funkcję stałego punktu i drugi przez funkcję mniejszą niż, ale nie wziąłem pod uwagę, że potrzebowałem kolejnej kopii. Dzięki, Emigna, za rozwiązanie mojej Enimgi.
Pan Xcoder,

6

Perl 6 , 49 bajtów

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

Wypróbuj online!

Zwraca nieskończoną sekwencję. Podejrzewam, że działa także następująca 45-bajtowa wersja, ale nie mogę udowodnić, że stały punkt zawsze znajduje się po iteracjach.

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

5

J , 41 39 37 bajtów

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

Wypróbuj online!

Ten jest pełnym programem drukującym nieskończoną sekwencję. Bardzo rzadka okazja, gdy pełny program bije czasownik w J.

Jak to działa

(>:[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

J , 41 39 bajtów

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

Wypróbuj online!

Czasownik monadyczny. Biorąc pod uwagę indeks oparty na 1, zwraca liczbę przy tym indeksie. Stopka sprawdza, czy pierwsze 20 warunków jest poprawnych.

Czytając słowo „punkt stały”, od razu pomyślałem: „O tak, ^:_zrobię świetną robotę”. Potem skończyło się na tym wstręt do gniewnych i smutnych twarzy. I to nawet nie pociąg, to pojedynczy czasownik .

Niegolfowany i jak to działa

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

Liczba całkowita o dowolnej dokładności 0xjest potrzebna do dokładnego obliczenia punktu stałego, np. Liczby 6.


Świetny! To dużo ^:, moja głowa zaczyna boleć na drugim z nich :)
Galen Iwanow


33 bajty: _&(_&(]]+]>:(^{.@/:~&.":)^:_)>:)*przyjmowanie danych jako rozszerzonej liczby całkowitej
mile

4

Pyth , 10 bajtów

.f>u^GshS`

Wypróbuj online!

nGZZQ.fQu^GshS`GZ

Kod źródłowy minimalnej mocy działa poprzez znalezienie stałego punktu upodniesienia bieżącej liczby Gdo potęgi jej minimalnej cyfry, która jest taka sama jak pierwsza cyfra ( h) posortowana leksykograficznie ( S), a następnie przekonwertowana z powrotem na liczbę całkowitą ( s).


4

Galaretka , 10 bajtów

*DṂƊƬḊCȦµ#

Monadyczny link pobierający liczbę całkowitą I, ze STDIN, który daje pierwsze Iwpisy.

Wypróbuj online!

( *DṂƊƬṪ%@µ#działa również dla 10)

W jaki sposób?

Zlicza rozpoczęcie do n=0momentu inputnapotkania prawdziwych wyników funkcji monadycznej i daje te ns.

Funkcja wielokrotnie stosuje inną funkcję monadyczną, zaczynając od x=ni zbiera wartości, xaż wyniki nie będą już unikalne. (np .: 19plony [19]; 23plony [23,529,279841]; 24plony [24, 576, 63403380965376, 1]; itd.), a następnie usuwa kolejność wyniku (usuwa wartość znajdującą się najdalej z lewej strony), uzupełnia wszystkie wartości ( 1-x) i używa Ȧdo obliczania, 0gdy na liście jest zero lub jeśli jest ono puste.

Funkcja najbardziej wewnętrzna podnosi prąd xdo wszystkich cyfr, xa następnie utrzymuje minimum (robi to zapisywanie bajtów w stosunku do znalezienia najpierw cyfry minimalnej).

*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?

Sprytne użycie ƬḊCȦtam. :-)
Erik the Outgolfer

Ṫ>odbiera 0:(
Jonathan Allan

4

Mathematica, 59 51 bajtów

-8 bajtów dzięki Misze Ławrow .

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

Czysta funkcja. Pobiera liczbę jako dane wejściowe i zwraca listę terminów do tej liczby jako dane wyjściowe. Nic bardzo skomplikowanego tutaj.


FixedPointzwykle nie jest tak dobry, jak //.(skrót od ReplaceRepeated) w golfie kodowym. Tutaj możemy zaoszczędzić kilka bajtów Select[Range@#,1<(#//.x_:>x^Min@IntegerDigits@x)!=#&]&.
Misha Lavrov

Ponadto, jeśli MPI (x) nie jest ani 1 ani x, to zawsze jest większe niż x, więc rozwiązaniem jest jeszcze krótsze Select[Range@#,#<(#//.x_:>x^Min@IntegerDigits@x)&]&.
Misha Lavrov

3

Python 3 , 90 88 bajtów

-2 bajty przez @mypetlion

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

Wypróbuj online!

printponieważ wyrażenie oszczędza dwa bajty za pomocą ifinstrukcji w Pythonie 2. Foblicza punkt stały MPI; reszta daje nieskończoną sekwencję STDOUT.


Zmień, return m>x and F(m)or maby return[int,F][m>x](m)zapisać 2 bajty.
mypetlion




2

Java 10, 178 173 bajtów

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

Port odpowiedzi Ruby @GB , więc również drukuje w nieskończoność.

Wypróbuj online.

Wyjaśnienie:

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 bajtów

-3 bajki dzięki @Conor O'Brien

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

Wypróbuj online!

MPR(n)>nMPR(n){1,n}

Wydaje się, że generator jest krótszy niż zwracanie tablicy nliczb?

Lub drukowanie w nieskończoność - 72 bajty

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

Wypróbuj online!


86 bajtów poprzez przesunięcie części przepływu sterowania, eliminując nawiasy klamrowe. (głównie: if(x>n)yield nsię x>n&&(yield n)jako wyrażenie)
Conor O'Brien



0

Rakieta , 270, 257 233 bajtów

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

Wypróbuj online!

To moje pierwsze zgłoszenie do rakiety , więc zdecydowanie można grać w golfa znacznie dalej. Niemniej jednak jestem trochę zadowolony, przynajmniej z powodu rozwiązania zadania.

Bardziej czytelny:

(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

Aksjomat, 168 bajtów

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]

Funkcją, która go używa, jest z (); tutaj wypisuje liczby, które mają odpowiednik jeden numer nie 1, nie sam i są mniejsze niż jego argument.

(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 bajtów (obejmuje import)

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

Wypróbuj online!

Wymaga następującego importu:

Imports B = System.Numerics.BigInteger

Używa funkcji iteratora, aby zwrócić nieskończoną (leniwie załadowaną) listę liczb całkowitych, która spełnia kryteria. Wykorzystuje się, BigIntegeraby uniknąć ograniczeń rozmiaru, szczególnie przy obliczeniach pośrednich.

Bez golfa:

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

Common Lisp , 238 bajtów

(defun x(m n o p q)(setf i(sort(map 'list #'digit-char-p(prin1-to-string m))#'<))(setf j(expt m(first i)))(cond((= q p)nil)((and(= n j)(not(= n 1))(not(= n o)))(cons o(x(1+ o)0(1+ o)p(1+ q))))((= n j)(x(1+ o)0(1+ o)p q))(t(x j j o p q))))

Wypróbuj online!


0

APL (NARS), 96 znaków, 192 bajty

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

test (częściowy wynik dla argumentu 22 wydaje się być zbyt duży, więc <21 argumentów nie wiem, czy może być w porządku)

  f 21
3 5 6 8 


0

C (brzęk) + -DL=long long -lm, 213 bajtów

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--;}}

Wypróbuj online!

Funkcja g(j)drukuje pierwsze jwarunki sekwencji.


Wróć za pomocą, a=...aby zapisać kilkanaście bajtów.

I x>1zamiast x!=1&x>0.

Pierwszy wymaga jednak zmiany na GCC.

0

Łuska , 16 12 10 bajtów

fS>ωṠ^o▼dN

Zaoszczędzono 6 bajtów dzięki H.PWiz.
Wypróbuj online!

Wyjaśnienie

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.

Możesz zmienić tutaj za pomocą S>. Pozwala to umieścić wszystko w jednym wierszu. Wygląda też na to, że omyłkowo opuściłeś poprzedni link tio
H.PWiz

0

Japt , 44 bajty


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

Wypróbuj online!

Zasadniczo różni się od drugiej odpowiedzi Japt.

Wyjaśnienie:

                        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

Jeśli chodzi o przyszłe możliwości gry w golfa, wykonuję wiele ręcznych wywołań funkcji na numerach, które, jak podejrzewam, mogłyby zostać zredukowane, ale nie jestem pewien, jak to zrobić.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.