Kumite (ko͞omiˌtā) is the practice of taking techniques learned from Kata and applying them through the act of freestyle sparring.
You can create a new kumite by providing some initial code and optionally some test cases. From there other warriors can spar with you, by enhancing, refactoring and translating your code. There is no limit to how many warriors you can spar with.
A great use for kumite is to begin an idea for a kata as one. You can collaborate with other code warriors until you have it right, then you can convert it to a kata.
Macro to get max of two integers
can be used as a new pseudo-command
; A macro with two parameters
; Implements actual int max(int a, int b)
%macro _max 2
cmp %2, %1 ; compare a ?= b
jle _lower ; jump to lower if a <= b
jmp _greater ; jump to greater if a > b
_lower:
mov rax, %1 ; assgine rax to b
jmp _end ; end program
_greater:
mov rax, %2 ; assgine rax to a
_end:
ret
%endmacro
section .text
global max ; declaring int max(int a, int b)
max:
_max rdi, rsi ; using inner _max macro
ret
#include <criterion/criterion.h>
int max(int, int);
Test(max, should_return_max) {
cr_assert_eq(max(3, 2), 3);
}
Iterating over two vectors at the same time till end of one of them
#include <vector>
#include <tuple>
#include <iostream>
template <class T, class U>
void iterateTwoVectors(std::vector<T> A, std::vector<U> B)
{
for (auto [a,b] = std::tuple{A.begin(), B.begin()}; a != A.end() && b != B.end(); a++, b++)
{
std::cout << *a << ":" << *b << "\n";
}
}
// TODO: Replace examples and use TDD by writing your own tests
Describe(iterating)
{
It(should_iterate_both)
{
iterateTwoVectors<int, char>({1, 'a', 3}, {'a', 'b'});
}
};
enumerating over vector, equivelent to python's enumerate(list)
#include <vector>
#include <tuple>
#include <iostream>
template <class T>
void enumerate(std::vector<T> A)
{
for(auto [a,i]=std::tuple{A.begin(), 0}; a < A.end(); a++, i++)
{
std::cout << i << ":" << *a << "\n";
}
}
Describe(enumerating)
{
It(should_enumerate)
{
enumerate<int>({1, 5, 'a', 32});
}
};
Break lists of lists into a simple list
my_list = [[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]]
while (all(isinstance(x, list) for x in my_list)):
new_list = []
for sublist in my_list:
for i in sublist:
new_list.append(i)
my_list = new_list
print(my_list)
import codewars_test as test
# TODO Write tests
import solution # or from solution import example
# test.assert_equals(actual, expected, [optional] message)
@test.describe("Example")
def test_group():
@test.it("test case")
def test_case():
test.assert_equals(1 + 1, 2)
Endo
wraps a function; appEndo
unwraps it.
stimes
composes a wrapped function with itself n
times. It is optimised to take O(log n)
time.
module Example where
import Data.Semigroup (Endo(..),stimes)
fib :: Integer -> Integer
fib n = fst $ n `stimes` Endo ( \ (a,b) -> (b,a+b) ) `appEndo` (0,1)
module ExampleSpec where
import Test.Hspec
import Example
spec :: Spec
spec = do
it "tests" $ do
fib 0 `shouldBe` 0
fib 1 `shouldBe` 1
fib 2 `shouldBe` 1
fib 3 `shouldBe` 2
fib 4 `shouldBe` 3
fib 5 `shouldBe` 5
fib 6 `shouldBe` 8
fib 7 `shouldBe` 13
fib 8 `shouldBe` 21
fib 9 `shouldBe` 34
fib 1000 `shouldBe` 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
fib 100000 `shouldBe` 2597406934722172416615503402127591541488048538651769658472477070395253454351127368626555677283671674475463758722307443211163839947387509103096569738218830449305228763853133492135302679278956701051276578271635608073050532200243233114383986516137827238124777453778337299916214634050054669860390862750996639366409211890125271960172105060300350586894028558103675117658251368377438684936413457338834365158775425371912410500332195991330062204363035213756525421823998690848556374080179251761629391754963458558616300762819916081109836526352995440694284206571046044903805647136346033000520852277707554446794723709030979019014860432846819857961015951001850608264919234587313399150133919932363102301864172536477136266475080133982431231703431452964181790051187957316766834979901682011849907756686456845066287392485603914047605199550066288826345877189410680370091879365001733011710028310473947456256091444932821374855573864080579813028266640270354294412104919995803131876805899186513425175959911520563155337703996941035518275274919959802257507902037798103089922984996304496255814045517000250299764322193462165366210841876745428298261398234478366581588040819003307382939500082132009374715485131027220817305432264866949630987914714362925554252624043999615326979876807510646819068792118299167964409178271868561702918102212679267401362650499784968843680975254700131004574186406448299485872551744746695651879126916993244564817673322257149314967763345846623830333820239702436859478287641875788572910710133700300094229333597292779191409212804901545976262791057055248158884051779418192905216769576608748815567860128818354354292307397810154785701328438612728620176653953444993001980062953893698550072328665131718113588661353747268458543254898113717660519461693791688442534259478126310388952047956594380715301911253964847112638900713362856910155145342332944128435722099628674611942095166100230974070996553190050815866991144544264788287264284501725332048648319457892039984893823636745618220375097348566847433887249049337031633826571760729778891798913667325190623247118037280173921572390822769228077292456662750538337500692607721059361942126892030256744356537800831830637593334502350256972906515285327194367756015666039916404882563967693079290502951488693413799125174856667074717514938979038653338139534684837808612673755438382110844897653836848318258836339917310455850905663846202501463131183108742907729262215943020429159474030610183981685506695026197376150857176119947587572212987205312060791864980361596092339594104118635168854883911918517906151156275293615849000872150192226511785315089251027528045151238603792184692121533829287136924321527332714157478829590260157195485316444794546750285840236000238344790520345108033282013803880708980734832620122795263360677366987578332625485944906021917368867786241120562109836985019729017715780112040458649153935115783499546100636635745448508241888279067531359950519206222976015376529797308588164873117308237059828489404487403932053592935976454165560795472477862029969232956138971989467942218727360512336559521133108778758228879597580320459608479024506385194174312616377510459921102486879496341706862092908893068525234805692599833377510390101316617812305114571932706629167125446512151746802548190358351688971707570677865618800822034683632101813026232996027599403579997774046244952114531588370357904483293150007246173417355805567832153454341170020258560809166294198637401514569572272836921963229511187762530753402594781448204657460288485500062806934811398276016855584079542162057543557291510641537592939022884356120792643705560062367986544382464373946972471945996555795505838034825597839682776084731530251788951718630722761103630509360074262261717363058613291544024695432904616258691774630578507674937487992329181750163484068813465534370997589353607405172909412697657593295156818624747127636468836551757018353417274662607306510451195762866349922848678780591085118985653555434958761664016447588028633629704046289097067736256584300235314749461233912068632146637087844699210427541569410912246568571204717241133378489816764096924981633421176857150311671040068175303192115415611958042570658693127276213710697472226029655524611053715554532499750843275200199214301910505362996007042963297805103066650638786268157658772683745128976850796366371059380911225428835839194121154773759981301921650952140133306070987313732926518169226845063443954056729812031546392324981793780469103793422169495229100793029949237507299325063050942813902793084134473061411643355614764093104425918481363930542369378976520526456347648318272633371512112030629233889286487949209737847861884868260804647319539200840398308008803869049557419756219293922110825766397681361044490024720948340326796768837621396744075713887292863079821849314343879778088737958896840946143415927131757836511457828935581859902923534388888846587452130838137779443636119762839036894595760120316502279857901545344747352706972851454599861422902737291131463782045516225447535356773622793648545035710208644541208984235038908770223039849380214734809687433336225449150117411751570704561050895274000206380497967960402617818664481248547269630823473377245543390519841308769781276565916764229022948181763075710255793365008152286383634493138089971785087070863632205869018938377766063006066757732427272929247421295265000706646722730009956124191409138984675224955790729398495608750456694217771551107346630456603944136235888443676215273928597072287937355966723924613827468703217858459948257514745406436460997059316120596841560473234396652457231650317792833860590388360417691428732735703986803342604670071717363573091122981306903286137122597937096605775172964528263757434075792282180744352908669606854021718597891166333863858589736209114248432178645039479195424208191626088571069110433994801473013100869848866430721216762473119618190737820766582968280796079482259549036328266578006994856825300536436674822534603705134503603152154296943991866236857638062351209884448741138600171173647632126029961408561925599707566827866778732377419444462275399909291044697716476151118672327238679208133367306181944849396607123345271856520253643621964198782752978813060080313141817069314468221189275784978281094367751540710106350553798003842219045508482239386993296926659221112742698133062300073465628498093636693049446801628553712633412620378491919498600097200836727876650786886306933418995225768314390832484886340318940194161036979843833346608676709431643653538430912157815543512852077720858098902099586449602479491970687230765687109234380719509824814473157813780080639358418756655098501321882852840184981407690738507369535377711880388528935347600930338598691608289335421147722936561907276264603726027239320991187820407067412272258120766729040071924237930330972132364184093956102995971291799828290009539147382437802779051112030954582532888721146170133440385939654047806199333224547317803407340902512130217279595753863158148810392952475410943880555098382627633127606718126171022011356181800775400227516734144169216424973175621363128588281978005788832454534581522434937268133433997710512532081478345067139835038332901313945986481820272322043341930929011907832896569222878337497354301561722829115627329468814853281922100752373626827643152685735493223028018101449649009015529248638338885664893002250974343601200814365153625369199446709711126951966725780061891215440222487564601554632812091945824653557432047644212650790655208208337976071465127508320487165271577472325887275761128357592132553934446289433258105028633583669291828566894736223508250294964065798630809614341696830467595174355313224362664207197608459024263017473392225291248366316428006552870975051997504913009859468071013602336440164400179188610853230764991714372054467823597211760465153200163085336319351589645890681722372812310320271897917951272799656053694032111242846590994556380215461316106267521633805664394318881268199494005537068697621855231858921100963441012933535733918459668197539834284696822889460076352031688922002021931318369757556962061115774305826305535862015637891246031220672933992617378379625150999935403648731423208873977968908908369996292995391977217796533421249291978383751460062054967341662833487341011097770535898066498136011395571584328308713940582535274056081011503907941688079197212933148303072638678631411038443128215994936824342998188719768637604496342597524256886188688978980888315865076262604856465004322896856149255063968811404400429503894245872382233543101078691517328333604779262727765686076177705616874050257743749983775830143856135427273838589774133526949165483929721519554793578923866762502745370104660909382449626626935321303744538892479216161188889702077910448563199514826630802879549546453583866307344423753319712279158861707289652090149848305435983200771326653407290662016775706409690183771201306823245333477966660525325490873601961480378241566071271650383582257289215708209369510995890132859490724306183325755201208090007175022022949742801823445413711916298449914722254196594682221468260644961839254249670903104007581488857971672246322887016438403908463856731164308169537326790303114583680575021119639905615169154708510459700542098571797318015564741406172334145847111268547929892443001391468289103679179216978616582489007322033591376706527676521307143985302760988478056216994659655461379174985659739227379416726495377801992098355427866179123126699374730777730569324430166839333011554515542656864937492128687049121754245967831132969248492466744261999033972825674873460201150442228780466124320183016108232183908654771042398228531316559685688005226571474428823317539456543881928624432662503345388199590085105211383124491861802624432195540433985722841341254409411771722156867086291742124053110620522842986199273629406208834754853645128123279609097213953775360023076765694208219943034648783348544492713539450224591334374664937701655605763384697062918725745426505879414630176639760457474311081556747091652708748125267159913793240527304613693961169892589808311906322510777928562071999459487700611801002296132304588294558440952496611158342804908643860880796440557763691857743754025896855927252514563404385217825890599553954627451385454452916761042969267970893580056234501918571489030418495767400819359973218711957496357095967825171096264752068890806407651445893132870767454169607107931692704285168093413311046353506242209810363216771910420786162184213763938194625697286781413636389620123976910465418956806197323148414224550071617215851321302030684176087215892702098879108938081045903397276547326416916845445627600759561367103584575649094430692452532085003091068783157561519847567569191284784654692558665111557913461272425336083635131342183905177154511228464455136016013513228948543271504760839307556100908786096663870612278690274831819331606701484957163004705262228238406266818448788374548131994380387613830128859885264201992286188208499588640888521352501457615396482647451025902530743172956899636499615707551855837165935367125448515089362904567736630035562457374779100987992499146967224041481601289530944015488942613783140087804311431741858071826185149051138744831358439067228949408258286021650288927228387426432786168690381960530155894459451808735197246008221529343980828254126128257157209350985382800738560472910941184006084485235377833503306861977724501886364070344973366473100602018128792886991861824418453968994777259482169137133647470453172979809245844361129618997595696240971845564020511432589591844724920942930301651488713079802102379065536525154780298059407529440513145807551537794861635879901158192019808879694967187448224156836463534326160242632934761634458163890163805123894184523973421841496889262398489648642093409816681494771155177009562669029850101513537599801272501241971119871526593747484778935488777815192931171431167444773882941064615028751327709474504763922874890662989841540259350834035142035136168819248238998027706666916342133424312054507359388616687691188185776118135771332483965209882085982391298606386822804754362408956522921410859852037330544625953261340234864689275060526893755148403298542086991221052597005628576707702567695300978970046408920009852106980295419699802138053295798159478289934443245491565327845223840551240445208226435420656313310702940722371552770504263482073984454889589248861397657079145414427653584572951329719091947694411910966797474262675590953832039169673494261360032263077428684105040061351052194413778158095005714526846009810352109249040027958050736436961021241137739717164869525493114805040126568351268829598413983222676377804500626507241731757395219796890754825199329259649801627068665658030178877405615167159731927320479376247375505855052839660294566992522173600874081212014209071041937598571721431338017425141582491824710905084715977249417049320254165239323233258851588893337097136310892571531417761978326033750109026284066415801371359356529278088456305951770081443994114674291850360748852366654744869928083230516815711602911836374147958492100860528981469547750812338896943152861021202736747049903930417035171342126923486700566627506229058636911882228903170510305406882096970875545329369434063981297696478031825451642178347347716471058423238594580183052756213910186997604305844068665712346869679456044155742100039179758348979935882751881524675930878928159243492197545387668305684668420775409821781247053354523194797398953320175988640281058825557698004397120538312459428957377696001857497335249965013509368925958021863811725906506436882127156815751021712900765992750370228283963962915973251173418586721023497317765969454283625519371556009143680329311962842546628403142444370648432390374906410811300792848955767243481200090309888457270907750873638873299642555050473812528975962934822878917619920725138309388288292510416837622758204081918933603653875284116785703720989718832986921927816629675844580174911809119663048187434155067790863948831489241504300476704527971283482211522202837062857314244107823792513645086677566622804977211397140621664116324756784216612961477109018826094677377686406176721484293894976671380122788941309026553511096118347012565197540807095384060916863936906673786627209429434264260402902158317345003727462588992622049877121178405563348492490326003508569099382392777297498413565614830788262363322368380709822346012274241379036473451735925215754757160934270935192901723954921426490691115271523338109124042812102893738488167358953934508930697715522989199698903885883275409044300321986834003470271220020159699371690650330547577095398748580670024491045504890061727189168031394528036165633941571334637222550477547460756055024108764382121688848916940371258901948490685379722244562009483819491532724502276218589169507405794983759821006604481996519360110261576947176202571702048684914616894068404140833587562118319210838005632144562018941505945780025318747471911604840677997765414830622179069330853875129298983009580277554145435058768984944179136535891620098725222049055183554603706533183176716110738009786625247488691476077664470147193074476302411660335671765564874440577990531996271632972009109449249216456030618827772947750764777446452586328919159107444252320082918209518021083700353881330983215894608680127954224752071924134648334963915094813097541433244209299930751481077919002346128122330161799429930618800533414550633932139339646861616416955220216447995417243171165744471364197733204899365074767844149929548073025856442942381787641506492878361767978677158510784235702640213388018875601989234056868423215585628508645525258377010620532224244987990625263484010774322488172558602233302076399933854152015343847725442917895130637050320444917797752370871958277976799686113626532291118629631164685159934660693460557545956063155830033697634000276685151293843638886090828376141157732003527565158745906567025439437931104838571313294490604926582363108949535090082673154497226396648088618041573977888472892174618974189721700770009862449653759012727015227634510874906948012210684952063002519011655963580552429180205586904259685261047412834518466736938580027700252965356366721619883672428226933950325930390994583168665542234654857020875504617520521853721567282679903418135520602999895366470106557900532129541336924472492212436324523042895188461779122338069674233980694887270587503389228395095135209123109258159006960395156367736067109050566299603571876423247920752836160805597697778756476767210521222327184821484446631261487584226092608875764331731023263768864822594691211032367737558122133470556805958008310127481673962019583598023967414489867276845869819376783757167936723213081586191045995058970991064686919463448038574143829629547131372173669836184558144505748676124322451519943362182916191468026091121793001864788050061351603144350076189213441602488091741051232290357179205497927970924502479940842696158818442616163780044759478212240873204124421169199805572649118243661921835714762891425805771871743688000324113008704819373962295017143090098476927237498875938639942530595331607891618810863505982444578942799346514915952884869757488025823353571677864826828051140885429732788197765736966005727700162592404301688659946862983717270595809808730901820120931003430058796552694788049809205484305467611034654748067290674399763612592434637719995843862812391985470202414880076880818848087892391591369463293113276849329777201646641727587259122354784480813433328050087758855264686119576962172239308693795757165821852416204341972383989932734803429262340722338155102209101262949249742423271698842023297303260161790575673111235465890298298313115123607606773968998153812286999642014609852579793691246016346088762321286205634215901479188632194659637483482564291616278532948239313229440231043277288768139550213348266388687453259281587854503890991561949632478855035090289390973718988003999026132015872678637873095678109625311008054489418857983565902063680699643165033912029944327726770869305240718416592070096139286401966725750087012218149733133695809600369751764951350040285926249203398111014953227533621844500744331562434532484217986108346261345897591234839970751854223281677187215956827243245910829019886390369784542622566912542747056097567984857136623679023878478161201477982939080513150258174523773529510165296934562786122241150783587755373348372764439838082000667214740034466322776918936967612878983488942094688102308427036452854504966759697318836044496702853190637396916357980928865719935397723495486787180416401415281489443785036291071517805285857583987711145474240156416477194116391354935466755593592608849200546384685403028080936417250583653368093407225310820844723570226809826951426162451204040711501448747856199922814664565893938488028643822313849852328452360667045805113679663751039248163336173274547275775636810977344539275827560597425160705468689657794530521602315939865780974801515414987097778078705357058008472376892422189750312758527140173117621279898744958406199843913365680297721208751934988504499713914285158032324823021340630312586072624541637765234505522051086318285359658520708173392709566445011404055106579055037417780393351658360904543047721422281816832539613634982525215232257690920254216409657452618066051777901592902884240599998882753691957540116954696152270401280857579766154722192925655963991820948894642657512288766330302133746367449217449351637104725732980832812726468187759356584218383594702792013663907689741738962252575782663990809792647011407580367850599381887184560094695833270775126181282015391041773950918244137561999937819240362469558235924171478702779448443108751901807414110290370706052085162975798361754251041642244867577350756338018895379263183389855955956527857227926155524494739363665533904528656215464288343162282921123290451842212532888101415884061619939195042230059898349966569463580186816717074818823215848647734386780911564660755175385552224428524049468033692299989300783900020690121517740696428573930196910500988278523053797637940257968953295112436166778910585557213381789089945453947915927374958600268237844486872037243488834616856290097850532497036933361942439802882364323553808208003875741710969289725499878566253048867033095150518452126944989251596392079421452606508516052325614861938282489838000815085351564642761700832096483117944401971780149213345335903336672376719229722069970766055482452247416927774637522135201716231722137632445699154022395494158227418930589911746931773776518735850032318014432883916374243795854695691221774098948611515564046609565094538115520921863711518684562543275047870530006998423140180169421109105925493596116719457630962328831271268328501760321771680400249657674186927113215573270049935709942324416387089242427584407651215572676037924765341808984312676941110313165951429479377670698881249643421933287404390485538222160837088907598277390184204138197811025854537088586701450623578513960109987476052535450100439353062072439709976445146790993381448994644609780957731953604938734950026860564555693224229691815630293922487606470873431166384205442489628760213650246991893040112513103835085621908060270866604873585849001704200923929789193938125116798421788115209259130435572321635660895603514383883939018953166274355609970015699780289236362349895374653428746875
Nigelius is a new Hero in Mobile Legends, and you are invited for an interview by Shanghai Moonton
Technology for a game developer position. Nigelius the Bloodborn has a passive skill that increases
his damage for every 250 HP he has, and your task is to code this skill. The increase goes as
follows:
at 250 HP +1 damage
at 500 HP +4 damage
at 750 HP +9 damage
at 1000 HP +16 damage
at 1250 HP +25 damage
.
.
.
at 2000 HP +64 damage
at 2250 HP +81 damage
...etc
That is, we determine how many chunks of 250 HP Nigelius has, and then we square it to get the bonus
damage. Write a function getBonusDamage
given the current health of Nigelius.
Nigelius does not get fractional damage bonuses, in other words, 500 and 600 HP will give him +4
bonus damage. 749 HP will also give him +4 bonus damage.
function getBonusDamage(currentHP) {
return Math.trunc(currentHP / 250) ** 2
}
// Since Node 10, we're using Mocha.
// You can use `chai` for assertions.
const chai = require("chai");
const assert = chai.assert;
// Uncomment the following line to disable truncating failure messages for deep equals, do:
// chai.config.truncateThreshold = 0;
// Since Node 12, we no longer include assertions from our deprecated custom test framework by default.
// Uncomment the following to use the old assertions:
// const Test = require("@codewars/test-compat");
describe('getBonusDamage', () => {
describe('Hidden Test Cases', () => {
it('___SE___works_for_HP_that_evenly_divides_250', () => {
assert.strictEqual(getBonusDamage(35750), 20449)
})
it('___SE___works_for_HP_that_does_not_evenly_divide_250_-_I', () => {
assert.strictEqual(getBonusDamage(67783), 73441)
})
it('___SE___works_for_HP_that_almost_creates_another_250_HP_chunk_-_I', () => {
assert.strictEqual(getBonusDamage(122488), 239121)
})
it('___SE___works_for_HP_that_does_not_evenly_divide_250_-_II', () => {
assert.strictEqual(getBonusDamage(125438), 251001)
})
it('___SE___works_for_HP_that_almost_creates_another_250_HP_chunk_-_II', () => {
assert.strictEqual(getBonusDamage(125249), 250000)
})
it('___SE___works_for_HP_that_does_not_evenly_divide_250_-_III', () => {
assert.strictEqual(getBonusDamage(232001), 861184)
})
it('___SE___works_for_HP_that_almost_creates_another_250_HP_chunk_-_III', () => {
assert.strictEqual(getBonusDamage(231998), 859329)
})
it('___SE___works_for_HP_that_does_not_evenly_divide_250_-_IV', () => {
assert.strictEqual(getBonusDamage(3586126), 205750336)
})
it('___SE___works_for_HP_That_almost_creates_another_250_HP_chunk_-_IV', () => {
assert.strictEqual(getBonusDamage(3585990), 205721649)
})
it('___SE___works_when_Nigelius_is_not_fine', () => {
assert.strictEqual(getBonusDamage(3), 0)
})
})
})
I had to use this for the kyu 3 binomial expansion kata since I have no clue how to use the BigInts library for Java. Instead of calculating the total value of each factorial, this finds the factors of the numerator and denominator, simplifies, and divides the results. Nothing special and there are better solutions, but I'm proud of it.
Note: The n-choose-k formula
n!
------------
k!(n - k)!
public class ArrayFactorial{
public static int factorial(int n, int k) {
int n_k = n - k;
int[] numerator = new int[n];
int[] denominator = new int[k + n_k];
for(int i = 1; i <= n; i++)
numerator[i - 1] = i;
for(int i = 1; i <= k; i++)
denominator[i - 1] = i;
for(int i = 1; i <= n_k; i++)
denominator[k + i - 1] = i;
for(int i = 0; i < numerator.length; i++){
for(int j = 0; j < denominator.length; j++){
if(numerator[i] == denominator[j]) {
numerator[i] = 1;
denominator[j] = 1;
}
}
}
int n_sum = 1;
int d_sum = 1;
for(int v : numerator)
n_sum *= v;
for(int v : denominator)
d_sum *= v;
return n_sum / d_sum;
}
}
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.JUnit4;
// TODO: Replace examples and use TDD by writing your own tests
public class SolutionTest {
@Test
public void BasicTests() {
assertEquals(3, ArrayFactorial.factorial(3, 1));
assertEquals(10, ArrayFactorial.factorial(5, 2));
assertEquals(15, ArrayFactorial.factorial(6, 4));
}
@Test
public void LargerTests() {
assertEquals(1365, ArrayFactorial.factorial(15, 4));
assertEquals(19448, ArrayFactorial.factorial(17, 7));
}
}
Hello! I have a lot of difficulties to write a good description of this kata. I published it some time ago but I met a lot of critics with that description and received good evaluations of the task. I tried to rewrite it several times but it would not get better. If you like thaе kata and you are interested in helping me it would be great!
What we have:
-
Input: a
table
pool (two-dimensional array); -
"X"
is a part of the table or cell; -
One white cue ball is represented by number >=1. This number means the force of shot: one point of the force is equal to one movement of a ball, so the ball with number 3 can move 3 cells (to move to the next cell you should subtract one point from its force). After collision with a coloured ball it gives the rest points of force to a coloured ball and disappears (the white ball only determines the direction).
-
One coloured ball is represented by
"O"
. -
Pockets are represented by
"U"
. They can be in any place on the borders of the table; -
The output is: a boolean (whether the coloured ball rolled into a pocket) and a pair of integers (the final coordinates of the coloured ball).
Rules
The balls can move only to their adjacent cells in the horizontal, vertical ou diagonal direction. The line
You should shot the white ball in the direction of the coloured ball using that way that results in the imaginable straight line between them:
Possible collisions:
1) ["O", "X", "X"] 2) ["X", "X", "X"] 3) ["X", "4", "X"]
["X", "X", "X"] ["O", "X", "4"] ["X", "X", "X"]
["X", "X", "4"] ["X", "X", "X"] ["X", "O", "X"]
No collisions:
1) ["X", "4", "X"] 2) ["X", "X", "X", "X"]
["X", "X", "X"] ["X", "X", "X", "O"]
["O", "X", "X"] ["4", "X", "X", "X"]
If the white ball can't reach the coloured ball by that way, a collision won't happen.
In the case of collision, the coloured ball "O"
starts to move(in the same direction that the white ball moved) until it stops because its force is over or until it enters a pocket. If it hits the "table wall", the ball changes its angle of movement according to physics.
For example, in this case, after collision the ball "O"
goes to the opposite direction:
["X", "O", "X"] ["X", "O", "X"] ["X", "X", "X"] ["X", "X", "X"] ["X", "X", "X"]
["X", "4", "X"]=>["X", "X", "X"]=>["X", "O", "X"]=>["X", "X", "X"]=>["X", "O", "X"]
["X", "X", "X"] ["X", "X", "X"] ["X", "X", "X"] ["X", "O", "X"] ["X", "X", "X"]
And in the next case, it "reflects":
["X", "O", "X"] ["X", "O", "X"] ["X", "X", "X"] ["X", "X", "X"] ["X", "X", "X"]
["4", "X", "X"]=>["X", "X", "X"]=>["X", "X", "O"]=>["X", "X", "X"]=>["O", "X", "X"]
["X", "X", "X"] ["X", "X", "X"] ["X", "X", "X"] ["X", "O", "X"] ["X", "X", "X"]
Return true
or false
if the coloured ball did enter a pocket or not and the coordinates of coloured ball.
Notes
The size of a table can be different but always rectangular.
There are only two balls.
Examples
let table = [["U", "X", "O", "X"], // the collision is possible
["X", "X", "X", "X"],
["9", "X", "U", "X"]]
table = [["U", "X", "O", "X"],
["X", "8", "X", "X"], // <-- one movement spends one point of force
["X", "X", "U", "X"]]
table = [["U", "X", "O", "X"], // <-- 7 points of force (the white ball was removed)
["X", "X", "X", "X"],
["X", "X", "U", "X"]]
table = [["U", "X", "X", "X"],
["X", "X", "X", "O"],// <--6 points
["X", "X", "U", "X"]]
table = [["U", "X", "X", "X"],
["X", "X", "X", "X"],
["X", "X", "U", "X"]] // <--the coloured ball entered a pocket
return [true, [2, 2] ]
let table = [["U", "X", "X"], // the collision is possible,
["1", "O", "U"], // but there is not enough force to reach a pocket
["X", "X", "X"]]
return [false, [1, 1] ]
let table = [["U", "X", "X", "X"], // the collision is not possible
["X", "X", "X", "O"],
["9", "X", "U", "X"]]
return [false, [1, 3] ]
!The last critic of a Moderator:
-
would be more readable to have the input as an array of strings, rather than an array of arays of strings, no? (and you could use whitespaces instead of X for "empty" places)
-
the description really needs a rewrite... ;) General advises:
a) don't give the examples before the specifications
b) especially, don't mix explanations and examples
c) give the general idea of the task right at the beginning before going into details. Like, that's the very first thing that should be in the description, before the picture. -
I believe you didn't specify that no pockets will ever be under the starting positions of the balls
-
the notes are parts of the specs
-
did you say that the force/speed may be greater than 9 (and is never negative)?
*3 - I'm going t fix it
function poolgame(table) {
let force;
let coordBall1 = {};
let coordBall2 = {};
for (let i = 0; i < table.length; i++) {
for (let k = 0; k < table[i].length; k++) {
if (Object.keys(coordBall1).length && Object.keys(coordBall2).length) break;
if (!isNaN(table[i][k])) {
coordBall1.X = k;
coordBall1.Y = i;
force = table[i][k];
} else if (table[i][k] == "O") {
coordBall2.X = k;
coordBall2.Y = i;
}
}
}
let dir = { X: 0, Y: 0 };
let y = Math.abs(coordBall1.Y - coordBall2.Y);
let x = Math.abs(coordBall1.X - coordBall2.X);
if (coordBall1.Y === coordBall2.Y) {
force -= x;
} else if (coordBall1.X === coordBall2.X) {
force -= y;
} else {
if (y !== x) return [false, [coordBall2.Y, coordBall2.X]]; //check if there is no collision
force -= x;
}
if (force <= 0) return [false, [coordBall2.Y, coordBall2.X]]; //check if there is no collision
dir.X = (coordBall1.X > coordBall2.X) ? -1 : (coordBall1.X === coordBall2.X) ? 0 : 1;
dir.Y = (coordBall1.Y > coordBall2.Y) ? -1 : (coordBall1.Y === coordBall2.Y) ? 0 : 1;
let tableLimit = {
X: table[0].length - 1,
Y: table.length - 1
}
while (force--) {
let possibleX = coordBall2.X + dir.X;
let possibleY = coordBall2.Y + dir.Y;
if (possibleX > tableLimit.X || possibleX < 0) dir.X = -dir.X;
if (possibleY > tableLimit.Y || possibleY < 0) dir.Y = -dir.Y;
coordBall2.X += dir.X;
coordBall2.Y += dir.Y;
if (table[coordBall2.Y][coordBall2.X] === "U") return [true, [coordBall2.Y, coordBall2.X]];
}
return [false, [coordBall2.Y, coordBall2.X]];
}
const chai = require("chai");
const assert = chai.assert;
chai.config.truncateThreshold = 0;
describe("Sample tests", function() {
it(`[
["X", "X", "U"],
["O", "X", "5"],
["U", "X", "X"]
]`, function() {
assert.deepEqual(poolgame(
[
["X", "X", "U"],
["O", "X", "5"],
["U", "X", "X"]
]), [ false, [ 1, 1 ] ]);
});
it(`[
["U", "X", "3"],
["X", "X", "X"],
["O", "X", "U"]
]`, function() {
assert.deepEqual(poolgame(
[
["U", "X", "3"],
["X", "X", "X"],
["O", "X", "U"]
]), [ false, [ 1, 1 ] ]);
});
it(`[
["U", "X", "O","X"],
["X", "X", "X","X"],
["8", "X", "X","X"]
]`, function() {
assert.deepEqual(poolgame(
[
["U", "X", "O","X"],
["X", "X", "X","X"],
["8", "X", "X","X"]
]), [ true, [ 0, 0 ] ]);
});
it(`[
["U", "X", "X","X"],
["X", "X", "X","O"],
["8", "X", "X","X"],
["X", "U", "U","X"]
]`, function() {
assert.deepEqual(poolgame(
[
["U", "X", "X","X"],
["X", "X", "X","O"],
["8", "X", "X","X"],
["X", "U", "U","X"]
]), [ false, [ 1, 3 ] ]);
});
it(`[
["U", "X", "X","O"],
["X", "X", "X","X"],
["X", "X", "X","X"],
["8", "U", "U","X"]
]`, function() {
assert.deepEqual(poolgame(
[
["U", "X", "X","O"],
["X", "X", "X","X"],
["X", "X", "X","X"],
["8", "U", "U","X"]
]), [ false, [ 1, 2 ] ]);
});
it(`[
["U", "X", "X","X"],
["X", "X", "O","X"],
["9", "X", "X","X"],
["X", "U", "U","X"]
]`, function() {
assert.deepEqual(poolgame(
[
["U", "X", "X","X"],
["X", "X", "O","X"],
["9", "X", "X","X"],
["X", "U", "U","X"]
]), [ false, [ 1, 2 ] ]);
});
it(`[
["U", "X", "X","O"],
["X", "X", "X","X"],
["X", "9", "X","X"],
["U", "X", "U","X"]
]`, function () {
assert.deepEqual(poolgame(
[
["U", "X", "X", "O"],
["X", "X", "X", "X"],
["X", "9", "X", "X"],
["U", "X", "U", "X"]
]), [true, [3, 0]]);
});
it(`[
["U", "X", "X","X"],
["X", "X", "X","X"],
["2", "X", "X","O"],
["X", "X", "U","X"],
["X", "U", "U","X"]
]`, function() {
assert.deepEqual(poolgame(
[
["U", "X", "X","X"],
["X", "X", "X","X"],
["2", "X", "X","O"],
["X", "X", "U","X"],
["X", "U", "U","X"]
]),[ false, [ 2, 3 ] ]);
});
it(`[
["U", "X", "X","X"],
["X", "X", "X","X"],
["1", "O", "X","X"]
]`, function() {
assert.deepEqual(poolgame(
[
["U", "X", "X","X"],
["X", "X", "X","X"],
["1", "O", "X","X"]
]), [ false, [ 2, 1 ] ]);
});
});
describe("New Edge test", function() {
it(`[
["X", "X", "U", "X", "X", "X", "U", "X", "X", "X"],
["X", "X", "X", "X", "X", "X", "X", "X", "X", "X"],
["X", "X", "X", "X", "X", "X", "X", "X", "X", "X"],
["X", "X", "X", "X", "X", "X", "X", "X", "X", "X"],
["X", "X", "X", "X", "O", "X", "X", "X", "X", "X"],
["X", "X", "X", "X", "X", "X", "X", "X", "X", "U"],
["X", "X", "X", "X", "X", "X", "X", "X", "X", "U"],
["X", "50", "X", "X", "X", "X", "X", "X", "X", "X"],
["U", "X", "X", "X", "X", "X", "X", "X", "X", "X"],
["U", "X", "U", "X", "U", "X", "X", "X", "X", "X"]
]`, function() {
assert.deepEqual(poolgame(
[
["X", "X", "U", "X", "X", "X", "U", "X", "X", "X"],
["X", "X", "X", "X", "X", "X", "X", "X", "X", "X"],
["X", "X", "X", "X", "X", "X", "X", "X", "X", "X"],
["X", "X", "X", "X", "X", "X", "X", "X", "X", "X"],
["X", "X", "X", "X", "O", "X", "X", "X", "X", "X"],
["X", "X", "X", "X", "X", "X", "X", "X", "X", "U"],
["X", "X", "X", "X", "X", "X", "X", "X", "X", "U"],
["X", "50", "X", "X", "X", "X", "X", "X", "X", "X"],
["U", "X", "X", "X", "X", "X", "X", "X", "X", "X"],
["U", "X", "U", "X", "U", "X", "X", "X", "X", "X"]
]), [ true, [ 8, 0 ] ]);
});
});
describe("Random tests", function() {
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min) + min); //The maximum is exclusive and the minimum is inclusive
}
function createTable(a, b) {
let arr = [];
while (arr.length < a) {
let sub = [];
while (sub.length < b) {
sub.push("X");
}
arr.push(sub);
}
return arr;
}
function createTest() {
let outerSize = getRandomInt(3, 11);
let innerSize = getRandomInt(3, 11);
let arr = createTable(outerSize, innerSize)
let coordBall1 = {
Y: getRandomInt(0, outerSize),
X: getRandomInt(0, innerSize)
}
let coordBall2 = {};
let typeOfPos = Math.random();
if (typeOfPos < 0.3) {
coordBall2.X = coordBall1.X;
coordBall2.Y = getRandomInt(0, outerSize)
if (coordBall2.Y === coordBall1.Y) {
coordBall2.Y += (coordBall2.Y > 0) ? -1 : 1;
}
} else if (typeOfPos < 0.6) {
coordBall2.X = getRandomInt(0, innerSize)
coordBall2.Y = coordBall1.Y;
if (coordBall2.X === coordBall1.X) {
coordBall2.X += (coordBall2.X > 0) ? -1 : 1;
}
} else if (typeOfPos < 0.9) { //simple diagonal tests
if (Math.random() < 0.5) {
coordBall2.X = (coordBall1.X > 0) ? coordBall1.X - 1 : coordBall1.X + 1;
} else {
coordBall2.X = (coordBall1.X < innerSize - 1) ? coordBall1.X + 1 : coordBall1.X - 1;
}
if (Math.random() < 0.5) {
coordBall2.Y = (coordBall1.Y > 0) ? coordBall1.Y - 1 : coordBall1.Y + 1;
} else {
coordBall2.Y = (coordBall1.Y < outerSize - 1) ? coordBall1.Y + 1 : coordBall1.Y - 1;
}
} else {
coordBall2.Y = getRandomInt(0, outerSize)
if (coordBall2.Y === coordBall1.Y) {
coordBall2.Y += (coordBall2.Y > 0) ? -1 : 1;
}
coordBall2.X = getRandomInt(0, innerSize)
if (coordBall2.X === coordBall1.X) {
coordBall2.X += (coordBall2.X > 0) ? -1 : 1;
}
}
let pockets = [];
function createPockets(pos) {
let pocket;
if (pos === "top") {
pocket = [0, getRandomInt(0, innerSize)];
} else if (pos === "bottom") {
pocket = [outerSize - 1, getRandomInt(0, innerSize)];
} else if (pos === "left") {
pocket = [getRandomInt(0, outerSize), 0];
} else if (pos === "right") {
pocket = [getRandomInt(0, outerSize), innerSize - 1];
}
pockets.push(pocket)
}
let totalS = outerSize + innerSize;
if (totalS === 6) {
createPockets("top");
createPockets("bottom");
} else if (totalS < 10) {
createPockets("top");
createPockets("bottom");
createPockets("left");
createPockets("right");
} else if (totalS < 14) {
createPockets("top");
createPockets("bottom");
createPockets("left");
createPockets("right");
createPockets("left");
createPockets("right");
} else {
createPockets("top");
createPockets("bottom");
createPockets("top");
createPockets("bottom");
createPockets("left");
createPockets("right");
createPockets("left");
createPockets("right");
}
for (let i = 0; i < pockets.length; i++) {
let pocket = pockets[i];
arr[pocket[0]][pocket[1]] = "U";
}
arr[coordBall1.Y][coordBall1.X] = (getRandomInt(1, 50)).toString();
arr[coordBall2.Y][coordBall2.X] = "O";
return arr;
}
function mySol(table) {
let force;
let coordBall1 = {};
let coordBall2 = {};
for (let i = 0; i < table.length; i++) {
for (let k = 0; k < table[i].length; k++) {
if (Object.keys(coordBall1).length && Object.keys(coordBall2).length) break;
if (!isNaN(table[i][k])) {
coordBall1.X = k;
coordBall1.Y = i;
force = table[i][k];
} else if (table[i][k] == "O") {
coordBall2.X = k;
coordBall2.Y = i;
}
}
}
let dir = { X: 0, Y: 0 };
let y = Math.abs(coordBall1.Y - coordBall2.Y);
let x = Math.abs(coordBall1.X - coordBall2.X);
if (coordBall1.Y === coordBall2.Y) {
force -= x;
} else if (coordBall1.X === coordBall2.X) {
force -= y;
} else {
if (y !== x) return [false, [coordBall2.Y, coordBall2.X]]; //check if there is no collision
force -= x;
}
if (force <= 0) return [false, [coordBall2.Y, coordBall2.X]]; //check if there is no collision
dir.X = (coordBall1.X > coordBall2.X) ? -1 : (coordBall1.X === coordBall2.X) ? 0 : 1;
dir.Y = (coordBall1.Y > coordBall2.Y) ? -1 : (coordBall1.Y === coordBall2.Y) ? 0 : 1;
let tableLimit = {
X: table[0].length - 1,
Y: table.length - 1
}
while (force--) {
let possibleX = coordBall2.X + dir.X;
let possibleY = coordBall2.Y + dir.Y;
if (possibleX > tableLimit.X || possibleX < 0) dir.X = -dir.X;
if (possibleY > tableLimit.Y || possibleY < 0) dir.Y = -dir.Y;
coordBall2.X += dir.X;
coordBall2.Y += dir.Y;
if (table[coordBall2.Y][coordBall2.X] === "U") return [true, [coordBall2.Y, coordBall2.X]];
}
return [false, [coordBall2.Y, coordBall2.X]];
}
function verify() {
for (let i = 0; i < 90; i++) {
let arr = createTest();
let solution = mySol(arr)
it(`arr`, function() {
assert.deepEqual(poolgame(arr), solution);
});
}
}
verify()
});
Sprawdza czy wyraz jest palindromem.
Palindrom to wyraz który czytany od przodu i od tyłu daje to samo słowo.
function isPalindrom(word) {
if (!word || word.indexOf(' ') > -1) {
return false;
}
return word.toLowerCase() === word.toLowerCase().split('').reverse().join('');
}
// Since Node 10, we're using Mocha.
// You can use `chai` for assertions.
const chai = require("chai");
const assert = chai.assert;
// Uncomment the following line to disable truncating failure messages for deep equals, do:
// chai.config.truncateThreshold = 0;
// Since Node 12, we no longer include assertions from our deprecated custom test framework by default.
// Uncomment the following to use the old assertions:
// const Test = require("@codewars/test-compat");
describe("isPalindrom", function() {
it("zwraca false kiedy word jest pustym ciągiem znaków", function() {
assert.strictEqual(isPalindrom(''), false);
});
it("zwraca false kiedy word zawiera spację", function() {
assert.strictEqual(isPalindrom('work krow'), false);
});
it("zwraca true kiedy word jest palindromem", function() {
assert.strictEqual(isPalindrom('kajak'), true);
});
it("zwraca true kiedy word jest palindromem z literami o różnej wielkości", function() {
assert.strictEqual(isPalindrom('Kajak'), true);
});
});
(This is a draft for a potential Kata series, left as a Kumite for now)
Regex engine from scratch
Throughout this series you'll be gradually piecing together a regex engine, with each successive Kata adding an additional piece of syntax into the mix.
You may wish to copy code you've developed in earlier parts of the series for later parts so that you can gradually build up the engine as you go, or you can cater each solution to the specific syntax proposed. The latter might be better for the first few steps as they're very simple.
It all begins with a dot.
For the first step we're going to implement regex's .
syntax.
To keep things simple, every other symbol except for a period should be treated as if it was inside a character set, even if the symbol would be treated as syntax by a real regex engine.
For example, the input [.]
, even though it looks like a character class, should be handled as if it was \[.\]
because we're only implementing the dot metacharacter for now. This also means you can't cheat and just import re!
Your function will be provided a pattern as a string. This pattern should be handled somehow to produce a function that can then be used to match on a string. You should expect this prepared function to be called multiple times with different inputs, it can't match just once.
The produced match function should behave as if it had anchors on either end, so it should match the entire string.
Examples
match('c.t')("cat") => True
match('c.t')("cbt") => True
match('c.t')("catastrophic") => False (must match entire string)
match('c.t')("abc") => False (not a match)
match('[.]')('[a]') => True (we don't support character classes, treat them like letters)
match('[a]')('a') => False (we've not implemented character classes yet)
def match(pattern):
def matcher(string):
return len(pattern) == len(string) and all(a == b if a != '.' else True for a, b in zip(pattern, string))
return matcher
import codewars_test as test
# TODO Write tests
import solution # or from solution import example
# test.assert_equals(actual, expected, [optional] message)
@test.describe("Example")
def test_group():
@test.it("test case")
def test_case():
cat = match('c.t')
test.assert_equals(cat('cat'), True)
test.assert_equals(cat('cbt'), True)
test.assert_equals(cat('catastrophic'), False)
test.assert_equals(match('c.t')('abc'), False)
test.assert_equals(match('[.]')('[a]'), True)
test.assert_equals(match('[a]')('a'), False)