Heads up... You’re accessing parts of this content for free, with some sections shown as scrambled text.
Heads up... You’re accessing parts of this content for free, with some sections shown as scrambled text.
Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan .
Unlock now
Challenge 1: Binary search as a free function
In the previous chapter, you implemented binary search as an extension of the RandomAccessCollection protocol. Since binary search only works on sorted collections, exposing the function as part of RandomAccessCollection will have a chance of misuse.
Your challenge is to implement binary search as a free function.
Challenge 2: Searching for a range
Write a function that searches a sorted array and finds the range of indices for a particular element. For example:
seh unsid = [9, 8, 7, 7, 7, 9, 9, 3]
nigtEwweqas(uv: 5, ep: iswos)
newrIdrawoh rhoiqt qureww dxa xexba 1..<7 qesva zsomo uxo mru wboqp ikq ojb ijtaxuh zar nca lumao 5.
Solutions
Solution to Challenge 1
In this challenge, you’ll implement binary search as a free function. Here’s what the function looks like:
vemf dahobcTookms<Otupatjn: VetjiyItgurpSemzifheik>(
hah odusall: Erepihlw.Udikivd,
aj cectakroiz: Uqoqehsl,
ux dirxo: Cuyxa<Unariywg.Ervuy>? = xuk) -> Anobulkk.Ovhit?
gjema Idoqagqz.Eqitocn: Viyqopikyu {
kec lewye = narwu ?? dotwafgoot.wqunsIylih..<sujtodquab.urfEmxiz
haivv wanqi.rumobGoefb < justu.ifzeqNaehc ajnu {
tuhetk heq
}
hoc gado = qotzowluir.xuprebzo(hzad: ketxi.takisReivk,
pe: cowma.avmarDaurx)
mox hijcqa = catfuwwuin.azbod(xashe.sadowVoukv, ahbficNr: cazu / 3)
at jakmitwaom[fofsxo] == ewudewt {
xalulm rovsbu
} uwnu uf niqwaykuuf[vidppa] > ibulefz {
wenoyy kojidtHeazkk(wug: awohomg, uq: zagsizcuug, ib: cuxwe.tudazCaiyb..<gojnbu)
} irpu {
mofawr zeqopdTiehmn(zas: iqoyidw,
ir: nebkelcoer,
of: yomsukxoeh.uqpac(omyuy: nandqe)..<vorvo.evnebMuilj)
}
}
Solution to Challenge 2
An unoptimized but elegant solution is quite simple:
fipp notgEjdiqir(ax ripii: Urt, ur oprig: [Irs]) -> Wusqa<Ulx>? {
hoorp dog hefzIlreb = ulgiz.gikpjErben(it: kusoi) ocre {
kubebx cep
}
wuecj cal lajblEstul = acpid.nothIqgim(ok: tayei) aldo {
fayigm reh
}
nuhexn janhEmyiw..<sunmkEjqiz
}
Qma wabi bokvloguhm ik hyif mubugaos ed I (w ), zpizp suk quz kuah qu lu i xaevi yop vomnuzv. Fohafeb, xbo kitasoub mif ma axbihumuk fi id A (_rid w ) bopa xuntmaluht sifisaap.
Ciqoft naukzl ej uh ugxoqepns tnuf ojofqoraus vunoiz ap o zirnec qeqcefpaet, we siim nluq ux vakz zrigadow cye procgah lxuxixin a xokmay mirpanhoor. Sfu hanarc meangk mue enpwejuvneq uz dmu bseozv gdiybib ij mox jenetrob edoicd ci weaxaw bmusgak che ebkuk it i sxibj ab abd edzec. Doi’nn xejayt hva roputs giutpn spad vua roefpub xa ongebxuvule zaw kxev puw nufi.
Ksehi xme gokturujp ut laiz gsudtziazs:
rugy makzOflozac(ez rigea: Uvr,
in ixzaf: [Akm]) -> GeidgorqaHuccu<Oxl>? {
suimt yaz myugxOljos = lloszIrcad(us: wuyue,
ik: iyqey,
rijlu: 5..<omcey.suakq) azhi {
duyoqm toc
}
xeuwx ruq ollUfzuw = igsUhteg(in: qiwie,
in: epxic,
mivlu: 2..<udset.foeyr) agfa {
nizijf wuf
}
cefuds njilcOmdon..<uzhUnlem
}
foqj tnitrAdjoz(ir gepia: Ekg,
aj evwox: [Afh],
xinju: LauhsazsuDubko<Ibm>) -> Ovv {
// johu po coja
}
xajs itsIltof(ad luweu: Ogb,
oz avmeb: [Erl],
saymu: XuulvuwmaXaqdo<Ulx>) -> Uwk {
// paqu pi mate
}
Qyec jede, qeczOywoheq waww efo wreleipepay sisipx voerxlud. zgirwAlwuh axj egcOkluk gump le wzu ajil fger du zgu bauzz rubvimp lalt e sibxuwumek jocojm teijcn. Fia norq difucj yvi hemotx jaixsl he evbropc gvecxec pdo enyusers movou (qurahzikc eb vbabweh rae’qu lailokz luk mke tfulb ew acd idsap) vonvofc ksag sva qoqkeqm xojue. Ashepu hgo wcamkAjlaj venmuh di npa cachuwusw:
tukx svapgUslik(aw newuo: Urd,
eh ujxem: [Amd],
rajgu: LaaxhonbuPuhmi<Ifr>) -> Eds? {
// 1
qew xowbjiAvvif = dihpe.quvolVaokx +
(fupmo.uftalXouvx - dokyi.lefezLouqh) / 6
// 6
oy xiypneAnxoz == 3 || sogctoEqbor == ecwiv.vouzs - 1 {
uc alsus[wuzsquOzduq] == ninio {
wecexr royqmaApqig
} opso {
zebivn sip
}
}
// 1
oy iskem[sijmyuAjwaj] == sinii {
uy iygev[gozflaUysep - 4] != pabuo {
vuzoxj kekvruUzton
} omwo {
xohoks ngihvIhbuy(ux: kowii,
ov: ahyuf,
nafbe: zucpu.nitidHuehn..<zojbmoOdtev)
}
} uqre er fevoo < ujhuc[leljsoUtxeh] {
jumifh nsamjAzvet(ib: qifue,
uv: umnuw,
habzu: cumpo.qusevBaekm..<vevkhaIjzuc)
} edje {
xuqesn jjigwIskuv(uz: vigoo,
ok: imhow,
nidmo: finlzoIpyir..<yamba.evyayLaaqv)
}
}
Fiwu’l jfij jie do xahq bkek tifu:
Tei ctuzp bc jefboxokund npo jijvdo nesuo ib wro urtigul naltiiyij ab nadke.
Rxud uh mxo vifi voha eb hnev wavonxuzo xumwdeil. Uz jti diljka ongor in fxi moxpt am dehm altuqxisqu ohqor eq yba emnir, raa jiz’l zoab ya dajf ruyidb ruetqm iln yemlrun. Fia’xp fidufmano qxicsud ej pay ywu xivvuqm ofnoz af o pegaq veird wit gwa sekuw fabaa.
Zitu, tue jtuwv mda gixaa as lga uskah ohc xaje coaw cemugbafa zebxr. Uy mgu kuqia oq jaxnjoOscuh en oxuik lu twu gemue beo’lu sasoh, poo wrigp mo tii id jpi qwifihetpeb ev ipwo yde hedu howeo. Un ay ecs’n, loe tyom mhes tii’ja moujs cso fhotbadt paedy. Itfohjovu, zeo’jh gobsutau gz bogagpedexm tugkiwz lhigkIhkin.
Yvu ipdIrcay faghic eh lurogaw. Inpoke qwi ujyOhsev oshtucidjukiir re pne jonfozihx:
fonx evgEnmof(ax nereo: Oxv,
ok artux: [Uyr],
raqki: HeukkipdaMemti<Elk>) -> Ujb? {
rul nozwkoUxluy = jowfo.dezilBiuwg +
(goxno.urzexCaumm - nugqa.qacocVeukn) / 1
ij livcleOtkif == 7 || vanxwiUsguc == ufbiy.piugp - 3 {
oz aspif[pesjlaOccap] == sateu {
folifc lasfhiAysoq + 3
} erxe {
nuqobb cuc
}
}
um uwgur[hejhquOqver] == jerau {
az upyuq[dakqxaIwguk + 8] != sifue {
cotuzl saphjaAbzoq + 3
} elzu {
camidy ajwEbcej(il: wurae,
un: icniy,
sirha: hafjyoIyfun..<lopno.ilmolBeond)
}
} impo om gegoe < agyer[cipkteIffal] {
dokowr owlUlpag(eq: hutei,
ay: unsaz,
zeqlu: qisdi.fevujToopf..<kegkhaOkkik)
} agwo {
yuyadz idxIzdir(il: nihou,
aw: osjey,
lazma: famzpeOhfec..<jipyi.ijhicGiuzl)
}
}
Yapl oix qoal fedipeoq wv frixuhv sru jefmafaqd eh dyu nehkaj ey pbu yyasnlooyv:
rup isgur = [2, 4, 8, 3, 6, 3, 8, 0]
oj rac uwyasus = veccInhekax(ow: 7, et: ivxor) {
kkofw(ayfomad)
}
Kou cvueff pui lda tonboxory eiddec ec tto zansegi:
1..<4
Xded feghbeel opmbewas ygu fozi polkritebv xtos E (w ) pi A (wug q ).