diff --git a/DIRECTORY.md b/DIRECTORY.md index 7f6484cae5..e939f51faa 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -290,6 +290,8 @@ * [Problem019](Project-Euler/Problem019.js) * [Problem020](Project-Euler/Problem020.js) * [Problem021](Project-Euler/Problem021.js) + * **Problem022** + * [Problem022](Project-Euler/Problem022/Problem022.js) * [Problem023](Project-Euler/Problem023.js) * [Problem025](Project-Euler/Problem025.js) * [Problem028](Project-Euler/Problem028.js) diff --git a/Project-Euler/Problem022/Names.txt b/Project-Euler/Problem022/Names.txt new file mode 100644 index 0000000000..9e4f8df387 --- /dev/null +++ b/Project-Euler/Problem022/Names.txt @@ -0,0 +1,38 @@ +"MARY","PATRICIA","LINDA","BARBARA","ELIZABETH","JENNIFER","MARIA","SUSAN","MARGARET","DOROTHY", +"LISA","NANCY","KAREN","BETTY","HELEN","SANDRA","DONNA","CAROL","RUTH","SHARON","MICHELLE", +"LAURA","SARAH","KIMBERLY","DEBORAH","JESSICA","SHIRLEY","CYNTHIA","ANGELA","MELISSA","BRENDA", +"AMY","ANNA","REBECCA","VIRGINIA","KATHLEEN","PAMELA","MARTHA","DEBRA","AMANDA","STEPHANIE", +"CAROLYN","CHRISTINE","MARIE","JANET","CATHERINE","FRANCES","ANN","JOYCE","DIANE","ALICE", +"JULIE","HEATHER","TERESA","DORIS","GLORIA","EVELYN","JEAN","CHERYL","MILDRED","KATHERINE", +"JOAN","ASHLEY","JUDITH","ROSE","JANICE","KELLY","NICOLE","JUDY","CHRISTINA","KATHY", +"THERESA","BEVERLY","DENISE","TAMMY","IRENE","JANE","LORI","RACHEL","MARILYN","ANDREA", +"KATHRYN","LOUISE","SARA","ANNE","JACQUELINE","WANDA","BONNIE","JULIA","RUBY","LOIS", +"TINA","PHYLLIS","NORMA","PAULA","DIANA","ANNIE","LILLIAN","EMILY","ROBIN","PEGGY", +"CRYSTAL","GLADYS","RITA","DAWN","CONNIE","FLORENCE","TRACY","EDNA","TIFFANY","CARMEN", +"ROSA","CINDY","GRACE","WENDY","VICTORIA","EDITH","KIM","SHERRY","SYLVIA","JOSEPHINE", +"THELMA","SHANNON","SHEILA","ETHEL","ELLEN","ELAINE","MARJORIE","CARRIE","CHARLOTTE","MONICA", +"ESTHER","PAULINE","EMMA","JUANITA","ANITA","RHONDA","HAZEL","AMBER","EVA","DEBBIE", +"APRIL","LESLIE","CLARA","LUCILLE","JAMIE","JOANNE","ELEANOR","VALERIE","DANIELLE","MEGAN", +"ALICIA","SUZANNE","MICHELE","GAIL","BERTHA","DARLENE","VERONICA","JILL","ERIN","GERALDINE", +"LAUREN","CATHY","JOANN","LORRAINE","LYNN","SALLY","REGINA","ERICA","BEATRICE","DOLORES", +"BERNICE","AUDREY","YVONNE","ANNETTE","JUNE","SAMANTHA","MARION","DANA","STACY","ANA", +"RENEE","IDA","VIVIAN","ROBERTA","HOLLY","BRITTANY","MELANIE","LORETTA","YOLANDA","JEANETTE", +"LAURIE","KATIE","KRISTEN","VANESSA","ALMA","SUE","ELSIE","BETH","JEANNE","VICKI", +"CARLA","TARA","ROSEMARY","EILEEN","TERRI","GERTRUDE","LUCY","TONYA","ELLA","STACEY", +"WILMA","GINA","KRISTIN","JESSIE","NATALIE","AGNES","VERA","WILLIE","CHARLENE","BESSIE", +"DELORES","MELINDA","PEARL","ARLENE","MAUREEN","COLLEEN","ALLISON","TAMARA","JOY","GEORGIA", +"CONSTANCE","LILLIE","CLAUDIA","JACKIE","MARCIA","TANYA","NELLIE","MINNIE","MARLENE","HEIDI", +"GLENDA","LYDIA","VIOLA","COURTNEY","MARIAN","STELLA","CAROLINE","DORA","JO","VICKIE", +"MATTIE","TERRY","MAXINE","IRMA","MABEL","MARSHA","MYRTLE","LENA","CHRISTY","DEANNA", +"PATSY","HILDA","GWENDOLYN","JENNIE","NORA","MARGIE","NINA","CASSANDRA","LEAH","PENNY", +"KAY","PRISCILLA","NAOMI","CAROLE","BRANDY","OLGA","BILLIE","DIANNE","TRACEY","LEONA", +"JENNY","FELICIA","SONIA","MIRIAM","VELMA","BECKY","BOBBIE","VIOLET","KRISTINA","TONI", +"MISTY","MAE","SHELLY","DAISY","RAMONA","SHERRI","ERIKA","KATRINA","CLAIRE","LINDSEY", +"LINDSAY","GENEVA","GUADALUPE","BELINDA","MARGARITA","SHERYL","CORA","FAYE","ADA","NATASHA", +"SABRINA","ISABEL","MARGUERITE","HATTIE","HARRIET","MOLLY","CECILIA","KRISTI","BRANDI","BLANCHE", +"SANDY","ROSIE","JOANNA","IRIS","EUNICE","ANGIE","INEZ","LYNDA","MADELINE","AMELIA", +"ALYSSA","KRISTY","CATHLEEN","ANGELINE","FRIEDA","ANTOINETTE","CECIL","JASMINE","NORMA","HANNAH", +"SANDRA","KEISHA","CLAIRE","ELLA","TAMIKA","FANNIE","CELIA","PEGGY","MICHAELA","ALYSON", +"ALTHEA","KENDRA","LORA","CORA","SHIRLEY","MATTIE","EMMA","MONICA","CATHY","ELEANOR", +"REBECCA","TERESA","CLARA","PAMELA","SYLVIA","NANCY","FLORENCE","VICTORIA","ANITA","ELIZABETH", +"JESSIE","LORRAINE","GERTRUDE","KATHERINE","VIVIAN","LOUISE","SUSAN","WANDA","PATRICIA","MARY","OMKARNATH" \ No newline at end of file diff --git a/Project-Euler/Problem022/Problem022.js b/Project-Euler/Problem022/Problem022.js new file mode 100644 index 0000000000..124e6f21d0 --- /dev/null +++ b/Project-Euler/Problem022/Problem022.js @@ -0,0 +1,31 @@ +/* +Names Scores + +Using names.txt (right click and 'Save Link/Target As...'), a 46K text file containing over five-thousand first names, begin by sorting it into alphabetical order. Then working out the alphabetical value for each name, multiply this value by its alphabetical position in the list to obtain a name score. +For example, when the list is sorted into alphabetical order, COLIN, which is worth 3 + 15 + 12 + 9 + 14 = 53, is the 938th name in the list. So, COLIN would obtain a score of 938 * 53 = 49714. +What is the total of all the name scores in the file? +*/ +import fs from 'fs' + +export const getAlphabeticalValue = (name) => { + return [...name].reduce( + (sum, char) => sum + (char.charCodeAt(0) - 'A'.charCodeAt(0) + 1), + 0 + ) +} + +export const calculateTotalNameScore = (filePath) => { + return new Promise((resolve) => { + fs.readFile(filePath, 'utf8', (_, data) => { + const names = data.replace(/"/g, '').split(',').sort() + + const totalScore = names.reduce((total, name, index) => { + const alphabeticalValue = getAlphabeticalValue(name) + const nameScore = alphabeticalValue * (index + 1) + return total + nameScore + }, 0) + + resolve(totalScore) + }) + }) +} diff --git a/Project-Euler/Problem022/Problem022.test.js b/Project-Euler/Problem022/Problem022.test.js new file mode 100644 index 0000000000..be3690f87b --- /dev/null +++ b/Project-Euler/Problem022/Problem022.test.js @@ -0,0 +1,33 @@ +import { describe, it, expect } from 'vitest' +import { calculateTotalNameScore, getAlphabeticalValue } from './Problem022' +const path = require('path') + +describe('getAlphabeticalValue', () => { + it('should return correct alphabetical value for COLIN', () => { + const name = 'COLIN' + const expectedValue = 3 + 15 + 12 + 9 + 14 + expect(getAlphabeticalValue(name)).toBe(expectedValue) + }) + + it('should return correct alphabetical value for A', () => { + const name = 'A' + const expectedValue = 1 + expect(getAlphabeticalValue(name)).toBe(expectedValue) + }) + + it('should return correct alphabetical value for Z', () => { + const name = 'Z' + const expectedValue = 26 + expect(getAlphabeticalValue(name)).toBe(expectedValue) + }) +}) + +describe('calculateTotalNameScore', () => { + it('should correctly calculate the total name score', async () => { + const namesFilePath = path.join(__dirname, 'Names.txt') + const result = await calculateTotalNameScore(namesFilePath) + + const expectedScore = 4654143 + expect(result).toBe(expectedScore) + }) +})