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>
Gelée ,
87 octetsMerci à @ErikTheOutgolfer pour avoir économisé 1 octet!
Essayez-le en ligne!
Comment ça marche
la source
Alice , 27 octets
Merci à Sp3000 pour l'
.C
idée.Essayez-le en ligne!
Explication
Je pense qu'il peut y avoir un moyen plus court de calculer cela en utilisant des nombres triangulaires, mais je pensais que c'était un abus intéressant d'un intégré, alors voici une solution différente.
L'idée de base est d'utiliser les modules intégrés "pack" et "unpack" d'Alice. "Pack", ou
Z
, prend deux entiers les mappe bijectivement à un seul entier. "Déballer", ouY
, inverse cette bijection et transforme un entier en deux. Normalement, cela peut être utilisé pour stocker une liste ou un arbre d'entiers dans un seul (grand) entier et récupérer les valeurs individuelles plus tard. Cependant, dans ce cas, nous pouvons utiliser les fonctions dans l'ordre inverse, pour laisser la nature de la bijection fonctionner pour nous.Décompresser un entier en deux entiers consiste essentiellement en trois étapes:
Carte ℕ → ℕ 2 , à l'aide de la fonction d'appariement Cantor . Autrement dit, les naturels sont écrits le long des diagonales d'une grille infinie et nous renvoyons les indices:
Par exemple,
8
serait mappé à la paire(1, 2)
.Mappez ℕ 2 → ℤ 2 , en utilisant l'inverse de l'étape 1 sur chaque entier individuellement. Autrement dit, les naturels impairs sont mappés sur des nombres entiers négatifs, et même les naturels sont mappés sur des nombres entiers non négatifs.
Pour regrouper deux entiers en un, nous inversons simplement chacune de ces étapes.
Maintenant, nous pouvons voir que la structure de la fonction d'appariement de Cantor code commodément le triangle dont nous avons besoin (bien que les valeurs soient décalées d'une unité). Pour inverser ces diagonales, tout ce que nous devons faire est d'échanger les coordonnées x et y dans la grille.
Malheureusement, étant donné que les trois étapes ci-dessus sont combinées en un seul intégré
Y
(ouZ
), nous devons annuler les mappages ℤ → ℕ ou ℕ → ℤ nous-mêmes. Cependant, ce faisant, nous pouvons enregistrer quelques octets en utilisant directement les mappages ℕ + → ℤ ou ℤ → ℕ + , pour prendre soin de l'erreur de coup par coup dans le tableau. Voici donc l'algorithme entier:Avec cela à l'écart, nous pouvons regarder le programme:
Il s'agit simplement d'un cadre pour les programmes arithmétiques linéaires avec entrée et sortie entières.
la source
Gelée , 8 octets
Essayez-le en ligne!
Port de ma réponse MATL.
la source
MATL ,
1511 octetsEssayez-le en ligne!
Cela utilise la formule
la source
Octave ,
7168 octets3 octets économisés grâce à Conor O'Brien .
Cela ne fonctionne pas pour les grandes entrées en raison de limitations de mémoire.
Essayez-le en ligne!
Explication
Tenez compte des commentaires
n = 4
. Le code construit d'abord la matriceEnsuite , il remplace les entrées non nulles dans l' ordre des colonnes-major (vers le bas, puis à travers) par
1
,2
,3
...:Il retourne ensuite la matrice verticalement:
Enfin, il prend la
n
-ème valeur non nulle dans l'ordre des colonnes, ce qui est dans ce cas6
.la source
e
génie! Vous devriez certainement le poster comme réponse, avec vos autres très bonnes suggestions. Quant àans =
, je ne suis jamais sûr qu'il soit valide ou nonHaskell , 31 octets
Essayez-le en ligne!
Cette réponse utilise simplement la formule. C'est la réponse la moins intéressante ici, mais c'est aussi la plus golfique.
Haskell ,
383634 octetsEssayez-le en ligne!
(!0)
est la fonction sans point qui nous intéresse.Explication
Permettez-moi de commencer en disant que je suis très satisfait de cette réponse.
L'idée de base ici est que si nous supprimons le plus grand nombre triangulaire plus petit que notre entrée, nous pouvons l'inverser et rajouter le nombre triangulaire. Nous définissons donc un opérateur
!
,!
prend notre entrée régulièrex
, mais il prend également un nombre supplémentairey
.y
garde une trace de la taille du nombre triangulaire croissant. Six>y
nous voulons récursif, nous diminuonsx
pary
et d' augmentery
par un. Nous calculons donc(x-y)!(y+1)
et ajoutonsy+1
à cela. Six<=y
nous avons atteint notre cas de base, pour inverserx
le placement dans la ligne du triangle, nous revenons1-x
.Haskell , 54 octets
Essayez-le en ligne!
(!!)$0:(>>=)[1..]f
est une fonction sans pointExplication
La première chose qui nous intéresse est
f
,f
est une fonction qui prendx
et retourne lax
th ligne du th triangle en sens inverse. Pour ce faire, il calcule d'abord lex-1
nd nombre triangulaire et l'affecte àu
.u<-div(x^2-x)2
. Nous retournons ensuite la liste[u+x,u+x-1..u+1]
.u+x
est lex
numéro triangulaire et le premier numéro de la ligne,u+x-1
est inférieur de un et le deuxième numéro de la ligneu+1
est un de plus que le dernier numéro triangulaire et donc le dernier numéro de la ligne.Une fois que nous avons,
f
nous formons une liste(>>=)[1..]f
, qui est un aplatissement du triangle. Nous ajoutons zéro au début avec0:
pour que nos réponses ne soient pas compensées par un, et le fournissons à notre fonction d'indexation(!!)
.Haskell , 56 octets
Essayez-le en ligne!
Celui-ci fait 2 octets de plus mais un peu plus élégant à mon avis.
la source
C (gcc) , 48 octets
Essayez-le en ligne!
Probablement sous-optimal, mais je suis assez content de celui-ci. Utilise le fait que
NTF N = T N + A057944 ( N ) - N + 1
(Si j'ai bien écrit la formule, c'est.)
la source
05AB1E , 30 octets
Essayez-le en ligne!
la source
Husk , 6 octets
Essayez-le en ligne!
Explication
la source
tinylisp , 78 octets
Définit une fonction
f
qui effectue le mappage.Essayez-le en ligne!Non golfé
Nous trouvons le plus petit nombre triangulaire supérieur ou égal au nombre d'entrée, ainsi que la ligne du triangle dans laquelle se trouve notre nombre. À partir de ceux-ci, nous pouvons calculer la version inversée du nombre.
La fonction principale
flip
appelle simplement la fonction d'aide à_flip
partir de la ligne supérieure.la source
05AB1E , 9 octets
Essayez-le en ligne!
Explication
L'aplatissement des tableaux ne gère malheureusement pas très bien les grandes listes.
Au prix d'un octet, nous pourrions faire · t2z + ïn¹-> en utilisant la formule mathématique
floor(sqrt(2*n)+1/2)^2 - n + 1
trouvée sur OEIS .la source
Lot, 70 octets
Utilise une boucle pour trouver l'index du nombre triangulaire au moins aussi grand que
n
.la source
PHP, 35 octets
Même formule que celle utilisée dans l' approche Arnaulds
la source
C #,
4644 octetsJe porte la solution de @ Arnauld . Merci!
la source
APL (Dyalog), 27 octets
J'ai deux solutions en même temps.
Un train:
Essayez-le en ligne!
Et un dfn:
Essayez-le en ligne!
Ces deux solutions créent d'abord le triangle inversé, puis extraient l'élément à l'index indiqué par l'argument (
1
basé sur).la source
J, 25 octets
Comme explication, réfléchissez
f(n) = n(n+1)/2
.f(r)
, étant donné la ligner
, renvoie le nombre le plus à gauche de lar
e ligne du triangle en miroir. Maintenant, réfléchissezg(n) = ceiling[f⁻¹(n)]
.g(i)
, étant donné l'indexi
, renvoie la ligne sur laquelle se trouve l'index i. Ensuite,f(g(n))
retourne le plus à gauche numéro de la ligne sur laquelle l' indice n est trouvé. C'est donch(n) = f(g(n)) - (n - f(g(n)-1)) + 1
la réponse au problème ci-dessus.Simplifiant, nous obtenons
h(n) = [g(n)]² - n + 1 = ceiling[(-1 + sqrt(1 + 8n))/2]² - n + 1
.D'après l'apparence de la formule de @ Arnauld, il semble que:
ceiling[(-1 + sqrt(1 + 8n))/2] = floor[1/2 + sqrt(2n)]
.la source
Pyt ,
1312 octetsApproche du port d' Arnauld
la source