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

cacat
sumber
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.

Lynn
sumber
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.

String yang tidak terkait
sumber
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.

Neil A.
sumber
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
6

Jelly , 8 byte

1!w⁼1ʋ1#

Cobalah online!

Mengambil bilangan bulat dan mengembalikan singleton.

Erik the Outgolfer
sumber
6

05AB1E , 7 byte

∞.Δ!IÅ?

Cobalah online atau verifikasi -hampir- semua kasus uji ( 841waktu habis, jadi tidak termasuk)

Penjelasan:

∞.Δ      # Find the first positive integer which is truthy for:
   !     #  Get the factorial of the current integer
    IÅ?  #  And check if it starts with the input
         # (after which the result is output implicitly)
Kevin Cruijssen
sumber
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 .

Maltysen
sumber
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.

Shaggy
sumber
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
2

C # (.NET Core) , 69 + 22 = 91 byte

a=>{var n=a/a;for(var b=n;!(b+"").StartsWith(a+"");b*=++n);return n;}

Cobalah online!

Penggunaan System.Numerics.BigIntegeryang membutuhkan usingpernyataan.

-1 byte terima kasih kepada @ExpiredData!

dana
sumber
1
69 + 22
Data Kedaluwarsa
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
Nick Kennedy
sumber
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
Jo King
sumber
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.

Neil
sumber
1

Perl 5 -Mbigint -p , 25 byte

1while($.*=++$\)!~/^$_/}{

Cobalah online!

Xcali
sumber
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
Jonah
sumber
(]+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!

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

Python 3 , 63 byte

f=lambda x,a=2,b=1:str(b).find(str(x))==0and a-1or f(x,a+1,b*a)

Cobalah online!

-24 byte terima kasih kepada Jo King

-3 byte terima kasih kepada Chas Brown

HyperNeutrino
sumber
@ Bersenang-senang, terima kasih
HyperNeutrino
61 byte
Chas Brown
@ ChasBrown, terima kasih
HyperNeutrino
Saya pikir f=yang Anda miliki di tajuk seharusnya diperhitungkan terhadap jumlah bit Anda.
mypetlion
@mypetlion Anda benar; terima kasih sudah menangkapnya.
HyperNeutrino
0

Jelly , 11 byte

‘ɼµ®!Dw³’µ¿

Cobalah online!

HyperNeutrino.
sumber
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.

Suram
sumber
0

Ikon , 65 63 byte

procedure f(a);p:=1;every n:=seq()&1=find(a,p*:=n)&return n;end

Cobalah online!

Galen Ivanov
sumber
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.

Mega Man
sumber
Tampaknya Anda menghasilkan N! dan tidak N seperti yang dipersyaratkan.
flawr