Wie Sie vielleicht wissen, ist die Fakultät einer positiven ganzen Zahl n
das Produkt aller positiven ganzen Zahlen, die gleich oder kleiner als sind n
.
Zum Beispiel :
6! = 6*5*4*3*2*1 = 720
0! = 1
Wir definieren nun eine spezielle Operation mit einem irrelevanten Namen wie sumFac
:
Gegeben eine positive ganze Zahl n
, sumFac(n)
ist die Summe des factorials der Ziffern.
Zum Beispiel :
sumFac(132) = 1! + 3! + 2! = 9
Aufgabe
Ihre Aufgabe ist es, unabhängig davon, ob Sie sie akzeptieren oder nicht, die (möglicherweise unendliche) Reihenfolge der Anwendungen sumFac
auf eine in der Eingabe angegebene Ganzzahl zurückzuführen.
Beispiel 132 -> 132, 9, 362880, 81369, 403927, ...
Aber das ist nicht alles! Tatsächlich werden die Anwendungen von sumFac
irgendwann einen Kreislauf bilden. Sie müssen diesen Zyklus auch zurückgeben!
Wenn Ihre Sprache eine eingebaute Fakultät hat, können Sie diese verwenden. Ich bin nicht wählerisch in Bezug auf den Rückgabetyp. Sie müssen lediglich die Reihenfolge der sumFac-Anwendungen und den Zyklus in einem für den Menschen verständlichen Format zurückgeben.
EDIT: Um Ihnen zu helfen, besser zu visualisieren, wie die Ausgabe aussehen soll, habe ich Leaky Nun's direkt darunter kopiert:
[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]
Sie müssen die Sequenz nur anhalten, wenn der Zyklus zum zweiten Mal gestartet wird!
Aber das ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes!
Bestenliste
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.
/* 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>
Antworten:
Gelee , 6 Bytes
Probieren Sie es online!
Ich sehe keine andere Möglichkeit, es kürzer zu machen, als wie gesagt zu tun.
Technische Daten
132
(als Kommandozeilenargument)[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]
quelle
Python 2 , 88 Bytes
Probieren Sie es online!
quelle
05AB1E , 12 Bytes
Probieren Sie es online!
Erläuterung
quelle
s
, war eine falsche, nette Antwort.Brachylog , 17 Bytes
Probieren Sie es online!
Erläuterung
quelle
I
bedeutetᵃ⁾
.ᵃ³
bedeutet "3 mal akkumulieren".ᵃ⁾
bedeutet "akkumuliere so oft wie das letzte Element der Eingabe", was in diesem Fall istI
. DaI
es sich um eine völlig freie Variable handelt, wird sie Werte von0
bis ausprobieren+inf
.Wolfram Language,
626056 BytesEs ist wirklich schade, dass Wolfram Language so unglaublich lange Funktionsnamen hat. *Seufzer*
Erläuterung:
quelle
Tr
.NestWhileList[...,All]
!JavaScript (ES6),
9189 Byte2 Bytes dank fɛnəˈtɛk eingespart
Es stellt sich heraus, dass es der anderen Antwort von JS ziemlich ähnlich ist .
Code-Snippet anzeigen
quelle
ClojureScript,
146109 BytesHuch, das ist eine Monstrosität. Jemand, bitte hilf mir Golf zu spielen ...
Danke,
@cliffroot
dass du satte 37 Bytes gespart hast!Dies ist eine anonyme Funktion. Um die Funktion auszuführen, müssen Sie Folgendes tun:
TIO hat kein ClojureScript, daher hier ein Link zu einer ClojureScript-REPL.
Hier ist ein Link zu einem Clojure-Programm, das das letzte Element in der Liste von 0 bis 1000 ausgibt.
Hier ist die Ausgabe für
9999
:Ich habe den starken Verdacht, dass sich alle Zahlen irgendwann auf
1
oder in der Schleife einstellen müssen[169 363601 1454]
.Ungolfed-Code:
Erklärung folgt in Kürze!
quelle
for
kann sein(for[a s](apply *(range 1(-(int a)47))))
, oder?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)
in ClojureScript, nurint
genügt(inc(int a))
Nun , sollte für ClojureScript und(-(int a)47)
für Clojure tun .Perl 6 , 64 Bytes
Versuch es
Erweitert:
Jede Zeile darüber
{
startet ein neues Bare-Block-Lambda mit dem impliziten Parameter$_
.Ich habe
[*] 2..$_
statt[*] 1..$_
nur eine Mikrooptimierung verwendet.quelle
JavaScript, 92 Bytes
Vielen Dank an @Shaggy für das Abschlagen eines Bytes mit Includes
Thanks @Neil für das Golfen aus zwei Bytes
Code in einzelne Funktionen 92 Bytes getrennt
Code in einer Zeile 92 Bytes
Erläuterung
Rufen Sie die Funktion zunächst mit nur einem Argument auf, also a = [].
Wenn x im Array existiert, gibt a a zurück
a.includes(x)?a:...
Ansonsten hänge x an a an und übergebe die faktorielle Ziffernsumme und a an die Funktion
(a.push(x),f(k(x),a))
Faktorielle Ziffernsumme, die so ausgeführt wird, dass die maximale Rekursionsgrenze nicht überschritten wird.
Liste aller möglichen Endpunkte: 1, 2, 145, 169, 871, 872, 1454, 40585, 45361, 45362, 363601
Probieren Sie es online!
quelle
f=(x,a=[])=>a.includes(x)?a:(a.push(x),f(k(x),a))
f(k(x),a,a.push(x))
? Ich denke, Sie können auch schreibenk=n=>n&&
, um ein weiteres Byte zu speichern.Haskell ,
8067 BytesProbieren Sie es online! Verwendung:
([]#) 132
Edit: 13 Bytes mit Texten von Ørjan Johansen gespeichert!
quelle
n
statts
(wie in der Python-Antwort von ovs)f=([]#)
. (2) Wechseln Sie die Zweige, Inlines
und verwenden Sieelem
.++
für:
auch.n:
und Ändern=g
zu=[]
, aber es scheint nur eine Krawatte zu sein.Pyth, 9 Bytes
Probieren Sie es online!
Diese Antwort verwendet
.u
("Kumulativer Fixpunkt. Anwenden, bis ein zuvor aufgetretenes Ergebnis gefunden wurde. Alle Zwischenergebnisse zurückgeben.")quelle
Pyth, 30 Bytes
Probieren Sie es hier
quelle
Python 3 , 110 Bytes
Probieren Sie es online!
quelle
R, 120 Bytes
quelle
o=scan()
,el()
anstelle von verwenden[[1]]
, undgamma(n+1)=factorial(n)
ich glaube, speichert ein Byte, und ich denke,as.numeric
ist das gleiche wieas.double
für Ganzzahlen, die auch ein Byte speichert, und Sie könnentoString
anstelle von verwendenas.character
.Java 9 JSHell, 213 Byte
Probieren Sie es online!
Hinweis: Diese Lösung basiert auf der Zeichenfolgendarstellung einer Zahl mit Codepunkten im Bereich von 48 bis 57. Funktioniert mit ASCII, UTF-8, Latin-1, allen ISO-8859- * -Zeichensätzen und den meisten Codepages. Funktioniert nicht für EBCDIC. Ich glaube nicht, dass jemand dafür Punkte abziehen wird. :)
Ungolfed:
Anmerkungen:
quelle
Pyth,
2211 BytesProbieren Sie es online!
Vielen Dank für die Antwort von Leaky Nun , die mir vorgestellt hat
.u
und dabei geholfen hat, massive 11 Bytes dieses Programms zu sparen.Erläuterung:
quelle
.u
. Ich denke, ich muss die Zeichenreferenz noch einmal durchsehen, um zu sehen, ob es dort noch andere nützliche Funktionen gibt.`N
anstelle von in Zeichenfolge konvertieren+Nk
.N
dann veraltet wäre, und es kommt eine 9-Byte-Lösung ...Axiom, 231 Bytes
Nicht Golf-Funktionen und einige Tests
quelle
Java 7, 220 Bytes
Erläuterung:
Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
GolfScript , 44 Bytes
Probieren Sie es online!
Der Fakultätsteil ist von hier .
quelle
C 161 Bytes
Sehen Sie, wie es online funktioniert.
quelle
TI-BASIC,
85796460 BytesDa dies auf einem Grafikrechner ausgeführt wird, ist der Arbeitsspeicher begrenzt. Versuchen Sie, es mit Zahlen zu testen, die sich wie z
169
.Weitere Erklärung:
If prod(L₁-X
Subtrahiert das neue Element von der alten Liste und multipliziert dann alle Elemente der Liste. Wenn das Element bereits in der Liste enthalten war, ist das Produkt0
ein falscher Wert. Andernfalls ist das Produkt eine positive ganze Zahl, ein wahrer Wert.quelle
Schale , 6 Bytes
Probieren Sie es online!
quelle
J ,
4031 BytesBearbeiten: 9 Bytes gespeichert mit den Verbesserungen von FrownyFrog. Vielen Dank!
Originalcode:
In diesem Fall habe ich mich entschieden, die Bytes für die Verbdefinition zu zählen, da es sonst im Interpreter nicht funktioniert.
Erläuterung:
Probieren Sie es online!
quelle
([:-.e.~)
->(1-e.~)
[:+/!@"."0@":@{:
ist die gleiche Länge, es gibt also keine Verbesserung mit10#.inv
. Musste nur die fallen lassen()
.Tcl , 143 Bytes
Probieren Sie es online!
quelle