The faktorial Number System , juga disebut factoradic, adalah sistem radix angka campuran. Faktorial menentukan nilai tempat suatu angka.
Dalam sistem ini, digit paling kanan bisa 0 atau 1, digit paling kanan kedua bisa 0, 1 atau 2, dan seterusnya. Ini berarti bahwa n
angka faktoradik digit dapat memiliki nilai maksimum (n + 1)!
.
Misalnya, untuk mengonversi angka faktoradik 24201
menjadi desimal, Anda akan melakukan ini:
2 * 5! = 240
4 * 4! = 96
2 * 3! = 12
0 * 2! = 0
1 * 1! = 1
240 + 96 + 12 + 0 + 1 = 349
Oleh karena itu angka faktoradik 24201
adalah 349
basa 10
.
Untuk mengonversi angka desimal (dengan 349
sebagai contoh) menjadi angka faktoradik, Anda akan melakukan ini:
Ambil faktorial terbesar kurang dari jumlah. Dalam hal ini 120
, atau 5!
.
349 / 5! = 2 r 109
109 / 4! = 4 r 13
13 / 3! = 2 r 1
1 / 2! = 0 r 1
1 / 1! = 1 r 0
Karenanya 349
basis 10
adalah angka faktoradik 24201
.
Tantangan Anda adalah membuat program atau fungsi terpendek yang mengubah nomor input ke basis lain.
Input akan berupa representasi string dari integer non-negatif. Angka faktoradik akan didahului oleh !
(mis. !24201
), Sedangkan angka desimal tidak akan didahului oleh apa pun. Anda dapat berasumsi bahwa input maksimum adalah 10! - 1
- 3628799
dalam desimal dan 987654321
faktoradik. Ini berarti bahwa huruf tidak akan muncul dalam input / output faktoradik.
Program tidak perlu menambahkan sebuah !
ke keluaran faktoradik, dan dapat menampilkan string atau integer. Masukan mungkin dalam format yang masuk akal.
Kasus uji:
Input: 1234
Output: 141120
Input: 746
Output: 101010
Input: !54321
Output: 719
Input: !30311
Output: 381
sumber
⍴⍵∩'!'
dengan'!'∊⍵
untuk menyimpan karakter.~'!'
dengan∩⎕D
untuk menyimpan karakter.Python 2.7 (
163157152)Versi yang lebih mudah dibaca:
Kerusakan:
sumber
'!'==i[0]
dengan'!'in i
, dan bisa menggunakana=x=1
. Juga, Anda tidak perlu tanda kurung di sekitar pernyataan eksekutif.(len(i)-1)
dengan~-len(i)
.(a,b)['!'in i]
dan berhasil mencukur 6 karakter. Ini tidak dapat dibaca seperti dulu ... tautan pastebinGolfScript (
48 4443 karakter)Ini adalah program mandiri. Factoriadic => konversi desimal cukup lambat, karena ia melakukan pencarian menggunakan konversi desimal => factoriadic daripada konversi basis langsung.
Format input memungkinkan untuk mode switch yang sangat singkat:
.~
menyalin string input dan mengevaluasinya, jadi jika inputnya hanya berupa angka, kita berakhir dengan mis."1234" 1234
Pada stack, dan jika dimulai dengan!
(tidak logis, dengan sembarang kosong) string menjadi benar) kita berakhir dengan misalnya0 30311
pada stack. Kemudian nilai di bagian bawah tumpukan benar untuk desimal => factoriadic dan falsy untuk factoriadic => decimal.sumber
PHP <7.1
178 171 170 168 164 155 147 144 138 126123 byteJalankan sebagai pipa dengan
-r
atau uji secara online .subfungsi: basis faktorial sedang digunakan kembali (bertambah / berkurang di loop)desimal 0 mengembalikan string kosong sebagai ganti(kedua jawaban PHP lainnya juga.)0
.Jika itu tidak dapat diterima, tambahkan +5 untuk case tambahan.ungolfed:
ide golf ditinggalkan:
$b<=$x
->$b<$x
(-1)akan memecah faktorial desimal murni (yaitu yang menghasilkan bilangan faktorial dengan hanya satu digit bukan nol). Solusi JMPC menderita karenanya; HamZa tidak.
floor($x/$b)
->(int)($x/$b)
bisa sedikit lebih cepat, tetapi tipe casting mendahului divisi, jadi saya perlu tanda kurung dan jangan mendapatkan byte.
$x/$b|0
lakukan triknyaLoop pada fact-> dec mirip dengan factorial-find dalam dec-> fact. Selisih yang sama, body tidak masalah, tetapi sayangnya kondisi preset dan postingan berbeda. Dang; bisa bermain golf -21 di sana.YA saya menemukan solusinya. Mengambil sedikit golf, tetapi memotong -4 (no: -9) dan menutup semua bug / celah.
Adakah yang lebih potensial ... atau apakah saya sudah bermain golf?
sumber
+$r
alih-alih$r|0
menyimpan satu byte. Sama untukif($x|0)
JavaScript (ES 6)
139 137 122 113111mencoba pendekatan yang berbeda menggunakan beberapa array magic; tapi saya berakhir di
174172 byte dengan itu:Jadi saya hanya mengambil kode PHP saya dan menerjemahkannya. Bisa menghapus semua
$
dan beberapa;
, tetapi keharusan untuk menginisialisasi vars memakan beberapa manfaat itu. Berhasil untuk golf kedua jawaban turun sedikit lebih jauh.bermain golf
ungolfed
test suite
sumber
.split('')
=>.split``
f=
. Juga, bisar+=(x/(b/=j--)|0)
menjadir+=x/(b/=j--)|0
?Perl 6 ,
666560 byte-1 byte terima kasih kepada Jo King
Cobalah online!
sumber
GolfScript, 69 karakter
Mengambil input dari STDIN seperti biasa dan mencetak hasilnya. Tes online .
sumber
Haskell, 221 karakter
Golf kode
Pemakaian
Kode tidak dikunci
sumber
Mathematica
213 177175Sejumlah faktorial dibungkus
f[]
, apakah itu input atau output.Pemakaian
Konversi faktorial ke angka desimal .
QuotientRemainder[n,j!]
secara rekursif bertindak pada digit nomor faktorial dari kiri ke kanan, menurunj
pada setiap langkah.QuotientRemainder[349, 5!]
, misalnya, pengembalian{2, 109}
dan sebagainya.Konversi angka desimal ke faktorial . Bergerak ke kanan ke kiri, fungsi murni
# (p++)! &
,, mengalikan setiap digit,#
, dengan faktorial yang sesuai.sumber
Python, 128 karakter
Ini membutuhkan waktu sekitar setengah jam untuk berjalan, tetapi kecil:
Itu membangun daftar semua nomor faktoradik <= 9 digit dalam urutan numerik, kemudian melakukan pencarian atau indeks untuk dikonversi.
Jika Anda ingin menguji, ganti saja
10**9
dengan10**6
dan batasi diri Anda dengan angka variadic 6 digit.Secara teknis saya bisa menyimpan karakter dengan menggunakan
range(10**9)
alih-alihxrange(10**9)
. Jangan coba ini di rumah.sumber
d+2
danfor
PHP
231214204Jawaban Terbaru
Jawaban Lama
Contoh
Keluaran
sumber
foreach(range())
dapat diganti denganfor
loop sederhana (-9). Saya suka ide itu.24
harus kembali1000
tetapi kembali400
. fix:g(++$p)<$x
->g(++$p)<=$x
(+1)for
membangun:,
seharusnya;
3) Saya punya 7 perubahan lain menghemat 20 byte pada kode itu. Ingin mereka?if
kondisi, kemudian menggunakan kondisi tersebut, kemudian menggunakan my sexy type cast to int (-6) Ini tidak akan memengaruhi hasil 0 desimal! e)for
konstruk yang tersisa dapat ditulis ulang dengan sangat baguswhile(++$t<$c=strlen($x))
: kenaikan sebelum tubuh -> $ t tidak perlu inisialisasi (-6)JELLY, 5 byte
Penjelasan
* Jelly lebih muda dari usia pertanyaan karena itu jawaban saya tidak bersaing.
sumber
V
danṾ
.)Jelly , 15 byte
Cobalah online!
Bagaimana itu bekerja
Mengapa
*)
bekerja¬
unsur-bijaksana TIDAK logis. Ketika diberi bilangan bulat tunggal, itu menjadi nol tunggal, yang salah. Namun, ketika diberi string, setiap elemen (karakter) berubah menjadi nol, dan keseluruhan hasilnya adalah array nol yang benar.Nol sebagai bilangan bulat adalah kasus khusus. Ia melewati rute "faktorial -> integer", tetapi masih memberikan nol yang benar.
Tanpa basis faktorial bawaan, 25 byte
Cobalah online!
Bagaimana itu bekerja
sumber
K, 102
Pasti bisa ditingkatkan.
sumber
D (159 karakter)
Tidak disatukan dan dengan titik masuk program
Semua argumen baris perintah dicetak sebagai
<original> -> <converted>
. Hanya desimal ke faktoradik yang benar-benar diterapkan dix
. Sebaliknya hanya panggilanx
dengan semua angka desimal (0 .. *) hingga hasilnya sama dengan input. Ini membutuhkan ~ 3 detik untuk input terbesar (! 987654321).Versi online yang dapat dieksekusi: http://dpaste.dzfl.pl/46e425f9
sumber
string n
kechar[]n
menyimpan satu byte (saya tahu aku terlambat sini).if(n[0]<48){while(r.text.x<n[1..$].to!int)r++;}
bisa menjadiif(n[0]<48)while(r.text.x<n[1..$].to!int)r++;
menghemat dua byte.VBA 225
Terima kasih kepada Titus atas bantuannya! Masih ingin bermain golf lagi.
sumber
b
nilai numerik daripada membandingkan karakter pertama?If Not IsNumeric(b) Then
tetapi itu membutuhkan lebih banyak karakter. Sekarang, saya tidak masuk dan memeriksa ulang semua kode; mungkin ada cara yang sedikit lebih baik untuk melakukan ini denganIsNumeric
keseluruhan. - Koreksi, ada sedikit peningkatan di sini. Terima kasih!For d=9To 1Step-1
danFact(d)
->For d=0To 8
danFact(9-d)
dan dua lagi jika Anda lakukanFor d=2To e
danFact(e-d+1)*Mid(b,d,1)
PHP , 124 byte
Cobalah online!
Diperpanjang
sumber
Perl 6 , 150 byte
sumber
APL (NARS), 36 karakter, 72 byte
tampaknya 10⊥ (9..2) ⊤ lebih baik daripada fungsi rekursif, terima kasih kepada Howard untuk solusi APL lainnya yang menunjukkan bahwa ... (bahkan jika saya tidak mengerti 100%). Masukkan nomor tanpa '!' <10 !. Uji:
sumber