Seperti yang Anda ketahui, faktorial dari bilangan bulat positif n
adalah 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 sumFac
ke bilangan bulat yang diberikan dalam input.
Contoh: 132 -> 132, 9, 362880, 81369, 403927, ...
Tapi itu belum semuanya! Memang, aplikasi pada sumFac
akhirnya 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.
/* Configuration */
var QUESTION_ID = 117583; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 68509; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
if (/<a/.test(lang)) lang = jQuery(lang).text();
languages[lang] = languages[lang] || {lang: a.language, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang > b.lang) return 1;
if (a.lang < b.lang) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body { text-align: left !important}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 290px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<div id="language-list">
<h2>Winners by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
Jawaban:
Jelly , 6 byte
Cobalah online!
Saya tidak melihat cara lain untuk membuatnya lebih pendek selain melakukan seperti yang diperintahkan.
Spesifikasi
132
(sebagai argumen baris perintah)[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]
sumber
Python 2 , 88 byte
Cobalah online!
sumber
05AB1E , 12 byte
Cobalah online!
Penjelasan
sumber
s
jawaban yang salah, bagus.Brachylog , 17 byte
Cobalah online!
Penjelasan
sumber
I
artinyaᵃ⁾
.ᵃ³
berarti "menumpuk 3 kali".ᵃ⁾
berarti "terakumulasi sebanyak elemen terakhir dari input", yang dalam hal ini adalahI
. SejakI
adalah variabel-benar bebas, ia akan mencoba nilai-nilai untuk itu dari0
ke+inf
.Bahasa Wolfram,
626056 byteSangat buruk sekali bahwa Bahasa Wolfram memiliki nama fungsi yang sangat panjang. *Mendesah*
Penjelasan:
sumber
Tr
.NestWhileList[...,All]
!JavaScript (ES6),
9189 byteDisimpan 2 byte berkat fəˈnɛtɪk
Ternyata sangat mirip dengan jawaban JS lainnya .
Tampilkan cuplikan kode
sumber
ClojureScript,
146109 byteAstaga, itu adalah keburukan. Seseorang tolong bantu saya bermain golf ini ...
Terima kasih
@cliffroot
telah memotong 37 byte kekalahan!Ini adalah fungsi anonim, untuk menjalankan fungsinya, Anda harus melakukan ini:
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
:Saya memiliki kecurigaan yang kuat bahwa semua angka akhirnya harus diselesaikan pada
1
atau loop[169 363601 1454]
.Kode tidak dikunci:
Penjelasan segera hadir!
sumber
for
bisa(for[a s](apply *(range 1(-(int a)47))))
, bukan?let
#(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)))))
(- ... 47)
di ClojureScript, hanyaint
akan cukup(inc(int a))
harus dilakukan untuk ClojureScript dan(-(int a)47)
untuk Clojure.Perl 6 , 64 byte
Cobalah
Diperluas:
Setiap baris di atas yang telah
{
memulai lambda blok baru dengan parameter implisit dari$_
.Saya menggunakan
[*] 2..$_
bukannya[*] 1..$_
murni sebagai optimasi mikro.sumber
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
Kode pada satu baris 92 byte
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))
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!
sumber
f=(x,a=[])=>a.includes(x)?a:(a.push(x),f(k(x),a))
f(k(x),a,a.push(x))
? Juga, saya pikir Anda dapat menulisk=n=>n&&
untuk menyimpan byte lain.Haskell ,
8067 byteCobalah online! Pemakaian:
([]#) 132
Sunting: Disimpan 13 byte dengan mengetik dari Ørjan Johansen!
sumber
n
bukannyas
(sama seperti dalam jawaban Python ovs), kemudianf=([]#)
. (2) Ganti cabang, sebariss
, dan gunakanelem
.++
untuk Anda:
.n:
dan mengubahnya=g
menjadi=[]
, tetapi tampaknya hanya dasi.Pyth, 9 byte
Cobalah online!
Jawaban ini menggunakan
.u
("Titik tetap kumulatif. Terapkan hingga hasil yang telah terjadi sebelumnya ditemukan. Kembalikan semua hasil antara.")sumber
Pyth, 30 byte
Coba Di Sini
sumber
Python 3 , 110 byte
Cobalah online!
sumber
R, 120 Bytes
sumber
o=scan()
, menggunakanel()
alih-alih[[1]]
, dangamma(n+1)=factorial(n)
yang saya percaya menyimpan byte, dan saya pikiras.numeric
sama denganas.double
untuk bilangan bulat, yang juga menyimpan byte, dan Anda dapat menggunakantoString
sebagai gantinyaas.character
.Java 9 JSHell, 213 byte
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:
Catatan:
sumber
Pyth,
2211 byteCobalah online!
Banyak penghargaan untuk jawaban Leaky Nun , yang memperkenalkan saya
.u
, dan membantu menyelamatkan 11 byte besar dari program ini.Penjelasan:
sumber
.u
. Saya kira saya perlu melihat referensi karakter lagi untuk melihat apakah ada fungsi lain yang berguna di sana.`N
untuk mengonversi ke string, bukan+Nk
.N
akan usang kemudian, dan ada solusi 9-byte ...Aksioma, 231 byte
bukan fungsi golf dan beberapa tes
sumber
Java 7, 220 byte
Penjelasan:
Kode uji:
Coba di sini.
Keluaran:
sumber
GolfScript , 44 byte
Cobalah online!
Bagian faktorialnya dari sini .
sumber
C, 161 byte
Lihat itu berfungsi online.
sumber
TI-BASIC,
85796460 byteKarena ini berjalan pada kalkulator grafik, ada RAM yang terbatas. Cobalah mengujinya dengan angka-angka yang berulang dengan cepat
169
.Penjelasan Lebih Lanjut:
If prod(L₁-X
bekerja dengan mengurangi elemen baru dari daftar lama, lalu mengalikan semua elemen daftar bersama-sama. Jika elemen sudah ada dalam daftar, produk akan menjadi0
, nilai palsu. Jika tidak, produk akan menjadi bilangan bulat positif, nilai kebenaran.sumber
Sekam , 6 byte
Cobalah online!
sumber
J ,
4031 byteSunting: 9 byte disimpan menggunakan penyempurnaan oleh FrownyFrog. Terima kasih!
Kode asli:
Dalam hal ini saya memutuskan untuk menghitung byte untuk definisi kata kerja, karena jika tidak maka tidak akan berfungsi dalam penerjemah.
Penjelasan:
Cobalah online!
sumber
([:-.e.~)
->(1-e.~)
[:+/!@"."0@":@{:
Panjangnya sama, jadi tidak ada peningkatan10#.inv
. Baru saja harus menjatuhkan()
.Tcl , 143 byte
Cobalah online!
sumber