Doing a little catch up on challenges. Here's my solution in Go:
Enjoy the naming scheme :evil-smile:
typeCheckbookstruct{balint64cheques[]ChequetotalExpint64avgExpint64}typeChequestruct{nointcategorystringamountint64balanceint64}constscaling=1000varfilter=regexp.MustCompile("[^a-zA-Z0-9 .\n]*")// New parses a text listing of chequesfuncNew(chequeListstring)(Checkbook,error){// remove unwanted runeschequeList=filter.ReplaceAllString(strings.TrimSpace(chequeList),"")lines:=strings.Split(chequeList,"\n")bal,ok:=(&big.Float{}).SetString(strings.TrimSpace(lines[0]))if!ok{returnCheckbook{},errors.Errorf("balance invalid %q",lines[0])}b,_:=bal.Mul(bal,(&big.Float{}).SetInt64(scaling)).Int64()cb:=Checkbook{bal:b,cheques:make([]Cheque,len(lines)-1),}tot:=int64(0)fori,v:=rangelines[1:]{cq,err:=parseCheque(v)iferr!=nil{returnCheckbook{},err}cq.balance,b=b-cq.amount,b-cq.amountcb.cheques[i]=cqtot+=cq.amount}cb.totalExp=totcb.avgExp=tot/int64(len(cb.cheques))returncb,nil}// parseCheque from an entry line in the checkbook.funcparseCheque(entrystring)(Cheque,error){entry=strings.TrimSpace(entry)ifstrings.Count(entry," ")<2{returnCheque{},errors.Errorf("cheque line invalid %q",entry)}fi,li:=strings.Index(entry," "),strings.LastIndex(entry," ")chNo,cat,amt:=entry[:fi],strings.TrimSpace(entry[fi:li]),entry[li+1:]no,err:=strconv.Atoi(chNo)iferr!=nil{returnCheque{},err}cq:=Cheque{no:no,category:cat}bal,ok:=(&big.Float{}).SetString(amt)if!ok{returnCheque{},errors.Errorf("amount invalid %q",amt)}cq.amount,_=bal.Mul(bal,(&big.Float{}).SetInt64(scaling)).Int64()returncq,nil}// String display of entire checkbook.func(cbCheckbook)String()string{b:=&strings.Builder{}fmt.Fprintf(b,"Original Balance: %0.2f\n",float64(cb.bal)/scaling)for_,v:=rangecb.cheques{v.Write(b)fmt.Fprintln(b)}fmt.Fprintf(b,"Total Expenses: %0.2f\n",float64(cb.totalExp)/scaling)fmt.Fprintf(b,"Average Expenses: %0.2f\n",float64(cb.avgExp)/scaling)returnb.String()}// String display of Cheque data.func(cqCheque)String()string{returnfmt.Sprintf("No: %d, Category: %s, Amount: %0.2f, Balance: %0.2f",cq.no,cq.category,float64(cq.amount)/scaling,float64(cq.balance)/scaling)}// Write string display to writer.func(cqCheque)Write(wio.Writer)(int,error){returnfmt.Fprintf(w,"No: %d, Category: %s, Amount: %0.2f, Balance: %0.2f",cq.no,cq.category,float64(cq.amount)/scaling,float64(cq.balance)/scaling)}
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
Doing a little catch up on challenges. Here's my solution in Go:
Enjoy the naming scheme :evil-smile: