Catatan tentang N!


32

JE Maxfield membuktikan teorema berikut (lihat DOI: 10.2307 / 2688966 ):

Jika A adalah bilangan bulat positif yang memiliki angka m , maka ada bilangan bulat positif N sehingga angka m pertama dari N!merupakan bilangan bulat A .

Tantangan

A1N1

Detail

  • N!mewakili faktorial dari .N!=123...NN
  • Digit dalam kasus kami dipahami berada di basis .SEBUAH10
  • Kiriman Anda harus bekerja untuk sewenang-wenang yang diberikan cukup waktu dan memori. Hanya menggunakan misalnya tipe 32-bit untuk mewakili bilangan bulat tidak cukup.SEBUAH1
  • Anda tidak perlu mengeluarkan sesedikit mungkin .N

Contohnya

A            N
1            1
2            2
3            9
4            8
5            7
6            3
7            6
9           96
12           5
16          89
17          69
18          76
19          63
24           4
72           6
841      12745
206591378  314

paling mungkin untuk setiap dapat ditemukan di https://oeis.org/A076219NSEBUAH


26
Aku ... kenapa dia membuktikan teorema itu? Apakah dia baru bangun suatu hari dan berkata "Aku akan menyelesaikan ini!" atau apakah itu melayani tujuan?
Guci Gurita Ajaib

11
@ MagicOctopusUrn Tidak pernah berurusan dengan ahli teori angka sebelumnya, bukan?
Brady Gilg

2
Ini buktinya ada yang tertarik.
Buah Esolanging

Jawaban:


14

Python 2 , 50 byte

f=lambda a,n=2,p=1:(`p`.find(a)and f(a,n+1,p*n))+1

Cobalah online!

Ini adalah variasi dari solusi 47-byte yang dijelaskan di bawah ini, disesuaikan untuk mengembalikan 1input '1'. (Yaitu, kami menambah 1ekspresi penuh daripada panggilan rekursif, dan mulai menghitung dari n==2untuk menghapus satu lapisan kedalaman, menyeimbangkan hasil untuk semua non- '1'input.)

Python 2 , 45 byte (peta 1 hingga True)

f=lambda a,n=2,p=1:`-a`in`-p`or-~f(a,n+1,p*n)

Ini adalah variasi lain, oleh @ Jo King dan @xnor, yang mengambil input sebagai angka dan kembali Trueuntuk input 1. Beberapa orang berpikir ini adalah permainan yang adil, tetapi saya pribadi merasa sedikit aneh.

Tetapi biayanya hanya 3 byte untuk membungkus hasil Boolean yang icky +(), memberi kami solusi "bagus" yang lebih pendek:

Python 2 , 48 byte

f=lambda a,n=2,p=1:+(`-a`in`-p`)or-~f(a,n+1,p*n)

Ini adalah solusi saya sebelumnya, yang mengembalikan 0input '1'. Itu akan berlaku jika pertanyaannya menyangkut non-negatifN .

Python 2 , 47 byte (tidak valid)

f=lambda a,n=1,p=1:`p`.find(a)and-~f(a,n+1,p*n)

Cobalah online!

Mengambil string sebagai input, seperti f('18').

Kuncinya di sini adalah itu x.find(y) == 0 kapan tepatnya x.startswith(y).

The and-expression akan hubungan pendek pada `p`.find(a)dengan hasil 0secepat `p`dimulai dengana ; jika tidak, akan dievaluasi menjadi -~f(a,n+1,p*n), id est 1 + f(a,n+1,p*n).

Hasil akhirnya adalah 1 + (1 + (1 + (... + 0))), nlapisan dalam, jadi n.


Omong-omong solusi bagus. Saya sedang mengerjakan metode yang sama tetapi menghitung faktorial pada setiap iterasi; menerapkan pendekatan Anda menyelamatkan saya beberapa byte jadi +1.
Shaggy

1
Untuk versi True-for-1 Anda, Anda dapat mempersingkat pengambilan kondisi dasara sebagai angka.
xnor

@ xnor Saya tidak akan memikirkan `` -adalam -p``, itu trik yang rapi :)
Lynn

Jika bukti masih berlaku jika N terbatas pada nilai genap, maka solusi 45 byte ini akan selalu menghasilkan angka.
negatif tujuh

9

Brachylog , 3 5 byte

ℕ₁ḟa₀

Cobalah online!

Mengambil input melalui variabel outputnya, dan output melalui variabel inputnya. (Sebaliknya, hanya menemukan awalan acak faktorial input, yang tidak begitu menarik.) Waktu pada kasus uji kedua-terakhir di TIO, tetapi baik-baik saja pada yang terakhir . Saya sudah menjalankannya di 841 di laptop saya selama beberapa menit pada saat menulis ini, dan itu belum benar-benar mengeluarkan jawaban, tetapi saya yakin akan hal itu.

         The (implicit) output variable
   a₀    is a prefix of
  ḟ      the factorial of
         the (implicit) input variable
ℕ₁       which is a positive integer.

Karena satu-satunya input yang ḟa₀tidak berfungsi adalah 1, dan 1 adalah awalan positif 1! = 1, 1|ḟa₀berfungsi dengan baik.

Juga, pada pengeditan ini, 841 telah berjalan selama hampir tiga jam dan masih belum menghasilkan output. Saya kira menghitung faktorial dari setiap bilangan bulat dari 1 hingga 12745 tidak terlalu cepat.


2
Implementasi predikat faktorial dalam Brachylog agak berbelit-belit sehingga dapat digunakan dua arah dengan efisiensi yang dapat diterima. Seseorang dapat menerapkan algoritma yang jauh lebih cepat untuk menghitung faktorial, tetapi akan sangat lambat menjalankan cara lain (yaitu menemukan nomor asli dari faktorial).
Fatalkan

Oh keren! Melihat sumbernya, saya tidak tahu apa yang dilakukannya, tetapi saya bisa memberi tahu Anda banyak pemikiran.
String yang tidak terkait

7

C ++ (gcc) , 107 95 byte, menggunakan -lgmpdan-lgmpxx

Terima kasih kepada orang-orang di komentar untuk menunjukkan beberapa kecelakaan konyol.

#import<gmpxx.h>
auto f(auto A){mpz_class n,x=1,z;for(;z!=A;)for(z=x*=++n;z>A;z/=10);return n;}

Cobalah online!

Menghitung n!dengan mengalikan (n1)!dengan n , lalu berulang kali membaginya dengan 10 sampai tidak lebih besar dari bilangan bulat yang dilewati. Pada titik ini, loop berakhir jika faktorial sama dengan bilangan bulat yang dilewati, atau berlanjut ke n berikutnya jika tidak.


Anda tidak perlu lagi menghitung flag, jadi ini 107byte.
AdmBorkBork

Mengapa Anda perlu titik koma kedua sebelumnya return?
Ruslan

Anda dapat menggunakan nama karakter tunggal untuk fungsi ini, menyimpan beberapa byte.
Shaggy



2

Pyth - 8 byte

f!x`.!Tz

f              filter. With no second arg, it searches 1.. for first truthy
 !             logical not, here it checks for zero
  x    z       indexof. z is input as string
   `           string repr
    .!T        Factorial of lambda var

Cobalah online .


2

JavaScript, 47 43 byte

Output sebagai BigInt.

n=>(g=x=>`${x}`.search(n)?g(x*++i):i)(i=1n)

Cobalah secara Online!

Menyelamatkan beberapa byte dengan mengambil pendekatan Lynn untuk "membangun" faktorial daripada menghitungnya pada setiap iterasi, jadi harap tingkatkan solusinya juga jika Anda membatalkan ini.


Sayangnya, _Ês bU}f1di Japt tidak bekerja
Perwujudan Ketidaktahuan

@EmbodimentofIgnorance, ya, saya juga punya itu. Anda dapat menghapus ruang setelah s.
Shaggy

@EmbodimentofIgnorance, Anda juga dapat menghapus 1jika 0dapat dikembalikan n=1.
Shaggy

3 byte lebih sedikit:x=i=1n;f=n=>`${x*=++i}`.search(n)?f(n):i
vrugtehagel

@vrugtehagel, itu tidak akan bisa digunakan kembali.
Shaggy


1

Jelly , 16 byte

‘ɼ!³;D®ß⁼Lḣ@¥¥/?

Cobalah online!

Penjelasan

‘ɼ                | Increment the register (initially 0)
  !               | Factorial
   ³;             | Prepend the input
     D            | Convert to decimal digits
        ⁼   ¥¥/?  | If the input diguts are equal to...
         Lḣ@      | The same number of diguts from the head of the factorial
      ®           | Return the register
       ß          | Otherwise run the link again

1

Perl 6 , 23 byte

{+([\*](1..*).../^$_/)}

Cobalah online!

Penjelasan

{                     }  # Anonymous code block
   [\*](1..*)            # From the infinite list of factorials
             ...         # Take up to the first element
                /^$_/    # That starts with the input
 +(                  )   # And return the length of the sequence

1

Arang , 16 byte

⊞υ¹W⌕IΠυθ⊞υLυI⊟υ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

⊞υ¹

Dorong 1ke daftar kosong sehingga mulai dengan produk yang ditentukan.

W⌕IΠυθ

Ulangi sementara input tidak dapat ditemukan di awal produk dari daftar ...

⊞υLυ

... dorong panjang daftar ke dirinya sendiri.

I⊟υ

Cetak nilai terakhir yang didorong ke daftar.



1

J , 28 22 byte

-6 byte berkat FrownyFrog

(]+1-0{(E.&":!))^:_&1x

Cobalah online!

jawaban asli J , 28 byte

>:@]^:(-.@{.@E.&":!)^:_ x:@1

Cobalah online!

  • >:@] ... x:@1 dimulai dengan presisi yang diperluas 1 , terus meningkatkannya sambil ...
  • -.@ itu tidak terjadi ...
  • {.@ elm pertama adalah pertandingan awal ...
  • E.&":semua kecocokan substring (setelah merangkai kedua argumen &":) mencari input asli di ...
  • ! faktorial dari angka yang kita tambahkan

(]+1-0{(E.&":!))^:_&1x
FrownyFrog

Saya suka itu menggunakan "titik tetap" untuk menghindari sementara tradisional.
Jonah

1

C (gcc) -lgmp, 161 byte

#include"gmp.h"
f(a,n,_,b)char*a,*b;mpz_t n,_;{for(mpz_init_set_si(n,1),mpz_init_set(_,n);b=mpz_get_str(0,10,_),strstr(b,a)-b;mpz_add_ui(n,n,1),mpz_mul(_,_,n));}

Cobalah online!


Sarankan strstr(b=mpz_get_str(0,10,_),a)-b;mpz_mul(_,_,n))mpz_add_ui(n,n,1)alih-alihb=mpz_get_str(0,10,_),strstr(b,a)-b;mpz_add_ui(n,n,1),mpz_mul(_,_,n))
ceilingcat



0

Bersihkan , 88 byte

import StdEnv,Data.Integer,Text
$a=hd[n\\n<-[a/a..]|startsWith(""<+a)(""<+prod[one..n])]

Cobalah online!

Mendefinisikan $ :: Integer -> Integer .

Menggunakan Data.Integerbilangan bulat ukuran arbitrer untuk IO.





0

Haskell, 89 byte

import Data.List
a x=head$filter(isPrefixOf$show x)$((show.product.(\x->[1..x]))<$>[1..])

Jika ada yang tahu cara memotong impor yang diperlukan, beri tahu saya.


Tampaknya Anda menghasilkan N! dan tidak N seperti yang dipersyaratkan.
flawr
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.