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>
Galaretka ,
87 bajtówDzięki @ErikTheOutgolfer za uratowanie 1 bajtu!
Wypróbuj online!
Jak to działa
źródło
Alice , 27 bajtów
Dzięki Sp3000 za
.C
pomysł.Wypróbuj online!
Wyjaśnienie
Myślę, że może być krótszy sposób na obliczenie tego za pomocą liczb trójkątnych, ale pomyślałem, że jest to ciekawe nadużycie wbudowanej, więc oto inne rozwiązanie.
Podstawową ideą jest wykorzystanie wbudowanych „paczek” i „rozpakowywania” Alicji. „Paczka”, lub
Z
, bierze dwie liczby całkowite odwzorowuje je biotycznie na jedną liczbę całkowitą. „Rozpakuj” lubY
odwraca ten bijection i zamienia jedną liczbę całkowitą na dwie. Zwykle można tego użyć do przechowywania listy lub drzewa liczb całkowitych w jednej (dużej) liczbie całkowitej i odzyskania poszczególnych wartości później. Jednak w tym przypadku możemy użyć funkcji w odwrotnej kolejności, aby natura bijection działała dla nas.Rozpakowanie jednej liczby całkowitej na dwie liczby całkowite składa się zasadniczo z trzech kroków:
Mapa ℕ → ℕ 2 , za pomocą funkcji parowania Cantor . Oznacza to, że naturale są zapisywane wzdłuż przekątnych nieskończonej siatki, a my zwracamy indeksy:
Np. Zostanie
8
zmapowany na parę(1, 2)
.Mapa ℕ 2 → ℤ 2 , używając odwrotności kroku 1 na każdej liczbie całkowitej osobno. Oznacza to, że nieparzyste naturale są mapowane na ujemne liczby całkowite, a nawet naturale są mapowane na nieujemne liczby całkowite.
Aby spakować dwie liczby całkowite w jedną, po prostu odwracamy każdy z tych kroków.
Teraz widzimy, że struktura funkcji parowania Cantora wygodnie koduje potrzebny nam trójkąt (chociaż wartości są oddzielone od siebie). Aby odwrócić te przekątne, wszystko co trzeba zrobić to zamienić x i y współrzędne do sieci.
Niestety, ponieważ wszystkie trzy powyższe kroki są połączone w jeden wbudowany
Y
(lubZ
), musimy sami cofnąć mapowania ℤ → ℕ lub ℕ → ℤ . Robiąc to, możemy jednak zaoszczędzić kilka bajtów, używając bezpośrednio mapowań ℕ + → ℤ lub ℤ → ℕ + , aby zająć się błędem off-by-one w tabeli. Oto cały algorytm:W ten sposób możemy spojrzeć na program:
Jest to po prostu struktura liniowych programów arytmetycznych z wejściowymi i wyjściowymi liczbami całkowitymi.
źródło
Galaretka , 8 bajtów
Wypróbuj online!
Port mojej odpowiedzi MATL.
źródło
MATL ,
1511 bajtówWypróbuj online!
To używa formuły
źródło
Oktawa ,
7168 bajtów3 bajty zapisane dzięki Conorowi O'Brienowi .
Nie działa to w przypadku dużych danych wejściowych z powodu ograniczeń pamięci.
Wypróbuj online!
Wyjaśnienie
Rozważ wejście
n = 4
. Kod najpierw tworzy macierzNastępnie zastępuje niezerowe wpisy w kolejności kolumny-dur (w dół, a następnie w poprzek) przez
1
,2
,3
...:Następnie odwraca matrycę w pionie:
Wreszcie, przyjmuje
n
-tą niezerową wartość w porządku głównym kolumny, która w tym przypadku jest6
.źródło
e
jest genialne! Zdecydowanie powinieneś opublikować to jako odpowiedź, wraz z innymi bardzo dobrymi sugestiami. Co do tegoans =
, nigdy nie jestem pewien, czy to ważne czy nieHaskell , 31 bajtów
Wypróbuj online!
Ta odpowiedź używa tylko formuły. Jest to najmniej interesująca odpowiedź tutaj, ale zdarza się również, że jest najbardziej golfowa.
Haskell ,
383634 bajtówWypróbuj online!
(!0)
to funkcja bez punktów, o którą nam chodzi.Wyjaśnienie
Zacznę od stwierdzenia, że jestem bardzo zadowolony z tej odpowiedzi.
Podstawową ideą jest to, że jeśli usuniemy największą trójkątną liczbę mniejszą niż nasze dane wejściowe, możemy ją odwrócić i dodać z powrotem trójkątną liczbę. Zdefiniujemy więc operatora
!
,!
przyjmujemy nasze zwykłe dane wejściowex
, ale także dodatkową liczbęy
.y
śledzi rozmiar rosnącej liczby trójkątnej. Jeślix>y
chcemy powtórzyć, zmniejszamyx
sięy
i zwiększamyy
o jeden. Obliczamy(x-y)!(y+1)
i dodajemyy+1
do tego. Jeślix<=y
osiągnęliśmy nasz przypadek podstawowy, aby odwrócićx
umieszczenie w rzędzie trójkąta, zwracamy1-x
.Haskell , 54 bajty
Wypróbuj online!
(!!)$0:(>>=)[1..]f
jest funkcją bez punktówWyjaśnienie
Pierwszą rzeczą, na której nam zależy
f
,f
jest funkcja, która przyjmujex
i zwracax
w odwrotnym rzędzie th trójkąta. Robi to, najpierw obliczającx-1
numer trójkątny i przypisując gou
.u<-div(x^2-x)2
. Następnie zwracamy listę[u+x,u+x-1..u+1]
.u+x
jestx
th trójkątną liczbą i pierwszą liczbą w rzędzie,u+x-1
jest o jeden mniejszą liczbą, a druga liczba w rzędzieu+1
jest o jeden większa niż ostatnia liczba trójkątna, a zatem ostatnia liczba w rzędzie.Kiedy już mamy,
f
tworzymy listę(>>=)[1..]f
, która jest spłaszczeniem trójkąta. Z przodu dodajemy zero,0:
dzięki czemu nasze odpowiedzi nie zostaną przesunięte o jeden, i dostarczymy je do naszej funkcji indeksowania(!!)
.Haskell , 56 bajtów
Wypróbuj online!
Ten jest o 2 bajty dłuższy, ale moim zdaniem nieco bardziej elegancki.
źródło
C (gcc) , 48 bajtów
Wypróbuj online!
Prawdopodobnie nieoptymalny, ale jestem z tego zadowolony. Wykorzystuje fakt, że
NTF N = T N + A057944 ( N ) - N + 1
(To znaczy, jeśli poprawnie zapisałem formułę.)
źródło
05AB1E , 30 bajtów
Wypróbuj online!
źródło
Łuska , 6 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
tinylisp , 78 bajtów
Definiuje funkcję,
f
która wykonuje mapowanie. Wypróbuj online!Bez golfa
Znajdujemy najmniejszą liczbę trójkątną, która jest większa lub równa liczbie wejściowej, a także wiersz, w którym znajduje się nasza liczba. Na ich podstawie możemy obliczyć odwróconą wersję liczby.
Główna funkcja
flip
po prostu wywołuje funkcję pomocnika,_flip
zaczynając od górnego rzędu.źródło
05AB1E , 9 bajtów
Wypróbuj online!
Wyjaśnienie
Spłaszczanie tablic niestety nie radzi sobie dobrze z większymi listami.
Kosztem 1 bajtu moglibyśmy zrobić · t2z + ïn¹-> przy użyciu wzoru matematycznego
floor(sqrt(2*n)+1/2)^2 - n + 1
znalezionego w OEIS .źródło
Partia, 70 bajtów
Korzysta z pętli, aby znaleźć indeks liczby trójkątnej co najmniej tak dużej jak
n
.źródło
PHP, 35 bajtów
Ta sama formuła, która jest używana w podejściu Arnaulds
źródło
C #,
4644 bajtówI portu @ rozwiązania Arnauld za . Dziękuję Ci!
źródło
APL (Dyalog), 27 bajtów
Mam dwa rozwiązania w tej samej liczbie bajtów.
Pociąg:
Wypróbuj online!
I dfn:
Wypróbuj online!
Oba te rozwiązania najpierw tworzą odwrócony trójkąt, a następnie wyodrębniają element o indeksie podanym przez argument (na podstawie
1
).źródło
J, 25 bajtów
Jako wyjaśnienie zastanów się
f(n) = n(n+1)/2
.f(r)
, biorąc pod uwagę wierszr
, zwraca lewą liczbęr
trzeciego rzędu lustrzanego trójkąta. Teraz zastanów sięg(n) = ceiling[f⁻¹(n)]
.g(i)
, biorąc pod uwagę indeksi
, zwraca wiersz, w którym znaleziono indeks i. Następnief(g(n))
zwraca lewą liczbę wiersza, w którym znaleziono indeks n. Tak więch(n) = f(g(n)) - (n - f(g(n)-1)) + 1
jest odpowiedź na powyższy problem.Upraszczamy, rozumiemy
h(n) = [g(n)]² - n + 1 = ceiling[(-1 + sqrt(1 + 8n))/2]² - n + 1
.Z wyglądu formuły @ Arnauld wynika, że:
ceiling[(-1 + sqrt(1 + 8n))/2] = floor[1/2 + sqrt(2n)]
.źródło
Pyt ,
1312 bajtówPodejście do Port of Arnauld
źródło