Ziffern Produktsequenzen

22

Hier ist eine interessante Sequenz, die von Paul Loomis, einem Mathematiker an der Bloomsburg University, entdeckt wurde. Von seiner Seite zu dieser Sequenz:

Definieren Sie
f(n) = f(n-1) + (the product of the nonzero digits of f(n-1))
f(0) = xmit einer xbeliebigen positiven Ganzzahl, die in Basis 10 geschrieben ist.

Ausgehend von erhalten f(0)=1Sie also die folgende Sequenz
1, 2, 4, 8, 16, 22, 26, 38, 62, 74, 102, 104, ...

So weit, so normal. Die interessante Eigenschaft kommt ins Spiel, wenn Sie eine beliebige andere Ganzzahl als Ausgangspunkt nehmen. Schließlich konvergiert die Sequenz zu einem Punkt entlang der obigen x=1Sequenz. Zum Beispiel beginnend mit x=3Ausbeuten
3, 6, 12, 14, 18, 26, 38, 62, 74, 102, ...

Hier sind einige weitere Sequenzen, die jeweils nur angezeigt werden, bis sie erreicht sind 102:

5, 10, 11, 12, 14, 18, 26, 38, 62, 74, 102, ...
7, 14, 18, 26, 38, 62, 74, 102, ...
9, 18, 26, 38, 62, 74, 102, ...
13, 16, 22, 26, 38, 62, 74, 102, ...
15, 20, 22, 26, 38, 62, 74, 102, ...
17, 24, 32, 38, 62, 74, 102, ...
19, 28, 44, 60, 66, 102, ...

Er vermutete und bewies empirisch x=1,000,000, dass diese Eigenschaft (dh, dass alle eingegebenen Zahlen zur gleichen Reihenfolge konvergieren) zutrifft.

Die Herausforderung

Geben Sie bei einer positiven Ganzzahl 0 < x < 1,000,000die Zahl aus, bei der die f(x)Sequenz zur Sequenz konvergiert f(1). Zum Beispiel x=5wäre dies 26, da dies die erste Zahl ist, die beiden Sequenzen gemeinsam ist.

 x output
 1 1
 5 26
19 102
63 150056

Regeln

  • Gegebenenfalls können Sie davon ausgehen, dass die Eingabe / Ausgabe in den systemeigenen Integer-Typ Ihrer Sprache passt.
  • Die Eingabe und Ausgabe kann durch jede bequeme Methode erfolgen .
  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
AdmBorkBork
quelle

Antworten:

5

JavaScript (ES6), 81 67 Byte

1 Byte dank @ l4m2 eingespart

f=(n,x=1)=>x<n?f(x,n):x>n?f(+[...n+''].reduce((p,i)=>p*i||p)+n,x):n

Probieren Sie es online!

Kommentiert

f = (n,                   // n = current value for the 1st sequence, initialized to input
        x = 1) =>         // x = current value for the 2nd sequence, initialized to 1
  x < n ?                 // if x is less than n:
    f(x, n)               //   swap the sequences by doing a recursive call to f(x, n)
  :                       // else:
    x > n ?               //   if x is greater than n:
      f(                  //     do a recursive call with the next term of the 1st sequence:
        +[...n + '']      //       coerce n to a string and split it
        .reduce((p, i) => //       for each digit i in n:
          p * i || p      //         multiply p by i, or let p unchanged if i is zero
        ) + n,            //       end of reduce(); add n to the result
        x                 //       let x unchanged
      )                   //     end of recursive call
    :                     //   else:
      n                   //     return n
Arnauld
quelle
`` `` f = (n, x = 1) => x <n? f (x, n): x> n? f (+ [... n + ''] > p * i || p) + n, x): n `` `
l4m2
4

Jelly , 18 14 Bytes

ḊḢDo1P+Ʋ;µQƑ¿Ḣ

Die Eingabe ist ein Singleton-Array.

Probieren Sie es online!

Wie es funktioniert

ḊḢDo1P+Ʋ;µQƑ¿Ḣ  Main link. Argument: [n]

            ¿   While...
          QƑ      all elements of the return value are unique...
         µ          execute the chain to the left.
Ḋ                     Dequeue; remove the first item.
 Ḣ                    Head; extract the first item.
                      This yields the second item of the return value if it has
                      at least two elements, 0 otherwise.
       Ʋ              Combine the links to the left into a chain.
  D                     Take the decimal digits of the second item.
   o1                   Perform logical OR with 1, replacing 0's with 1's.
     P                  Take the product.
      +                 Add the product with the second item.
        ;             Prepend the result to the previous return value.
             Ḣ  Head; extract the first item.
Dennis
quelle
2

Python 2 , 111 95 93 Bytes

Wenn Sie das Auspacken replace(*'01')wie in @Rod verwenden, antworten Sie
dank @Lynn mit -18 Bytes

l=[1,input()]
while cmp(*l):l[0]+=eval('*'.join(`l[0]`.replace(*'01')));l.sort()
print l[0]  

Probieren Sie es online!

Totes Opossum
quelle
1
Ah, und die Schleifenbedingung kann es while cmp(*l)auch sein!
Lynn
@Lynn Ja!
Nochmals
2

Python 2 , 78 Bytes

f=lambda a,b=1:a*(a==b)or f(*sorted([a+eval('*'.join(`a`.replace(*'01'))),b]))

Probieren Sie es online!

Lynn
quelle
Ich arbeitete an einer Lösung mit Lambda, blieb aber ein paar Minuten lang mit Kurzschluss hängen, gute Arbeit!
Dead Possum
2

Schale , 13 Bytes

→UΞm¡S+ȯΠf±dΘ

Übernimmt die Eingabe als Singleton-Liste.

Probieren Sie es online!

Erläuterung

                 Implicit input, e.g 5
            Θ    Prepend a zero to get  [0,5]
   m             Map the following over [0,5]
    ¡              Iteratatively apply the following function, collecting the return values in a list
           d         Convert to a list of digits
         f±          keep only the truthy ones
       ȯΠ            then take the product
     S+              add that to the original number
                After this map, we have [[0,1,2,4,8,16,22,26,38,62...],[5,10,11,12,14,18,26,38,62,74...]]
  Ξ             Merge the sorted lists:  [0,1,2,4,5,8,10,11,12,14,16,18,22,26,26,38,38,62,62,74...]
 U              Take the longest unique prefix: [0,1,2,4,5,8,10,11,12,14,16,18,22,26]
→               Get the last element and implicitely output: 26
H.PWiz
quelle
1

Python 3 , 126 125 Bytes

m=[1]
n=[int(input())]
while not{*m}&{*n}:
 for l in m,n:l+=l[-1]+eval('*'.join(str(l[-1]).replace(*'01'))),
print({*m}&{*n})

Probieren Sie es online!

Nimm die Eingabe als String

Stange
quelle
0

J , 50 Bytes

implizite Artfunktionsdefinition

[:{.@(e.~#])/[:(+[:*/@(*#])(#~10)&#:)^:(<453)"0,&1

Wenn das Argument (z. B. 63) in einen REPL-Ausdruck eingefügt würde, könnte es 45 sein, z

{.(e.~#])/(+[:*/@(*#])(#~10)&#:)^:(<453)"0]1,63
  • ,&1 Fügen Sie 1 hinzu, um die Suchsequenz sowie die Argumentsequenz zu generieren
  • ^:(<453)"0 iteriert jeweils, bis 1 Million in der Reihenfolge von 1 erreicht ist
  • + [: */@(*#]) (#~10)&#: Die Gabel fügt dem Haken hinzu, was das Produkt der Ziffern ergibt
  • (e.~ # ])/ Verwendet das Wiederholungselement, falls vorhanden, um die Schnittmenge von Listen zu erhalten
  • {. gibt nur den ersten gemeinsamen Wert zurück

Probieren Sie es online!

Jayprich
quelle
0

R , 110 86 Bytes

o=c(1,1:9);o=o%o%o%o%o;o=c(o%o%o)
x=c(1,n);while((x=sort(x))<x[2])x[1]=(x+o[x+1])[1]
x

TIO

Vorgängerversion 110:

f=function(x){if((x[1]=x[1]+(c((y=(y=c(1,1:9))%o%y%o%y)%o%y))[x[1]+1])==x[2]){x[1]}else{f(sort(x))}}
f(c(1,n))

TIO

Jayprich
quelle