Factorials und endlose Zyklen!

33

Wie Sie vielleicht wissen, ist die Fakultät einer positiven ganzen Zahl ndas Produkt aller positiven ganzen Zahlen, die gleich oder kleiner als sind n.

Zum Beispiel :

6! = 6*5*4*3*2*1 = 720
0! = 1

Wir definieren nun eine spezielle Operation mit einem irrelevanten Namen wie sumFac:

Gegeben eine positive ganze Zahl n, sumFac(n)ist die Summe des factorials der Ziffern.

Zum Beispiel :

sumFac(132) = 1! + 3! + 2! = 9

Aufgabe

Ihre Aufgabe ist es, unabhängig davon, ob Sie sie akzeptieren oder nicht, die (möglicherweise unendliche) Reihenfolge der Anwendungen sumFacauf eine in der Eingabe angegebene Ganzzahl zurückzuführen.

Beispiel 132 -> 132, 9, 362880, 81369, 403927, ...

Aber das ist nicht alles! Tatsächlich werden die Anwendungen von sumFacirgendwann einen Kreislauf bilden. Sie müssen diesen Zyklus auch zurückgeben!

Wenn Ihre Sprache eine eingebaute Fakultät hat, können Sie diese verwenden. Ich bin nicht wählerisch in Bezug auf den Rückgabetyp. Sie müssen lediglich die Reihenfolge der sumFac-Anwendungen und den Zyklus in einem für den Menschen verständlichen Format zurückgeben.

EDIT: Um Ihnen zu helfen, besser zu visualisieren, wie die Ausgabe aussehen soll, habe ich Leaky Nun's direkt darunter kopiert:

[132, 9, 362880, 81369, 403927, 367953, 368772, 51128, 40444, 97, 367920, 368649, 404670, 5810, 40442, 75, 5160, 842, 40346, 775, 10200, 6, 720, 5043, 151, 122, 5, 120, 4, 24, 26, 722, 5044, 169, 363601, 1454]

Sie müssen die Sequenz nur anhalten, wenn der Zyklus zum zweiten Mal gestartet wird!

Aber das ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes!

Bestenliste

Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.

Undichte Nonne
quelle
Related
Undichte Nonne
Willkommen bei PPCG! Das sieht nach einer schönen Herausforderung aus, übrigens.
Clismique
@ Qwerp-Derp Vielen Dank! Ich habe versucht, kreativ zu sein ^^
@ Zgarb Nun, es ist genau wie die Ausgabe von Leaky Nun. Die Abfolge der Anträge und danach muss unmittelbar vor dem Beginn des zweiten Zyklus enden. Ich werde seine Ausgabe in die Frage kopieren, damit jeder ein klares Verständnis haben kann. Vielen Dank für den Hinweis :)
1
@ 2501 Beim Hardcodieren betrügt der Wert, aber in Bezug auf die Ausgabeformatierung können Sie ein beliebiges Trennzeichen verwenden

Antworten:

19

Gelee , 6 Bytes

D!SµÐĿ
    ÐĿ  Repeat until the results are no longer unique. Collects all intermediate results.
D           Convert from integer to decimal (list of digits)
 !          Factorial (each digit)
  S         Sum

Probieren Sie es online!

Ich sehe keine andere Möglichkeit, es kürzer zu machen, als wie gesagt zu tun.

Technische Daten

  • Eingabe: 132(als Kommandozeilenargument)
  • Ausgabe: [132, 9, 362880, 81369, 403927, 367953, 368772, 51128, 40444, 97, 367920, 368649, 404670, 5810, 40442, 75, 5160, 842, 40346, 775, 10200, 6, 720, 5043, 151, 122, 5, 120, 4, 24, 26, 722, 5044, 169, 363601, 1454]
Undichte Nonne
quelle
Ich hätte nicht gedacht, dass ich so schnell eine Antwort bekommen würde. Nice :)
4
@ Antoine Es ist Jelly: D Es ist immer kürzer als ich denke, es wird;)
HyperNeutrino
8
@HyperNeutrino Irgendwie kommt Dennis mit einer noch kürzeren Antwort
Leaky Nun
Irgendwie ja. Weil Dennis. : P
HyperNeutrino
Also ... Welche Zeichenkodierung verwenden Sie, um 6 Bytes für diese 6 Zeichen zu erhalten? Soll Jelly nicht UTF-8-codiert sein, was bedeutet, dass dieses Programm tatsächlich 9 Bytes umfasst?
LordOfThePigs
10

Python 2 , 88 Bytes

import math
f=lambda x,l=[]:l*(x in l)or f(sum(math.factorial(int(i))for i in`x`),l+[x])

Probieren Sie es online!

ovs
quelle
Als Python-Fan bin ich froh, dass jemand darauf geantwortet hat, nett :)
9

05AB1E , 12 Bytes

[DˆS!O©¯så#®

Probieren Sie es online!

Erläuterung

[               # infinite loop
 Dˆ             # add a copy of current value to the global list (initialized as input)
   S            # split current number to digits
    !O          # calculate factorial of each and sum
      ©         # save a copy in register
       ¯så#     # if the current number is in the global list, exit loop
           ®    # retrieve the value from the register for the next iteration
                # implicitly output the global list
Emigna
quelle
Kurz und richtig, gut gespielt!
Ich dachte, ich könnte das loswerden s, war eine falsche, nette Antwort.
Magic Octopus Urn
8

Brachylog , 17 Bytes

g:I{tẹḟᵐ+}ᵃ⁾L¬≠Lk

Probieren Sie es online!

Erläuterung

g:I{     }ᵃ⁾         Accumulate I (a variable) times, with [Input] as initial input:
    t                  Take the last integer
     ẹḟᵐ+              Compute the sum of the factorial of its digits
            L        The result of the accumulation is L
            L­      Not all elements of L are different
               Lk    Output is L minus the last one (which is the start of the loop)
Tödlich
quelle
Was Ibedeutet
Undichte Nonne
1
@LeakyNun Dies ist ein Parameter von ᵃ⁾. ᵃ³bedeutet "3 mal akkumulieren". ᵃ⁾bedeutet "akkumuliere so oft wie das letzte Element der Eingabe", was in diesem Fall ist I. Da Ies sich um eine völlig freie Variable handelt, wird sie Werte von 0bis ausprobieren +inf.
Fatalize
8

Wolfram Language, 62 60 56 Bytes

Most@NestWhileList[Tr[IntegerDigits@#!]&,#,UnsameQ,All]&

Es ist wirklich schade, dass Wolfram Language so unglaublich lange Funktionsnamen hat. *Seufzer*

Erläuterung:

Most[NestWhileList[Tr[IntegerDigits[#]!]&,#,UnsameQ,All]]&
                      IntegerDigits[#]                     (*Split input into list of digits*)
                                      !                    (*Factorial each element in the list*)
                   Tr[                 ]&                  (*Sum the list together*)
     NestWhileList[                      ,#,UnsameQ,All]   (*Iterate the function over itself, pushing each to a list, until a repeat is detected*)
Most[                                                   ]& (*Remove the last element in the list*)
Scott Milner
quelle
Gute Antwort. Ich denke nicht, dass dies verbessert werden kann.
Kelly Lowder
1
@ KellyLowder Danke! Tatsächlich konnte ich zwei weitere Bytes speichern, indem ich den Fakultätsfaktor der Liste zuordnete und dann mit summierte Tr.
Scott Milner
1
Gute Verwendung von NestWhileList[...,All]!
Greg Martin
6

JavaScript (ES6), 91 89 Byte

2 Bytes dank fɛnəˈtɛk eingespart

Es stellt sich heraus, dass es der anderen Antwort von JS ziemlich ähnlich ist .

f=(n,x=!(a=[n]))=>n?f(n/10|0,x+(F=n=>n?n--*F(n):1)(n%10)):~a.indexOf(x)?a:f(x,!a.push(x))

Arnauld
quelle
Sollten Sie in Ihrer Fakultätsfunktion nicht in der Lage sein, n anstelle von n> 1 zu verwenden, weil 0! = 1?
Freitag,
@ fəˈnəˈtɪk Ich weiß nicht, was ich hier gedacht habe. Vielen Dank!
Arnauld
5

ClojureScript, 146 109 Bytes

#(loop[n[%]](let[f(apply +(for[a(str(last n))](apply *(range 1(int a))))](if(some #{f}n)n(recur(conj n f)))))

Huch, das ist eine Monstrosität. Jemand, bitte hilf mir Golf zu spielen ...

Danke, @cliffrootdass du satte 37 Bytes gespart hast!

Dies ist eine anonyme Funktion. Um die Funktion auszuführen, müssen Sie Folgendes tun:

(#(...) {arguments})

TIO hat kein ClojureScript, daher hier ein Link zu einer ClojureScript-REPL.

Hier ist ein Link zu einem Clojure-Programm, das das letzte Element in der Liste von 0 bis 1000 ausgibt.

Hier ist die Ausgabe für 9999:

[9999 1451520 269 363602 1455 265 842 40346 775 10200 6 720 5043 151 122 5 120 4 24 26 722 5044 169 363601 1454]

Ich habe den starken Verdacht, dass sich alle Zahlen irgendwann auf 1oder in der Schleife einstellen müssen [169 363601 1454].

Ungolfed-Code:

(defn fact-cycle [n]
  (loop [nums [n]]
    (let [fact-num
          (let [str-n (str (last nums))]
            (apply +
              (for [a (range (count str-n))]
                (apply *
                  (range 1
                    (inc (int (nth str-n a))))))))]
      (if (some #{fact-num} nums) nums
        (recur
          (conj nums fact-num))))))

Erklärung folgt in Kürze!

Clismique
quelle
Ziemlich lang, aber richtig;) Ich kann dir nicht wirklich helfen, dieses leidige
Das Innere forkann sein (for[a s](apply *(range 1(-(int a)47)))), oder?
Cliffroot
und dies ermöglicht es, die andere loszuwerdenlet #(loop[n[%]](let[f(apply +(for[a(str(last n))](apply *(range 1(-(int a)47)))))](if(some #{f}n)n(recur(conj n f)))))
Cliffroot
oh, scheinen Sie brauchen noch nicht einmal (- ... 47)in ClojureScript, nur intgenügt
cliffroot
(inc(int a))Nun , sollte für ClojureScript und (-(int a)47)für Clojure tun .
Cliffroot
5

Perl 6 , 64 Bytes

{my@a;$_,{[+] .comb.map:{[*] 2..$_}}...^{$_@a||!@a.push: $_}}

Versuch es

Erweitert:

{

  my @a;             # array of values already seen

  $_,                # seed sequence with the input

  {
    [+]              # reduce using &infix:<+>
      .comb          # the digits of $_ (implicit method call)
      .map:          # do the following for each
      {
        [*] 2..$_    # get the factorial of
      }
  }


  ...^               # keep generating values until
                     # (「^」 means throw away the last value when done)

  {
      $_  @a        # is it an elem of @a? (「∈」 is shorter than 「(cont)」)

    ||               # if it's not

      !              # boolean invert so this returns False
        @a.push: $_  # add the tested value to @a
  }
}

Jede Zeile darüber {startet ein neues Bare-Block-Lambda mit dem impliziten Parameter $_.

Ich habe [*] 2..$_statt[*] 1..$_ nur eine Mikrooptimierung verwendet.

Brad Gilbert b2gills
quelle
4

JavaScript, 92 Bytes

Vielen Dank an @Shaggy für das Abschlagen eines Bytes mit Includes
Thanks @Neil für das Golfen aus zwei Bytes

Code in einzelne Funktionen 92 Bytes getrennt

f=(x,a=[])=>a.includes(x)?a:f(k(x),a,a.push(x))
p=y=>y?y*p(y-1):1
k=n=>n?p(n%10)+k(n/10|0):0

Code in einer Zeile 92 Bytes

f=(x,a=[])=>a.includes(x)?a:f((k=n=>n?(p=y=>y?y*p(y-1):1)(n%10)+k(n/10|0):0)(x),a,a.push(x))

Erläuterung

Rufen Sie die Funktion zunächst mit nur einem Argument auf, also a = [].

Wenn x im Array existiert, gibt a a zurück a.includes(x)?a:...

Ansonsten hänge x an a an und übergebe die faktorielle Ziffernsumme und a an die Funktion (a.push(x),f(k(x),a))

p=y=>y?y*p(y-1):1
k=n=>n?p(n%10)+k(n/10|0):0

Faktorielle Ziffernsumme, die so ausgeführt wird, dass die maximale Rekursionsgrenze nicht überschritten wird.

Liste aller möglichen Endpunkte: 1, 2, 145, 169, 871, 872, 1454, 40585, 45361, 45362, 363601

Probieren Sie es online!

fəˈnəˈtɪk
quelle
1
Gah, ich war so nah! Speichern Sie ein Byte mitf=(x,a=[])=>a.includes(x)?a:(a.push(x),f(k(x),a))
Shaggy
Können Sie nicht schreiben f(k(x),a,a.push(x))? Ich denke, Sie können auch schreiben k=n=>n&&, um ein weiteres Byte zu speichern.
Neil
4

Haskell , 80 67 Bytes

g#n|elem n g=g|h<-g++[n]=h#sum[product[1..read[d]]|d<-show n]
([]#)

Probieren Sie es online! Verwendung:([]#) 132

Edit: 13 Bytes mit Texten von Ørjan Johansen gespeichert!

Laikoni
quelle
(1) Testen und Anhängen nstatt s(wie in der Python-Antwort von ovs) f=([]#). (2) Wechseln Sie die Zweige, Inline sund verwenden Sie elem.
Ørjan Johansen
Schalten Sie Ihre ++für :auch.
1
@Canyon Es ist die falsche Reihenfolge, das Endergebnis würde umgekehrt. Sie können fast fix it up danach, durch einen zusätzlichen Voranstellen n:und Ändern =gzu =[], aber es scheint nur eine Krawatte zu sein.
Ørjan Johansen
4

Pyth, 9 Bytes

.us.!MjNT
.us.!MjNTQ  implicit Q

.u          explained below
       N      current value
      j T     convert to decimal (list of digits)
   .!M        factorial of each digit
  s           sum

Probieren Sie es online!

Diese Antwort verwendet .u("Kumulativer Fixpunkt. Anwenden, bis ein zuvor aufgetretenes Ergebnis gefunden wurde. Alle Zwischenergebnisse zurückgeben.")

Undichte Nonne
quelle
3

Pyth, 30 Bytes

W!hxYQQ=+YQKQ=Q0WK=+Q.!%KT=/KT

Probieren Sie es hier

Maria
quelle
Pyth hat mehr nützliche Funktionen als man sich vorstellt. Siehe meine Antwort als Referenz.
Undichte Nonne
2

R, 120 Bytes

o=scan()
repeat {
q=sum(factorial(as.double(el(strsplit(as.character(o[length(o)]), "")))))
if(q%in%o)break
o=c(o,q)
}
o
Neil
quelle
Sie können tun o=scan(), el()anstelle von verwenden [[1]], und gamma(n+1)=factorial(n)ich glaube, speichert ein Byte, und ich denke, as.numericist das gleiche wie as.doublefür Ganzzahlen, die auch ein Byte speichert, und Sie können toStringanstelle von verwenden as.character.
Giuseppe
@ Giuseppe Danke für die Eingabe, aktualisiert.
Neil
2

Java 9 JSHell, 213 Byte

n->{Set<Integer>s=new HashSet<>();
return IntStream.iterate(n,i->(""+i).chars()
.map(x->x<50?1:IntStream.rangeClosed(2,x-48)
.reduce(1,(a,b)->a*b)).sum()).boxed()
.takeWhile(x->s.add(x)).collect(Collectors.toList());}

Probieren Sie es online!

Hinweis: Diese Lösung basiert auf der Zeichenfolgendarstellung einer Zahl mit Codepunkten im Bereich von 48 bis 57. Funktioniert mit ASCII, UTF-8, Latin-1, allen ISO-8859- * -Zeichensätzen und den meisten Codepages. Funktioniert nicht für EBCDIC. Ich glaube nicht, dass jemand dafür Punkte abziehen wird. :)

Ungolfed:

Function<Integer, List<Integer>> f =        // function from Integer to List of Integer
n -> {
    Set<Integer> s = new HashSet<>();       // memo of values we've seen
    return IntStream.iterate(n,             // iterate over n, f(n), f(f(n)), etc.
    i -> (""+i).chars()                     // the sumFac function; for all chars
        .map(x -> x < 50? 1 :               // give 1 for 0! or 1!
        IntStream.rangeClosed(2, x-48)      // else produce range 2..d 
        .reduce(1,(a,b)->a*b))              // reduction to get the factorial
        .sum())                             // and sum up the factorii!

                                            // now we have a stream of ints
                                            // from applying sumFac repeatedly
        .boxed()                            // box them into Integers (thanks, Java)
        .takeWhile(x->s.add(x))             // and take them while not in the memo
        .collect(Collectors.toList());      // collect them into a list
}

Anmerkungen:

  • Der Rückgabewert von Set :: add ist hier sehr hilfreich; liefert true iff das Element nicht im Set enthalten war
  • Ich war sarkastisch, als ich sagte "Danke, Java"
  • factorii ist eigentlich kein Wort; Ich habe das gerade erfunden
David Conrad
quelle
1
Ich gebe zu, das ist original!
@Antoine Ich gebe zu, Java ist nicht die beste Sprache zum Golfspielen, aber es ist kaum das Verrückteste, was ich in letzter Zeit gemacht habe. :) codegolf.stackexchange.com/a/117644/794
David Conrad
2

Pyth, 22 11 Bytes

.usm.!sd+Nk

Probieren Sie es online!

Vielen Dank für die Antwort von Leaky Nun , die mir vorgestellt hat .uund dabei geholfen hat, massive 11 Bytes dieses Programms zu sparen.

Erläuterung:

.usm.!sd+NkQ | ending Q is implicitly added
             | Implicit: Q = eval(input())
.u         Q | Repeat the function with initial value Q until a previous value is found. Return all intermediate values
  s          | Summation
   m.!sd     | For each character 'd' in the string, convert to integer and take the factorial
        +Nk  | Convert function argument to string
K Zhang
quelle
Pyth hat mehr nützliche Funktionen als man sich vorstellt. Siehe meine Antwort als Referenz.
Undichte Nonne
@LeakyNun Ich habe meine Antwort zur Verwendung umgeschrieben .u. Ich denke, ich muss die Zeichenreferenz noch einmal durchsehen, um zu sehen, ob es dort noch andere nützliche Funktionen gibt.
K Zhang
Sie können `Nanstelle von in Zeichenfolge konvertieren +Nk.
Undichte Nonne
@LeakyNun Wo das Ndann veraltet wäre, und es kommt eine 9-Byte-Lösung ...
Erik the Outgolfer
1

Axiom, 231 Bytes

l(a:NNI):List NNI==(r:List NNI:=[];repeat(r:=cons(a rem 10,r);a:=a quo 10;a=0=>break);r)
g(a:NNI):NNI==reduce(+,[factorial(x) for x in l(a)])
h(a:NNI):List NNI==(r:=[a];repeat(a:=g(a);member?(a,r)=>break;r:=cons(a,r));reverse(r))

Nicht Golf-Funktionen und einige Tests

-- convert one NNI in its list of digits
listify(a:NNI):List NNI==
    r:List NNI:=[]
    repeat
        r:=cons(a rem 10,r)
        a:=     a quo 10
        a=0=>break
    r

-- g(1234)=1!+2!+3!+4!
SumfactorialDigits(a:NNI):NNI==reduce(+,[factorial(x) for x in listify(a)])

ListGenerateFromSumFactorialDigits(a:NNI):List NNI==
    r:=[a]
    repeat
       a:=SumfactorialDigits(a)
       member?(a,r)=>break
       r:=cons(a,r)
    reverse(r)

(9) -> h 132
   (9)
   [132, 9, 362880, 81369, 403927, 367953, 368772, 51128, 40444, 97, 367920,
    368649, 404670, 5810, 40442, 75, 5160, 842, 40346, 775, 10200, 6, 720,
    5043, 151, 122, 5, 120, 4, 24, 26, 722, 5044, 169, 363601, 1454]
RosLuP
quelle
1

Java 7, 220 Bytes

String c(int n){String r=n+",",c;for(;!r.matches("^"+(c=(n=d(n))+",")+".*|.*,"+c+".*");r+=c);return r;}int d(int n){int s=0;for(String i:(n+"").split(""))s+=f(new Long(i));return s;}long f(long x){return x<2?1:x*f(x-1);}

Erläuterung:

String c(int n){                            // Method with integer parameter and String return-type
  String r=n+",",                           //  Result-String (which starts with the input integer + a comma
         c;                                 //  Temp String
  for(;!r.matches(                          //  Loop as long as the result-String doesn't match the following regex:
    "^"+(c=(n=d(n))+",")+".*|.*,"+c+".*");  //    "^i,.*|.*,i,.*" where `i` is the current integer
                                            //   `n=d(n)` calculates the next integer in line
                                            //   `c=(n=d(n))+","` sets the temp String to this integer + a comma
    r+=c                                    //   And append the result-String with this temp String
  );                                        //  End of loop
  return r;                                 //  Return the result-String
}                                           // End of method

int d(int n){                               // Separate method (1) with integer parameter and integer return-type
  int s=0;                                  //  Sum
  for(String i:(n+"").split(""))            //  Loop over the digits of `n`
    s+=f(new Long(i));                      //   And add the factorial of these digits to the sum
                                            //  End of loop (implicit / single-line body)
  return s;                                 //  Return the sum
}                                           // End of separate method (1)

long f(long x){                             // Separate method (2) with long parameter and long return-type (calculates the factorial)
                                            // (NOTE: 2x `long` and the `new Long(i)` is shorter than 2x `int` and `new Integer(i)`, hence long instead of int)
  return x<2?                               //  If `x` is 1:
      1                                     //   return 1
    :                                       //  Else:
      x*f(x-1);                             //   return `x` multiplied by the recursive-call of `x-1`
}                                           // End of method (2)

Testcode:

Probieren Sie es hier aus.

class M{
  String c(int n){String r=n+",",c;for(;!r.matches("^"+(c=(n=d(n))+",")+".*|.*,"+c+".*");r+=c);return r;}int d(int n){int s=0;for(String i:(n+"").split(""))s+=f(new Long(i));return s;}long f(long x){return x<2?1:x*f(x-1);}

  public static void main(String[] a){
    System.out.println(new M().c(132));
  }
}

Ausgabe:

132,9,362880,81369,403927,367953,368772,51128,40444,97,367920,368649,404670,5810,40442,75,5160,842,40346,775,10200,6,720,5043,151,122,5,120,4,24,26,722,5044,169,363601,1454,
Kevin Cruijssen
quelle
1

GolfScript , 44 Bytes

~]{..)\;10base{,1\{)*}/}%{+}*.@\+@@?)!}do);`

~                                             eval input
 ]                                            initialization
  {                                   }do     do...
   ..)\;                                          initialization
        10base                                    get digits
              {,1\{)*}/}%                         factorial each
                         {+}*                     sum
                             .@\+@@?)!        while result not found
                                         );   drop last element
                                           `  tostring

Probieren Sie es online!

Der Fakultätsteil ist von hier .

Undichte Nonne
quelle
1

C 161 Bytes

f(a){return a?a*f(a-1):1;}
a(l){return l?f(l%10)+a(l/10):0;}
c,t,o;r(i){for(t=o=i;t=a(t),o=a(a(o)),c=t^o;);for(t=i;t^c;printf("%d ",t),c=c|t^o?c:o,t=a(t),o=a(o));}

Sehen Sie, wie es online funktioniert.

2501
quelle
1

TI-BASIC, 85 79 64 60 Bytes

:Prompt L₁                             //Get input as 1 length list, 4 bytes
:Lbl C                                //create marker for looping, see below, 3 bytes
:int(10fPart(Xseq(10^(~A-1),A,0,log(X //split input into list of digits, 20 bytes
:sum(Ans!→X                           //factorial and sum the list, write to new input, 6 bytes
:If prod(L₁-X                         //Test to see if new element is repeated, see below, 7 bytes
:Then                                 //Part of If statement, 2 bytes
:augment(L₁,{X→L₁                     //Push new input to List 1, 10 bytes
:Goto C                               //Loop back to beginning, 3 bytes
:Else                                 //Part of If statement, 2 bytes
:L₁                                   //Print Answer, 2 bytes

Da dies auf einem Grafikrechner ausgeführt wird, ist der Arbeitsspeicher begrenzt. Versuchen Sie, es mit Zahlen zu testen, die sich wie z 169.

Weitere Erklärung:

:int(10fPart(Xseq(10^(~A-1),A,0,log(X
              seq(10^(~A-1),A,0,log(X //Get a list of powers of 10 for each digit (i.e. 1, 0.1, 0.01, etc.)
             X                        //Multiply by input
       fPart(                         //Remove everything but the decimal
     10                               //Multiply by 10 (move one digit in front of the decimal
:int(                                 //Truncate to an integer

If prod(L₁-XSubtrahiert das neue Element von der alten Liste und multipliziert dann alle Elemente der Liste. Wenn das Element bereits in der Liste enthalten war, ist das Produkt 0ein falscher Wert. Andernfalls ist das Produkt eine positive ganze Zahl, ein wahrer Wert.

Scott Milner
quelle
1

J , 40 31 Bytes

Bearbeiten: 9 Bytes gespeichert mit den Verbesserungen von FrownyFrog. Vielen Dank!

f=.$:@,~`]@.e.~[:+/@:!10#.inv{:

Originalcode:

f =. [`($: @,) @. ([: -. e. ~) [: + /! @ (". "0 &": @ {:)

In diesem Fall habe ich mich entschieden, die Bytes für die Verbdefinition zu zählen, da es sonst im Interpreter nicht funktioniert.

Erläuterung:

                         ({:) - Nimmt das letzte Element des Arrays
                               ": @ - konvertiert es in einen String
                          "." 0 & - konvertiert jedes Zeichen zurück in eine Ganzzahl
                       ! @ - findet die Fakultäten
                     + / - summiert sie
                   [: - cap (es gibt 2 abgeleitete Verben, wir brauchen 3 für eine Gabel)
          (e. ~) - Überprüfen Sie, ob das Ergebnis in der Liste vorhanden ist    
             -. - negiert den obigen Check
           [: - Deckel
        @. - Agenda Konjunktion, die für die Rekursion benötigt wird
  ($: @,) - Wenn das Ergebnis nicht in der Liste enthalten ist, fügen Sie es der Liste hinzu und wiederholen Sie den Vorgang
[`- Wenn das Ergebnis in der Liste ist, zeige es an und stoppe    

Probieren Sie es online!

Galen Ivanov
quelle
1
([:-.e.~)->(1-e.~)
FrownyFrog
1
31 Bytes
FrownyFrog
@FrownyFrog Danke, dein Code ist viel besser! Ich habe 10 # .inv früh während des Experimentierens versucht, aber dann habe ich 10 & # .inv geschrieben und es war länger, also habe ich es abgelehnt. Vielen Dank für alle Ihre Vorschläge! Ich muss noch viel lernen :)
Galen Ivanov
@ FrownyFrog Umkehren der Fälle für die Tagesordnung ist so gut, ich bedaure, ich habe es nicht gesehen :)
Galen Ivanov
[:+/!@"."0@":@{:ist die gleiche Länge, es gibt also keine Verbesserung mit 10#.inv. Musste nur die fallen lassen ().
FrownyFrog
1

Tcl , 143 Bytes

proc P {n L\ ""} {proc F n {expr $n?($n)*\[F $n-1]:1}
while {[set n [expr [join [lmap d [split $n ""] {F $d}] +]]] ni $L} {lappend L $n}
set L}

Probieren Sie es online!

Sergiol
quelle