var QUESTION_ID=117879,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/117879/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}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>
Желе ,
87 байтСпасибо @ErikTheOutgolfer за сохранение 1 байта!
Попробуйте онлайн!
Как это работает
источник
Алиса , 27 байт
Спасибо Sp3000 за
.C
идею.Попробуйте онлайн!
объяснение
Я думаю, что может быть более короткий способ вычислить это, используя треугольные числа, но я подумал, что это интересное злоупотребление встроенным, так что вот другое решение.
Основная идея состоит в том, чтобы использовать встроенные модули «pack» и «unpack» Алисы. «Пакет», или
Z
, принимает два целых числа, отображает их биективно в одно целое число. «Распаковать», илиY
, инвертирует эту биекцию и превращает одно целое в два. Обычно это можно использовать для хранения списка или дерева целых чисел в одном (большом) целом числе и восстановления отдельных значений позже. Однако в этом случае мы можем использовать функции в обратном порядке, чтобы позволить природе биекции работать на нас.Распаковка одного целого числа в два целых состоит в основном из трех шагов:
Карта ℕ → ℕ 2 , используя функцию сопряжения Кантора . То есть натуральные числа записываются по диагонали бесконечной сетки, и мы возвращаем индексы:
Например
8
, будет сопоставлен с парой(1, 2)
.Карта ℕ 2 → ℤ 2 , используя обратный шаг 1 на каждое целое по отдельности. То есть нечетные натуральные числа отображаются в отрицательные целые числа, а четные натуральные числа отображаются в неотрицательные целые числа.
Чтобы упаковать два целых числа в одно, мы просто инвертируем каждый из этих шагов.
Теперь мы можем видеть, что структура функции сопряжения Кантора удобно кодирует нужный нам треугольник (хотя значения не совпадают). Чтобы перевернуть эти диагонали, все, что нам нужно сделать, это поменять местами x и y координаты на сетке.
К сожалению, поскольку все три из вышеперечисленных шагов объединены в одну встроенную
Y
(илиZ
), нам нужно отменить отображения ℤ → ℕ или ℕ → ourselves самостоятельно. Тем не менее, при этом мы можем сохранить пару байтов, непосредственно используя сопоставления ℕ + → ℤ или ℤ → ℕ + , чтобы позаботиться об ошибке «один за другим» в таблице. Итак, вот весь алгоритм:С этим из пути мы можем смотреть на программу:
Это просто структура для линейных арифметических программ с целочисленным вводом и выводом.
источник
Желе , 8 байт
Попробуйте онлайн!
Порт моего MATL ответа.
источник
MATL ,
1511 байтПопробуйте онлайн!
Это использует формулу
источник
Октава ,
7168 байт3 байта сохранены благодаря Конору О'Брайену .
Это не работает для больших входов из-за ограничений памяти.
Попробуйте онлайн!
объяснение
Рассмотрим ввод
n = 4
. Код сначала строит матрицуЗатем он заменяет ненулевые элементы в столбцах порядка (вниз, а затем по горизонтали) от
1
,2
,3
...:Затем он переворачивает матрицу по вертикали:
Наконец, он принимает
n
-ное ненулевое значение в мажорном столбце, который в данном случае равен6
.источник
e
гений! Вы обязательно должны опубликовать его как ответ, вместе с другими вашими очень хорошими предложениями. Что касаетсяans =
, я никогда не уверен, что это действительно или нетHaskell , 31 байт
Попробуйте онлайн!
Этот ответ просто использует формулу. Это наименее интересный ответ здесь, но он также оказывается самым гольфом.
Haskell ,
383634 байтаПопробуйте онлайн!
(!0)
это функция без точек, с которой мы имеем дело.объяснение
Позвольте мне начать с того, что я очень доволен этим ответом.
Основная идея здесь заключается в том, что, если мы удалим наибольшее треугольное число, меньшее нашего ввода, мы можем обратить его вспять и добавить обратно треугольное число. Таким образом, мы определяем оператор
!
, который!
принимает наш обычный вводx
, но он также требует дополнительного числаy
.y
отслеживает размер растущего треугольного числа. Еслиx>y
мы хотим рекурсию, мы уменьшаемx
путемy
и увеличенияy
на единицу. Итак, мы рассчитаем(x-y)!(y+1)
и добавимy+1
к нему. Еслиx<=y
мы достигли нашего базового случая, для обратногоx
размещения в строке треугольника мы возвращаемся1-x
.Haskell , 54 байта
Попробуйте онлайн!
(!!)$0:(>>=)[1..]f
это бессмысленная функцияобъяснение
Первое, что нас интересует
f
,f
- это функция, которая принимаетx
и возвращаетx
строку в обратном порядке. Это делается путем вычисления первогоx-1
треугольного числа и присвоения егоu
.u<-div(x^2-x)2
, Затем мы возвращаем список[u+x,u+x-1..u+1]
.u+x
этоx
треугольное число и первое число в строке,u+x-1
на единицу меньше, чем второе число в строкеu+1
на единицу больше, чем последнее треугольное число и, следовательно, последнее число в строке.После того, как
f
у нас есть, мы формируем список(>>=)[1..]f
, который является уплощением треугольника. Мы добавляем ноль в начало,0:
чтобы наши ответы не были смещены на единицу, и добавляем его в нашу функцию индексации(!!)
.Haskell , 56 байт
Попробуйте онлайн!
Это на 2 байта длиннее, но, на мой взгляд, немного более элегантно.
источник
C (gcc) , 48 байтов
Попробуйте онлайн!
Возможно, неоптимальный, но я очень доволен этим. Использует тот факт, что
NTF N = T N + A057944 ( N ) - N + 1
(Если я правильно написал формулу, то есть.)
источник
05AB1E , 30 байтов
Попробуйте онлайн!
источник
Шелуха , 6 байт
Попробуйте онлайн!
объяснение
источник
тинилисп , 78 байт
Определяет функцию,
f
которая выполняет сопоставление.Попробуйте онлайн!Ungolfed
Мы находим наименьшее треугольное число, которое больше или равно входному номеру, а также в какой строке треугольника находится наше число. Из них мы можем вычислить перевернутую версию числа.
Основная функция
flip
просто вызывает вспомогательную функцию,_flip
начиная с верхнего ряда.источник
05AB1E , 9 байтов
Попробуйте онлайн!
объяснение
К сожалению, выравнивание массивов не очень хорошо справляется с большими списками.
Ценой в 1 байт мы могли бы сделать · t2z + ïn¹->, используя математическую формулу,
floor(sqrt(2*n)+1/2)^2 - n + 1
найденную в OEIS .источник
Пакетная, 70 байт
Использует цикл, чтобы найти индекс треугольного числа, по крайней мере, такого же размера, как
n
.источник
PHP, 35 байт
Та же формула, которая используется в подходе Арно
источник
C #,
4644 байтаЯ портирую решение @ Арно . Спасибо!
источник
APL (Дьялог), 27 байт
У меня есть два решения на одном и том же bytecount.
Поезд:
Попробуйте онлайн!
И DFN:
Попробуйте онлайн!
Оба эти решения сначала создают перевернутый треугольник, а затем извлекают элемент по индексу, указанному аргументом (
1
-based).источник
J, 25 байт
В качестве объяснения рассмотрим
f(n) = n(n+1)/2
.f(r)
, Учитывая строкуr
, возвращает крайний левый номер -r
й строке зеркальном треугольника. Теперь рассмотримg(n) = ceiling[f⁻¹(n)]
.g(i)
с учетом индексаi
возвращает строку, по которой найден индекс i. Затемf(g(n))
возвращает крайний левый номер строки, в которой найден индекс n. Итак,h(n) = f(g(n)) - (n - f(g(n)-1)) + 1
является ответом на вышеуказанную проблему.Упрощая, мы получаем
h(n) = [g(n)]² - n + 1 = ceiling[(-1 + sqrt(1 + 8n))/2]² - n + 1
.Из формул @ Арнаулда видно, что:
ceiling[(-1 + sqrt(1 + 8n))/2] = floor[1/2 + sqrt(2n)]
,источник
Пыть ,
1312 байтПорт Арнаулда подход
источник