Memasukkan
String alfanumerik s
.
Keluaran
String terpendek yang muncul tepat sekali sebagai substring (bersebelahan) di s
. Kejadian yang tumpang tindih dihitung sebagai berbeda. Jika ada beberapa kandidat dengan panjang yang sama, Anda harus menampilkan semuanya dalam urutan kejadian. Dalam tantangan ini, string kosong muncul n + 1
kali dalam string panjang n
.
Contoh
Pertimbangkan senarnya
"asdfasdfd"
String kosong muncul 10 kali di dalamnya, jadi itu bukan kandidat untuk kejadian unik. Masing-masing huruf "a"
, "s"
, "d"
, dan "f"
terjadi setidaknya dua kali, sehingga mereka tidak kandidat baik. Substring "fa"
dan "fd"
terjadi hanya sekali dan dalam urutan ini, sedangkan semua substring panjang 2 lainnya terjadi dua kali. Dengan demikian output yang benar adalah
["fa","fd"]
Aturan
Baik fungsi dan program penuh diizinkan, dan celah standar tidak. Pemformatan yang tepat dari output fleksibel, masuk akal. Khususnya, tidak menghasilkan output untuk string kosong diperbolehkan, tetapi tidak menghasilkan kesalahan. Hitungan byte terendah menang.
Uji kasus
"" -> [""]
"abcaa" -> ["b","c"]
"rererere" -> ["ererer"]
"asdfasdfd" -> ["fa","fd"]
"ffffhhhhfffffhhhhhfffhhh" -> ["hffff","fffff","hhhhh","hfffh"]
"asdfdfasddfdfaddsasadsasadsddsddfdsasdf" -> ["fas","fad","add","fds"]
Papan peringkat
Inilah papan peringkat berdasarkan bahasa yang saya janjikan.
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
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 45056;jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
Jawaban:
Pyth,
2726 byteCoba di sini.
Perhatikan bahwa karena bug dalam kompiler online, case string kosong hanya berfungsi dengan benar pada versi baris perintah, yang dapat ditemukan di sini.
Anda juga dapat menyembuhkan bug dengan memberikan baris baru sebagai input untuk kompiler online.
Penjelasan:
sumber
z
tanpa input gagal online, jadi itu pasti bug di penerjemah.Python 3,
12412311196 byteMencari string sehingga kemunculan pertama dari kiri sama dengan kemunculan pertama dari kanan. Di
+1
dalamrange
adalah untuk mengakomodasi untuk kasus string kosong.Sekarang jika hanya Python
.count()
yang menghitung pertandingan yang tumpang tindih , maka ini akan menjadi sedikit lebih pendek.sumber
Mathematica,
959479 byteStringCases
memberi saya semua kemungkinan substring,Tally
danCases
menyaring yang muncul lebih dari satu kali danMinimalBy
menemukan yang paling pendek.sumber
&
di akhir kode?GolfScript, 44 byte
Mengambil input sebagai string pada stdin dan output dalam sintaks array-ganda: mis
[["b"] ["c"]]
. Demo onlinePembedahan
Ini diatur sedemikian rupa sehingga tidak diperlukan case khusus untuk string kosong (yang saya sertakan sebagai test case dalam demo online yang ditautkan di atas).
sumber
CJam,
52 4340 byteInput adalah string tanpa tanda kutip
Penjelasan :
Contoh:
Keluaran
Cobalah online di sini
sumber
Scala, 120 byte
Saya mulai dengan 140 yang setidaknya sudah pas dengan tweet.
sumber
(_)
berfungsi sebagai identitas, bukanl=>l
?list.groupBy(_)
sama denganx => list.groupBy(x)
. Saya tidak tahu mengapa mereka menerapkannya seperti itu.JavaScript (ES6), 109
110Edit pencarian daripada indexOf, karena string input adalah alfanumerik. Terima kasih @IsmaelMiguel
Fungsi rekursif, mencari substring mulai dengan panjang 1 dan naik.
Tidak diikat dan dijelaskan
Uji di konsol FireFox / FireBug
Keluaran
sumber
.search
sebagai ganti.indexOf
dan Anda menghemat 2 byte.s.indexOf(a)+1
). Meskipun ini tidak akan bekerja dengan karakter itu, Anda tidak perlu khawatir! Mengutip OP: "Input: An alphanumeric string s.
"Jawa, 168
176 233Berikut adalah contoh loop bersarang yang cukup mendasar.
Atau sedikit lebih mudah dibaca:
sumber
+++
untuk menunjukkan apakah itu+ ++
atau++ +
akan membantu ... Dan jika Anda ingin menyimpan beberapa byte lagi, mungkin ada cara untuk melakukannya dengan inisialisasiq=1
, menggantiq++
denganq=t
, dan menggantil++<t&q<1
dengan sesuatu sepertit>l+=q
. Mungkin membutuhkan penyesuaian satu atau dua offset lain untuk membuatnya berfungsi.+++
. Saya sudah mencoba untuk men-tweak-nya (terutamaq
, yang terasa agak boros), tetapi belum menemukan sesuatu yang solid.+++
selalu memutuskan untuk++ +
.Haskell,
169162155153151138120 120115Untuk menggunakannya:
Pemberian yang mana:
Btw. Saya benci baris terakhir dari kode saya (pengulanganh y
). Adakah yang mengisyaratkan untuk menyingkirkannya?sumber
g y=q(minimum.(map l)$y)$y
(apakah tanda kurungmap l
benar - benar diperlukan?) Dan kemudianf=g.concat.q 1.group.sort.concatMap inits.tails
?>>=
bukannyaconcatMap
, yaituf x=p$concat$q 1$group$sort$(tails x>>=inits)
menyimpan 2 byte. MengapaData.Ord
impor?q
tidak perlu, karena Anda dapat menulisfilter$(==)k.l
, seperti yang terakhir$
dan spasi sebelumy
s dip
. Anda juga dapat menghapus titik koma setelah impor (Data.Ord
tampaknya memang tidak perlu).$
diikuti oleh non-spasi. Ini akan mencukur beberapa byte, tetapi apakah itu dalam spesifikasi bahasa?J,
61584442403837 byteBerikut adalah versi yang dibagi menjadi komponen-komponen terpisah dari solusi:
x #/. y
menghitung untuk setiap elemen berbeda dalamx
seberapa sering di terjadi diy
. Jika kita menggunakan ini sebagaiy #/. y
, kita mendapatkan untuk setiap elemen berbeda dalamy
hitungannya. Misalnya,a #/. a
untuka =. 1 2 2 3 4 4
hasil1 2 1 2
.1 = y
memeriksa item manay
yang sama dengan1
. Misalnya,1 = a #/. a
hasil1 0 1 0
.u~
adalah refleksif dari kata kerja monadiku
. Ini,u~ y
sama dengany u y
. Jadi,#/.~ y
sama dengan#/.~ y
. Ketika diterapkan pada kata kerja diad,u~
adalah pasif dariu
. Artinya,x u~ y
sama dengany u x
. Ini digunakan di beberapa tempat lain yang tidak saya sebutkan secara eksplisit.~. y
adalah inti dariy
, sebuah vektor dengan duplikat dihapus. Misalnya,~. a
hasil1 2 3 4
.x # y
( salin ) memilih dariy
item pada indeks di manax
berisi a1
.(1 = y #/. y) # (~. y)
buat vektor elemen-elemeny
yang hanya muncul sekali. Dalam notasi diam-diam, kata kerja ini ditulis sebagai~. #~ 1 = #/.~
; sebut saja frasa iniunqs
untuk penjelasan selanjutnya.x ]\ y
menciptakan sebuah arrayx
dengan1 + y - x
semua infiks vektory
panjangx
. Misalnya,3 ]\ 'asdfasdfd
hasil# y
adalah penghitungan dariy
, yaitu jumlah elemen dalamy
.u\ y
berlakuu
untuk setiap awalan dariy
. Kebetulan,#\ y
membuat vektor bilangan bulat dari1
ke#y
.< y
menempatkany
ke dalam kotak. Ini diperlukan karena array tidak dapat di-compang-camping dan kami menghitung array sufiks dengan panjang yang berbeda; array kotak dihitung sebagai skalar.Dengan demikian,
(i. # y) <@:unqs@(]\) y
menghasilkan vektor#y
array kotak panjang k (untuk semua 0 ≤ k <#y
) infiks y yang terjadi tepat sekali. Bentuk diam-diam dari kata kerja ini adalahi.@# <@unqs@(]\) ]
ataui.@# <@(~. #~ 1 = #/.~)@(]\) ]
jika kita tidak menggunakanunqs
namanya. Sebut frasa iniallsbsq
untuk penjelasan selanjutnya. Misalnya,allsbsq 'asdfasdfd'
hasil:(#@> y) # y
mengambil dari vektor array kotaky
yang tidak kosong.{. y
mengambil elemen pertama vektory
.> y
menghapus kotak dariy
.> {. (#@> y) # y
menghasilkan array non-kosong pertama tanpa kotak dari vektor array kotaky
. Frasa ini ditulis>@{.@(#~ #@>)
dalam notasi diam-diam.Akhirnya,
[: >@{.@(#~ #@>) allsbsq
kumpulkan kalimat sebelumnya denganallsbsq
menciptakan solusi untuk masalah yang kita miliki. Inilah frasa lengkap dengan spasi:sumber
Haskell, 135 Bytes
sumber
PHP,
171152134125http://3v4l.org/RaWTN
sumber
$j=0
. Di depan, kamu punyasubstr($s,$j++,$i)
. Tanpa mendefinisikan$j
, Anda dapat menulis ulang inisubstr($s,0+$j++,$i)
dan Anda menghemat 2 byte. Mengapa demikian? Yah, pertama kali,$j
akannull
. Dan Anda secara efektif akan melewatinull
kesubstr
, yang saya tidak berpikir bahwa akan bekerja dengan baik. Menggunakan0+$j++
akan mengonversinull
ke0
. Jika Anda melihat bahwa itu tidak diperlukan, silakan tanpanya dan hapus saja$j=0
bagian itu.$j
tidak dibersihkan dan diinisialisasi ulang untuk setiap iterasi dariwhile()
loop. Jadi, sementara itu nol (dan karenanya akan dikonversi menjadi0
dengan$j++
panggilan) pertama kali, pada iterasi berikutnya dari loop luar itu tetap pada nilai seperti sebelumnya. Ini tidak begitu banyak menginisialisasi sebagai pengaturan ulang. Terima kasih untuk sarannya :-)function f($s){$l=strlen($s);while(!$a&&++$i<$l)for($j=0;$j<$l;)($b=substr($s,$j++,$i))&(strpos($s,$b)==strrpos($s,$b)&&($a[]=$b));return$a;}
Perubahan: Menghapus semua milik Anda||1
, menggunakan bitwise&
(AND
) alih-alih&&
di satu tempat, memindahkan$j<$l&&[...]
bagian di luarfor
(menghemat 2 byte) dan menghapus beberapa tanda kurung yang tidak perlu.function f($s){$l=strlen($s);while(!$a&&++$i<$l)for($j=0;$j<$l;)strpos($s,$b=substr($s,$j++,$i))==strrpos($s,$b)&&($a[]=$b);return$a;}
Perubahan yang dibuat pada kode sebelumnya: pindahkan$b=substr($s,$j++,$i)
kestrpos($s,$b)
membuatnyastrpos($s,$b=substr($s,$j++,$i))
, hapus lebih banyak tanda kurung yang tidak perlu dan hapus yang tidak dibutuhkan&
.substr($s,$j++,$i)
kembali""
ketika$j
mencapai panjang string, danfalse
sesudahnya, sehingga tugas itu juga dapat berfungsi sebagai loop kondisional istirahat. Kemudian hanya ada satu penggunaan yang$l
tersisa, sehingga bisa dikonsolidasikan juga.Groovy (Java regex pada implementasi Oracle), 124
Diuji pada Groovy 2.4 + Oracle JRE 1.7. Regex harus berfungsi untuk Java 6 hingga Java 8, karena bug yang memungkinkan kode di atas berfungsi tidak diperbaiki. Tidak yakin untuk versi sebelumnya, karena ada bug di Java 5 yang diperbaiki di Java 6.
Regex menemukan string terpendek yang tidak memiliki duplikat substring di tempat lain, di setiap posisi dalam string input. Kode di luar menangani penyaringan.
(?=...)
.(.*?)
mencari dari substring terpendek(?=(.*))
menangkap sisa string untuk menandai posisi saat ini.(?<=^(?!.*\1(?!\2$)).*)
adalah emulasi dari variabel-panjang melihat-belakang, yang mengambil keuntungan dari bug implementasi yang memungkinkan(?<=.*)
untuk melewati pemeriksaan panjang.(?!.*\1(?!\2$))
cukup periksa bahwa Anda tidak dapat menemukan substring yang sama di tempat lain. Yang(?!\2$)
menolak posisi asli di mana substring dicocokkan.Batas konstruk look-around luar tidak berlaku untuk konstruk look-around bersarang. Oleh karena itu, pandangan negatif di depan
(?!.*\1(?!\2$))
sebenarnya memeriksa seluruh string, bukan hanya sampai batas kanan tampilan di belakang.sumber
Rebol, 136 byte
Tidak Terkumpul:
Contoh penggunaan:
NB. Saya kira inti dari kodenya adalah bagaimana
find
bagian ini bekerja. Semoga ini akan membantu menjelaskan ...sumber
Haskell, 119
sumber
q = length
suatu tempat dan menggunakanq
, mencukur beberapa byteBrachylog , 10 byte
Cobalah online!
Meskipun
ᵍ
tidak secara alami mengurutkan berdasarkan nilai yang dikelompokkan, alih-alih memesan grup dengan kemunculan pertama dari setiap nilai, kejadian pertama dari setiap panjang berada dalam urutan menurun. Saya tidak 100% yakin bahwa pemfilteran keunikan tidak dapat mengacaukan ini, tetapi saya belum membuat test case ini gagal.sumber
05AB1E , 10 byte
Tidak menghasilkan apa pun untuk string kosong.
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Ini mengambil keuntungan dari 05AB1E yang hanya memiliki
1
nilai kebenaran, dan yang lainnya sebagai falsey. Substring unik terpendek selalu dijamin terjadi tepat sekali untuk semua string input yang mungkin. (Untuk string input yang hanya berisi karakter yang sama (yaituaaaaa
), string input itu sendiri sebagai substring terjadi sekali saja, jadi hasilnya adalah["aaaaa"]
. Untuk string input dengan pola berulang (yaitu"abcabc"
), masih ada substring unik yang hanya terjadi sekali (["abca","abcab","abcabc","bca","bcab","bcabc","ca","cab","cabc"]
), jadi ini akan menghasilkan["ca"]
.)sumber
Python 2, 150
sumber
""
, tetapi Anda tidak mencetak apa pun.Perl 5
-a
,11487 byteCobalah online!
Metode lama: 114 byte
sumber