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>
Jelly ,
87 byteTerima kasih kepada @ErikTheOutgolfer untuk menghemat 1 byte!
Cobalah online!
Bagaimana itu bekerja
sumber
Alice , 27 byte
Terima kasih kepada Sp3000 untuk
.C
idenya.Cobalah online!
Penjelasan
Saya pikir mungkin ada cara yang lebih pendek untuk menghitung ini menggunakan angka segitiga, tapi saya pikir ini adalah penyalahgunaan yang menarik dari built-in, jadi inilah solusi yang berbeda.
Ide dasarnya adalah memanfaatkan "bawaan" Alice dan "membongkar" bawaan. "Paket", atau
Z
, mengambil dua bilangan bulat memetakannya secara bijektif ke satu bilangan bulat. "Buka kemasan", atauY
, membalikkan bualan ini dan mengubah satu bilangan bulat menjadi dua. Biasanya, ini dapat digunakan untuk menyimpan daftar atau pohon bilangan bulat dalam satu bilangan bulat (besar) dan memulihkan nilai individu nanti. Namun, dalam hal ini kita dapat menggunakan fungsi dalam urutan yang berlawanan, untuk membiarkan sifat dari penambangan bekerja untuk kita.Membongkar satu bilangan bulat menjadi dua bilangan bulat pada dasarnya terdiri dari tiga langkah:
Peta ℕ → ℕ 2 , menggunakan fungsi pemasangan Cantor . Yaitu, naturals ditulis di sepanjang diagonal grid yang tak terbatas dan kami mengembalikan indeks:
Misalnya
8
akan dipetakan ke pasangan(1, 2)
.Peta ℕ 2 → ℤ 2 , menggunakan kebalikan dari langkah 1 pada setiap bilangan bulat secara individual. Artinya, naturals yang aneh dipetakan ke bilangan bulat negatif, dan bahkan naturals dipetakan ke bilangan bulat yang tidak negatif.
Untuk mengemas dua bilangan bulat menjadi satu, kita cukup membalikkan masing-masing langkah tersebut.
Sekarang, kita dapat melihat bahwa struktur fungsi pasangan Cantor dengan mudah mengkodekan segitiga yang kita butuhkan (walaupun nilainya tidak dalam satu per satu). Untuk membalikkan diagonal itu, yang perlu kita lakukan adalah menukar koordinat x dan y ke dalam kisi.
Sayangnya, karena ketiga langkah di atas digabungkan menjadi satu built-in
Y
(atauZ
), kita perlu membatalkan pemetaan ℤ → ℕ atau ℕ → ℤ sendiri. Namun, saat melakukan itu kita dapat menyimpan beberapa byte dengan langsung menggunakan pemetaan ℕ + → ℤ atau ℤ → ℕ + , untuk mengatasi kesalahan off-by-one dalam tabel. Jadi di sini adalah keseluruhan algoritma:Dengan itu, kita dapat melihat program:
Ini hanyalah kerangka kerja untuk program aritmatika linier dengan input dan output integer.
sumber
Jelly , 8 byte
Cobalah online!
Port jawaban MATL saya.
sumber
MATL ,
1511 byteCobalah online!
Ini menggunakan rumus
sumber
Oktaf ,
7168 byte3 byte disimpan berkat Conor O'Brien .
Ini tidak berfungsi untuk input besar karena keterbatasan memori.
Cobalah online!
Penjelasan
Pertimbangkan input
n = 4
. Kode pertama membangun matriksKemudian menggantikan entri tidak nol dalam kolom-besar order (bawah, kemudian di) oleh
1
,2
,3
...:Kemudian ia membalik matriks secara vertikal:
Akhirnya, dibutuhkan nilai
n
bukan-nol dalam urutan kolom-utama, yang dalam hal ini adalah6
.sumber
e
jenius! Anda harus mempostingnya sebagai jawaban, bersama dengan saran Anda yang sangat bagus lainnya. Adapunans =
, saya tidak pernah yakin itu valid atau tidakHaskell , 31 byte
Cobalah online!
Jawaban ini hanya menggunakan rumus. Ini adalah jawaban yang paling tidak menarik di sini, tetapi juga merupakan golfiest.
Haskell ,
383634 byteCobalah online!
(!0)
adalah fungsi titik bebas yang menjadi perhatian kita.Penjelasan
Biarkan saya memulai dengan mengatakan saya sangat senang dengan jawaban ini.
Ide dasar di sini adalah bahwa jika kita menghapus angka segitiga terbesar lebih kecil dari input kita, kita dapat membalikkannya dan menambahkan angka segitiga kembali. Jadi kami mendefinisikan operator
!
,!
mengambil input reguler kamix
, tetapi juga mengambil angka tambahany
.y
melacak ukuran angka segitiga yang tumbuh. Jikax>y
kita ingin recurse, kami menurunkanx
olehy
dan meningkatkany
per satu. Jadi kami menghitung(x-y)!(y+1)
dan menambahkannyay+1
. Jikax<=y
kita telah mencapai base case kita, untuk membalikkanx
penempatan di deretan segitiga kita kembali1-x
.Haskell , 54 byte
Cobalah online!
(!!)$0:(>>=)[1..]f
adalah fungsi point-freePenjelasan
Hal pertama yang kami perhatikan adalah
f
,f
adalah fungsi yang mengambilx
dan mengembalikanx
deretan ke tiga dari segitiga secara terbalik. Ini dilakukan dengan terlebih dahulu menghitung angkax-1
segitiga nd dan menetapkannyau
.u<-div(x^2-x)2
. Kami kemudian mengembalikan daftar[u+x,u+x-1..u+1]
.u+x
adalah angkax
segitiga ke - t dan angka pertama pada baris,u+x-1
adalah satu kurang dari itu dan angka kedua pada barisu+1
adalah satu lebih dari angka segitiga terakhir dan dengan demikian angka terakhir pada baris.Setelah kita memiliki
f
kita membentuk daftar(>>=)[1..]f
, yang merupakan perataan segitiga. Kami menambahkan nol ke depan dengan0:
sehingga jawaban kami tidak akan diimbangi oleh satu, dan menyediakannya ke fungsi pengindeksan kami(!!)
.Haskell , 56 byte
Cobalah online!
Yang ini 2 byte lebih lama tapi menurut saya agak lebih elegan.
sumber
C (gcc) , 48 byte
Cobalah online!
Mungkin suboptimal, tapi saya cukup senang dengan yang ini. Menggunakan fakta itu
NTF N = T N + A057944 ( N ) - N + 1
(Jika saya menuliskan formula dengan benar, itu adalah.)
sumber
05AB1E , 30 byte
Cobalah online!
sumber
Sekam , 6 byte
Cobalah online!
Penjelasan
sumber
tinylisp , 78 byte
Menentukan fungsi
f
yang melakukan pemetaan. Cobalah online!Tidak disatukan
Kami menemukan bilangan segitiga terkecil yang lebih besar dari atau sama dengan bilangan masukan, serta deretan mana dari segitiga bilangan kita. Dari ini, kita dapat menghitung versi bilangan terbalik dari bilangan tersebut.
Fungsi utama
flip
cukup memanggil fungsi helper_flip
mulai dari baris atas.sumber
05AB1E , 9 byte
Cobalah online!
Penjelasan
Perataan array sayangnya tidak menangani daftar yang lebih besar dengan sangat baik.
Dengan biaya 1 byte kita bisa melakukan · t2z + ïn¹-> menggunakan rumus matematika yang
floor(sqrt(2*n)+1/2)^2 - n + 1
ditemukan di OEIS .sumber
Batch, 70 byte
Menggunakan loop untuk menemukan indeks angka segitiga setidaknya sebesar
n
.sumber
PHP, 35 Bytes
Formula yang sama yang digunakan dalam Pendekatan Arnaulds
sumber
C #,
4644 byteSaya port solusi @ Arnauld . Terima kasih!
sumber
APL (Dyalog), 27 byte
Saya punya dua solusi di bytecount yang sama.
Kereta:
Cobalah online!
Dan sebuah dfn:
Cobalah online!
Kedua solusi ini pertama-tama membuat segitiga terbalik dan kemudian mengekstrak elemen pada indeks yang dinyatakan oleh argumen (
1
berbasis).sumber
J, 25 byte
Sebagai penjelasan, pertimbangkan
f(n) = n(n+1)/2
.f(r)
, mengingat barisr
, mengembalikan angka paling kiri dari barisr
ke-3 dari segitiga cermin. Sekarang, pertimbangkang(n) = ceiling[f⁻¹(n)]
.g(i)
, mengingat indeksi
, mengembalikan baris di mana indeks saya ditemukan. Kemudian,f(g(n))
kembalikan angka paling kiri dari baris di mana indeks n ditemukan. Begitu,h(n) = f(g(n)) - (n - f(g(n)-1)) + 1
inilah jawaban untuk masalah di atas.Menyederhanakan, kita dapatkan
h(n) = [g(n)]² - n + 1 = ceiling[(-1 + sqrt(1 + 8n))/2]² - n + 1
.Dari tampilan rumus @ Arnauld, tampak bahwa:
ceiling[(-1 + sqrt(1 + 8n))/2] = floor[1/2 + sqrt(2n)]
.sumber
Pyt ,
1312 bytePendekatan Port of Arnauld
sumber