Yer kazanmak için tamsayıyı katlayın!


20

Çılgın matematikçi geniş bir sayı koleksiyonuna sahiptir ve bu nedenle bıraktığı alan oldukça sınırlıdır. Bazılarını kurtarmak için tam sayılarını katlaması gerekir, ancak ne yazık ki gerçekten tembeldir. Göreviniz, ona yardım etmek istiyorsanız, manyak sayımız için belirli bir pozitif tamsayıyı katlayan bir işlev / program oluşturmaktır.

Tam sayı nasıl katlanır?

Basamaklarının toplamıyla eşit olarak bölünebiliyorsa, basamaklarının toplamıyla bölün. Bu gereksinimi karşılamıyorsa, rakamlarının toplamına bölünmesiyle kalanını alın. Sonuç ulaşana kadar işlemi tekrarlayın 1. Katlanmış tam sayı, gerçekleştirmeniz gereken işlem sayısıdır. Bir örnek alalım (diyelim 1782):

  1. Onun basamak toplamını alın: 1 + 7 + 8 + 2 = 18. 1782eşit olarak bölünebilir 18, yani bir sonraki sayı 1782 / 18 = 99.

  2. 99 tarafından eşit olarak bölünemez 9 + 9 = 18 , bu yüzden geri kalanını alırız 99 % 18 = 9.

  3. 9 belli ki tarafından bölünebilir 9 , bu yüzden onu böleriz ve elde ederiz 1.

Sonuç 3 , ulaşmak için 3 işlem gerektiğinden 1.

Kurallar ve Şartnameler

  • Bazı tamsayılar veya 1gibi basamakların toplamına sahip olabilir . Programınızın bu tür durumları ele almasına gerek yoktur. Diğer bir deyişle, giriş olarak verilen tamsayının rakamların toplamına eşit olmadığı garanti edilir ve verilen tamsayı ile hiçbir işlem yapılmazsa, rakamların toplamı ( kendisi hariç , " hedef"). Örneğin, hiçbir zaman veya girdi olarak almazsınız .101001111020

  • Giriş, değerinden daha yüksek bir pozitif tam sayı olacaktır 1.

  • Varsayılan Loopholes uygulanır.

  • Herhangi bir standart ortalama ile girdi alabilir ve çıktı sağlayabilirsiniz .


Test Durumları

Giriş -> Çıkış

2 -> 1
5 -> 1
9 -> 1
18 -> 2
72 -> 2
152790 -> 2
152 -> 3
666 -> 3
777 -> 3
2010 -> 3
898786854 -> 4

İşte süreci görselleştirmenizi ve daha fazla test örneği denemenizi sağlayan bir program .


Bu , bu yüzden her dilde (bayt cinsinden puan) en kısa kod kazanır!


İlk başta ilgili görünmese de, bu meydan okumadan ilham alındı .
Bay Xcoder

3
Bu bir stopgap çözümü olarak çalışacaktır, ancak uzun vadede matematikçi gerçekten Hilbert'in Otellerinden birini satın almayı düşünmelidir . Bunlardan birinde her zaman kullanılmayan bir oda bulabilirsiniz.
Ray

iken 8987868546geçerli bir girdidir, bu test aracını kırmak ve cevapların aynı zamanda birçok (hepsi değilse) ... olacak
Mischa

@MischaBehrend Örneğiniz geçerli bir girdi değil. Sanırım son test davamı yanlış yönlendirdin. Geçerli giriş 898786854, değil 8987868546( 6sonuna bir eklediniz )
Bay Xcoder

nvm ... tüm ilk kuralı okumalıyım ... bunu burada bırakarak neden geçerli olduğunu düşündüğümü biliyorsun: bu bir hata değildi ... Bu komut dosyalarını test etmek için kasıtlı olarak değiştirdim ... ve kuralları okudum olan geçerli bir girdi. Tüm basamakların toplamı 8987868546 1 ( Kural 1 karşılandı ) değil ve 89878685461'den ( Kural 2 karşılandı ) yüksek bir pozitif tam sayı .
Mischa

Yanıtlar:


6

05AB1E , 13 12 bayt

[¼DSO‰0Kθ©#®

Çevrimiçi deneyin!

açıklama

[               # start loop
 ¼              # increment counter
  D             # duplicate current value
   SO           # sum the digits in the copy
     ‰          # divmod the current value by its digit-sum
      0K        # remove 0 from the resulting list
        θ       # pop the last element
         ©      # store a copy in register
          #     # if the current value is 1, break
           ®    # push the copy from register
                # implicitly output counter


5

Haskell, 85 78 bayt

f 1=0
f n|r<1=1+f(n`div`s)|1<2=1+f r where s=sum(read.pure<$>show n);r=n`rem`s

Bruce Forte sayesinde 7 bayt tasarruf etti.

Çevrimiçi deneyin.


Kullanarak divModve bırakarak daha fazla bayt kaydedin where: Çevrimiçi deneyin!
Laikoni

@ Laikoni Vay be, bu oldukça iyi bir gelişme! Lütfen farklı bir cevap olarak gönderin; benimkinden yeterince farklı. BTW: Kurtulmak için bir numara arıyordum where. Bunu gelecekte kullanacağım. :)
Cristian Lupascu

sum[read[d]|d<-show n]bir bayt kaydeder
nimi

5

JavaScript (ES6), 66 58 51 49 bayt

Girdiyi tamsayı olarak alır. İade falseiçin 0veya 1kimin rakam kadar ekleyin herhangi bir sayıda karşılaştığında ve bir taşma hatası atar 1.

f=n=>n>1&&f(n%(x=eval([...""+n].join`+`))||n/x)+1

Dene

o.innerText=(

f=n=>n>1&&f(n%(x=eval([...""+n].join`+`))||n/x)+1

)(i.value=898786854);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>


1
Kullanarak rakamları toplayarak bazı baytlar kaydedebilir misiniz eval(array.join`+`)?
Justin Mariner

Gerçekten, @JustinMariner - beni buna ninja ettin! Teşekkürler :)
Shaggy

4

Kabuk , 12 bayt

←€1¡Ṡ§|÷%oΣd

Çevrimiçi deneyin!

açıklama

←€1¡Ṡ§|÷%oΣd  Implicit input, e.g. n=1782
    Ṡ§|÷%oΣd  This part defines the transformation.
         oΣ   Sum of
           d  digits: s=18
    Ṡ   %     n mod s: 0
     §|       or (take this branch if last result was 0)
       ÷      n divided by s: 99
   ¡          Iterate the transformation: [1782,99,9,1,1,1,...
 €1           Index of 1 (1-based): 4
←             Decrement: 3
              Print implicitly.



2

Retina , 100 bayt

$
;
{`(.+);
$1$*1;$&
(?<=;.*)\d(?=.*;)
$*
.*;1;(.*)
$.1
r`(1)*(\3)*;(1+);
$#1;$#2;1
0;(.*);|;.*;
$1;

Çevrimiçi deneyin! Büyük olanlar çok uzun sürdüğü için bağlantı yalnızca daha küçük test senaryolarını içerir.


2

Mathematica, 73 bayt

(t=#;For[r=0,t>1,r++,If[(s=Mod[t,g=Tr@IntegerDigits@t])<1,t=t/g,t=s]];r)&

İle ==0değiştirilebilir <1?
Bay Xcoder

@ Mr.Xcoder evet, elbette! Bir sıralayıcı sürümü yaptım ...
J42161217

2

PHP, 68 + 1 bayt

tekli çıktı:

for($n=$argn;$n>1;$n=$n%($s=array_sum(str_split($n)))?:$n/$s)echo 1;

ondalık çıktı, 73 + 1 bayt:

for($n=$argn;$n>1;$i++)$n=$n%($s=array_sum(str_split($n)))?:$n/$s;echo$i;

Pipo ile çalıştırın -nRveya çevrimiçi deneyin .


Elvis operatörü PHP 5.3 veya üstünü gerektirir. Daha eski PHP için, (+5 bayt) ?:ile değiştirin ?$n%$s:.


2

Yakut, 46 bayt

f=->n{s=n.digits.sum;n<2?0:1+f[n%s<1?n/s:n%s]}

2

Haskell , 94 93 89 88 bayt

Bu çok uzun hissettiriyor ..

length.fst.span(/=1).iterate g
g x|(d,m)<-x`divMod`sum[read[d]|d<-show x]=last$m:[d|m<1]

Çevrimiçi deneyin!

Her biri 1 bayt golf için @Laikoni & @ nimi teşekkürler!





1

Perl, 71 bayt, 64 bayt, 63 bayt

-pl

$c=0;while($_>1){$s=0;$s+=$_ for/./g;$_=$_%$s?$_%$s:$_/$s;++$c};$_=$c

Çevrimiçi deneyin

DÜZENLEME: Xcali'nin yorumu sayesinde 7 bayt kaydedildi

-p

while($_>1){$s=0;$s+=$_ for/./g;$_=$_%$s?$_%$s:$_/$s;++$c}$_=$c

EDIT: beri 5.14 tahribatsız ikame s / // r

-pl

while($_>1){$s=eval s/\B/+/gr;$_=$_%$s?$_%$s:$_/$s;++$c}$_=$c

Is -pldeğil, üstüne bir komut satırı bayrağı olması gerekiyordu?
Outgolfer Erik

evet onlar perl seçenekleri
Nahuel Fouilleul

Sen saymanız gerekir -plgöre bayrak bu yazı .
Outgolfer Erik

Pl seçenekleri için 69 bayt +2 saydım, doğru mu?
Nahuel Fouilleul

Bunu biraz golf oynayabilirsiniz. $cbaşlatılması gerekmez. undef0'dan başlayacaktır. Süre kapanışından sonra noktalı virgül gidebilir. Ayrıca, ihtiyacınız yok -l. Bir seferde birden fazla giriş almanıza gerek yoktur.
Xcali

1

Dyalog APL, 36 bayt

{x←+/⍎¨⍕⍵⋄1=⍵:00=x|⍵:1+∇⍵÷x1+∇x|⍵}

Çevrimiçi deneyin!

Nasıl?

{
   x←+/⍎¨⍕⍵       x = digit sum
   1=⍵:0          if arg = 1: bye
   0=x|⍵:1+∇⍵÷x   if arg divisible by x: recurse with arg/x
   1+∇x|⍵         recurse with arg mod x
}

1

Gaia , 13 bayt

-@{:ΣZ¤∨)‡}°\

Çevrimiçi deneyin!

açıklama

-              Push -1 (this will be the counter)
 @             Push input (the starting number)
  {:ΣZ¤∨)‡}°   Repeat this block until the results of 2 consecutive runs are the same:
   :            Copy the number
    Σ           Digital sum
     Z          Divmod number by digital sum
      ¤         Swap
       ∨        Logical or: left-most non-zero out of (number mod sum, number div sum)
        )‡      Increment the counter
            \  Delete the final 1, implicitly print the counter

1

Matlab, 150 bayt

function[d]=X(x) 
d=0;while ~strcmp(x,'1')z='sum(str2num(x(:)))';a=eval(['rem(',x,',',z,')']);y=num2str(a*(a>0)+eval([x,'/',z])*(a==0));x=y;d=d+1;end

Girişler, işleve X ('152') gibi bir dize olarak verilmelidir.

Fonksiyon döngü ve artış sırasında çalışır d. x=y;Çizgi benim için yeni bir oldu görünüşe göre, okuma ve aynı zamanda değişken değerinin üzerine çalışırken Matlab'in bir hata önlemek için gerekliydi.

Ungolfed:

function[d]=X(x) 
d=0;
while ~strcmp(x,'1')
    z='sum(str2num(x(:)))';
    a=eval(['rem(',x,',',z,')']);
    y=num2str(a*(a>0)+eval([x,'/',z])*(a==0));
    x=y;
    d=d+1;
end


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.