Browse Source

Resistor color trio.

Frederic G. MARAND 2 months ago
parent
commit
795b46214e

+ 13 - 0
resistor-color-trio/.eslintignore

@@ -0,0 +1,13 @@
+!.meta
+
+# Protected or generated
+.git
+.vscode
+
+# When using npm
+node_modules/*
+
+# Configuration files
+.eslintrc.cjs
+babel.config.cjs
+jest.config.cjs

+ 38 - 0
resistor-color-trio/.eslintrc.cjs

@@ -0,0 +1,38 @@
+module.exports = {
+  root: true,
+  parserOptions: {
+    tsconfigRootDir: __dirname,
+    project: ['./tsconfig.json'],
+  },
+  overrides: [
+    // Student provided files
+    {
+      files: ['*.ts'],
+      excludedFiles: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],
+      extends: '@exercism/eslint-config-typescript',
+    },
+    // Exercism given tests
+    {
+      files: ['*.test.ts'],
+      excludedFiles: ['custom.test.ts'],
+      env: {
+        jest: true,
+      },
+      extends: '@exercism/eslint-config-typescript/maintainers',
+    },
+    // Student provided tests
+    {
+      files: ['custom.test.ts'],
+      env: {
+        jest: true,
+      },
+      extends: '@exercism/eslint-config-typescript',
+    },
+    // Exercism provided files
+    {
+      files: ['.meta/proof.ci.ts', '.meta/exemplar.ts', '*.test.ts'],
+      excludedFiles: ['custom.test.ts'],
+      extends: '@exercism/eslint-config-typescript/maintainers',
+    },
+  ],
+}

+ 22 - 0
resistor-color-trio/.exercism/config.json

@@ -0,0 +1,22 @@
+{
+  "authors": [
+    "rodmagaldi"
+  ],
+  "contributors": [
+    "SleeplessByte"
+  ],
+  "files": {
+    "solution": [
+      "resistor-color-trio.ts"
+    ],
+    "test": [
+      "resistor-color-trio.test.ts"
+    ],
+    "example": [
+      ".meta/proof.ci.ts"
+    ]
+  },
+  "blurb": "Convert color codes, as used on resistors, to a human-readable label.",
+  "source": "Maud de Vries, Erik Schierboom",
+  "source_url": "https://github.com/exercism/problem-specifications/issues/1549"
+}

+ 1 - 0
resistor-color-trio/.exercism/metadata.json

@@ -0,0 +1 @@
+{"track":"typescript","exercise":"resistor-color-trio","id":"c0bea65a3ef747e0a8938d504234d818","url":"https://exercism.org/tracks/typescript/exercises/resistor-color-trio","handle":"Fairgame","is_requester":true,"auto_approve":false}

File diff suppressed because it is too large
+ 3 - 0
resistor-color-trio/.yarn/releases/yarn-3.6.4.cjs


+ 1 - 0
resistor-color-trio/.yarnrc.yml

@@ -0,0 +1 @@
+yarnPath: .yarn/releases/yarn-3.6.4.cjs

+ 45 - 0
resistor-color-trio/HELP.md

@@ -0,0 +1,45 @@
+# Help
+
+## Running the tests
+
+Execute the tests with:
+
+```bash
+$ yarn test
+```
+
+## Skipped tests
+
+In the test suites all tests but the first have been skipped.
+
+Once you get a test passing, you can enable the next one by changing `xit` to
+`it`.
+
+## Submitting your solution
+
+You can submit your solution using the `exercism submit resistor-color-trio.ts` command.
+This command will upload your solution to the Exercism website and print the solution page's URL.
+
+It's possible to submit an incomplete solution which allows you to:
+
+- See how others have completed the exercise
+- Request help from a mentor
+
+## Need to get help?
+
+If you'd like help solving the exercise, check the following pages:
+
+- The [TypeScript track's documentation](https://exercism.org/docs/tracks/typescript)
+- The [TypeScript track's programming category on the forum](https://forum.exercism.org/c/programming/typescript)
+- [Exercism's programming category on the forum](https://forum.exercism.org/c/programming/5)
+- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs)
+
+Should those resources not suffice, you could submit your (incomplete) solution to request mentoring.
+
+To get help if you're having trouble, you can use one of the following resources:
+
+- [TypeScript QuickStart](https://www.typescriptlang.org/docs/handbook/release-notes/overview.html)
+- [ECMAScript 2015 Language Specification](https://www.ecma-international.org/wp-content/uploads/ECMA-262_6th_edition_june_2015.pdf) (pdf)
+- [Mozilla JavaScript Reference](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference)
+- [/r/typescript](https://www.reddit.com/r/typescript) is the TypeScript subreddit.
+- [StackOverflow](https://stackoverflow.com/questions/tagged/typescript) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions.

+ 75 - 0
resistor-color-trio/README.md

@@ -0,0 +1,75 @@
+# Resistor Color Trio
+
+Welcome to Resistor Color Trio on Exercism's TypeScript Track.
+If you need help running the tests or submitting your code, check out `HELP.md`.
+
+## Instructions
+
+If you want to build something using a Raspberry Pi, you'll probably use _resistors_.
+For this exercise, you need to know only three things about them:
+
+- Each resistor has a resistance value.
+- Resistors are small - so small in fact that if you printed the resistance value on them, it would be hard to read.
+  To get around this problem, manufacturers print color-coded bands onto the resistors to denote their resistance values.
+- Each band acts as a digit of a number.
+  For example, if they printed a brown band (value 1) followed by a green band (value 5), it would translate to the number 15.
+  In this exercise, you are going to create a helpful program so that you don't have to remember the values of the bands.
+  The program will take 3 colors as input, and outputs the correct value, in ohms.
+  The color bands are encoded as follows:
+
+- Black: 0
+- Brown: 1
+- Red: 2
+- Orange: 3
+- Yellow: 4
+- Green: 5
+- Blue: 6
+- Violet: 7
+- Grey: 8
+- White: 9
+
+In Resistor Color Duo you decoded the first two colors.
+For instance: orange-orange got the main value `33`.
+The third color stands for how many zeros need to be added to the main value.
+The main value plus the zeros gives us a value in ohms.
+For the exercise it doesn't matter what ohms really are.
+For example:
+
+- orange-orange-black would be 33 and no zeros, which becomes 33 ohms.
+- orange-orange-red would be 33 and 2 zeros, which becomes 3300 ohms.
+- orange-orange-orange would be 33 and 3 zeros, which becomes 33000 ohms.
+
+(If Math is your thing, you may want to think of the zeros as exponents of 10.
+If Math is not your thing, go with the zeros.
+It really is the same thing, just in plain English instead of Math lingo.)
+
+This exercise is about translating the colors into a label:
+
+> "... ohms"
+
+So an input of `"orange", "orange", "black"` should return:
+
+> "33 ohms"
+
+When we get to larger resistors, a [metric prefix][metric-prefix] is used to indicate a larger magnitude of ohms, such as "kiloohms".
+That is similar to saying "2 kilometers" instead of "2000 meters", or "2 kilograms" for "2000 grams".
+
+For example, an input of `"orange", "orange", "orange"` should return:
+
+> "33 kiloohms"
+
+[metric-prefix]: https://en.wikipedia.org/wiki/Metric_prefix
+
+## Source
+
+### Created by
+
+- @rodmagaldi
+
+### Contributed to by
+
+- @SleeplessByte
+
+### Based on
+
+Maud de Vries, Erik Schierboom - https://github.com/exercism/problem-specifications/issues/1549

+ 4 - 0
resistor-color-trio/babel.config.cjs

@@ -0,0 +1,4 @@
+module.exports = {
+  presets: ['@exercism/babel-preset-typescript'],
+  plugins: [],
+}

+ 19 - 0
resistor-color-trio/jest.config.cjs

@@ -0,0 +1,19 @@
+module.exports = {
+  verbose: true,
+  projects: ['<rootDir>'],
+  testMatch: [
+    '**/__tests__/**/*.[jt]s?(x)',
+    '**/test/**/*.[jt]s?(x)',
+    '**/?(*.)+(spec|test).[jt]s?(x)',
+  ],
+  testPathIgnorePatterns: [
+    '/(?:production_)?node_modules/',
+    '.d.ts$',
+    '<rootDir>/test/fixtures',
+    '<rootDir>/test/helpers',
+    '__mocks__',
+  ],
+  transform: {
+    '^.+\\.[jt]sx?$': 'babel-jest',
+  },
+}

+ 36 - 0
resistor-color-trio/package.json

@@ -0,0 +1,36 @@
+{
+  "name": "@exercism/typescript-resistor-color-trio",
+  "version": "1.0.0",
+  "description": "Exercism practice exercise on resistor-color-trio",
+  "author": "Katrina Owen",
+  "contributors": [
+    "Derk-Jan Karrenbeld <derk-jan+git@karrenbeld.info> (https://derk-jan.com)"
+  ],
+  "private": true,
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/exercism/typescript"
+  },
+  "type": "module",
+  "engines": {
+    "node": "^18.16.0 || >=20.0.0"
+  },
+  "devDependencies": {
+    "@exercism/babel-preset-typescript": "^0.4.0",
+    "@exercism/eslint-config-typescript": "^0.5.0",
+    "@types/jest": "^29.5.2",
+    "@types/node": "~18.16.16",
+    "babel-jest": "^29.5.0",
+    "core-js": "~3.30.2",
+    "eslint": "^8.42.0",
+    "jest": "^29.5.0",
+    "typescript": "~5.0.4"
+  },
+  "scripts": {
+    "test": "yarn lint:types && jest --no-cache",
+    "lint": "yarn lint:types && yarn lint:ci",
+    "lint:types": "yarn tsc --noEmit -p .",
+    "lint:ci": "eslint . --ext .tsx,.ts"
+  },
+  "packageManager": "yarn@3.6.4"
+}

+ 56 - 0
resistor-color-trio/resistor-color-trio.test.ts

@@ -0,0 +1,56 @@
+import { decodedResistorValue } from './resistor-color-trio'
+
+xit = it
+describe('Resistor Colors', () => {
+  it('Orange and orange and black', () => {
+    expect(decodedResistorValue(['orange', 'orange', 'black'])).toEqual(
+      '33 ohms'
+    )
+  })
+
+  xit('Blue and grey and brown', () => {
+    expect(decodedResistorValue(['blue', 'grey', 'brown'])).toEqual('680 ohms')
+  })
+
+  xit('Red and black and red', () => {
+    expect(decodedResistorValue(['red', 'black', 'red'])).toEqual('2 kiloohms')
+  })
+
+  xit('Green and brown and orange', () => {
+    expect(decodedResistorValue(['green', 'brown', 'orange'])).toEqual(
+      '51 kiloohms'
+    )
+  })
+
+  xit('Yellow and violet and yellow', () => {
+    expect(decodedResistorValue(['yellow', 'violet', 'yellow'])).toEqual(
+      '470 kiloohms'
+    )
+  })
+
+  xit('Blue and violet and blue', () => {
+    expect(decodedResistorValue(['blue', 'violet', 'blue'])).toEqual(
+      '67 megaohms'
+    )
+  })
+
+  xit('Minimum possible value', () => {
+    expect(decodedResistorValue(['black', 'black', 'black'])).toEqual('0 ohms')
+  })
+
+  xit('Maximum possible value', () => {
+    expect(decodedResistorValue(['white', 'white', 'white'])).toEqual(
+      '99 gigaohms'
+    )
+  })
+
+  xit('First two colors make an invalid octal number', () => {
+    expect(decodedResistorValue(['black', 'grey', 'black'])).toEqual('8 ohms')
+  })
+
+  xit('Ignore extra colors', () => {
+    expect(decodedResistorValue(['blue', 'green', 'yellow', 'orange'])).toEqual(
+      '650 kiloohms'
+    )
+  })
+})

+ 69 - 0
resistor-color-trio/resistor-color-trio.ts

@@ -0,0 +1,69 @@
+export function decodedResistorValue(colors: string[]): string {
+    if (colors.length < 3) {
+        throw new Error("Unexpected number of colors");
+    }
+    // Ignore extra colors.
+    const first = colors.slice(0, 2);
+    let value = colorCode(first[0]) * 10 + colorCode(first[1]);
+    let scale = colorCode(colors[2]);
+    if (value % 10 === 0) {
+        value /= 10;
+        scale++;
+    }
+    let prefix: string = '';
+    switch (scale) {
+        case 9:
+            prefix = 'giga';
+            break;
+        case 8:
+            prefix = 'mega';
+            value *= 100;
+            break;
+        case 7:
+            prefix = 'mega';
+            value *= 10;
+            break;
+        case 6:
+            prefix = 'mega';
+            break;
+        case 5:
+            prefix = 'kilo';
+            value *= 100;
+            break;
+        case 4:
+            prefix = 'kilo';
+            value *= 10;
+            break;
+        case 3:
+            prefix = 'kilo';
+            break;
+        case 2:
+            value *= 100;
+            break;
+        case 1:
+            value *= 10;
+            break;
+    }
+    return `${value} ${prefix}ohms`;
+}
+
+export const colorCode = (name: string): number => {
+    const num = COLORS.indexOf(name.toLowerCase())
+    if (num == -1) {
+        throw new Error(`Invalid color name "${name}"`);
+    }
+    return num;
+}
+
+export const COLORS: string[] = [
+    'black',
+    'brown',
+    'red',
+    'orange',
+    'yellow',
+    'green',
+    'blue',
+    'violet',
+    'grey',
+    'white',
+];

+ 28 - 0
resistor-color-trio/tsconfig.json

@@ -0,0 +1,28 @@
+{
+  "display": "Configuration for Exercism TypeScript Exercises",
+  "compilerOptions": {
+    // Allows you to use the newest syntax, and have access to console.log
+    // https://www.typescriptlang.org/tsconfig#lib
+    "lib": ["ESNEXT", "dom"],
+    // Make sure typescript is configured to output ESM
+    // https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-make-my-typescript-project-output-esm
+    "module": "ES2020",
+    // Since this project is using babel, TypeScript may target something very
+    // high, and babel will make sure it runs on your local Node version.
+    // https://babeljs.io/docs/en/
+    "target": "ESNext", // ESLint doesn't support this yet: "es2022",
+
+    "strict": true,
+    "esModuleInterop": true,
+    "skipLibCheck": true,
+    "forceConsistentCasingInFileNames": true,
+
+    // Because we'll be using babel: ensure that Babel can safely transpile
+    // files in the TypeScript project.
+    //
+    // https://babeljs.io/docs/en/babel-plugin-transform-typescript/#caveats
+    "isolatedModules": true
+  },
+  "include": ["*.ts", "*.tsx", ".meta/*.ts", ".meta/*.tsx"],
+  "exclude": ["node_modules"]
+}

Some files were not shown because too many files changed in this diff