Как вы, возможно, знаете, факториал натурального числа n
является произведением всех натуральных чисел, равных или меньших n
.
Например :
6! = 6*5*4*3*2*1 = 720
0! = 1
Теперь мы определим специальную операцию с нерелевантным именем, например sumFac
:
Учитывая положительное целое число n
, sumFac(n)
это сумма факториалов цифр.
Например :
sumFac(132) = 1! + 3! + 2! = 9
задача
Ваша миссия, независимо от того, решите вы ее принять или нет, состоит в том, чтобы вернуть последовательность (потенциально бесконечную) применений sumFac
целого числа, указанного во входных данных.
Пример : 132 -> 132, 9, 362880, 81369, 403927, ...
Но это не все! Действительно, приложения в sumFac
конечном итоге создадут цикл. Вы также должны вернуть этот цикл!
Если ваш язык имеет встроенный факториал, вы можете использовать его. Я не придирчив к типу возвращаемого значения, вам просто нужно вернуть последовательность приложений sumFac и цикл в формате, понятном человеку.
РЕДАКТИРОВАТЬ: Чтобы помочь вам лучше визуализировать, как должен выглядеть вывод, я скопировал Leaky Nun чуть ниже:
[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]
Вам просто нужно остановить последовательность, когда цикл собирается начать во второй раз!
Но это код-гольф, поэтому выигрывает самый короткий ответ в байтах!
Leaderboard
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.
/* 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>
Ответы:
Желе , 6 байт
Попробуйте онлайн!
Я не вижу другого способа сделать его короче, кроме как делать, как сказано.
Спекуляции
132
(как аргумент командной строки)[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]
источник
Python 2 , 88 байт
Попробуйте онлайн!
источник
05AB1E , 12 байтов
Попробуйте онлайн!
объяснение
источник
s
, был неправильный, хороший ответ.Брахилог , 17 байт
Попробуйте онлайн!
объяснение
источник
I
значит?ᵃ⁾
.ᵃ³
означает «накапливать 3 раза».ᵃ⁾
означает «накапливать столько раз, сколько последний элемент ввода», что в этом случаеI
. ТакI
как это полностью свободная переменная, она будет пытаться значения для нее от0
до+inf
.Wolfram Language,
626056 байтОчень плохо, что в Wolfram Language есть такие отвратительно длинные имена функций. *Вздох*
Объяснение:
источник
Tr
.NestWhileList[...,All]
!JavaScript (ES6),
9189 байтСохранено 2 байта благодаря fəˈnɛtɪk
Оказывается, он очень похож на другой ответ JS .
Показать фрагмент кода
источник
ClojureScript,
146109 байтДа, это чудовище. Кто-нибудь, пожалуйста, помогите мне в этом ...
Спасибо,
@cliffroot
что сбрил колоссальные 37 байт!Это анонимная функция, для запуска функции необходимо сделать следующее:
TIO не имеет ClojureScript, поэтому вот ссылка на REPL ClojureScript.
Вот ссылка на программу Clojure, которая печатает последний элемент в списке от 0 до 1000.
Вот вывод для
9999
:У меня есть сильное подозрение, что все числа должны в конечном итоге обосноваться на
1
или петле[169 363601 1454]
.Ungolfed код:
Объяснение скоро!
источник
for
может быть(for[a s](apply *(range 1(-(int a)47))))
, не так ли?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)
ClojureScript, простоint
будет достаточно(inc(int a))
следует сделать для ClojureScript и(-(int a)47)
для Clojure.Perl 6 , 64 байта
Попытайся
Expanded:
Каждая строка выше этого имеет
{
новый лямбда-блок с неявным параметром$_
.Я использовал
[*] 2..$_
вместо[*] 1..$_
чисто микро оптимизации.источник
JavaScript, 92 байта
Спасибо @Shaggy за игру в один байт с включенными
включением Спасибо @Neil за игру в гольф с двумя байтами
Код разделен на отдельные функции 92 байта
Код в одной строке 92 байта
объяснение
Сначала вызовите функцию только с одним аргументом, поэтому a = [].
Если x существует в массиве, возвращается
a.includes(x)?a:...
В противном случае добавьте x к a и передайте сумму цифр факториала и a в функцию
(a.push(x),f(k(x),a))
Сумма Factorial Digit выполнена так, чтобы она не превышала максимального предела рекурсии.
Список всех возможных конечных точек: 1, 2, 145, 169, 871, 872, 1454, 40585, 45361, 45362, 363601
Попробуйте онлайн!
источник
f=(x,a=[])=>a.includes(x)?a:(a.push(x),f(k(x),a))
f(k(x),a,a.push(x))
? Кроме того, я думаю, что вы можете написать,k=n=>n&&
чтобы сохранить еще один байт.Haskell ,
8067 байтПопробуйте онлайн!Использование:
([]#) 132
Изменить: 13 байтов с типами от Орджана Йохансена!
источник
n
вместоs
(так же, как в ответе Python от ovs), затемf=([]#)
. (2) Переключите ветви, встроенныеs
и используйтеelem
.++
FOR:
также.n:
и изменив=g
на=[]
, но, похоже, это всего лишь ничья.Pyth, 9 байт
Попробуйте онлайн!
Этот ответ использует
.u
(«Накопительная фиксированная точка. Применять до тех пор, пока не будет найден результат, полученный до того, как будет найден. Вернуть все промежуточные результаты».)источник
Pyth, 30 байт
Попробуй здесь
источник
Python 3 , 110 байт
Попробуйте онлайн!
источник
R, 120 байт
источник
o=scan()
, использоватьel()
вместо[[1]]
, и, какgamma(n+1)=factorial(n)
я считаю, сохраняет байт, и я думаю, чтоas.numeric
то же самое, что иas.double
для целых чисел, которые также сохраняют байт, и вы можете использоватьtoString
вместоas.character
.Java 9 JSHell, 213 байт
Попробуйте онлайн!
Примечание. Это решение основано на строковом представлении числа, имеющего кодовые точки в диапазоне 48-57. Работает для ASCII, UTF-8, Latin-1, всех наборов символов ISO-8859- *, большинства кодовых страниц. Не работает для EBCDIC. Я не думаю, что кто-то вычитает очки за это. :)
Ungolfed:
Заметки:
источник
Pyth,
2211 bytesTry it online!
Lots of credit to Leaky Nun's answer, which introduced me to
.u
, and helped save a massive 11 bytes of this program.Explanation:
источник
.u
. Думаю, мне нужно еще раз просмотреть ссылку на символ, чтобы увидеть, есть ли там другие полезные функции.`N
для преобразования в строку вместо+Nk
.N
устареет тогда, и приходит 9-байтовое решение ...Аксиома, 231 байт
не гольфовые функции и некоторый тест
источник
Java 7, 220 байт
Объяснение:
Тестовый код:
Попробуй это здесь.
Выход:
источник
GolfScript , 44 байта
Попробуйте онлайн!
Факторная часть отсюда .
источник
C 161 байт
Посмотрите, как это работает онлайн.
источник
TI-BASIC,
85796460 байтПоскольку он работает на графическом калькуляторе, объем ОЗУ ограничен. Попробуйте проверить это с числами, которые зацикливаются быстро, как
169
.Более объяснение:
If prod(L₁-X
работает, вычитая новый элемент из старого списка, затем умножая все элементы списка вместе. Если элемент уже был в списке, продукт будет0
ошибочным значением. В противном случае произведение будет целым положительным, истинным значением.источник
Шелуха , 6 байт
Попробуйте онлайн!
источник
J ,
4031 байтРедактировать: 9 байтов сохранены с использованием улучшений FrownyFrog. Благодарность!
Оригинальный код:
В этом случае я решил подсчитать байты для определения глагола, так как в противном случае он не работает в интерпретаторе.
Объяснение:
Try it online!
источник
([:-.e.~)
->(1-e.~)
[:+/!@"."0@":@{:
is the same length, so there's no improvement with10#.inv
. Just had to drop the()
.Tcl, 143 bytes
Try it online!
источник