var QUESTION_ID=83873,OVERRIDE_USER=48934;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://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+(?:\.\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>
Ответы:
Двоичное лямбда-исчисление , 114 бит = 14,25 байт
HexDump:
Binary:
объяснение
Это (λ x . (Λ y . X y (λ m . M (λ g . Λ n . N g 1) (λ n . Λ f . X ( n f )) x ) y ) (λ f . Λ z . f ( x f z ))) 3, где все числа представлены в виде церковных цифр, Церковные цифры являются стандартным представлением лямбда-исчисления натуральных чисел, и они хорошо подходят для этой задачи, потому что церковный номер определяется итерацией функции: n g является n- й итерацией функции g .
Например, если g - функция λ n . λ ф . 3 ( n f ), который умножает 3 на церковную цифру, то λ n . n g 1 - это функция, которая переводит 3 в степень церковной цифры. Повторение этой операции m раз дает
m (λ g . λ n . n g 1) (λ n . λ f . 3 ( n f )) n = u (3, n , m ).
(Мы используем умножение u (-, -, 0), а не возведение в степень u (-, -, 1) в качестве базового случая, потому что вычитание 1 из церковного числа неприятно .)
Подставим n = 3:
m (λ g . λ n . n g 1) (λ n . λ f . 3 ( n f )) 3 = u (3, 3, m ).
Повторение этой операции 64 раза, начиная с m = 4, дает
64 (λ м . М (λ г . Λ п . П г 1) (λ п . Λ е . 3 ( п е )) 3) 4 = О .
Чтобы оптимизировать это выражение, подставьте 64 = 4 ^ 3 = 3 4:
3 4 (λ м . М (λ г λ. П . П г 1) (λ п . Λ е . 3 ( п е )) 3) 4 = О .
Помните 4 = succ 3 = λ f . λ z . f (3 f z ) в качестве лямбда-аргумента:
(λ y . 3 y (λ m . m (λ g . λ n . n g 1) (λ n . λ f . 3 ( n f )) 3) y ) (λ f . λ z . f (3 f г )) = G .
Наконец, запомните 3 = λ f . λ z . f ( f ( f z )) в качестве лямбда-аргумента:
(λ x . (λ y . x y (λ m . m (λ g . λ n . n g 1) (λ n . λ f . x ( n f )) x ) y ) (λ f . λ z . е ( х е г ))) 3 = О .
источник
14.25 bytes
похоже портит таблицу лидеров. Он анализируется как25 bytes
, и поэтому вы ставитесь на второе место.Haskell, 41 байт
Объяснение:
(`i`1)f n
=i f 1 n
вычисляетn
итерацию функции,f
начиная с1
. В частности,(`i`1)(*3)n
= 3 ^ n , и повторение этой конструкции m раз даетi(`i`1)(*3)m n
= u (3, n , m ). Мы можем переписать это как(($n).i(`i`1)(*3))m
= u (3, n , m ) и повторить эту конструкцию k раз, чтобы получитьi(($3).i(`i`1)(*3))4 k
= g _ k .источник
Haskell, 43 байта
Там был лучший способ перевернуть в
g
линию.46 байтов:
48 байтов:
Просто записываю определения.
Базовые случаи немного более чистые, резервное копирование до 0, хотя это не экономит байты. Возможно, это облегчит написание альтернативного определения.
источник
+
для удаления скобок междуm-1
?(`g`3)
, нет(3`g`)
.Pyth, 25 байт
Первая часть
M?H.UgbtH*G]3^3G
определяет методg(G,H) = u(3,G,H+1)
.Для того, чтобы проверить первую часть, убедитесь , что
7625597484987=u(3,3,2)=g(3,1)
:g3 1
.Вторая часть
ug3tG64 4
начинается с,r0 = 4
а затем вычисляетсяrn = u(3,3,r(n-1)) = g(3,r(n-1))
64 раза, выводя окончательное значение (r
выбирается вместо того,g
чтобы избежать путаницы).Чтобы проверить эту часть, начните с ,
r0=2
а затем вычислитьr1
:ug3tG1 2
.источник
^3
↦*3
,tG
↦G
) и другой байт с помощью.UgbtH*G]3
↦e.ugNtHG1
.*G]3
↦ShG
.Sesos , 30 байт
разобранный
Или в обозначении Brainfuck:
тестирование
Для вычисления U (3, п , U (3, п ... у (3, п , м ) ...)) с K вложенных вызовов функции и заменить первые три
add
инструкцийadd 4
,add 64
,add 3
сadd m
,add k
,add n
соответственно. Поскольку Sesos не может строить числа быстрее, чем за линейное время, вы практически ограничены небольшими значениями, такими как u (3, 2, 2) = 27, u (3, 5, 1) = 243 и u (3, 1 , u (3, 1,… u (3, 1, m )…)) = 3.источник
[-]
с ,,
так как EOF является0
.JavaScript (ES7), 63 байта
источник
Брахилог , 57 байт
Не ожидает ввода или вывода и записывает результат в
STDOUT
. Это приведет к переполнению стека в одной точке.Для того, чтобы проверить , что это работает для малых значений (например
u(3,3,2)
) , вы можете заменить4
со значениемm
и64
с1
.объяснение
Это в основном прямая реализация объясненного способа вычисления числа.
Основной предикат:
Предикат 1:
Предикат 2:
источник
Карамель , 38 байт
Это синтаксический сахар для выражения 64 лямбда-исчисления (λ m . M (λ f . Λ n . N f 1) (λ n . Λ f . 3 ( n f )) 3) 4, где все числа представлены как церковь цифры .
источник
(n f->3 (n f))
не должно ли это читатьn-1
?(n f->3 (n f))
- это функция для умножения на три в церковных цифрах .Пролог (SWIPL), 129/137 байт
Чтобы вывести число Грэма,
g(64,G).
выполните запрос (если нужно подсчитать 8 байтов этого запроса, длина составляет 137 байтов):Но, как и следовало ожидать, это выходит за пределы стека.
Тест
Возврат приводит к тому, что он выходит за пределы стека:
Ungolfed
Версия без заглавных букв добавляет общую нотацию со стрелкой вверх, а не только для 3, и использует сокращения и проверки, чтобы избежать возврата и неопределенных ситуаций.
источник
64
в вашем коде?C 161 байт
РЕДАКТИРОВАТЬ: сохранены 11 байтов путем удаления вкладок и новых строк. РЕДАКТИРОВАТЬ: THX Auhmann сохранил еще один байт и исправил мою программу
источник
g(int a){if(a==1)return u(3,4);return g(a-1);}
так как он вообще не используется ... Или вы что-то забыли?return g(a-1)
должен бытьreturn u(3,g(a-1))
.u(a,b){return a<2?3:b<2?pow(3,a):u(u(a-1,b),b-1);}g(a){return a<2?u(3,4):u(3,g(a-1));}main(){printf("%d",g(64));}
Mathematica, 59 байт
Использует неопределенный инфиксный оператор,
±
который требует только 1 байта при кодировании в ISO 8859-1. См @ Мартин поста для получения дополнительной информации. Функции Mathematica поддерживают сопоставление с образцом для своих аргументов, так что два базовых случая могут быть определены отдельно.источник
n_ ±m_:=Nest[#±(m-1)&,3,n]
C
114109 байтОсновываясь на ответе @thepiercingarrow ( ссылка ), я немного обдумал ответ. Большая экономия объясняется неправильным набором аргументов по умолчанию при выполнении функций в стиле K & R и заменой операторов if на троичные операторы. Добавлены необязательные переводы строк между функциями для удобства чтения.
Улучшено до 109 благодаря @LeakyNun.
источник
g(a){return u(3,a<2?4:g(a-1));}
Python, 85 байт
v
Функция определяет ту же функцию, найденные в ответе Дениса :v(n,m) = u(3,n+1,m+1)
.g
Функция нулевого проиндексирована версия традиционной итерации:g(0) = v(2,3), g(n) = v(2,g(n-1))
. Таким образом,g(63)
это число Грэма. Установив значение по умолчанию дляn
параметраg
функции на63
, можно получить требуемый вывод, вызвавg()
(без параметров), таким образом, выполняя наши требования для представления функции, которая не требует ввода.Проверьте
v(2,1) = u(3,3,2)
иv(4,0) = u(3,5,1)
протестируйте онлайн: Python 2 , Python 3источник
g
отключена. Не должноv(2,n-1)
бытьg(n-1)
или что-то подобное?u
иv
означает, что это должно бытьg(n-1)-1
.Dyalog APL, 41 байт
Прецедент:
источник
1=⍺:3⋄1=⍵:3*⍺
в just1=⍵:3*⍺
(3=3*1
)Рубин, 64 байта
Заимствование из теоретического алгоритма для вычисления числа Грэма .
Проще говоря,
f a = u(3,3,a)
и это применяется 64 раза.источник
J, 107 байт
Я работаю над преобразованием
u
в повестку дня, но сейчас это подойдет.источник
u=:3^[`[:(3$:])/[#<:@]@.*@]
(не проверено)F #,
111108 байтредактировать
Это использует функцию ниже, чтобы вычислить число Грэма
Вот мой предыдущий ответ, который, ну, не сделал:
Довольно просто. Просто определение
u
функции.Использование:
Если бы я принял значение 3 в качестве значения a, я мог бы сократить его до 60:
Использование:
источник
u
. Конечно, вы можете включать любые промежуточные функции, которые вам нужны, например,u
с первым аргументом или без него, установленным в 3.R
154142128126118 байтЯ использовал определение этой рекурсивной функции из Википедии, потому что по какой-то странной причине предложенная функция не сработала ... или я просто сосу в R гольф.
UPD: побрилось 12 + 14 = 26 байт благодаря совету от Leaky Nun . Предыдущая версия использовала громоздкие и менее эффективные
UPD: сбрил еще 2 + 6 + 2 байта (опять же, похвала Лики Монахине ) благодаря гениальной замене на «if (x)» вместо «if (x == 0)», потому что x <0 никогда не подается в функция ... верно?
источник
u
в том же ключе, что и ваш,g
и сохранил еще 6 байтов - потрясающе!PHP, 114 байт
игнорировать разрывы строк; они только для удобства чтения.
Второй случай можно интегрировать в первый: для
n=1
,3^n
равно3
.Это позволит сэкономить несколько байтов на - насколько я вижу - всех существующих ответах; сэкономил два байта на моем
предыдущая версия, 62 + 43 + 11 = 116 байт
Левая ассоциативность троичного языка в PHP требует скобок ... или определенного порядка тестов.
Это сохранило два байта в выражении в скобках.
Вероятно, существует итеративный подход, который может позволить дальнейшую игру в гольф ...
но я не могу сейчас уделить этому время.
источник