var QUESTION_ID=127261,OVERRIDE_USER=56433;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/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} /* font fix */ body {font-family: Arial,"Helvetica Neue",Helvetica,sans-serif;} /* #language-list x-pos fix */ #answer-list {margin-right: 200px;}
<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>Score</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>
-n
untuk Perl dihitung menuju skor? Secara tradisional dihitung sebagai 1 byte karena jarak sunting antara standarperl -e
danperl -ne
1, tetapi untuk tantangan ini, akankahn
penghitungan untuk keperluan penghitungan duplikat?n
adalah opsi yang paling adil.how often this character has already occurred in the string
, saya mungkin akan berubahhow many times the character has occurred up to this point
untuk membuatnya lebih jelas bahwa biaya penggunaan pertama 1, bukan 0Jawaban:
MATL , skor 4
Cobalah online!
Penjelasan
Pertimbangkan input
'ABBA'
sebagai contoh.sumber
Python , skor 49
Cobalah online!
Setelah itu ada tab
in
.Rincian skor:
()Camnou
S
sumber
T-SQL, skor
775 579!580EDIT : Menjatuhkan beberapa variabel, sedikit dipadatkan. Turun ke 16
@
simbol, bukan 22, yang dengan sendirinya mengurangi skor saya dengan 117 poin kekalahan!Kontes yang bagus, saya suka persyaratan untuk mengoptimalkan selain jumlah total karakter.
Input melalui bidang varchar q di tabel yang sudah ada sebelumnya z , sesuai aturan IO kami . Database yang berisi tabel input ini harus disetel ke susunan case-sensitive .
Diformat:
Kata kunci SQL tidak peka huruf besar-kecil, jadi saya menggunakan huruf besar-kecil untuk meminimalkan jumlah surat duplikat ( aaAA menghasilkan skor yang lebih baik / lebih rendah dari aaaa ).
Loop utama membandingkan panjang sebelum dan sesudah melepas semua instance dari karakter pertama. Perbedaan itu n * (n + 1) / 2 ditambahkan ke total berjalan.
Fungsi SQL secara
LEN()
mengganggu mengabaikan spasi tambahan, jadi saya harus menambahkan karakter kontrol dan mengurangi 1 di akhir.EDIT : Memperbaiki salah perhitungan skor saya sendiri dengan 2 poin (masalah dengan kutipan penawaran), dikurangi 1 dengan mengubah satu casing
R
. Juga mengerjakan strategi yang sama sekali berbeda, saya akan memposting itu sebagai jawabannya sendiri.sumber
579! ≈ 8.22 x 10^1349
C (gcc) , skor:
1131031009691Terima kasih kepada @ugoren, @CalculatorFeline, @gastropner, @ l4m2, dan @ JS1 untuk tips mereka.
Menginisialisasi array nol, kemudian menggunakan nilai ASCII dari karakter dalam string sebagai indeks untuk array itu untuk melacak jumlah instance dari setiap karakter dalam string.
Cobalah online!
sumber
z
,x
,c
.char
termasukc
...\x7f
tidak dapat dicetak) dan silakan tambahkan penjelasan.z;g(char*s){int y[238]={z=0};while(*s)z+=--y[*s++];z/=~0;}
g(char*s){int y[238]={};while(*s)*y+=--y[*s++];*y/=~0;}
JavaScript (ES6), skor
8178Menyimpan 3 poin berkat @Arnauld
Solusi rekursif skor-81 asli saya:
sumber
Haskell , skor 42
Cobalah online!
Anonimisasi
\l->
memberikan skor yang sama.sumber
Jelly , skor 6
Cobalah online!
sumber
Retina , skor 34
Cobalah online!
Penjelasan
Kita mulai dengan menyortir semua karakter dalam input sehingga karakter yang identik dikelompokkan bersama menjadi satu run. The
s(
mengaktifkan modus singleline untuk semua tahap (yaitu membuat.
linefeeds pertandingan).Tujuannya adalah untuk mengubah serangkaian n karakter menjadi karakter T n ( angka segitiga ke- n ) karena itulah skor kemunculan karakter ini. Untuk melakukannya, kami menemukan kecocokan yang tumpang tindih. Khususnya, untuk setiap i dalam [1, n] , kita akan memasukkan karakter i-1 dalam pertandingan. Kami mendapatkan semua pertandingan itu karena bendera yang tumpang tindih
&
. Itu memberi kita n * (n-1) / 2 = T n-1 = T n - n karakter hanya dari pertandingan. Namun tahap pertandingan akan bergabung ini dengan linefeeds, yang n linefeeds untuk ncocok. Hanya ada satu masalah. Tidak akan ada umpan baris setelah pertandingan terakhir, jadi jumlah keseluruhan karakter dalam output adalah satu kurang dari yang kita butuhkan. Kami memperbaikinya dengan mencocokkan awal input, yang memberi kami satu umpan baris terkemuka jika setidaknya ada satu kecocokan lainnya.Akhirnya, kami hanya menghitung berapa banyak karakter yang ada di string.
sumber
Haskell, skor
5251Ada tab di antara
f
dan_
.Cobalah online!
Nilai string kosong adalah 0. Nilai string s, di mana
a
karakter pertama danb
sisa string adalah 1 ditambah kemunculana
inb
plus panggilan rekursif dengan b.sumber
J , skor 16
Cobalah online!
Penjelasan
Menggunakan
1#.
alih-alih+/@
untuk jumlah menyimpan beberapa poin, dan&
dapat digunakan sebagai pengganti@
dalam konteks monadik untuk menyimpan satu lagi. Pengulangan itu membuat1
saya kehilangan satu poin ekstra, tetapi saya belum bisa menyingkirkannya.sumber
R , skor: 67
8395128-61 Berkat tips top dari Giuseppe
Cobalah online!
String dipisah menggunakan
utf8ToInt
dan setiap nilai ascii dihitungtable
. Hasilnya dihitung menggunakan melakukan perkalian matriks%*%
lebih dari itu sendiri + 1 dan akhirnya setengah.sumber
table
sebagai gantirle
; Anda dapat menyingkirkannyasort
juga (dan Anda tidak perlu mengindeks[[1]]
ke hasilstrsplit
)n
(karena dalamfunction
dua kali) dan juga berubah(n+1)
menjadi{n+1}
05AB1E , skor 6
Cobalah online!
sumber
Pyth , skor 6
1 byte berkat isaacg.
Suite uji.
Bagaimana itu bekerja
sumber
s+0
sama dengan+F
.usaShHGrScQ1 8Z
untuk 16. Bisakah Anda menambahkan penjelasan?s/LQ
adalah skor 4, apakah ini menggunakan fitur yang mengatasi tantangan?J , skor:
14 1211Cobalah online!
sumber
$
.1#.2!1+1#.=
Jelly , skor 7
Penjelasan:
Cobalah online!
sumber
C, 60 byte, skor
10895Cobalah online!
Biasanya operator sebelum dan sesudah kenaikan sangat bagus untuk kode golf, tetapi mereka benar-benar terluka pada tantangan ini!
EDIT: Dengan mengurangi jumlah negatif daripada menambahkan yang positif, saya menyimpan banyak skor. Mengganti
for()
denganwhile()
menghilangkan titik koma juga.sumber
Perl 6 , skor
61 56 53 4644Cobalah
Cobalah
Cobalah
Cobalah
Cobalah
sumber
C # (.NET Core) , skor ∞ (maksud saya, 209)
Cobalah online!
Skor tersebut meliputi:
sumber
return w*(w+1)/2
kereturn-~w*w/2
(skor 196). EDIT: Anda dapat membuat port jawaban Java 8 saya dengan skor 149 :using System.Linq;b=>{int[]x=new int[256];return\nb.Select(z=>++x[z]).Sum();}
Cobalah secara online.b=>{var x=new int[256];return\nb.Sum(z=>++x[z]);}
Jelly , skor 5
Cobalah online!
Terima kasih kepada Leaky Nun untuk -2 (sebelumnya pada jawabannya )
sumber
ĠJ€ẎS
PowerShell, skor 64
(Skor didasarkan pada baris baris baru, yang bukan standar Windows tetapi bekerja di PS).
@{}
$args
adalah array parameter - dalam hal ini string input menjadikannya array item tunggal;|%
melakukan foreach loop pada item, dan menggunakan jalangetE*
pintas untuk mencocokkanGetEnumerator()
metode string dan memanggilnya untuk mengubah string menjadi aliran karakter.|%
loop di atas karakter dan meningkatkan entri hashtable mereka, tambahkan ke total berjalan. The($x+=1)
form dengan parens baik memodifikasi variabel dan output nilai baru untuk digunakan.(Ketika saya pertama kali menulisnya, itu
$c=@{};$t=0;[char[]]"$args"|%{$c[$_]++;$t+=$c[$_]};$t
dengan skor 128, dan merasa seperti itu tidak akan jauh lebih rendah. Membagi dua menjadi 64 cukup menyenangkan).sumber
Julia 0.6 , 45 bytes, Nilai: 77
Terinspirasi oleh solusi MATL:
Cobalah online!
Solusi yang kurang cantik, menggunakan hitungan:
Julia 0.6 , skor: 82
Cobalah online!
Terima kasih kepada Guiseppe yang telah menunjukkan skor dan tipnya. Komentar-komentar ini banyak membantu saya.
sumber
(x+1)
dengan[x+1]
untuk mengurangi skor.[x+1]
bukannya(x+1)
menurunkannya menjadi skor 98 .Java 10, skor:
149138137134133130103102101100( Bytes:
72737475646261 )Bytes naik, tetapi skor turun. : DSkor -28 (dan -11 byte) berkat @Nevay .
Skor -1 (dan -2 byte) berkat @ OlivierGrégoire .
Skor -1 (dan -1 byte) dengan mengonversi Java 8 ke Java 10.
Penjelasan:
Coba di sini.
sumber
~
jika Anda menggunakanj=0
danreturn-j;
(133).x->{int[]q=new int[256];return\nx.chars().map(v->++q[v]).sum();}
j
bukanu
(return
berisiu
) dan baris baru dan tab bukan spasi. EDIT: Hehe, Anda sudah mengedit tepat ketika saya membuat komentar ini. :)F #, skor
120118-2 Terima kasih kepada Kevin Cruijssen !
Cobalah online!
Mengambil
string
sebagai input.Seq.countBy
pasangkan setiap karakter berbeda dengan hitungannya (id
adalah fungsi identitas) sehingga Anda berakhir dengan koleksi seperti'a' = 4, 'b' = 2
dll.The
Seq.sumBy
mengambil hitungan untuk setiap huruf dan merangkum semua angka dari0
hitungan untuk surat itu. Jadi jika'a' = 4
koleksi yang akan0, 1, 2, 3, 4
dirangkum adalah10
. LaluSeq.sumBy
jumlahkan semua total itu.sumber
let q
kelet j
, karenaq
sudah digunakan di keduanyaSeq
.APL (Dyalog) , skor 15
Cobalah online!
⍞
dapatkan input teks∘.=⍨
meja kesetaraan dengan diri sendiri+\
jumlah kumulatif di seluruh1 1⍉
diagonal (sedikit jatuhkan kedua dimensi ke dimensi satu)+/
jumlahsumber
Retina , skor
684543Cobalah online! Tautan menunjukkan skor. Sunting: Terima kasih kepada @MartinEnder yang menyimpan 20 byte dengan menggunakan pertandingan yang tumpang tindih alih-alih mencari yang lain dan tiga byte selanjutnya dengan mengelompokkan tahapan sehingga
s
bendera hanya perlu diterapkan sekali. Menyimpan dua byte lebih lanjut dengan menghitung angka segitiga secara berbeda, menghindari perlunya pengurutan.sumber
PHP , 45 byte, Skor 78
Cobalah online!
PHP , 46 byte, Skor 79 Bytes
Cobalah online!
PHP , 56 byte, Skor 92
Cobalah online!
sumber
Perl 5 skor
9183Menggunakan
-p
bendera yang menambahkan 2 karena p di split.sumber
$` is automatically
printed after each call so we can use that to store the score and
/./g` mengembalikan daftar semua karakter$_
yang lebih murah daripadasplit//
.Oktaf , 39 byte, Skor 69
Cobalah online!
Walaupun ada satu lagi jawaban Octave, yang ini sepenuhnya milik saya dan pendekatan yang berbeda, ditambah skornya lebih sedikit :).
Pendekatan ini bermula untuk menemukan jumlah (b) pertama dari setiap karakter unik, yang dicapai dengan menggunakan fungsi histogram. Kemudian untuk setiap elemen kita menghitung jumlah 1 hingga b yang dilakukan menggunakan rumus
(b*(b+1))/2
. Kemudian jumlah individu semua dijumlahkan ke dalam skor akhir.Dalam pengujian tampaknya kurung benar-benar mahal dalam penilaian karena banyak yang dibutuhkan. Saya telah dioptimalkan turun dari skor awal sekitar 88 dengan mengatur ulang pertanyaan untuk meminimalkan jumlah kurung buka / tutup - maka kita sekarang melakukan / 2 pada total akhir daripada secara individual, dan juga saya telah memodifikasi rumus untuk
(b^2+b)/2
karena itu membutuhkan kurung lebih sedikit.sumber
error: hist: subscript indices must be either positive integers less than 2^31 or logicals
Common Lisp, skor
286232222Skor bernilai tinggi karena sintaksis bertele-tele dari operator Common Lisp.
Cobalah online!
Kode yang tidak dipisahkan:
sumber
Mathematica, skor 54
memasukkan
terima kasih kepada hftf
sumber
Total[#(#+1)/2&@Counts@Characters@#]&
skor 54.