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>
Jalea ,
87 bytes¡Gracias a @ErikTheOutgolfer por guardar 1 byte!
Pruébalo en línea!
Cómo funciona
fuente
Alice , 27 bytes
Gracias a Sp3000 por la
.C
idea.Pruébalo en línea!
Explicación
Creo que puede haber una forma más corta de calcular esto usando números triangulares, pero pensé que este es un abuso interesante de un incorporado, así que aquí hay una solución diferente.
La idea básica es hacer uso de los elementos integrados de "empaquetar" y "desempaquetar" de Alice. "Pack", o
Z
toma dos enteros, los asigna biyetivamente a un solo entero. "Desempaquetar", oY
, invierte esta biyección y convierte un número entero en dos. Normalmente, esto se puede usar para almacenar una lista o árbol de enteros en un solo entero (grande) y recuperar los valores individuales más adelante. Sin embargo, en este caso podemos usar las funciones en el orden opuesto, para permitir que la naturaleza de la biyección funcione para nosotros.Desempacar un entero en dos enteros consiste básicamente en tres pasos:
Mapa ℕ → ℕ 2 , utilizando la función de emparejamiento de Cantor . Es decir, los naturales se escriben a lo largo de las diagonales de una cuadrícula infinita y devolvemos los índices:
Por ejemplo
8
, se asignaría a la pareja(1, 2)
.Mapa ℕ 2 → ℤ 2 , utilizando el inverso del paso 1 en cada entero de forma individual. Es decir, los naturales impares se asignan a enteros negativos, e incluso los naturales se asignan a enteros no negativos.
Para agrupar dos enteros en uno, simplemente invertimos cada uno de esos pasos.
Ahora, podemos ver que la estructura de la función de emparejamiento de Cantor codifica convenientemente el triángulo que necesitamos (aunque los valores son off-by-one). Para invertir esas diagonales, todo lo que tenemos que hacer es intercambiar las coordenadas x e y en la cuadrícula.
Desafortunadamente, dado que los tres pasos anteriores se combinan en un solo incorporado
Y
(oZ
), necesitamos deshacer las asignaciones ℤ → ℕ o ℕ → ℤ nosotros mismos. Sin embargo, mientras lo hacemos, podemos guardar un par de bytes utilizando directamente las asignaciones ℕ + → ℤ o ℤ → ℕ + , para solucionar el error off-by-one en la tabla. Así que aquí está el algoritmo completo:Con eso fuera del camino, podemos ver el programa:
Esto es simplemente un marco para programas aritméticos lineales con entrada y salida de enteros.
fuente
Jalea , 8 bytes
Pruébalo en línea!
Puerto de mi respuesta MATL.
fuente
MATL ,
1511 bytesPruébalo en línea!
Esto usa la fórmula
fuente
Octava ,
7168 bytes3 bytes guardados gracias a Conor O'Brien .
Esto no funciona para entradas grandes debido a limitaciones de memoria.
Pruébalo en línea!
Explicación
Considere la entrada
n = 4
. El código primero construye la matrizLuego se reemplaza entradas no nulas con el fin de columna mayor (hacia abajo, luego de diámetro) por
1
,2
,3
...:Luego voltea la matriz verticalmente:
Finalmente, toma el
n
enésimo valor distinto de cero en orden de columna principal, que en este caso es6
.fuente
e
es genial! Definitivamente debe publicarlo como respuesta, junto con sus otras muy buenas sugerencias. En cuanto aans =
, nunca estoy seguro de si es válido o noHaskell , 31 bytes
Pruébalo en línea!
Esta respuesta solo usa la fórmula. Es la respuesta menos interesante aquí, pero también resulta ser la más golfista.
Haskell ,
383634 bytesPruébalo en línea!
(!0)
es la función de punto libre que nos preocupa.Explicación
Permítanme comenzar diciendo que estoy muy feliz con esta respuesta.
La idea básica aquí es que si eliminamos el número triangular más grande más pequeño que nuestra entrada, podemos revertirlo y agregar el número triangular nuevamente. Entonces definimos un operador
!
,!
toma nuestra entrada regularx
, pero también toma un número adicionaly
.y
realiza un seguimiento del tamaño del número triangular creciente. Six>y
queremos recursivo, disminuimosx
pory
e incrementary
por uno. Entonces lo calculamos(x-y)!(y+1)
y le agregamosy+1
. Six<=y
hemos alcanzado nuestro caso base, para revertirx
la ubicación en la fila del triángulo volvemos1-x
.Haskell , 54 bytes
Pruébalo en línea!
(!!)$0:(>>=)[1..]f
es una función sin puntosExplicación
Lo primero que nos ocupa es
f
,f
es una función que tomax
y devuelve elx
ª ª fila de triángulo a la inversa. Lo hace calculando primero elx-1
nd número triangular y asignándolo au
.u<-div(x^2-x)2
. Luego devolvemos la lista[u+x,u+x-1..u+1]
.u+x
es elx
número triangular th y el primer número en la fila,u+x-1
es uno menos que eso y el segundo número en la filau+1
es uno más que el último número triangular y, por lo tanto, el último número en la fila.Una vez que tenemos
f
, formamos una lista(>>=)[1..]f
, que es un aplanamiento del triángulo. Agregamos cero al frente0:
para que nuestras respuestas no se compensen con una, y se lo proporcionamos a nuestra función de indexación(!!)
.Haskell , 56 bytes
Pruébalo en línea!
Este es 2 bytes más largo pero un poco más elegante en mi opinión.
fuente
C (gcc) , 48 bytes
Pruébalo en línea!
Probablemente subóptimo, pero estoy bastante contento con este. Utiliza el hecho de que
NTF N = T N + A057944 ( N ) - N + 1
(Si escribí la fórmula correctamente, eso es).
fuente
05AB1E , 30 bytes
Pruébalo en línea!
fuente
Casco , 6 bytes
Pruébalo en línea!
Explicación
fuente
tinylisp , 78 bytes
Define una función
f
que realiza la asignación. Pruébalo en línea!Sin golf
Encontramos el número triangular más pequeño que es mayor o igual que el número de entrada, así como en qué fila del triángulo se encuentra nuestro número. A partir de estos, podemos calcular la versión invertida del número.
La función principal
flip
simplemente llama a la función auxiliar a_flip
partir de la fila superior.fuente
05AB1E , 9 bytes
Pruébalo en línea!
Explicación
Desafortunadamente, el aplanamiento de matrices no maneja muy bien las listas más grandes.
Al costo de 1 byte podríamos hacer · t2z + ïn¹-> usando la fórmula matemática
floor(sqrt(2*n)+1/2)^2 - n + 1
encontrada en OEIS .fuente
Lote, 70 bytes.
Utiliza un bucle para encontrar el índice del número triangular al menos tan grande como
n
.fuente
PHP, 35 bytes
La misma fórmula que se utiliza en el enfoque de Arnaulds
fuente
C #,
4644 bytesPuerto de E @ solución de Arnauld . ¡Gracias!
fuente
APL (Dyalog), 27 bytes
Tengo dos soluciones en el mismo bytecount.
Un tren:
Pruébalo en línea!
Y un dfn:
Pruébalo en línea!
Ambas soluciones primero crean el triángulo invertido y luego extraen el elemento en el índice indicado por el argumento (
1
basado en).fuente
J, 25 bytes
Como explicación, considere
f(n) = n(n+1)/2
.f(r)
, dada la filar
, devuelve el número más a la izquierda de la filar
th del triángulo reflejado. Ahora considereg(n) = ceiling[f⁻¹(n)]
.g(i)
, dado el índicei
, devuelve la fila en la que se encuentra el índice i. Luego,f(g(n))
devuelve el número más a la izquierda de la fila en la que se encuentra el índice n. Entonces,h(n) = f(g(n)) - (n - f(g(n)-1)) + 1
es la respuesta al problema anterior.Simplificando, obtenemos
h(n) = [g(n)]² - n + 1 = ceiling[(-1 + sqrt(1 + 8n))/2]² - n + 1
.Por el aspecto de la fórmula de @ Arnauld, parece que:
ceiling[(-1 + sqrt(1 + 8n))/2] = floor[1/2 + sqrt(2n)]
.fuente
Pyt ,
1312 bytesEnfoque del puerto de Arnauld
fuente