แฟ็กทอเรียลและไม่สิ้นสุด!


33

ขณะที่คุณอาจจะรู้ว่าปัจจัยของจำนวนเต็มบวกเป็นผลิตภัณฑ์ของทุกจำนวนเต็มบวกซึ่งมีค่าเท่ากันหรือเล็กลงไปnn

ตัวอย่างเช่น

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

ตอนนี้เราจะกำหนดการปฏิบัติการพิเศษด้วยชื่อที่ไม่เกี่ยวข้องเช่นsumFac:

ป.ร. ให้ไว้เป็นจำนวนเต็มบวกn, sumFac(n)คือผลรวมของ factorials ของตัวเลขที่

ตัวอย่างเช่น

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

งาน

ภารกิจของคุณไม่ว่าคุณจะเลือกที่จะยอมรับหรือไม่ก็คือการส่งคืนลำดับ (อาจไม่มีที่สิ้นสุด) ของแอปพลิเคชั่นของsumFacจำนวนเต็มที่ระบุในอินพุต

ตัวอย่าง: 132 -> 132, 9, 362880, 81369, 403927, ...

แต่นั่นไม่ใช่ทั้งหมด! แท้จริงแล้วการใช้งานของsumFacในที่สุดจะสร้างรอบ คุณต้องส่งคืนวงจรนี้ด้วย!

หากภาษาของคุณมีแฟกทอเรียลคุณสามารถใช้มันได้ ฉันไม่จู้จี้จุกจิกเกี่ยวกับประเภทการคืนคุณเพียงแค่ส่งคืนลำดับของแอปพลิเคชัน sumFac และวัฏจักรในรูปแบบที่มนุษย์เข้าใจได้

แก้ไข: เพื่อช่วยให้คุณมองเห็นภาพได้ดีขึ้นว่าผลลัพธ์ควรมีลักษณะอย่างไรฉันคัดลอก Leaky Nun ด้านล่าง:

[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]

คุณเพียงแค่ต้องหยุดลำดับเมื่อรอบกำลังจะเริ่มเป็นครั้งที่สอง!

แต่นี่คือcode-golfดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!

ลีดเดอร์บอร์ด

นี่คือ Stack Snippet เพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา



ยินดีต้อนรับสู่ PPCG! ดูเหมือนว่าจะเป็นความท้าทายที่ดี BTW
clismique

@ Qwerp-Derp ขอบคุณมาก! ฉันพยายามที่จะสร้างสรรค์ ^^

@Zgarb มันเหมือนกับผลลัพธ์ของ Leaky Nun ลำดับของแอปพลิเคชันและจากนั้นจะสิ้นสุดก่อนที่จะเริ่มรอบที่สอง ฉันจะคัดลอกผลลัพธ์ของเขาในคำถามเพื่อให้ทุกคนมีความเข้าใจที่ชัดเจน ขอบคุณสำหรับการชี้ให้เห็น :)

1
@ 2501 การ Hardcoding ค่าเป็นการโกง แต่เกี่ยวกับการจัดรูปแบบผลลัพธ์คุณสามารถใช้ตัวคั่นใดก็ได้ที่คุณต้องการ

คำตอบ:


19

เยลลี่ 6 ไบต์

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

ลองออนไลน์!

ฉันไม่เห็นวิธีอื่นที่จะทำให้เตี้ยกว่าที่จะทำตามที่บอก

รายละเอียด

  • อินพุต: 132(เป็นอาร์กิวเมนต์บรรทัดคำสั่ง)
  • เอาท์พุท: [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]

ฉันไม่ได้คาดหวังว่าจะได้คำตอบสั้น ๆ Nice :)

4
@Antoine It's Jelly: D มันสั้นกว่าที่ฉันคิดไว้เสมอ)
HyperNeutrino

8
@HyperNeutrino อย่างใดเดนนิสจะมาพร้อมกับคำตอบที่สั้นยิ่งขึ้น
Leaky Nun

ยังไงก็เถอะ เพราะเดนนิส : P
HyperNeutrino

ดังนั้น ... การเข้ารหัสตัวอักษรใดที่คุณใช้เพื่อสร้าง 6 ไบต์สำหรับ 6 ตัวอักษรเหล่านั้น? เยลลี่ไม่ควรเข้ารหัส UTF-8 หมายความว่าโปรแกรมนี้มีขนาด 9 ไบต์จริงหรือ
LordOfThePigs


9

05AB1E , 12 ไบต์

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

ลองออนไลน์!

คำอธิบาย

[               # 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

สั้นและถูกต้องเล่นได้ดี!

คิดว่าฉันสามารถกำจัดsมันผิดคำตอบที่ดี
Magic Octopus Urn

8

Brachylogขนาด 17 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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)

อะไรIหมายถึง?
Leun Nun

1
@LeakyNun ᵃ⁾มันเป็นพารามิเตอร์ ᵃ³หมายถึง "สะสม 3 ครั้ง" ᵃ⁾หมายถึง "สะสมหลาย ๆ ครั้งตามองค์ประกอบสุดท้ายของการป้อนข้อมูล" Iซึ่งในกรณีที่เป็น ตั้งแต่Iเป็นตัวแปรอิสระอย่างสมบูรณ์ก็จะพยายามค่าได้จากการ0 +inf
ลดขนาด

8

ภาษา Wolfram, 62 60 56 ไบต์

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

มันแย่มากที่ Wolfram Language มีชื่อฟังก์ชันที่ยาวเหยียด * * * * * * * * เฮ้อ

คำอธิบาย:

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*)

คำตอบที่ดี ฉันไม่คิดว่ามันจะดีขึ้น
Kelly Lowder

1
@ KellyLowder ขอบคุณ! Trผมเป็นจริงสามารถที่จะบันทึกไบต์ที่สองมากขึ้นโดยการทำแผนที่ปัจจัยในรายการแล้วข้อสรุปด้วย
Scott Milner

1
ใช้งานได้ดีNestWhileList[...,All]!
Greg Martin

6

JavaScript (ES6), 91 89 ไบต์

บันทึก 2 ไบต์ต้องขอบคุณ fəˈnɛtɪk

มันจะเปิดออกจะค่อนข้างคล้ายกับคำตอบที่ JS อื่น ๆ

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))


ในฟังก์ชันแฟคทอเรียลของคุณคุณไม่ควรใช้ n แทน n> 1 เพราะ 0! = 1?
fəˈnɛtɪk

@ fəˈnɛtɪk ฉันไม่รู้ว่าฉันคิดอะไรอยู่ที่นี่ ขอขอบคุณ!
Arnauld

5

ClojureScript, 146 109 ไบต์

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

Yikes นั่นคือความโหดร้าย มีคนช่วยฉันตีกอล์ฟนี้ด้วย ...

ขอบคุณที่@cliffrootโกนหนวดขนาดใหญ่ถึง 37 ไบต์!

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อเพื่อเรียกใช้ฟังก์ชันคุณต้องทำสิ่งนี้:

(#(...) {arguments})

TIO ไม่มี ClojureScript ดังนั้นนี่คือลิงก์ไปยัง ClojureScript REPL

นี่คือลิงค์ไปยังโปรแกรม Clojure ซึ่งจะพิมพ์องค์ประกอบสุดท้ายในรายการจาก 0 ถึง 1,000

นี่คือผลลัพธ์สำหรับ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]

ผมมีความสงสัยที่แข็งแกร่งที่ตัวเลขทั้งหมดในที่สุดก็จะต้องชำระหรือห่วง1[169 363601 1454]

รหัสไม่ได้รับการตอบกลับ:

(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))))))

คำอธิบายจะมาเร็ว ๆ นี้!


ค่อนข้างยาว แต่ถูกต้อง;) ฉันไม่สามารถช่วยคุณเล่นกอล์ฟได้ด้วยความเสียใจ ^^

ด้านในforสามารถ(for[a s](apply *(range 1(-(int a)47))))ใช่ไหม?
หน้าผา

และสิ่งนี้จะช่วยให้กำจัดอื่น ๆ let #(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)))))
หน้าผา

โอ้ดูเหมือนคุณไม่จำเป็นต้องใช้(- ... 47)ClojureScript แค่intพอเพียง
cliffroot

ดี, (inc(int a))ควรทำเพื่อ ClojureScript และ(-(int a)47)สำหรับ Clojure
หน้าผา

5

Perl 6 , 64 ไบต์

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

ลองมัน

ขยาย:

{

  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
  }
}

บรรทัดข้างต้นที่มีทุกคนเริ่มต้นใหม่แลมบ์ดาบล็อกเปลือยกับพารามิเตอร์โดยนัยของ{$_

ฉันใช้[*] 2..$_แทน[*] 1..$_การเพิ่มประสิทธิภาพแบบไมโคร


4

JavaScript, 92 ไบต์

ขอบคุณ @Shaggy สำหรับการเล่นกอล์ฟหนึ่งไบต์พร้อมกับ
ขอบคุณ @Neil สำหรับการเล่นกอล์ฟสองไบต์

รหัสแยกออกเป็นแต่ละฟังก์ชั่น 92 ไบต์

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

รหัสในหนึ่งบรรทัด 92 ไบต์

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))

คำอธิบาย

เริ่มแรกเรียกใช้ฟังก์ชันด้วยอาร์กิวเมนต์เพียงตัวเดียวดังนั้น a = []

ถ้า x อยู่ในอาร์เรย์ a จะคืนค่า a a.includes(x)?a:...

มิฉะนั้นให้ผนวก x ไปที่ a และส่งผลรวมหลักของแฟคทอเรียลและ a ไปยังฟังก์ชัน (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

จำนวนแฟกทอเรียลที่ดำเนินการเพื่อไม่ให้เกินขีด จำกัด การเรียกซ้ำสูงสุด

รายการปลายทางที่เป็นไปได้ทั้งหมด: 1, 2, 145, 169, 871, 872, 1454, 40585, 45361, 45362, 363601

ลองออนไลน์!


1
Gah ฉันอยู่ใกล้มาก! บันทึกไบต์ด้วยf=(x,a=[])=>a.includes(x)?a:(a.push(x),f(k(x),a))
Shaggy

คุณเขียนไม่ได้f(k(x),a,a.push(x))เหรอ นอกจากนี้ฉันคิดว่าคุณสามารถเขียนk=n=>n&&เพื่อบันทึกไบต์อื่น
Neil

4

Haskell , 80 67 ไบต์

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

ลองออนไลน์! การใช้งาน:([]#) 132

แก้ไข: บันทึก 13 ไบต์ด้วย typs จากØrjan Johansen!


(1) การทดสอบและการผนวกnแทนs(เช่นเดียวกับใน OVS คำตอบของงูใหญ่) f=([]#)แล้ว (2) สวิทช์สาขาใกล้เคียงและการใช้งานs elem
Ørjan Johansen

สวิทช์ออกของคุณ++สำหรับ:ยัง

1
@Canyon มันเป็นคำสั่งที่ผิดมันจะให้ผลลัพธ์สุดท้ายกลับด้าน คุณเกือบจะสามารถแก้ไขมันได้ในภายหลังโดยเตรียมส่วนเพิ่มn:และเปลี่ยน=gเป็น=[]แต่ดูเหมือนว่าจะเป็นแค่เนคไท
Ørjan Johansen

4

Pyth, 9 ไบต์

.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

ลองออนไลน์!

คำตอบนี้ใช้.u("คะแนนคงที่สะสมนำไปใช้จนกว่าจะพบผลลัพธ์ที่เกิดขึ้นก่อนพบกลับผลลัพธ์ระดับกลางทั้งหมด")




2

R, 120 ไบต์

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

คุณสามารถทำได้o=scan()ใช้el()แทน[[1]]และgamma(n+1)=factorial(n)ฉันเชื่อว่าช่วยประหยัดไบต์และฉันคิดว่าas.numericเหมือนกันas.doubleสำหรับจำนวนเต็มซึ่งยังช่วยประหยัดไบต์, และคุณสามารถใช้แทนtoString as.character
Giuseppe

@Giuseppe ขอบคุณสำหรับข้อมูลอัปเดต
Neil

2

Java 9 JSHell, 213 ไบต์

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());}

ลองออนไลน์!

หมายเหตุ: การแก้ปัญหานี้ขึ้นอยู่กับการเป็นตัวแทนสตริงของตัวเลขที่มีจุดรหัสในช่วง 48-57 ใช้งานได้กับ ASCII, UTF-8, Latin-1, ชุดอักขระ ISO-8859- * ทั้งหมด, หน้ารหัสส่วนใหญ่ ไม่ทำงานสำหรับ EBCDIC ฉันไม่คิดว่าใครจะหักคะแนนสำหรับสิ่งนั้น :)

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
}

หมายเหตุ:

  • ค่าตอบแทนของ Set :: add มีประโยชน์มากที่นี่; ผลตอบแทนจริงถ้ารายการไม่ได้อยู่ในชุด
  • ฉันประชดประชันเมื่อฉันพูดว่า "ขอบคุณ Java"
  • Factoriiไม่ใช่คำพูดจริงๆ ฉันเพิ่งทำมันขึ้นมา

1
ฉันยอมรับว่านี่เป็นต้นฉบับ! เป็นคนดีมาก :)

@Antoine ฉันยอมรับว่า Java ไม่ใช่ภาษาที่ดีที่สุดในการเล่นกอล์ฟ แต่มันก็เป็นสิ่งที่บ้าที่สุดที่ฉันเคยทำเมื่อเร็ว ๆ นี้ :) codegolf.stackexchange.com/a/117644/794
David Conrad

2

Pyth, 22 11 ไบต์

.usm.!sd+Nk

ลองออนไลน์!

เครดิตจำนวนมากสำหรับคำตอบของ Leaky Nunซึ่งแนะนำให้ฉันรู้จัก.uและช่วยประหยัด 11 ไบต์ขนาดใหญ่ของโปรแกรมนี้

คำอธิบาย:

.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

Pyth มีฟังก์ชั่นที่มีประโยชน์มากกว่าจินตนาการหนึ่งภาพ ดูคำตอบของฉันเป็นข้อมูลอ้างอิง
แม่ชีที่รั่วไหล

@LeakyNun .uผมเคยเขียนใหม่คำตอบของฉันกับการใช้งาน ฉันเดาว่าฉันจะต้องดูการอ้างอิงตัวละครอีกครั้งเพื่อดูว่ามีฟังก์ชั่นที่มีประโยชน์อื่น ๆ อีกหรือไม่
K Zhang

คุณสามารถใช้การแปลงสตริงแทน`N +Nk
Leun Nun

@LeakyNun ที่ไหนNจะล้าสมัยแล้วและมีมาเป็นทางออกที่ 9 ไบต์ ...
เอริก Outgolfer

1

ความจริง 231 ไบต์

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))

ฟังก์ชั่นไม่กอล์ฟและการทดสอบบางอย่าง

-- 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]

1

Java 7, 220 ไบต์

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);}

คำอธิบาย:

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)

รหัสทดสอบ:

ลองที่นี่

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));
  }
}

เอาท์พุท:

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,



1

TI-BASIC, 85 79 64 60 ไบต์

: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

เนื่องจากสิ่งนี้ทำงานบนเครื่องคิดเลขกราฟจึงมี RAM จำกัด ลองทดสอบด้วยตัวเลขที่วนซ้ำอย่างรวดเร็วเช่น169ลองทดสอบกับตัวเลขที่วงได้อย่างรวดเร็วเช่น

คำอธิบายเพิ่มเติม:

: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₁-Xทำงานโดยการลบองค์ประกอบใหม่จากรายการเก่าจากนั้นคูณองค์ประกอบทั้งหมดของรายการเข้าด้วยกัน หากองค์ประกอบอยู่ในรายการอยู่แล้วผลิตภัณฑ์จะ0เป็นค่าเท็จ มิฉะนั้นผลิตภัณฑ์จะเป็นจำนวนเต็มบวกซึ่งเป็นค่าจริง



1

J , 40 31 ไบต์

แก้ไข: บันทึก 9 ไบต์โดยใช้การปรับปรุงโดย FrownyFrog ขอบคุณ!

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

รหัสเดิม:

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

ในกรณีนี้ฉันตัดสินใจนับไบต์สำหรับคำจำกัดความของคำกริยาเนื่องจากไม่เช่นนั้นมันจะไม่ทำงานในล่าม

คำอธิบาย:

                         ({:) - ใช้องค์ประกอบสุดท้ายของอาร์เรย์
                               ": @ - แปลงเป็นสตริง
                          "." 0 & - แปลงอักขระแต่ละตัวกลับเป็นจำนวนเต็ม
                       ! @ - ค้นหาแฟคทอเรียล
                     + / - ผลรวมพวกเขา
                   [: - หมวก (มีคำกริยา 2 คำมาด้านบนเราต้องการ 3 สำหรับทางแยก)
          (e. ~) - ตรวจสอบว่าผลลัพธ์มีอยู่ในรายการหรือไม่    
             - - คัดค้านการตรวจสอบข้างต้น
           [: - หมวก
        แอท - การรวมวาระที่จำเป็นสำหรับการสอบถามซ้ำ
  ($: @,) - หากผลลัพธ์ไม่ได้อยู่ในรายการให้เพิ่มลงในรายการและเกิดขึ้นอีก
[`- ถ้าผลลัพธ์อยู่ในรายการให้แสดงและหยุด    

ลองออนไลน์!


1
([:-.e.~)->(1-e.~)
FrownyFrog


@FrownyFrog ขอบคุณรหัสของคุณดีกว่ามาก! ฉันลองใช้ 10 # .inv ก่อนหน้านี้ขณะทำการทดลอง แต่จากนั้นฉันเขียนมัน 10 & #. inv และมันก็นานกว่านั้นดังนั้นฉันจึงปฏิเสธ ขอบคุณสำหรับคำแนะนำของคุณ! ฉันมีมากที่จะเรียนรู้ :)
เลน Ivanov

@FrownyFrog กลับกรณีสำหรับวาระการประชุมเป็นไปอย่างดีผมเสียใจผมไม่เห็นมัน :)
เลน Ivanov

[:+/!@"."0@":@{:เป็นระยะเวลาเดียวกันเพื่อให้มีการปรับปรุงใด ๆ 10#.invกับ ()เพิ่งมีการวาง
FrownyFrog

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.