String Istimewa
Himpunan string istimewa didefinisikan secara rekursif sebagai berikut.
- Semua string dengan panjang 0 atau 1 adalah hak istimewa.
- Sebuah string
s
dengan panjang minimal 2 adalah privilege, jika ada string privilege yang lebih pendek t
yang muncul s
tepat dua kali, sekali sebagai awalan dan sekali sebagai akhiran. Kejadian yang tumpang tindih dihitung sebagai berbeda.
Misalnya, string aa
, aaa
dan aba
diberi hak istimewa, tetapi ab
dan aab
tidak.
Memasukkan
String alfanumerik.
Keluaran
Semua substring istimewa dari string input, masing-masing tepat sekali, dalam urutan apa pun. Output dapat diberikan dalam format array asli bahasa Anda (atau setara terdekat), atau dicetak satu substring per baris.
Fakta yang menyenangkan
Jumlah string dalam output selalu tepat length(s) + 1
( sumber ).
Aturan
Fungsi dan program lengkap diizinkan. Hitungan byte terendah menang, dan celah standar tidak diizinkan.
Uji Kasus
Ini disortir terlebih dahulu berdasarkan panjang dan kemudian menurut abjad, tetapi urutan apa pun dapat diterima.
"" -> [""]
"a" -> ["","a"]
"abc" -> ["","a","b","c"]
"abcaaabccaba" -> ["","a","b","c","aa","cc","aaa","aba","abca","abcca","bccab","bcaaab","caaabc"]
"1010010110101010001101" -> ["","0","1","00","11","000","010","101","0110","1001","01010","10001","10101","010010","101101","0101010","1010101","01011010","10100101","1010001101","1101010100011","00101101010100","011010101000110"]
"CapsAndDigits111" -> ["","1","A","C","D","a","d","g","i","n","p","s","t","11","111","igi","sAndDigits"]
Papan peringkat
Berikut adalah papan peringkat berdasarkan bahasa, milik Martin Büttner .
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);i=i.replace("{{PLACE}}",t++ +".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=45497;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*((?:[^,\s]|\s+[^-,\s])*)/
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>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
t
mungkin bukan simbol tunggal. Sebagai contoh,aaa
adalah string istimewa, karena memilikiaa
awalan dan akhiran, dan itu terjadi hanya dua kali. Saya menambahkannya sebagai contoh.Jawaban:
.NET Regex, 31 byte
String ditangkap di
\1
dalam setiap pertandingan.Penjelasan
sumber
CJam,
33453938 byteKatakanlah itu dicetak tanpa baris baru. Jadi baris tambahan berarti substring kosong ...
Penjelasan
sumber
Python 2,
179173164 byteCukup besar saat ini - Saya ingin tahu apakah mungkin untuk menggabungkan cek dan generasi substring entah bagaimana ...
Lambda
f
pada dasarnya adalah suatuis_privileged()
fungsi, menggabungkan tiga kondisi menjadi satu perbandingan (substring diistimewakan, muncul dua kali, adalah akhiran dan awalan).Diperluas:
sumber
Python 3,
131129 byteIni secara rekursif menemukan substring istimewa, dimulai dengan substring terpendek dan menambahkannya ke set. Set kemudian digunakan dalam menentukan apakah substring yang lebih panjang memiliki hak istimewa.
Sayangnya, ini adalah fungsi sekali pakai saja. Berikut program lengkap yang sesuai ( 145 byte ):
sumber
Python,
152147126116 byteSeperti ditunjukkan dalam makalah yang ditautkan, ada akhiran hak istimewa yang unik untuk setiap awalan string. Sufiks itu adalah bentuk di
p·u·p
manap
substring istimewa terlama yang sebelumnya ditemukan yang merupakan sufiks dari awalan. (Pencarian adalah argumen untukmax
, yang sebenarnya menemukan panjangp
karena lebih mudah dilakukanmax
daripadalongest
.) Setelahp
ditemukan, akhiran itu sendiri dibentuk dengan mencari kejadian terakhir keduap
dalam awalan, menggunakanrfind
dibatasi untuk tidak menggunakan karakter terakhir. Kita tahu itu akan berhasil, karena itup
adalah sufiks yang sebelumnya ditemukan. (Bukti algoritma yang lebih ketat dapat diturunkan dari makalah.)Saya cukup yakin bahwa ini dapat diimplementasikan dalam waktu linier menggunakan pohon suffix, bukan algoritma
kuadratikyang digunakan di atas, tetapi program di atas tentu cukup cepat di semua kasus uji, dan menangani string 2000a
s dalam sebuah sedikit kurang dari satu detik di laptop saya (tidak superpower).sumber
Ruby, 87
Saya merasa seperti ada solusi regex rekursif di sini di suatu tempat, tapi saya tidak terlalu pandai dalam hal itu, jadi inilah fungsi rekursif yang sangat lambat dan panjang.
Algoritma kira-kira sama dengan grc , dibuat lebih lambat (tapi lebih pendek) dengan karakter tunggal yang tidak khusus. String karakter tunggal dapat dianggap istimewa karena memiliki string kosong sebagai awalan, akhiran, dan tempat lain.
Trik menarik lainnya di sini adalah penggunaan
$'
, variabel ajaib yang diwarisi dari Perl yang mengambil nilai string setelah pencocokan ekspresi reguler terbaru. Ini memberi saya cara singkat untuk memotong karakter pertama dari sebuah string, meskipun saya mendapatkan hampir semua karakter tersebut dengan harus mengaturnya dengans[/./]
alih - alihs[0]
. Saya menggunakannya lagi untuk memeriksa bahwa kecocokan substring kedua terjadi pada akhir string.sumber
J, 92 byte
Butuh beberapa detik pada input terpanjang.
p
memeriksa apakah string diistimewakan (dengan rekursi),s
memeriksa setiap substring menggunakanp
.Tes:
sumber
JavaScript (ES6) 195
Fungsi P secara rekursif memverifikasi bahwa string memiliki hak istimewa.
Fungsi F mencoba setiap substring yang terkandung dalam string yang diberikan. String yang ditemukan disimpan sebagai kunci hashtable untuk menghindari duplikat.
Akhirnya, kunci dikembalikan sebagai output.
sumber