9'a yaklaşalım!


21

Bir tamsayıdır verilen n> 2 ise baskı veya küçük negatif olmayan bir tamsayı dönüş, k , öyle ki , bir (n, k) = 9 , bir (n, k) ile tanımlanır:

  • a (n, 0) = n
  • a (n, k + 1) =
    • bir (n, k) / 2 + 1 ise , bir (n, k) da olduğu
    • basamak toplamıdır bir (n, k) ² (10 tabanına) ise bir (n, k) garip

Örnekler

For n = 5 , beklenen çıkışı k = 4 :

a(5, 0) = 5
a(5, 1) = 7  (5² = 25 and 2 + 5 = 7)
a(5, 2) = 13 (7² = 49 and 4 + 9 = 13)
a(5, 3) = 16 (13² = 169 and 1 + 6 + 9 = 16)
a(5, 4) = 9  (16 / 2 + 1)

İçin n = 40 , beklenen çıkışı k = 2 :

a(40, 0) = 40
a(40, 1) = 21 (40 / 2 + 1)
a(40, 2) = 9  (21² = 441 and 4 + 4 + 1 = 9)

Açıklamalar ve kurallar

  • Girişin 2'den büyük olması garanti edilir.
  • Programınız teorik olarak n'nin herhangi bir değeri için çalışmalıdır . (Uygulamada, diliniz tarafından desteklenen maksimum tamsayı büyüklüğü ile sınırlı olabilir.)
  • k , 0 indeksli veya 1 indeksli olabilir. Lütfen cevabınıza yazınız.
  • Bu , yani bayt cinsinden en kısa cevap kazanır!

İlk değerler

Aşağıda n = 3 ile n = 422 arasındaki ilk değerler , k 0 indekslidir. (1 indeksleme için, sadece 1bu değerlere ekleyin .)

 1  2  4  3  3  5  0  4  3  4  2  6  1  1  6  5  5  4  1  5  2  3  3  7  6  2  3  2  2  7
 6  6  5  6  6  5  1  2  2  6  6  3  1  4  3  4  4  8  1  7  6  3  5  4  6  3  2  3  3  8
 7  7  3  7  4  6  6  7  5  7  6  6  6  2  4  3  3  3  6  7  3  7  2  4  7  2  6  5  6  4
 7  5  2  5  6  9  6  2  3  8  2  7  1  4  6  6  6  5  1  7  4  4  3  3  7  4  3  4  2  9
 6  8  6  8  6  4  6  8  2  5  3  7  6  7  3  8  2  6  7  8  6  7  5  7  6  7  4  3  3  5
 6  4  3  4  4  4  6  7  6  8  3  4  6  8  7  3  6  5  6  8  3  3  2  7  6  6  5  7  6  5
 7  8  2  6  3  3  6  6  6  7  4 10  6  7  3  3  6  4  1  9  2  3  3  8  7  2  6  5  2  7
 7  7  6  7  3  6  7  2  4  8  3  5  6  5  6  4  2  4  6  8  3  5  6  4  7  5  2  3  6 10
 7  7  3  9  2  7  1  9  5  7  6  5  6  7  4  9  6  3  6  6  3  4  2  8  7  7  6  8  6  4
 7  9  4  3  3  7  7  8  3  9  4  7  6  8  3  6  6  8  7  7  7  8  6  5  7  4  6  4  2  6
 7  7  6  5  3  4  7  5  4  5  3  5  7  7  6  8  2  7  1  9  6  4  6  5  7  7  2  9  6  8
 7  4  3  7  4  6  6  7  6  9  3  4  6  4  2  3  3  8  1  7  6  7  2  6  7  8  3  7  5  6
 7  8  2  9  3  3  6  7  6  4  4  4  6  7  6  7  6  7  6  8  7  5  6 11  7  7  3  8  4  4
 7  4  6  7  3  5  6  2  2 10  6  3  6  4  3  4  4  9  7  8  3  3  6  7  7  6  4  3  6  8

23
Başlık üzerinde Zorunlu nitpick:9! ≠ 9
JungHwan Min

1
Serin dizisi. Bunu kendin mi keşfettin?
Robert Fraser,

@RobertFraser Yaptım, ancak benzer dizilerin bir yerlerde bulunduğundan eminim (birini bulamadım, ancak aramaya fazla zaman harcamamıştım.)
Arnauld

Collatz varsayımından sonra, Arnauld's Conjecture! Sıradaki ne?
sergiol

@sergiol lmgtfy.com/?q=conjecture göre bir varsayım biran opinion or conclusion formed on the basis of incomplete information.
Roman Gräf

Yanıtlar:


6

Kabuğu , 13 bayt

€9¡?o→½ȯΣd□¦2

Bu 1 indeksli. Çevrimiçi deneyin!

açıklama

Burada fazla süslü bir şey yok.

€9¡?o→½ȯΣd□¦2  Implicit input, say n = 5
  ¡            Iterate the following function:
   ?       ¦2   If divisible by 2,
    o→½         then halve and increment,
       ȯΣd□     else square, take digits and get their sum.
               This gives an infinite sequence: [5,7,13,16,9,9,9,9,9..
€9             1-based index of 9; print implicitly.

Bunu çözerse iyi olacağını düşünüyorum .
H.PWiz

10

Perl 6 , 41 bayt (40 karakter)

{+($_,{$_%2??[+] $_².comb!!$_/2+1}...9)}

Çevrimiçi deneyin!

Bu, k'lerin 1 indekslemesini kullanır, dolayısıyla OP'deki örneklerden 1 daha yüksek cevap verir. 1 indekslemenin anlamı bu değilse, 1 bayt daha eklemek zorunda kalacağım.

Açıklama : Bu isimsiz bir işlevdir. Perl 6'nın tesisini özyineleme kullanarak liste oluşturmak için kullanıyoruz: --). Bu şuna benzer: (first element),(block that takes the previous element and gives the next)...(end condition). Bu durumda, birinci eleman $_(ana fonksiyonun argümanı) ve bitiş koşulu 9(9 ürettiğimizde yerine getirilir). Orta blokta, $_argümanına başvurmak için kullanırız (= dizinin önceki elemanı). ?? !!(Daha iyi olarak bilinen eski üçlü operatörüdür ? :). Son olarak, sayısal listeyi zorlayarak bu listenin uzunluğunu alıyoruz +(...).

Buradaki son garip şey rakamların toplamı. Sayılar Cool(hem dizeler hem de sayılar gibi davranırlar), bu nedenle .combüzerinde bir dize yöntemi kullanırız $_²(karakterlerin listesini ver = rakamlar), sonra karakterleri ekleriz (bunları tekrar sayılara dönüştürür).


Evet, 1 indekslemenin anlamı budur.
Arnauld

7

Jöle , 17 bayt

²DSµH‘$Ḃ?ßµ-n9$?‘

Çevrimiçi deneyin!

Dümdüz ileri yaklaşım. 0 tabanlı endeksleme kullanır.

açıklama

²DSµH‘$Ḃ?ßµ-n9$?‘  Input: n
               ?   If
            n9$      n != 9
          µ        Then
        ?            If
       Ḃ               n % 2 == 1
   µ                 Then
²                      Square
 D                     Decimal digits
  S                    Sum
      $              Else
    H                  Halve
     ‘                 Increment
         ß           Call recursively
                   Else
           -         The constant -1
                ‘  Increment

1
@Arnauld sayesinde koşullu bir oldu do-while n != 9yerine aitwhile n!= 9
mil

7

Python 2 , 129 126 76 68 67 64 54 53 bayt

Jonathan Frech sayesinde -3 bayt. -Maltysen sayesinde 8 bayt. Jonathan Allan sayesinde -7 bayt. Bay Xcoder sayesinde -1 bayt.

f=lambda n:n-9and-~f(n%2*sum(map(int,`n*n`))or 1+n/2)

Çevrimiçi deneyin!

Muhtemelen yeterince matematik bilmeyen birinden, bu tamamen keyfi görünüyor. : P


1
Sen yerine mümkün olabilir )%2and sumile )%2*sumüç bayt tasarruf.
Jonathan Frech

1
python 3 için bir neden var mı? Aksi takdirde `str repr
için`

1
kTamamen kurtulabilir ve yedi bayttan daha tasarruf
Jonathan Allan

8
İtiraf edeceğim, bunun birkaç dakika önce nasıl çalıştığını tamamen kaybettim. > _ <
totallyhuman


6

Mathematica, 58 bayt

1 endeksli

If[#!=9,#0@If[OddQ@#,Total@IntegerDigits[#^2],#/2+1]+1,0]&

Çevrimiçi deneyin! (Mathics üzerinde çalışmak için, Trbunun yerine değiştirilir Total)

burada @JungHwanMin tarafından -1 byte sürümü var (ancak matematik üzerinde çalışmıyor, bu yüzden ikisini de sakladım)

Mathematica, 57 bayt

If[#!=9,#0@If[2∣#,#/2+1,Total@IntegerDigits[#^2]]+1,0]&

1
-1 bayt: 2∣#Bunun yerine kullanın OddQ@#ve iki ifadesini değiştirin If.
JungHwan Min

6

JavaScript (ES6), 59 50 bayt

0 endeksli.

f=n=>n-9&&f(n%2?eval([...""+n*n].join`+`):n/2+1)+1

Dene

o.innerText=(
f=n=>n-9&&f(n%2?eval([...""+n*n].join`+`):n/2+1)+1
)(i.value=5);oninput=_=>o.innerText=f(+i.value)
<input id=i min=3 type=number><pre id=o>


açıklama

İlk yaptığımız şey hesaplamak n-9. Eğer n==9öyleyse, bu açıkça, verir 0ve orada şeyler durur. Eğer n!=9öyleyse n-9, sıfır olmayan bir değer verir, ki bu gerçeğe uygun olarak, mantıksal AND ile devam edebileceğimiz anlamına gelir. Fonksiyonu tekrar çağırırız, nona yeni bir mesaj vererek, aşağıdaki şekilde hesaplanır:

n%2?

Eğer nmodülo 2truthy - yani, ngarip.

[...""+n*n]

nKendi kendine çarp , dizgeye dönüştür ve bu dizgiyi tek tek karakter dizisine (rakam) ayır.

 .join`+`

Karakterleri +, bize matematiksel bir ifade vererek bir dizgiye yeniden katılın .

eval(                   )

Bu ifadeyi değerlendirin, bize rakamlarının toplamını verin n*n.

:n/2+1

Eğer n%2(yani Falsey olduğunu nbile değilse) o zaman biz sadece bölmek ntarafından 2ve ekleyin 1.

Fonksiyonu tekrar çağırmanın sonucuna sonra ekleriz 1. Böylece, bir başlangıç ​​girişi kullanarak 5, işlem şöyle devam eder:

f(5)
= -4&&f(7)+1
= -2&&(f(13)+1)+1
=  4&&((f(16)+1)+1)+1
=  7&&(((f(9)+1)+1)+1)+1
=     (((0+1)+1)+1)+1
= 4

4

Jöle ,  16  15 bayt

-1 byte sayesinde mil (üçlü kullanılması halinde)

²DSµH‘µḂ?_9$пL

Sayıları alan ve dönen bir monadik bağlantı.
1 endeksli

Çevrimiçi deneyin! veya bir test takımı görün (sonuçları 0 indeksli olmaya zorlar ve OP kod bloğu gibi biçimler)

Nasıl?

²DSµH‘µḂ?_9$пL - Link: number, n
            п  - collect results in a list while:
           $    -   last two links as a monad:
         _9     -     subtract nine
        ?       -   if:
       Ḃ        -     bit - current loop input modulo by 2 (1 if odd, 0 if even)
   µ            -   ...then:
²               -     square the current loop input
 D              -     cast to a list of its decimal digits
  S             -     sum
      µ         -   ...else:
    H           -     halve current loop input
     ‘          -     increment
              L - length (get the number of results collected
                -         - this includes the 9, so is 1-indexed w.r.t. k)

While döngüsüyle birlikte kullandığım if ifadesini birleştirerek bir bayt kaydedebileceğinizi düşünüyorum. ²DSµH‘$Ḃ?n9$пL
mil



2

05AB1E , 16 bayt

[Ð9Q#Èi2÷>ënSO]N

Çevrimiçi deneyin!

açıklama

[                  # start a loop
 Ð                 # triplicate current number
  9Q#              # if it equals 9, break
     Èi            # if even
       2÷>         # divide by 2 and increment
          ë        # else
           n       # square
            SO     # sum digits
              ]    # end loop
               N   # push the iteration counter N

1

VB.NET (.NET 4.5.2), 107 + 20 (ithalat) = 117 bayt

gerektirir Imports System.Linq

Function A(n)
While n<>9
n=If(n Mod 2=0,n/2+1,CStr(n^2).Sum(Function(c)Val(c)))
A+=1
End While
End Function

nBir tamsayı girişi olarak alan ve 0 tabanlı bir döndüren işlev k.

Ungolfed:

Function A(n) ' input/output types are Object, but we will be casting to integer
    'A = 0 ' VB will create an implicit variable with the same name as the function

    ' loop until a(n, k) = 9
    ' using n as the variable to store a(n, k)
    While n <> 9

        n = If(n Mod 2 = 0, ' equivalent to c# ternary ?: operator

            n / 2 + 1, ' even case

            CStr(n ^ 2).Sum(Function(c) Val(c)))
            ' odd case
            ' cast number to string
            ' then convert each char to the number it represents
            ' and do a linq sum

        A += 1 ' Object + Integer will coerce to an integer
    End While

    ' Where's the return?
    ' That implicit variable with the matching name will get returned if there's no explicit return
End Function


1

Pyth ,  23  22 bayt

Şimdilik, bu özyinelemeli bir işlevdir, ancak .Wbunun yerine baytları kaydetmek için (işlevsel süre) geçiş yapmaya çalışacağım .

L&-b9hy|*%b2sj^b2Th/b2

Burada dene! (işlevi çağırmak için ek kodla - kullanım- boşluksuz)y<your_number>


1

Java 8, 110 98 bayt

n->{int k=0,s;for(;n!=9;k++){s=0;for(int c:(n*n+"").getBytes())s+=c-48;n=n%2<1?n/2+1:s;}return k;}

0 endeksli

Açıklama:

Burada dene.

 n->             // Method with integer as both input and return-type
   int k=0,      //  Result-integer `k` starting at 0
       s;        //  Sum-integer
   for(;n!=9;    //  Loop (1) as long as `n` is not 9
        k++){    //    And increase `k` by 1 after every iteration
     s=0;        //   Reset sum `s` to 0
     for(int c:(n*n+"").getBytes())
                 //   Do `n*n` and inner loop (2) over the digits as characters
       s+=c-48;  //    And increase the sum `s` with these digits
                 //   End of inner loop (2) (implicit / single-line body)
     n=n%2<1?    //   If `n` is even:
        n/2+1    //    Change `n` to `n/2+1`
       :         //   Else:
        s;       //    Change `n` to sum `s`
  }              //  End of loop (1)
  return k;      //  Return the result `k`
}                // End of separated method (2)

1

Clojure v1.8, 124 113 112 bayt

0 endeksli

(fn[n](loop[a n k 0](if(= a 9)k(recur(if(even? a)(+(/ a 2)1)(apply +(map #(-(int %)48)(str(* a a)))))(inc k)))))

Çevrimiçi deneyin!

açıklama

(loop[a n k 0](if(= a 9)...))  Loop until a=9
(if(even? a)(+(/ a 2)1)...)    If even, a(n, k) / 2 + 1 if a(n, k)
(if(even? a)...(apply +(map #(-(int %)48)(str(* a a)))))  If odd, calculate the sum of digits of a(n, k)²
#(-(int %)48)                  Convert character to number

1

Pyth, 18 bayt

tl.u?%N2sj*NNTh/N2

Çevrimiçi deneyin: Gösteri

Açıklama:

tl.u?%N2sj*NNTh/N2
  .u                 apply the following function to the input, 
                     until it runs into a fixed point
    ?%N2                if value % 2 == 1:
          *NN               value * value
         j   T              convert to digits
        s                   sum
                        else:
               /N2          value / 2
              h              + 1
 l                   get the length of all visited values
t                     - 1

1

Japt, 22 21 bayt

0 endeksli.

NcUÆ=v ?U/2Ä:U²ìxà b9

Dene


açıklama

Tamsayının örtük girişi U.

UÆ             Ã

Arasındaki tam bir dizi oluşturmak 0için U-1ve bir fonksiyonu sayesinde her geçişte.

=

Değerini ayarlayın U.

v ?

Eğer U2 ile bölünebilir.

U/2Ä

Ubölü 2, artı 1 ( Ä).

:U²ìx

Başka:: U2 ( ²) ' nin gücüne, bir rakam dizisine ( ) bölün ìve toplama ( x) ile azaltılır .

Nc

Elde edilen diziyi girdi dizisine ekleyin.

b9

Dizideki ilk oluşum endeksini bulun 9. Örtülü sonucu sonuç.


Dang. Bir fonksiyon metodu kullanarak çok daha iyi olacağına dair bir his vardı, ama sadece 23 bayta indirdim: @¥9}a@=u ?U²ìx :U/2Ä;°TKeşke bir değer değişmeyi
bırakıncaya

@ETHproductions: 0 yerine 9 için 1 çıktı, ancak burada 22 baytlık bir sürüm (hala 9 için başarısız oluyor).
Shaggy

Dün gece 20 byte sürümü ile geldim ama aynı sorunu vardı.
Shaggy
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.