Comme vous le savez peut-être, la factorielle d'un entier positif n
est le produit de tous les entiers positifs égaux ou inférieurs à n
.
Par exemple :
6! = 6*5*4*3*2*1 = 720
0! = 1
Nous allons maintenant définir une opération spéciale avec un nom non pertinent, tel que sumFac
:
Étant donné un entier positif n
,sumFac(n)
est la somme des factorielles des chiffres.
Par exemple :
sumFac(132) = 1! + 3! + 2! = 9
Tâche
Votre mission, que vous choisissiez ou non de l’accepter, est de renvoyer la séquence (potentiellement infinie) des applications de sumFac
à un entier donné en entrée.
Exemple : 132 -> 132, 9, 362880, 81369, 403927, ...
Mais ce n'est pas tout! En effet, les applications desumFac
créeront éventuellement un cycle. Vous devez également retourner ce cycle!
Si votre langue a une factorielle intégrée, vous pouvez l'utiliser. Je ne suis pas pointilleux sur le type de retour, il vous suffit de renvoyer la séquence d'applications sumFac et le cycle dans un format compréhensible par un humain.
EDIT: Pour vous aider à mieux visualiser à quoi ressemblerait la sortie, j’ai copié Leaky Nun's juste en dessous:
[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]
Vous devez juste arrêter la séquence lorsque le cycle est sur le point de commencer pour la deuxième fois!
Mais c'est du code-golf alors la réponse la plus courte en octets gagne!
Classement
Voici un extrait de pile permettant de générer à la fois un classement régulier et un aperçu des gagnants par langue.
/* 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>
Réponses:
Gelée , 6 octets
Essayez-le en ligne!
Je ne vois pas d'autre moyen de le rendre plus court que de faire ce qui est dit.
Spécifications
132
(comme argument de ligne de commande)[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]
la source
Python 2 , 88 octets
Essayez-le en ligne!
la source
05AB1E , 12 octets
Essayez-le en ligne!
Explication
la source
s
, bonne réponse.Brachylog , 17 octets
Essayez-le en ligne!
Explication
la source
I
signifieᵃ⁾
.ᵃ³
signifie "accumuler 3 fois".ᵃ⁾
signifie "accumuler autant de fois que le dernier élément de l'entrée", ce qui est dans ce casI
. Puisqu'ilI
s'agit d'une variable totalement libre, il essaiera les valeurs de0
à+inf
.Wolfram Language,
626056 octetsIl est vraiment dommage que Wolfram Language ait des noms de fonction si longs. *Soupir*
Explication:
la source
Tr
.NestWhileList[...,All]
!JavaScript (ES6),
9189 octets2 octets sauvés grâce à fəˈnɛtɪk
Il s’avère être assez similaire à l’autre réponse de JS .
Afficher l'extrait de code
la source
ClojureScript,
146109 octetsOuais, c'est une monstruosité. Quelqu'un s'il vous plaît aidez-moi à golf cette ...
Merci de vous
@cliffroot
être débarrassé de 37 octets!Ceci est une fonction anonyme, pour exécuter la fonction, vous devez faire ceci:
TIO n'a pas ClojureScript, alors voici un lien vers un REPL ClojureScript.
Voici un lien vers un programme Clojure qui affiche le dernier élément de la liste de 0 à 1000.
Voici la sortie pour
9999
:Je soupçonne fortement que tous les chiffres doivent finalement s'installer à
1
ou en boucle[169 363601 1454]
.Code non golfé:
Explication à venir bientôt!
la source
for
peut être(for[a s](apply *(range 1(-(int a)47))))
, n'est-ce pas?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)
n'aies même pas besoin de ClojureScript, çaint
suffira(inc(int a))
devrait faire pour ClojureScript et(-(int a)47)
pour Clojure.Perl 6 , 64 octets
L'essayer
Étendu:
Chaque ligne au-dessus de qui
{
commence un nouveau bloc lambda avec un paramètre implicite de$_
.J'ai utilisé
[*] 2..$_
au lieu de[*] 1..$_
purement comme une micro optimisation.la source
JavaScript, 92 octets
Merci @Shaggy pour le golf d'un octet avec comprend
Merci @Neil pour le golf de deux octets
Code séparé en fonctions individuelles 92 octets
Code sur une ligne 92 octets
Explication
Initialement, appelez la fonction avec un seul argument, donc a = [].
Si x existe dans le tableau, retourne a
a.includes(x)?a:...
Sinon, ajoutez x à a et transmettez la somme des chiffres factoriels et a à la fonction
(a.push(x),f(k(x),a))
Factorielle La somme en chiffres effectuée de manière à ne pas dépasser la limite de récursivité maximale.
Liste de tous les points de terminaison possibles: 1, 2, 145, 169, 871, 872, 1454, 40585, 45361, 45362, 363601
Essayez-le en ligne!
la source
f=(x,a=[])=>a.includes(x)?a:(a.push(x),f(k(x),a))
f(k(x),a,a.push(x))
? De plus, je pense que vous pouvez écrirek=n=>n&&
pour sauvegarder un autre octet.Haskell ,
80 à67 octetsEssayez-le en ligne! Usage:
([]#) 132
Edit: Sauvegardé 13 octets avec des types de Ørjan Johansen!
la source
n
place des
(comme dans la réponse Python de ovs), puisf=([]#)
. (2) Basculez les branches, en lignes
et utilisezelem
.++
pour:
aussi.n:
et en changeant=g
à=[]
, mais cela ne semble être qu'une égalité.Pyth, 9 octets
Essayez-le en ligne!
Cette réponse utilise
.u
("Point fixe cumulatif. Appliquer jusqu'à ce qu'un résultat obtenu auparavant soit trouvé. Renvoyer tous les résultats intermédiaires.")la source
Pyth, 30 octets
Essayez-le ici
la source
Python 3 , 110 octets
Essayez-le en ligne!
la source
R, 120 octets
la source
o=scan()
, utiliser à lael()
place de[[1]]
, etgamma(n+1)=factorial(n)
je pense que cela enregistre un octet, et je pense queas.numeric
c'est la même chose queas.double
pour les entiers, ce qui enregistre également un octet, et vous pouvez utiliser à latoString
place deas.character
.Java 9 JSHell, 213 octets
Essayez-le en ligne!
Remarque: Cette solution repose sur la représentation sous forme de chaîne d'un nombre comportant des points de code compris entre 48 et 57. Fonctionne pour ASCII, UTF-8, Latin-1, tous les jeux de caractères ISO-8859- *, la plupart des pages de codes. Ne fonctionne pas pour EBCDIC. Je ne pense pas que quiconque va déduire des points pour cela. :)
Ungolfed:
Remarques:
la source
Pyth,
22 à11 octetsEssayez-le en ligne!
Beaucoup de crédit à la réponse de Leaky Nun , qui m'a présenté à
.u
et aidé à économiser 11 octets de ce programme, a .Explication:
la source
.u
. Je suppose que je devrai regarder à nouveau dans la référence du personnage pour voir s'il y a d'autres fonctions utiles là-bas.`N
pour convertir en chaîne au lieu de+Nk
.N
serait obsolète alors, et il y a une solution de 9 octets ...Axiome, 231 octets
pas de fonctions de golf et certains tests
la source
Java 7, 220 octets
Explication:
Code de test:
Essayez ici.
Sortie:
la source
GolfScript , 44 octets
Essayez-le en ligne!
La partie factorielle est à partir d' ici .
la source
C, 161 octets
Voir le travail en ligne.
la source
TI-BASIC,
85796460 octetsComme cela fonctionne sur une calculatrice graphique, la RAM est limitée. Essayez de le tester avec des nombres qui tournent rapidement, comme
169
.Plus d'explication:
If prod(L₁-X
fonctionne en soustrayant le nouvel élément de l'ancienne liste, puis en multipliant tous les éléments de la liste. Si l'élément était déjà dans la liste, le produit sera0
une valeur de falsey. Sinon, le produit sera un entier positif, une valeur de vérité.la source
Husk , 6 octets
Essayez-le en ligne!
la source
J ,
4031 octetsEdit: 9 octets enregistrés en utilisant les améliorations apportées par FrownyFrog. Merci!
Code d'origine:
Dans ce cas, j'ai décidé de compter les octets pour la définition du verbe, sinon cela ne fonctionne pas dans l'interpréteur.
Explication:
Essayez-le en ligne!
la source
([:-.e.~)
->(1-e.~)
[:+/!@"."0@":@{:
est la même longueur, donc il n'y a pas d'amélioration avec10#.inv
. Il fallait juste laisser tomber le()
.Tcl , 143 octets
Essayez-le en ligne!
la source