Armstrong numbers
This commit is contained in:
@@ -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
|
||||
@@ -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',
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"authors": [
|
||||
"CRivasGomez"
|
||||
],
|
||||
"contributors": [
|
||||
"masters3d",
|
||||
"SleeplessByte"
|
||||
],
|
||||
"files": {
|
||||
"solution": [
|
||||
"armstrong-numbers.ts"
|
||||
],
|
||||
"test": [
|
||||
"armstrong-numbers.test.ts"
|
||||
],
|
||||
"example": [
|
||||
".meta/proof.ci.ts"
|
||||
]
|
||||
},
|
||||
"blurb": "Determine if a number is an Armstrong number.",
|
||||
"source": "Wikipedia",
|
||||
"source_url": "https://en.wikipedia.org/wiki/Narcissistic_number"
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{"track":"typescript","exercise":"armstrong-numbers","id":"9fe847c468f443788fe63cc32e3bba13","url":"https://exercism.org/tracks/typescript/exercises/armstrong-numbers","handle":"briemens","is_requester":true,"auto_approve":false}
|
||||
+19812
File diff suppressed because one or more lines are too long
+2047
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
yarnPath: .yarn/releases/yarn-3.6.0.cjs
|
||||
@@ -0,0 +1,44 @@
|
||||
# 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 armstrong-numbers.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)
|
||||
- [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.
|
||||
@@ -0,0 +1,34 @@
|
||||
# Armstrong Numbers
|
||||
|
||||
Welcome to Armstrong Numbers on Exercism's TypeScript Track.
|
||||
If you need help running the tests or submitting your code, check out `HELP.md`.
|
||||
|
||||
## Instructions
|
||||
|
||||
An [Armstrong number][armstrong-number] is a number that is the sum of its own digits each raised to the power of the number of digits.
|
||||
|
||||
For example:
|
||||
|
||||
- 9 is an Armstrong number, because `9 = 9^1 = 9`
|
||||
- 10 is _not_ an Armstrong number, because `10 != 1^2 + 0^2 = 1`
|
||||
- 153 is an Armstrong number, because: `153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153`
|
||||
- 154 is _not_ an Armstrong number, because: `154 != 1^3 + 5^3 + 4^3 = 1 + 125 + 64 = 190`
|
||||
|
||||
Write some code to determine whether a number is an Armstrong number.
|
||||
|
||||
[armstrong-number]: https://en.wikipedia.org/wiki/Narcissistic_number
|
||||
|
||||
## Source
|
||||
|
||||
### Created by
|
||||
|
||||
- @CRivasGomez
|
||||
|
||||
### Contributed to by
|
||||
|
||||
- @masters3d
|
||||
- @SleeplessByte
|
||||
|
||||
### Based on
|
||||
|
||||
Wikipedia - https://en.wikipedia.org/wiki/Narcissistic_number
|
||||
@@ -0,0 +1,47 @@
|
||||
import { isArmstrongNumber } from './armstrong-numbers'
|
||||
|
||||
describe('Armstrong Numbers', () => {
|
||||
it('Single-digit numbers are Armstrong numbers', () => {
|
||||
expect(isArmstrongNumber(5)).toBeTruthy()
|
||||
})
|
||||
|
||||
it('There are no two-digit Armstrong numbers', () => {
|
||||
expect(isArmstrongNumber(10)).toBeFalsy()
|
||||
})
|
||||
|
||||
it('Three-digit number that is an Armstrong number', () => {
|
||||
expect(isArmstrongNumber(153)).toBeTruthy()
|
||||
})
|
||||
|
||||
it('Three-digit number that is not an Armstrong number', () => {
|
||||
expect(isArmstrongNumber(100)).toBeFalsy()
|
||||
})
|
||||
|
||||
it('Four-digit number that is an Armstrong number', () => {
|
||||
expect(isArmstrongNumber(9474)).toBeTruthy()
|
||||
})
|
||||
|
||||
it('Four-digit number that is not an Armstrong number', () => {
|
||||
expect(isArmstrongNumber(9475)).toBeFalsy()
|
||||
})
|
||||
|
||||
it('Seven-digit number that is an Armstrong number', () => {
|
||||
expect(isArmstrongNumber(9926315)).toBeTruthy()
|
||||
})
|
||||
|
||||
it('Seven-digit number that is not an Armstrong number', () => {
|
||||
expect(isArmstrongNumber(9926314)).toBeFalsy()
|
||||
})
|
||||
|
||||
it('Armstrong number containing seven zeroes', () => {
|
||||
expect(
|
||||
isArmstrongNumber(BigInt('186709961001538790100634132976990'))
|
||||
).toBeTruthy()
|
||||
})
|
||||
|
||||
it('The largest and last Armstrong number', () => {
|
||||
expect(
|
||||
isArmstrongNumber(BigInt('115132219018763992565095597973971522401'))
|
||||
).toBeTruthy()
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,8 @@
|
||||
export const isArmstrongNumber = (candidate: bigint | number): boolean =>
|
||||
candidate
|
||||
.toString()
|
||||
.split('')
|
||||
.map(BigInt)
|
||||
.reduce((result, value, _index, arr) =>
|
||||
result + (value ** BigInt(arr.length)), 0n
|
||||
) === BigInt(candidate);
|
||||
@@ -0,0 +1,4 @@
|
||||
module.exports = {
|
||||
presets: ['@exercism/babel-preset-typescript'],
|
||||
plugins: [],
|
||||
}
|
||||
@@ -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',
|
||||
},
|
||||
}
|
||||
+15515
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"name": "@exercism/typescript-armstrong-numbers",
|
||||
"version": "1.0.0",
|
||||
"description": "Exercism exercises in Typescript.",
|
||||
"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.0"
|
||||
}
|
||||
@@ -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"]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user