Faktorial dan siklus tidak pernah berakhir!

33

Seperti yang Anda ketahui, faktorial dari bilangan bulat positif nadalah produk dari semua bilangan bulat positif yang sama atau lebih kecil n.

Contohnya :

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

Kami sekarang akan mendefinisikan operasi khusus dengan nama yang tidak relevan seperti sumFac:

Diberikan bilangan bulat positif n, sumFac(n)adalah jumlah faktorial dari digit.

Contohnya :

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

Tugas

Misi Anda, terlepas Anda memilih untuk menerimanya, adalah mengembalikan urutan (berpotensi tak terbatas) aplikasi sumFacke bilangan bulat yang diberikan dalam input.

Contoh: 132 -> 132, 9, 362880, 81369, 403927, ...

Tapi itu belum semuanya! Memang, aplikasi pada sumFacakhirnya akan membuat siklus. Anda juga harus mengembalikan siklus ini!

Jika bahasa Anda memiliki faktorial bawaan, Anda dapat menggunakannya. Saya tidak pilih-pilih tentang tipe pengembalian, Anda hanya perlu mengembalikan urutan aplikasi sumFac dan siklus dalam format yang dapat dimengerti oleh manusia.

Suntingan: Untuk membantu Anda memvisualisasikan dengan lebih baik seperti apa outputnya seperti saya menyalin Leaky Nun di bawah ini:

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

Anda hanya perlu menghentikan urutan ketika siklus akan dimulai untuk yang kedua kalinya!

Tapi ini kode-golf sehingga jawaban tersingkat dalam byte menang!

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Biarawati Bocor
sumber
Terkait
Leaky Nun
Selamat datang di PPCG! Ini sepertinya tantangan yang bagus, BTW.
clismique
@ Qwerp-Derp Terima kasih banyak! Saya mencoba menjadi kreatif ^^
@ Zgarb Yah itu persis seperti output dari Leaky Nun. Urutan aplikasi dan kemudian itu akan berakhir tepat sebelum awal siklus kedua. Saya akan menyalin hasilnya dalam pertanyaan sehingga semua orang dapat memiliki pemahaman yang jelas. Terima kasih telah menunjukkannya :)
1
@ 2501 Hardcoding nilainya curang, tetapi mengenai pemformatan output Anda dapat menggunakan pemisah apa pun yang Anda inginkan

Jawaban:

19

Jelly , 6 byte

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

Cobalah online!

Saya tidak melihat cara lain untuk membuatnya lebih pendek selain melakukan seperti yang diperintahkan.

Spesifikasi

  • Input: 132(sebagai argumen baris perintah)
  • Keluaran: [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]
Biarawati Bocor
sumber
Saya tidak berharap mendapat jawaban sesingkat itu. Bagus :)
4
@Antoine Ini Jelly: D Itu selalu lebih pendek daripada yang saya pikir akan;)
HyperNeutrino
8
@HyperNeutrino Entah bagaimana Dennis akan datang dengan jawaban yang bahkan lebih pendek
Leaky Nun
Entah bagaimana, ya. Karena Dennis. : P
HyperNeutrino
Jadi ... Pengodean karakter apa yang Anda gunakan untuk menghasilkan 6 byte untuk 6 karakter tersebut? Bukankah Jelly seharusnya dikodekan UTF-8, artinya program ini sebenarnya 9 byte?
LordOfThePigs
10

Python 2 , 88 byte

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

Cobalah online!

ovs
sumber
Sebagai penggemar python, saya senang seseorang menjawabnya, bagus :)
9

05AB1E , 12 byte

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

Cobalah online!

Penjelasan

[               # 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
sumber
Pendek dan benar, dimainkan dengan baik!
Kupikir aku bisa menyingkirkan sjawaban yang salah, bagus.
Magic Gurita Guci
8

Brachylog , 17 byte

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

Cobalah online!

Penjelasan

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)
Fatalisasi
sumber
Apa Iartinya
Leaky Nun
1
@ LeakyNun Ini adalah parameter untuk ᵃ⁾. ᵃ³berarti "menumpuk 3 kali". ᵃ⁾berarti "terakumulasi sebanyak elemen terakhir dari input", yang dalam hal ini adalah I. Sejak Iadalah variabel-benar bebas, ia akan mencoba nilai-nilai untuk itu dari 0ke +inf.
Fatalkan
8

Bahasa Wolfram, 62 60 56 byte

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

Sangat buruk sekali bahwa Bahasa Wolfram memiliki nama fungsi yang sangat panjang. *Mendesah*

Penjelasan:

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
sumber
Jawaban bagus. Saya tidak berpikir ini bisa diperbaiki.
Kelly Lowder
1
@KellyLowder Terima kasih! Saya sebenarnya bisa menyimpan dua byte lagi dengan memetakan faktorial ke daftar, lalu menjumlahkannya dengan Tr.
Scott Milner
1
Penggunaan yang bagus NestWhileList[...,All]!
Greg Martin
6

JavaScript (ES6), 91 89 byte

Disimpan 2 byte berkat fəˈnɛtɪk

Ternyata sangat mirip dengan jawaban JS lainnya .

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
sumber
Dalam fungsi faktorial Anda, bukankah seharusnya Anda dapat menggunakan n alih-alih n> 1 karena 0! = 1?
fəˈnɛtɪk
@ fəˈnɛtɪk Saya tidak tahu apa yang saya pikirkan di sini. Terima kasih!
Arnauld
5

ClojureScript, 146 109 byte

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

Astaga, itu adalah keburukan. Seseorang tolong bantu saya bermain golf ini ...

Terima kasih @cliffroottelah memotong 37 byte kekalahan!

Ini adalah fungsi anonim, untuk menjalankan fungsinya, Anda harus melakukan ini:

(#(...) {arguments})

TIO tidak memiliki ClojureScript, jadi inilah tautan ke REPL ClojureScript.

Berikut ini tautan ke program Clojure yang mencetak elemen terakhir dalam daftar dari 0 hingga 1000.

Inilah output untuk 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]

Saya memiliki kecurigaan yang kuat bahwa semua angka akhirnya harus diselesaikan pada 1atau loop [169 363601 1454].

Kode tidak dikunci:

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

Penjelasan segera hadir!

clismique
sumber
Cukup lama tapi benar;) Saya benar-benar tidak dapat membantu Anda bermain golf ini ^^
batin forbisa (for[a s](apply *(range 1(-(int a)47)))), bukan?
cliffroot
dan ini akan memungkinkan untuk menyingkirkan yang lainlet #(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, tampaknya Anda bahkan tidak perlu (- ... 47)di ClojureScript, hanya intakan cukup
cliffroot
baik, (inc(int a))harus dilakukan untuk ClojureScript dan (-(int a)47)untuk Clojure.
cliffroot
5

Perl 6 , 64 byte

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

Cobalah

Diperluas:

{

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

Setiap baris di atas yang telah {memulai lambda blok baru dengan parameter implisit dari $_.

Saya menggunakan [*] 2..$_bukannya [*] 1..$_murni sebagai optimasi mikro.

Brad Gilbert b2gills
sumber
4

JavaScript, 92 byte

Terima kasih @Shaggy untuk bermain golf satu byte dengan menyertakan
Terima kasih @Neil untuk bermain golf dua byte

Kode dipisahkan menjadi fungsi individu 92 byte

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

Kode pada satu baris 92 byte

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

Penjelasan

Awalnya panggil fungsi hanya dengan satu argumen, oleh karena itu a = [].

Jika x ada dalam array, kembalikan a a.includes(x)?a:...

Jika tidak, tambahkan x ke a dan meneruskan jumlah digit faktorial dan a ke fungsi (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

Jumlah Digit faktorial dilakukan sehingga tidak akan melebihi batas rekursi maksimum.

Daftar semua kemungkinan titik akhir: 1, 2, 145, 169, 871, 872, 1454, 40585, 45361, 45362, 363601

Cobalah online!

fəˈnɛtɪk
sumber
1
Gah, aku sudah sangat dekat! Simpan satu byte denganf=(x,a=[])=>a.includes(x)?a:(a.push(x),f(k(x),a))
Shaggy
Tidak bisakah kamu menulis f(k(x),a,a.push(x))? Juga, saya pikir Anda dapat menulis k=n=>n&&untuk menyimpan byte lain.
Neil
4

Haskell , 80 67 byte

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

Cobalah online! Pemakaian:([]#) 132

Sunting: Disimpan 13 byte dengan mengetik dari Ørjan Johansen!

Laikoni
sumber
(1) Uji dan tambahkan nbukannya s(sama seperti dalam jawaban Python ovs), kemudian f=([]#). (2) Ganti cabang, sebaris s, dan gunakan elem.
Ørjan Johansen
Ganti juga ++untuk Anda :.
1
@Canyon Ini urutan yang salah untuk itu, itu akan memberikan hasil akhir terbalik. Anda hampir dapat memperbaikinya setelah itu, dengan menambahkan ekstra n:dan mengubahnya =gmenjadi =[], tetapi tampaknya hanya dasi.
Ørjan Johansen
4

Pyth, 9 byte

.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

Cobalah online!

Jawaban ini menggunakan .u("Titik tetap kumulatif. Terapkan hingga hasil yang telah terjadi sebelumnya ditemukan. Kembalikan semua hasil antara.")

Biarawati Bocor
sumber
3

Pyth, 30 byte

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

Coba Di Sini

Maria
sumber
Pyth memiliki fungsi yang lebih berguna daripada yang dibayangkan. Lihat jawaban saya sebagai referensi.
Leaky Nun
2

Python 3 , 110 byte

g=lambda x:x<1or x*g(x-1)
def f(n):
 a=[];b=n
 while b not in a:a+=[b];yield b;b=sum(g(int(x))for x in str(b))

Cobalah online!

Biarawati Bocor
sumber
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
sumber
Anda dapat melakukan o=scan(), menggunakan el()alih-alih [[1]], dan gamma(n+1)=factorial(n)yang saya percaya menyimpan byte, dan saya pikir as.numericsama dengan as.doubleuntuk bilangan bulat, yang juga menyimpan byte, dan Anda dapat menggunakan toStringsebagai gantinya as.character.
Giuseppe
@Giuseppe Terima kasih atas masukannya, diperbarui.
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());}

Cobalah online!

Catatan: Solusi ini bergantung pada representasi string dari nomor yang memiliki poin kode dalam kisaran 48-57. Berfungsi untuk ASCII, UTF-8, Latin-1, semua rangkaian karakter ISO-8859- *, sebagian besar halaman kode. Tidak berfungsi untuk EBCDIC. Saya tidak berpikir ada orang yang akan mengurangi poin untuk itu. :)

Tidak Disatukan:

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
}

Catatan:

  • Nilai balik dari Set :: add sangat membantu di sini; mengembalikan true jika item tidak dalam set
  • Saya menjadi sarkastik ketika saya berkata "Terima kasih, Java"
  • factorii sebenarnya bukan kata; Saya hanya mengada-ada
David Conrad
sumber
1
Saya akui ini asli!
@Antoine saya akui, Jawa bukan bahasa terbaik untuk bermain golf, tapi itu bukan hal paling gila yang saya lakukan akhir-akhir ini. :) codegolf.stackexchange.com/a/117644/794
David Conrad
2

Pyth, 22 11 byte

.usm.!sd+Nk

Cobalah online!

Banyak penghargaan untuk jawaban Leaky Nun , yang memperkenalkan saya .u, dan membantu menyelamatkan 11 byte besar dari program ini.

Penjelasan:

.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
sumber
Pyth memiliki fungsi yang lebih berguna daripada yang dibayangkan. Lihat jawaban saya sebagai referensi.
Leaky Nun
@ LeakyNun Saya telah menulis ulang jawaban saya untuk digunakan .u. Saya kira saya perlu melihat referensi karakter lagi untuk melihat apakah ada fungsi lain yang berguna di sana.
K Zhang
Anda dapat menggunakan `Nuntuk mengonversi ke string, bukan +Nk.
Leaky Nun
@ LeakyNun Dimana Nakan usang kemudian, dan ada solusi 9-byte ...
Erik the Outgolfer
1

Aksioma, 231 byte

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

bukan fungsi golf dan beberapa tes

-- 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
sumber
1

Java 7, 220 byte

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

Penjelasan:

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)

Kode uji:

Coba di sini.

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

Keluaran:

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
sumber
1

GolfScript , 44 byte

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

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

Cobalah online!

Bagian faktorialnya dari sini .

Biarawati Bocor
sumber
1

C, 161 byte

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

Lihat itu berfungsi online.

2501
sumber
1

TI-BASIC, 85 79 64 60 byte

: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

Karena ini berjalan pada kalkulator grafik, ada RAM yang terbatas. Cobalah mengujinya dengan angka-angka yang berulang dengan cepat 169.

Penjelasan Lebih Lanjut:

: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₁-Xbekerja dengan mengurangi elemen baru dari daftar lama, lalu mengalikan semua elemen daftar bersama-sama. Jika elemen sudah ada dalam daftar, produk akan menjadi 0, nilai palsu. Jika tidak, produk akan menjadi bilangan bulat positif, nilai kebenaran.

Scott Milner
sumber
1

J , 40 31 byte

Sunting: 9 byte disimpan menggunakan penyempurnaan oleh FrownyFrog. Terima kasih!

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

Kode asli:

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

Dalam hal ini saya memutuskan untuk menghitung byte untuk definisi kata kerja, karena jika tidak maka tidak akan berfungsi dalam penerjemah.

Penjelasan:

                         ({:) - Mengambil elemen terakhir dari array
                               ": @ - mengubahnya menjadi string
                          "." 0 & - mengonversi setiap karakter kembali ke integer
                       ! @ - menemukan faktorial
                     + / - menjumlahkan mereka
                   [: - cap (ada 2 kata kerja turunan di atas, kita perlu 3 fork)
          (e. ~) - periksa apakah hasilnya ada dalam daftar    
             -. - Meniadakan cek di atas
           [: - tutup
        @. - Agenda konjungsi, diperlukan untuk rekursi
  ($: @,) - jika hasilnya tidak ada dalam daftar, tambahkan ke daftar dan ulangi
[`- jika hasilnya ada dalam daftar, tampilkan dan berhenti    

Cobalah online!

Galen Ivanov
sumber
1
([:-.e.~)->(1-e.~)
FrownyFrog
1
31 byte
FrownyFrog
@FrownyFrog Terima kasih, kode Anda jauh lebih baik! Saya mencoba 10 # .inv awal saat bereksperimen, tetapi kemudian saya menulisnya 10 & #. Inv dan itu lebih lama, jadi saya menolaknya. Terima kasih atas semua saran Anda! Saya harus banyak belajar :)
Galen Ivanov
@FrownyFrog Membalikkan kasus untuk agenda sangat bagus, saya menyesal tidak melihatnya :)
Galen Ivanov
[:+/!@"."0@":@{:Panjangnya sama, jadi tidak ada peningkatan 10#.inv. Baru saja harus menjatuhkan ().
FrownyFrog
1

Tcl , 143 byte

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}

Cobalah online!

sergiol
sumber