Корень минимальной мощности


22

Минимальная мощность итерации из числа n определяется следующим образом :

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

То есть n повышается до самой низкой цифры в n . Например, MPI(32)=322=1024 и MPI(1234)=12341=1234 .

Минимальный корень мощности из числа n определяется как число , полученное от многократного применения MPI , пока фиксированная точка не будет найдена. Вот таблица минимальных степенных корней чисел от 1 до 25:

   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", так как это строки.3, 5, 6и 3 5 6оба действительны, однако. Выведение 2 3, "23"или twenty-threeвсе считаются недействительным представлением числа 23. (Опять же, вы можете использовать любую базу для представления этих чисел.)
  • Это , поэтому выигрывает самый короткий код (в байтах).

2
Просто любопытно, как вы можете доказать, что фиксированная точка найдена в конце концов для всех n?
nwellnhof

1
@nwellnhof (Грубое доказательство.) Предположим, что нет фиксированной точки , т. е. MPR ( x ) не существует. Пусть x i будет i-й итерацией функции MPI над x . Эта последовательность строго возрастает, поскольку a b > a b c для всех a , b , c 2 . Строго увеличиваясь, вероятность отсутствия цифры в x i, равной 0 или 1, стремится к 0, так как x i стремится к xMPR(x)xiiMPIxab>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}‹

Попробуйте онлайн!


Подожди, это все? .. Это выглядит намного проще, чем я думал.>.> Я удалю свой ответ, поскольку он более чем в два раза длиннее ..
Кевин Круйссен,

@KevinCruijssen: Я сам немного удивлен. Думал, что это займет 12 или около того байтов при рассмотрении задачи.
Эминья

1
Я вертелся µи Δсразу после того, как вопрос был опубликован, и получил точно такой же ответ, но мне было интересно, почему это не сработало ... Я использовал, Dа не Ðпотому, что думал, что одна копия будет использоваться функцией с фиксированной точкой и другой - функцией меньше, но я не учел, что мне нужна еще одна копия. Спасибо, Эминья, за решение моей Enimga.
г-н Xcoder

6

Perl 6 , 49 байт

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

Попробуйте онлайн!

Возвращает бесконечную последовательность. Я предполагаю, что следующая 45-байтовая версия тоже работает, но я не могу доказать, что фиксированная точка всегда находится после n итераций.

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

5

J , 41 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

J , 41 39 байт

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

Попробуйте онлайн!

Монадический глагол. С учетом индекса на основе 1 возвращает число по этому индексу. Нижний колонтитул проверяет правильность первых 20 терминов.

Читая слово «fixpoint», я сразу подумал: «О да, отлично справлюсь» ^:_. Тогда я закончил с этой мерзостью сердитых и грустных лиц. И это даже не поезд, это единственный глагол .

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.


Большой! Это очень много ^:, у меня начинает болеть голова от второго из них :)
Гален Иванов


33 байта: _&(_&(]]+]>:(^{.@/:~&.":)^:_)>:)*принимать входные данные как расширенное целое число
мили

4

Pyth , 10 байт

.f>u^GshS`

Попробуйте онлайн!

NGZZQ.fQu^GshS`GZ

Корневой код минимальной мощности работает, находя фиксированную точку uвозведения текущего числа Gв степень его минимальной цифры, которая совпадает с первой цифрой ( h), отсортированной лексикографически ( S), а затем преобразованной обратно в целое число ( s).


4

Желе , 10 байт

*DṂƊƬḊCȦµ#

Монадическая ссылка I, получающая целое число из STDIN, которое возвращает первые Iзаписи.

Попробуйте онлайн!

( *DṂƊƬṪ%@µ#работает на 10 тоже)

Как?

Считает, что запускает n=0до inputтех пор, пока не встретятся истинные результаты монадической функции и выдаст теn s.

Функция многократно применяет другую монадическую функцию, начиная с, x=nи собирает значения xдо тех пор, пока результаты не станут уникальными. (например: 19yields [19]; 23yields [23,529,279841]; 24yields [24, 576, 63403380965376, 1]; etc ...), а затем удаляет результат из результата (удаляет крайнее левое значение), дополняет все значения ( 1-x) и использует Ȧдля получения результата, 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Ȧтам. :-)
Эрик Outgolfer

Ṫ>поднимает 0:(
Джонатан Аллан

4

Mathematica, 59 51 байт

-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 3 , 90 88 байт

-2 байта @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

Попробуйте онлайн!

printпоскольку выражение сохраняет два байта по сравнению с ifоператором в Python 2. Fвычисляет точку фиксации MPI; остальное дает бесконечную последовательность STDOUT.


Изменить, return m>x and F(m)or mчтобы return[int,F][m>x](m)сохранить 2 байта.
mypetlion




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 байта спасибо @ Конор О'Брайен

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

Попробуйте онлайн!

Используя тот факт, что Mпр(N)>N если Mпр(N){1,N}

Кажется, что генератор короче, чем возвращает массив 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 nв x>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(протестировано на моем ПК). Не пытайтесь использовать этот код как есть в вашем браузере.


лол собирался сыграть в гольф мой ответ, но ты получил преимущество. 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'()))))

Попробуйте онлайн!

Это моя первая ракетка представление, так что это, безусловно , может быть golfed гораздо дальше. Тем не менее, я доволен, по крайней мере, тем, что сумел решить задачу.

Более читабельно:

(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, а не самому себе и меньше его аргумента.

(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чтобы избежать каких-либо ограничений по размеру, особенно при промежуточных вычислениях.

Un-golfed:

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)

Попробуйте онлайн!

Решил попробовать решение Python 3, которое напрямую печатает n-й член в последовательности.


Похоже, вы не используете какие-либо функции Python 3. Быстрый гольф в Python 2 дает 87 байтов.
Bubbler


0

C (лязг) + -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=...чтобы сохранить дюжину или около того байтов.

И x>1вместо x!=1&x>0.

Первый требует изменения GCC, хотя.

0

Шелуха , 16 12 10 байт

fS>ωṠ^o▼dN

Сохранено 6 байт благодаря H.PWiz.
Попробуйте онлайн!

объяснение

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>. Это позволяет поместить все это в одну строку. Кроме того, похоже, что вы по ошибке оставили в предыдущей ссылке tio
H.PWiz

0

Japt , 44 байта


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

Попробуйте онлайн!

Существенно отличается от другого ответа Япта.

Объяснение:

                        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

Что касается будущих возможностей игры в гольф, я много вручную вызываю функцию для числа, которое, я подозреваю, может быть уменьшено, но я не уверен, как.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.