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>
Gelee ,
87 BytesVielen Dank an @ErikTheOutgolfer für das Speichern von 1 Byte!
Probieren Sie es online!
Wie es funktioniert
quelle
Alice , 27 Bytes
Danke an Sp3000 für die
.C
Idee.Probieren Sie es online!
Erläuterung
Ich denke, es gibt einen kürzeren Weg, dies mit Dreieckszahlen zu berechnen, aber ich dachte, dies ist ein interessanter Missbrauch einer eingebauten, also hier ist eine andere Lösung.
Die Grundidee besteht darin, die integrierten Funktionen "packen" und "entpacken" von Alice zu verwenden. "Pack" oder "take
Z
two integers" ordnet sie bijektiv einer einzelnen Ganzzahl zu. "Unpack" oderY
invertiert diese Bijektion und wandelt eine Ganzzahl in zwei um. Normalerweise kann dies verwendet werden, um eine Liste oder einen Baum von Ganzzahlen in einer einzelnen (großen) Ganzzahl zu speichern und die einzelnen Werte später wiederherzustellen. In diesem Fall können wir jedoch die Funktionen in umgekehrter Reihenfolge verwenden, damit die Art der Bijektion für uns funktioniert.Das Entpacken einer Ganzzahl in zwei Ganzzahlen besteht im Wesentlichen aus drei Schritten:
Ordnen Sie ℕ → ℕ 2 mithilfe der Cantor-Pairing-Funktion zu . Das heißt, die Naturalien sind entlang der Diagonalen eines unendlichen Gitters geschrieben und wir geben die Indizes zurück:
ZB
8
würde das Paar zugeordnet werden(1, 2)
.Ordnen Sie ℕ 2 → ℤ 2 zu , indem Sie die Umkehrung von Schritt 1 für jede ganze Zahl einzeln verwenden. Das heißt, ungerade natürliche Werte werden negativen ganzen Zahlen zugeordnet, und gerade natürliche Werte werden nicht negativen ganzen Zahlen zugeordnet.
Um zwei ganze Zahlen in eine zu packen, invertieren wir einfach jeden dieser Schritte.
Jetzt können wir sehen, dass die Struktur der Cantor-Pairing-Funktion das benötigte Dreieck bequem codiert (obwohl die Werte nicht eins sind). Um diese Diagonalen umzukehren, müssen wir nur die x- und y- Koordinaten in das Gitter tauschen .
Leider müssen wir die Zuordnungen into → ℕ oder ℕ → ℤ selbst rückgängig machen , da alle drei oben genannten Schritte in einem integrierten
Y
(oderZ
) zusammengefasst sind . Währenddessen können wir jedoch einige Bytes durch direktes Verwenden der Zuordnungen ℕ + → ℤ oder ℤ → ℕ + speichern, um den Fehler in der Tabelle zu beheben, bei dem nur ein Byte vorkommt . Also hier ist der gesamte Algorithmus:Damit können wir uns das Programm ansehen:
Dies ist lediglich ein Framework für lineare arithmetische Programme mit ganzzahliger Eingabe und Ausgabe.
quelle
Gelee , 8 Bytes
Probieren Sie es online!
Port meiner MATL-Antwort.
quelle
MATL ,
1511 BytesProbieren Sie es online!
Dies verwendet die Formel
quelle
Oktave ,
7168 BytesDank Conor O'Brien konnten 3 Bytes eingespart werden .
Dies funktioniert bei großen Eingaben aufgrund von Speicherbeschränkungen nicht.
Probieren Sie es online!
Erläuterung
Betrachten Sie die Eingabe
n = 4
. Der Code erstellt zuerst die MatrixDann ersetzt es von Null verschiedenen Einträge in der Spalte-Großauftrag (nach unten, dann quer) durch
1
,2
,3
...:Dann wird die Matrix vertikal gespiegelt:
Schließlich nimmt es den
n
-ten Wert ungleich Null in der Hauptreihenfolge der Spalten an, was in diesem Fall der Fall ist6
.quelle
e
ist Genie! Sie sollten es auf jeden Fall als Antwort zusammen mit Ihren anderen sehr guten Vorschlägen posten. Wasans =
, bin ich es nie ist es sicher gültig ist oder nichtHaskell , 31 Bytes
Probieren Sie es online!
Diese Antwort verwendet nur die Formel. Es ist die am wenigsten interessante Antwort, aber es ist auch die golferischste.
Haskell ,
383634 BytesProbieren Sie es online!
(!0)
ist die punktfreie Funktion, um die es uns geht.Erläuterung
Lassen Sie mich zunächst sagen, dass ich mit dieser Antwort sehr zufrieden bin.
Die Grundidee hier ist, dass wenn wir die größte dreieckige Zahl entfernen, die kleiner als unsere Eingabe ist, wir sie umkehren und die dreieckige Zahl wieder hinzufügen können. Also definieren wir einen Operator
!
,!
nehmen unsere regulären Eingabenx
, aber es wird auch eine zusätzliche Nummer benötigty
.y
Verfolgt die Größe der wachsenden Dreieckszahl. Wennx>y
wir Rekursion wollen, verringern wirx
durchy
und erhöheny
nach dem anderen. Also berechnen wir(x-y)!(y+1)
und ergänzeny+1
es. Wennx<=y
wir unseren Basisfall erreicht haben, kehrenx
wir zurück , um die Platzierung in der Reihe des Dreiecks umzukehren1-x
.Haskell , 54 Bytes
Probieren Sie es online!
(!!)$0:(>>=)[1..]f
ist eine punktfreie FunktionErläuterung
Das erste, worum es uns geht
f
,f
ist eine Funktion, diex
diex
dritte Zeile des Dreiecks in umgekehrter Reihenfolge aufnimmt und zurückgibt . Dazu wird zunächst diex-1
nd-Dreieckszahl berechnet und dieser zugewiesenu
.u<-div(x^2-x)2
. Wir geben dann die Liste zurück[u+x,u+x-1..u+1]
.u+x
ist diex
dritte dreieckige Zahl und die erste Zahl in der Reihe,u+x-1
ist eins weniger als diese und die zweite Zahl in der Reiheu+1
ist eins mehr als die letzte dreieckige Zahl und damit die letzte Zahl in der Reihe.Sobald wir haben
f
, bilden wir eine Liste(>>=)[1..]f
, die eine Abflachung des Dreiecks ist. Wir fügen der Vorderseite Null hinzu,0:
damit unsere Antworten nicht um eins versetzt werden, und geben sie an unsere Indexierungsfunktion weiter(!!)
.Haskell , 56 Bytes
Probieren Sie es online!
Dieser ist 2 Bytes länger, aber meiner Meinung nach etwas eleganter.
quelle
C (gcc) , 48 Bytes
Probieren Sie es online!
Wahrscheinlich suboptimal, aber ich bin ziemlich zufrieden damit. Nutzt die Tatsache, dass
NTF N = T N + A057944 ( N ) - N + 1
(Wenn ich die Formel richtig aufgeschrieben habe, ist das.)
quelle
05AB1E , 30 Bytes
Probieren Sie es online!
quelle
Schale , 6 Bytes
Probieren Sie es online!
Erläuterung
quelle
tinylisp , 78 bytes
Definiert eine Funktion
f
, die das Mapping ausführt. Probieren Sie es online!Ungolfed
Wir finden die kleinste Dreieckszahl, die größer oder gleich der eingegebenen Zahl ist, sowie die Zeile des Dreiecks, in der sich unsere Zahl befindet. Daraus können wir die gespiegelte Version der Zahl berechnen.
Die Hauptfunktion
flip
ruft einfach die Hilfsfunktion_flip
ab der obersten Zeile auf.quelle
05AB1E , 9 Bytes
Probieren Sie es online!
Erläuterung
Das Reduzieren von Arrays kann mit größeren Listen leider nicht sehr gut umgehen.
Auf Kosten von 1 Byte könnten wir · t2z + ïn¹-> unter Verwendung der
floor(sqrt(2*n)+1/2)^2 - n + 1
in OEIS gefundenen mathematischen Formel ausführen .quelle
Batch, 70 Bytes
Verwendet eine Schleife, um den Index der Dreieckszahl zu finden, der mindestens so groß ist wie
n
.quelle
PHP, 35 Bytes
Dieselbe Formel wie im Arnaulds Approach
quelle
C #,
4644 BytesIch portiere @ Arnauld's Lösung . Vielen Dank!
quelle
APL (Dyalog), 27 Bytes
Ich habe zwei Lösungen gleichzeitig bytecount.
Ein Zug:
Probieren Sie es online!
Und ein DFN:
Probieren Sie es online!
Beide Lösungen erstellen zuerst das gespiegelte Dreieck und extrahieren dann das Element an dem Index, der durch das Argument (
1
-basiert) angegeben wird.quelle
J, 25 Bytes
Als Erklärung betrachten
f(n) = n(n+1)/2
.f(r)
, angesichts der Reiher
die am weitesten links stehende Zahl derr
th Zeile des gespiegelten Dreiecks zurück. Nun überlegen Sieg(n) = ceiling[f⁻¹(n)]
.g(i)
Gibt bei gegebenem Indexi
die Zeile zurück, in der sich der Index i befindet. Dannf(g(n))
gibt die am weitesten links stehende Nummer der Zeile , auf dem Index n gefunden wird. Also,h(n) = f(g(n)) - (n - f(g(n)-1)) + 1
ist die Antwort auf das obige Problem.Vereinfachend bekommen wir
h(n) = [g(n)]² - n + 1 = ceiling[(-1 + sqrt(1 + 8n))/2]² - n + 1
.Aus der Formel von @ Arnauld geht Folgendes hervor:
ceiling[(-1 + sqrt(1 + 8n))/2] = floor[1/2 + sqrt(2n)]
.quelle
Pyt ,
1312 BytesAnnäherung an den Hafen von Arnauld
quelle