Basamağı Kare'ye kadar toplam


11

Verilen herhangi bir x> 0 ve herhangi bir y> 3 tamsayısıdır.

  1. Tüm x basamaklarını toplayın (ayarlanan tabanda yazılmışsa).
  2. Bunu mümkün olan en yüksek rakamla çarpın (daima base -1).
  3. Bu değer verilene kadar tekrarlayın (y - 1) ^ 2

Aranan, yineleme sayısı ve adımlardır.

Örnek 1:

x= 739
y= 7
searched: (7 - 1) ^ 2 = 36

based: (b7)2104
sum: (dec)7
mul: (dec)42

based: (b7)60
sum: (dec)6
mul: (dec)36

2 steps needed -> answer is [2, 739, 42, 36] or [739, 42, 36, 2]

Örnek 2:

x = 1712
y = 19
s: 324

step1: 1712 -> 360
step2:  360 -> 648
step3:  648 -> 324

3 steps needed -> answer is [3, 1712, 360, 648, 324] or [1712, 360, 648, 324, 3]

Özel:
Bazı durumlarda (3 tabanlı bazı kombinasyonlar) ve (y - 1) ^ 2için x = 53beğenemezsiniz y = 3. Bu nedenle y3'ten büyük olması gerekir ve bunu göz ardı edebilirsiniz.

Yineleme sayısı ilk veya son değer olmalıdır

Bu en düşük bayt-sayısı kazanır.


Yanıttaki adım sayısını zorunlu tutmak, soruna gereksiz bir ekleme gibi görünüyor . Benim çözüm bir liste uzunluğunu bulmak ve 1 çıkarma miktarını yapmak için 21 bayt eklemek zorunda kaldı.
ngenisis

@ngenisis sadece bir çıktı sırası ile gidiyor, ama yöntemi (dizi, yığın, sınırlama dizesi, çoklu dizeler ....) görmezden geliyor. 2 farklı şeyi (son değer ve sayım) takip etmek, değerlerin (az ya da çok) “kör” toplanmasını önler ve gözüme iyi bir ektir. Belki farklı bir yaklaşım hesaplamada 5 bayta daha ihtiyaç duyar, ancak sayma kısmında 8 tasarruf sağlar (sadece rastgele sayılar).
Dirk Reichel

Yanıtlar:


4

Jöle , 14 13 bayt

Döngü olarak yazdırarak -1 bayt ( zincir ayırma µve birleştirme yerine ;)

Ṅb⁹S×⁹’¤µÐĿL’

TryItOnline!

Nasıl?

Ṅb⁹S×⁹’¤µÐĿL’ - Main link: x, y
        µÐĿ   - loop monadically until results are no longer unique and collect
Ṅ             - print z (initially x), then result of previous loop and return z
  ⁹           -     right argument (y, even though monadic)
 b            -     left to base right
   S          -     sum (the result was a list of base y digits)
       ¤      -     nilad followed by link(s) as a nilad
     ⁹’       -         y decremented
    ×         -     multiply
           L  - length(z)
            ’ - decrement
              - implicit print

Alternatif 13 byter, her girişi döngüye ve bir satır beslemesine ( ) yazdırır ve son olarak toplanan sonuçların azaltılmış sayısını dolaylı olarak basar ve monadik bir zincir ayırma ( µ) ve birleştirme ( ;) ihtiyacını ortadan kaldırır .


1
Ayarlanmış herhangi bir "çıktı biçimlendirme" olmadığı için. Sipariş iyi olduğu sürece çoklu çıkışlar sayılacaktır. Bu şekilde 13 bayt yanıtı geçerlidir.
Dirk Reichel

Harika, emin değildim, bana bildirdiğiniz için teşekkürler!
Jonathan Allan

4

Perl 6 , 60 bayt

{$/=[$^x,*.polymod($^y xx*).sum*($y-1)...($y-1)²];$/-1,|$/}

Expanded:

{    # bare block lambda with placeholder parameters 「$x」 「$y」

  $/ = [          # store in 「$/」 ( so that we don't have to declare it )

    # generate a sequence

    $^x,          # declare first parameter, and seed sequence generator

    # Whatever lambda

    *\            # the parameter to this lambda

    .polymod(     # broken down with a list of moduli

      $^y         # declare second parameter of the outer block lambda
      xx *        # an infinite list of copies of it

    )
    .sum
    *
    ( $y - 1 )

    # end of Whatever lambda

    ...           # repeat until it reaches

    ( $y - 1 
  ];

  # returns
  $/ - 1,         # count of values minus one
  |$/             # Slip 「|」 the list into the result
}

Kullanımı:

# store it in the lexical namespace so that it is easier to understand
my &code = {$/=[$^x,*.polymod($^y xx*).sum*($y-1)...($y-1)²];$/-1,|$/}

say code  739,  7; # (2 739 42 36)
say code 1712, 19; # (3 1712 360 648 324)

4

C, 116113 bayt

Her seferinde kareyi yeniden hesaplamak için -3 bayt

s,t,i;f(x,y){s=y-(i=1);while(x-s*s){t=0;++i;printf("%d ",x);while(x)t+=x%y,x/=y;x=t*y-t;}printf("%d %d ",x,i-1);}

Ungolfed ve kullanımı:

s,t,i;
f(x,y){
 s=y-(i=1);
 while(x-s*s){
  t=0;
  ++i;
  printf("%d ",x);
  while(x)
   t+=x%y,    //add the base y digit
   x/=y;      //shift x to the right by base y
  x=t*y-t;
 }
 printf("%d %d ",x,i-1);
}

main(){
 f(739,7);puts("");
 f(1712,19);puts("");
}

4

JavaScript (ES6), 97 91 84 82 bayt

f=(n,b,k=1,c=b-1)=>[n,(s=(B=n=>n%b*c+(n>b&&B(n/b|0)))(n))-c*c?f(s,b,k+1):[s,k]]+''

Test senaryoları


4

Jöle , 16 bayt

Sanırım bunu yazıyorum, yazarken dövülmüş olmasına rağmen, özellikle farklı bir algoritma ve yazmak ilginçti. ( ÐĿDokümanlardan nasıl ayrıştırıldığını ve bundan vazgeçmesi gerektiğini anlayamadım , ancak muhtemelen bundan daha kısa bir çözüme yol açacağını bilmesine rağmen.)

ṄbS×⁹’¤ß<’¥n⁸$?‘

Çevrimiçi deneyin!

Açıklama:

ṄbS×⁹’¤ß<’¥n⁸$?‘
Ṅ                 Output {the first argument} and a newline
 b                Convert to base {the second argument}
  S               Sum digits
    ⁹’¤           {the second argument} minus 1, parsed as a group
   ×              Multiply
           n⁸$    {the current value} ≠ {the first argument}, parsed as a group
              ?   If that's true:
       ß          then run the whole program recursively
        <’¥       else run (lambda a,b: (a<b)-1)
               ‘  Increment the result

Kullanımı <’¥temel olarak her zaman -1 döndüren bir dyad (iki argümanla bağlantı) yazmanın kısa bir yoludur (çünkü cevabın hiçbir zaman tabandan daha küçük olmayacağını biliyoruz). Yinelenen çalıştırma ile tüm program yinelemeli arasında seçim yapmak, döngüyü ne zaman durduracağımızı belirlememizi sağlar. Sonra yığın özyineleme sonunda gevşediğinde, kaç adım olduğunu belirlemek için -1 değerini artırmaya devam ediyoruz.


2

MATL, 25 21 bayt

@Luis sayesinde 4 byte tasarruf edildi

XJx`tJYA!UsJq*tJqU-}@

Çevrimiçi deneyin!

açıklama

XJ      % Implicitly grab the first input and store in clipboard J
x       % Delete this from the stack
`       % Do...while loop
  t     % Duplicate last element on stack (implicitly grabs second input)
  JYA   % Convert this number to the specified base
  !Us   % Sum the digits
  Jq*   % Multiply by the largest number in this base
  t     % Duplicate this value
  JqU   % Compute (base - 1) ^ 2
  -     % Subtract the two. Evaluates to TRUE if they are not equal
}       % When they are finally equal
@       % Push the number of iterations
        % Implicitly display the stack contents

@LuisMendo Düzeltildi!
Suever

1

Mathematica, 80 bayt

(s=FixedPointList[x(#2-1)(Plus@@x~IntegerDigits~#2),#];s[[-1]]=Length@s-2;s)&

U+F4A1temsil etmek için kullanılan özel kullanım karakteridir \[Function]. Yanıtta adım sayısı gerekli değilse, bu 60 baytta yapılabilir:

Most@FixedPointList[x(#2-1)(Plus@@x~IntegerDigits~#2),#]&
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.