Ada angka yang agak aneh yang terkadang muncul dalam soal matematika atau teka-teki. The pseudofactorial (N) adalah kelipatan umum paling tidak (yaitu terendah) dari angka 1 sampai N; dengan kata lain, itu adalah angka terendah yang memiliki semua angka dari 1 hingga N sebagai faktor.
Misalnya pseudofactorial (7) = 3 * 4 * 5 * 7, yang sama dengan 7! kecuali bahwa 2 dan 6 telah dihapus karena terkandung dalam istilah lain.
Tulis program untuk menghitung pseudofactorial (N) dan seperti biasa, kode terpendek menang.
Berikut adalah daftar singkat untuk Anda gunakan. Lebih banyak kasus uji dapat ditemukan di OEIS di bawah A003418 .
Faktorial:
- 1
- 2
- 6
- 24
- 120
- 720
- 5040
Pseudofactorial:
- 1
- 2
- 6
- 12
- 60
- 60
- 420
code-golf
math
number-theory
factorial
Tony Ruth
sumber
sumber
2
dan6
dihapus dari daftar kelipatan. Bisakah Anda menjelaskan aturannya?Jawaban:
Dyalog APL , 3 byte
APL mengalahkan Jelly ‽
⍳
1 meskipun argumen∧/
LCM di seberangsumber
Jelly , 4 byte
Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
C (dengan x86), 52 byte
Cek angka dari 1 ke atas. Untuk setiap angka, bagilah dengan semua angka dari n hingga 1, dan jumlah sisanya. Berhenti ketika jumlahnya 0.
Pemakaian:
Tidak jelas bagaimana cara mengembalikan nilai (tidak ada
return
pernyataan).Konvensi panggilan untuk x86 mengatakan bahwa fungsi tersebut harus mengembalikan nilainya dalam
eax
register. Dengan mudah, instruksi divisiidiv
mengharapkan inputnya masukeax
, dan mengeluarkan hasilnya dalameax
(hasil bagi) danedx
(sisanya). Iterasi terakhir dibagik
dengan1
, jadieax
akan berisi nilai yang benar ketika fungsi keluar.Ini hanya berfungsi dengan optimisasi aktif (dalam mode debug, menghasilkan
421
).sumber
int
secara default (termasuk nilai balik). Ini berfungsi untuk argumen fungsi jika mereka dideklarasikan menggunakan apa yang disebut sintaks "gaya lama". Deklarasi dengan tipe yang didefinisikan secara eksplisit adalahint d(n,k,b,t) int n,k,b,t; {...}
cdecl
danstdcall
menggunakan metode yang sama untuk nilai-kembali, jadi saya kirax86
sudah cukupHaskell, 20 byte
Contoh penggunaan:
map f [1..7]
->[1,2,6,12,60,60,420]
.The
lcm
trick dalam Haskell.sumber
Python + SymPy, 45 byte
Cukup jelas.
Python 2,
5754 byteUji di Ideone .
Bagaimana itu bekerja
Input disimpan dalam variabel i dan r .
exec
mengeksekusi kode r kali berikut .Sementara saya bervariasi dari r ke 1 , kami menambahkan nilai awal r (disimpan dalam t ) sebanyak yang diperlukan untuk r itu sendiri untuk membuat kelipatan i . Hasilnya, jelas, kelipatan t .
Nilai akhir r adalah kelipatan dari semua bilangan bulat dalam rentang [1, ..., n] , di mana n adalah input.
sumber
exec
trik pihak ketiga ada solusi 78 byte:from fractions import*;lambda n:reduce(lambda x,y:x*y/gcd(x,y),range(1,n+1),1)
Menggunakan fakta itulcm(x,y) = x*y/gcd(x,y)
.Python, 46 byte
Mencari beberapa
c
darig(n-1)
langsung. Saya pernah sebelumnya bahwa metode ini akan salah menemukan 0 sebagai kelipatan dari apa pun, tetapior
korsleting atau(c%n<1)*c
akan melompatc==0
juga karena 0 adalah Falsey.50 byte:
Seperti solusi Dennis , tetapi sebagai fungsi rekursif. Memiliki dihitung
g(n-1)
, terlihat untuk beberapa terkecili*n
darin
itu juga kelipatang(n-1)
. Sangat lambat.Terima kasih kepada Dennis untuk 4 byte dengan melihat kelipatan
n
alih-alihg(n-1)
.sumber
J, 9 byte
Pendekatan lurus ke depan. Buat kisaran angka
[0, ..., n-1]
, lalu tambahkan satu untuk masing-masing, dan kurangi menggunakan LCM.Pemakaian
sumber
MATL , 4 byte
Cobalah online!
Penjelasan
sumber
Mathematica, 13 byte
sumber
LCM
danRange
dengan@*
?LCM
mengoperasikan elemen-bijaksana pada daftar, yang akan dilewatiRange
, yang berarti ini hanya akan mengembalikan lcm ( x ) untuk x dari 1 hingga n . Juga, ada yang hilang&
yang akan menutup fungsi anonim. Sesuatu sepertiLCM@@Range@#&
untuk 13 byte akan berfungsi.Julia, 11 byte
Cobalah online!
sumber
Pyth - 8 byte
Periksa semua angka sampai ditemukan nomor yang dapat dibagi
[1..N]
.Test Suite .
sumber
Oktaf, 27 byte
Membuat fungsi anonim yang dapat dipanggil sebagai
ans(N)
.Demo online
Penjelasan
Solusi ini membuat daftar semua angka antara
1
danx
(1:x
), mengonversinya menjadi array selnum2cell
. Kemudian{:}
pengindeksan membuat daftar dipisahkan koma yang dilewatkanlcm
sebagai argumen input ganda untuk menghitung multiple paling umum. A 1 selalu diteruskan sebagai argumen pertamalcm
karenalcm
selalu membutuhkan setidaknya dua argumen input.sumber
lcm
dalam Oktaf menerima lebih dari 2 input! MenarikMATLAB, 49 byte
sumber
bsxfun
Perl 6 , 13 byte
Blok kode anonim yang menciptakan Rentang dari 1 hingga input (inklusif), dan kemudian menguranginya dengan
&infix:<lcm>
.Contoh:
sumber
JavaScript (ES6),
9288807469 byte:Terima kasih @ConorOBrien dan @Neil
sumber
b?g(b,a%b):a
menghemat satu byte.y*++i/g(y,i)
menyimpan beberapa byte lagi.05AB1E, 20 byte
Penjelasan
Cobalah online
sumber
Minkolang 0,15 , 12 byte
Saya memiliki dua solusi 12-byte, dan telah memasukkan keduanya.
Coba di sini!
Penjelasan
Tentang semudah yang didapat.
Coba di sini!
Penjelasan
Solusi ketiga dapat diturunkan dari ini: hapus a
1
dan tambahkand
setelah saat inid
. Dalam kedua kasus, angka tambahan diperlukan karena loop for berjalan satu kali terlalu banyak, dan membuatnya berjalan satu kali lebih sedikit membutuhkan dua byte (1-
tepat sebelum[
).sumber
Ruby, 25 byte
Ruby, 25 byte
sumber
g=
.Bahasa GameMaker, 60 byte
Berdasarkan logika jawaban anatolyg.
sumber
PHP,
615248 bytedisimpan 9 byte berkat @ user59178, 4 byte dengan menggabungkan loop.
Rekursi dalam PHP besar karena
function
kata kunci; jadi saya menggunakan iterasi.Dan dengan beberapa trik "kecil", saya sekarang bahkan mengalahkan JS Arnauld .
mengambil input dari argumen baris perintah. Jalankan dengan
-r
.kerusakan
ungolfed
Itu sebenarnya dua loop dalam satu:
Catatan: disalin dari jawaban saya pada duplikat
sumber
Japt, 10 byte
Tidak ada LCM bawaan.
Cobalah
sumber
Pyke, 3 byte, tidak bersaing
Coba di sini!
sumber
Hoon , 67 byte
Buat daftar
[1..n]
, lipat daftar dengan lcm. Sayangnya, stdlib Hoon tidak memiliki pre-built yang dapat saya gunakan: /sumber
𝔼𝕊𝕄𝕚𝕟, 7 karakter / 9 byte
Try it here (ES6 only).
Hanya satu kisaran inklusif LCM dari 1 hingga input.
sumber
AWK, 42 byte
Penggunaan baris perintah:
Saya tidak melihat
AWK
solusi dan duplikat dari pertanyaan yang baru saja diposting kemarin, jadi saya pikir saya akan menggabungkan ini. Ini pemecahan yang agak lambat19
atau lebih besar pada kotak saya, tetapi berhasil.sumber
QBIC ,
3532 byteIni membawaku ke sini.
Penjelasan:
Berikut adalah versi yang berhenti menguji
q
ketikab
tidak membaginya dengan bersih. Juga, urutan pengujianb
melawanq
dibalik dalam asumsi bahwa tinggib
's akan lebih sulit untuk bagi dengan (take2
,3
,4
misalnya: jika%2=0
,%4
bisa!0
. Begitu juga sebaliknya tidak begitu banyak ...).sumber
Aksioma, 35 byte
kode uji dan hasil
saya hanya membuat solusi dari Menemukan bilangan bulat positif terkecil yang memiliki semua bilangan bulat dari 1 ke n sebagai faktor karena Anda mengatakan itu douplicate saya posting di sini
sumber
Pari / GP , 14 byte
Cobalah online!
sumber
8 , 23 byte
Kode
Kode ini menghasilkan pseudofactorial pada TOS
Penggunaan dan contoh
Atau lebih jelas
sumber