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>
Respostas:
Cálculo lambda binário , 114 bits = 14,25 bytes
Hexdump:
Binário:
Explicação
Isto é (λ 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, onde todos os números são representados como números da Igreja. Os números da igreja são a representação padrão do cálculo lambda dos números naturais e são adequados para esse problema porque um número da igreja é definido pela iteração da função: n g é a n- ésima iteração da função g .
Por exemplo, se g é a função λ n . λ f . 3 ( n f ) que multiplica 3 por um número da Igreja, então λ n . n g 1 é a função que leva 3 ao poder de um numeral da Igreja. Iterar esta operação m vezes fornece
m (λ g . λ n . n g 1) (λ n . λ f . 3 ( n f )) n = u (3, n , m ).
(Usamos a multiplicação u (-, -, 0) em vez da exponenciação u (-, -, 1) como o caso base, porque subtrair 1 de um numeral da Igreja é desagradável .)
Substituto n = 3:
m (λ g . λ n . n g 1) (λ n . λ f . 3 ( n f )) 3 = u (3, 3, m ).
Iterando essa operação 64 vezes, iniciando em m = 4, fornece
64 (λ m . M (λ g . Λ n . N g 1) (λ n . Λ f . 3 ( n f )) 3) 4 = L .
Para otimizar essa expressão, substitua 64 = 4 ^ 3 = 3 4:
3 4 (λ m . M (λ g . Λ n . N g 1) (λ n . Λ f . 3 ( n f )) 3) 4 = L .
Lembre-se de 4 = succ 3 = λ f . λ z . f (3 f z ) como argumento lambda:
(λ y . 3 y (λ m . m (λ g . λ n . n g 1) (λ n . λ f . 3 ( n f )) 3) y ) (λ f . λ z . f (3 f z )) = L .
Finalmente, lembre-se de 3 = λ f . λ z . f ( f ( f z )) como argumento lambda:
(λ 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 = L .
fonte
14.25 bytes
parece estar atrapalhando a classificação. Ele é analisado como25 bytes
e, portanto, você é colocado como segundo.Haskell, 41 bytes
Explicação:
(`i`1)f n
=i f 1 n
calcula an
iteração da funçãof
iniciando em1
. Em particular,(`i`1)(*3)n
= 3 ^ n , e a iteração dessa construção m vezes fornecei(`i`1)(*3)m n
= u (3, n , m ). Podemos reescrever que quanto(($n).i(`i`1)(*3))m
= u (3, n , m ), e repita essa construção k vezes para obteri(($3).i(`i`1)(*3))4 k
= g _ k .fonte
Haskell, 43 bytes
Existe uma maneira melhor de
g
inline.46 bytes:
48 bytes:
Apenas anotando as definições.
Os casos base são um pouco mais limpos, com backup de 0, embora não salvem bytes. Talvez seja mais fácil escrever uma definição alternativa.
fonte
+
para remover os parênteses entre elesm-1
?(`g`3)
, não(3`g`)
.Pitão, 25 bytes
A primeira parte
M?H.UgbtH*G]3^3G
define um métodog(G,H) = u(3,G,H+1)
.Para testar a primeira parte, verifique se
7625597484987=u(3,3,2)=g(3,1)
:g3 1
.A segunda parte
ug3tG64 4
começar0 = 4
e depois calcularn = u(3,3,r(n-1)) = g(3,r(n-1))
64 vezes, produzindo o valor final (r
é escolhido em vez deg
evitar confusão).Para testar esta parte, comece a partir
r0=2
e depois calcularr1
:ug3tG1 2
.fonte
^3
↦*3
,tG
↦G
) e outro byte com.UgbtH*G]3
↦e.ugNtHG1
.*G]3
↦ShG
.Sesos , 30 bytes
Desmontado
Ou na notação Brainfuck:
Testando
Para calcular u (3, n , L (3, n , ... u (3, n , m ) ...)) com k aninhados chamadas para u , substituir as três primeiras
add
instruçõesadd 4
,add 64
,add 3
comadd m
,add k
,add n
, respectivamente. Como o Sesos não pode construir números mais rapidamente do que no tempo linear, você está praticamente limitado a pequenos valores como u (3, 2, 2) = 27, u (3, 5, 1) = 243 e u (3, 1 , u (3, 1,… u (3, 1, m )…)) = 3.fonte
[-]
por,
EOF0
.JavaScript (ES7), 63 bytes
fonte
Braquilog , 57 bytes
Não espera entrada nem saída e grava o resultado em
STDOUT
. Isso produzirá um estouro de pilha em um ponto.Para verificar se isso funciona com valores pequenos (por exemplo
u(3,3,2)
), você pode substituir o4
com o valor dem
e64
com1
.Explicação
Essa é basicamente uma implementação direta da maneira explicada de calcular o número.
Predicado principal:
Predicado 1:
Predicado 2:
fonte
Caramelo , 38 bytes
Este é um açúcar sintático para a expressão de cálculo lambda 64 (λ m . M (λ f . Λ n . N f 1) (λ n . Λ f . 3 ( n f )) 3) 4, onde todos os números são representados como Igreja numerais .
fonte
(n f->3 (n f))
não deveria lern-1
?(n f->3 (n f))
é uma função para multiplicação de três em numerais da Igreja .Prolog (SWIPL), 129/137 bytes
Para gerar o número de Graham, consulte
g(64,G).
(se os 8 bytes dessa consulta devem ser contados, o comprimento é de 137 bytes):Mas, como é de se esperar, isso fica sem pilha.
Teste
Voltar atrás faz com que fique sem pilha:
Ungolfed
A versão ungolfed adiciona a notação geral da seta para cima, não apenas para 3, e usa cortes e verificações para evitar retroceder e situações indefinidas.
fonte
64
em nenhum lugar do seu código?C, 161 bytes
EDIT: salvou 11 bytes removendo guias e novas linhas. EDIT: thx auhmann salvou outro byte e corrigiu meu programa
fonte
g(int a){if(a==1)return u(3,4);return g(a-1);}
já que não está sendo usado ... Ou você está esquecendo alguma coisa?return g(a-1)
deveria serreturn 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 bytes
Usa um operador infixo indefinido
±
que requer apenas 1 byte quando codificado na ISO 8859-1. Veja a publicação de @ Martin para mais informações. As funções do Mathematica suportam a correspondência de padrões para seus argumentos, de modo que os dois casos base possam ser definidos separadamente.fonte
n_ ±m_:=Nest[#±(m-1)&,3,n]
C,
114109 bytesCom base na resposta de @thepiercingarrow ( link ), reduzi bastante a resposta. A maioria das economias se deve ao abuso da digitação padrão de argumentos ao executar funções no estilo K&R e à substituição de instruções if por operadores ternários. Adicionadas novas linhas opcionais entre funções para facilitar a leitura.
Aprimorado para 109 graças a @LeakyNun.
fonte
g(a){return u(3,a<2?4:g(a-1));}
Python, 85 bytes
A
v
função define a mesma função que o encontrado na resposta de Dennis :v(n,m) = u(3,n+1,m+1)
. Ag
função é uma versão zero indexada da iteração tradicional:g(0) = v(2,3), g(n) = v(2,g(n-1))
. Assim,g(63)
é o número de Graham. Ao definir o valor padrão don
parâmetro dag
função como63
, a saída necessária pode ser obtida chamandog()
(sem parâmetros), atendendo assim aos nossos requisitos para o envio de uma função que não requer entrada.Verifique os casos de teste
v(2,1) = u(3,3,2)
ev(4,0) = u(3,5,1)
online: Python 2 , Python 3fonte
g
parece desativada. Não deveriav(2,n-1)
serg(n-1)
ou algo parecido?u
ev
significa que deveria serg(n-1)-1
.Dyalog APL, 41 bytes
Caso de teste:
fonte
1=⍺:3⋄1=⍵:3*⍺
para just1=⍵:3*⍺
(3=3*1
)Ruby, 64 bytes
Empréstimo do algoritmo teórico para calcular o número de Graham .
Simplificando,
f a = u(3,3,a)
e isso se aplica 64 vezes.fonte
J, 107 bytes
Estou trabalhando na conversão
u
para uma agenda, mas por enquanto isso serve.fonte
u=:3^[`[:(3$:])/[#<:@]@.*@]
(não testado) #F #,
111108 bytesEditar
Isso está usando a função abaixo para calcular o número de Graham
Aqui está a minha resposta anterior que, bem, não:
Bem direto. Apenas uma definição da
u
função.Uso:
Se eu assumisse 3 como o valor de a, poderia reduzi-lo para 60:
Uso:
fonte
u
. É claro que você pode incluir todas as funções intermediárias necessárias, comou
com ou sem o primeiro argumento fixado em 3. #R,
154142128126118 bytesEu usei a definição da Wikipedia dessa função recursiva porque, por alguma razão estranha, a sugerida não funcionou ... ou simplesmente sou péssima no golfe R.
UPD: raspou 12 + 14 = 26 bytes graças a uma dica da Leaky Nun . A versão anterior usava o volumoso e menos eficiente
UPD: raspou mais 2 + 6 + 2 bytes (novamente, parabéns a Leaky Nun ) devido a uma substituição engenhosa de “if (x)” em vez de “if (x == 0)” porque x <0 nunca é alimentado a função ... certo?
fonte
u
na mesma tecla que a suag
e salvou mais 6 bytes - incrível!PHP, 114 bytes
ignore as quebras de linha; eles são apenas para legibilidade.
É possível integrar o segundo caso no primeiro: for
n=1
,3^n
igual3
.Isso economizará alguns bytes em - até onde eu posso ver - todas as respostas existentes; salvou dois bytes no meu
versão anterior, 62 + 43 + 11 = 116 bytes
A associatividade esquerda do ternário do PHP requer parênteses ... ou uma ordem específica de testes.
Isso salvou dois bytes na expressão entre parênteses.
Provavelmente existe uma abordagem iterativa, que pode permitir mais golfe ...
mas não posso reservar um tempo para isso agora.
fonte