mirror of
https://github.com/theoludwig/programming-challenges.git
synced 2025-05-13 23:22:49 +02:00
build(deps): update latest
This commit is contained in:
parent
2b6669bf4a
commit
643989cc44
@ -10,7 +10,7 @@ charset = utf-8
|
|||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
|
|
||||||
[*.{py,cs,rs,java}]
|
[*.{py,cs,rs,java,md}]
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
|
|
||||||
[*.txt]
|
[*.txt]
|
||||||
|
4
.github/ISSUE_TEMPLATE/BUG.md
vendored
4
.github/ISSUE_TEMPLATE/BUG.md
vendored
@ -6,8 +6,8 @@ labels: "bug"
|
|||||||
---
|
---
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Please provide a clear and concise description of what the bug is. Include
|
Please provide a clear and concise description of what the bug is. Include
|
||||||
screenshots if needed. Please make sure your issue has not already been fixed.
|
screenshots if needed. Please make sure your issue has not already been fixed.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
## Steps To Reproduce
|
## Steps To Reproduce
|
||||||
|
2
.github/workflows/challenges.yml
vendored
2
.github/workflows/challenges.yml
vendored
@ -21,7 +21,7 @@ jobs:
|
|||||||
SKIP_LOGIN: true
|
SKIP_LOGIN: true
|
||||||
|
|
||||||
- name: "Setup Node.js"
|
- name: "Setup Node.js"
|
||||||
uses: "actions/setup-node@v4.1.0"
|
uses: "actions/setup-node@v4.4.0"
|
||||||
with:
|
with:
|
||||||
node-version: "lts/*"
|
node-version: "lts/*"
|
||||||
cache: "npm"
|
cache: "npm"
|
||||||
|
6
.github/workflows/cli.yml
vendored
6
.github/workflows/cli.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
|||||||
- uses: "actions/checkout@v4.2.2"
|
- uses: "actions/checkout@v4.2.2"
|
||||||
|
|
||||||
- name: "Setup Node.js"
|
- name: "Setup Node.js"
|
||||||
uses: "actions/setup-node@v4.1.0"
|
uses: "actions/setup-node@v4.4.0"
|
||||||
with:
|
with:
|
||||||
node-version: "lts/*"
|
node-version: "lts/*"
|
||||||
cache: "npm"
|
cache: "npm"
|
||||||
@ -32,7 +32,7 @@ jobs:
|
|||||||
- uses: "actions/checkout@v4.2.2"
|
- uses: "actions/checkout@v4.2.2"
|
||||||
|
|
||||||
- name: "Setup Node.js"
|
- name: "Setup Node.js"
|
||||||
uses: "actions/setup-node@v4.1.0"
|
uses: "actions/setup-node@v4.4.0"
|
||||||
with:
|
with:
|
||||||
node-version: "lts/*"
|
node-version: "lts/*"
|
||||||
cache: "npm"
|
cache: "npm"
|
||||||
@ -56,7 +56,7 @@ jobs:
|
|||||||
SKIP_LOGIN: true
|
SKIP_LOGIN: true
|
||||||
|
|
||||||
- name: "Setup Node.js"
|
- name: "Setup Node.js"
|
||||||
uses: "actions/setup-node@v4.1.0"
|
uses: "actions/setup-node@v4.4.0"
|
||||||
with:
|
with:
|
||||||
node-version: "lts/*"
|
node-version: "lts/*"
|
||||||
cache: "npm"
|
cache: "npm"
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -28,3 +28,6 @@ coverage
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
temp
|
temp
|
||||||
tmp
|
tmp
|
||||||
|
|
||||||
|
# typescript
|
||||||
|
*.tsbuildinfo
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"config": {
|
|
||||||
"extends": "markdownlint/style/prettier",
|
|
||||||
"default": true,
|
|
||||||
"relative-links": true,
|
|
||||||
"no-duplicate-heading": false,
|
|
||||||
"no-inline-html": false,
|
|
||||||
},
|
|
||||||
"globs": ["**/*.md"],
|
|
||||||
"ignores": ["**/node_modules"],
|
|
||||||
"customRules": ["markdownlint-rule-relative-links"],
|
|
||||||
}
|
|
19
.markdownlint-cli2.mjs
Normal file
19
.markdownlint-cli2.mjs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import relativeLinksRule, { markdownIt } from "markdownlint-rule-relative-links"
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
config: {
|
||||||
|
extends: "markdownlint/style/prettier",
|
||||||
|
default: true,
|
||||||
|
"relative-links": true,
|
||||||
|
"no-duplicate-heading": false,
|
||||||
|
"no-inline-html": false,
|
||||||
|
},
|
||||||
|
globs: ["**/*.md"],
|
||||||
|
ignores: ["**/node_modules"],
|
||||||
|
customRules: [relativeLinksRule],
|
||||||
|
markdownItFactory: () => {
|
||||||
|
return markdownIt
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default config
|
@ -20,21 +20,16 @@ community include:
|
|||||||
- Demonstrating empathy and kindness toward other people
|
- Demonstrating empathy and kindness toward other people
|
||||||
- Being respectful of differing opinions, viewpoints, and experiences
|
- Being respectful of differing opinions, viewpoints, and experiences
|
||||||
- Giving and gracefully accepting constructive feedback
|
- Giving and gracefully accepting constructive feedback
|
||||||
- Accepting responsibility and apologizing to those affected by our mistakes,
|
- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
|
||||||
and learning from the experience
|
- Focusing on what is best not just for us as individuals, but for the overall community
|
||||||
- Focusing on what is best not just for us as individuals, but for the
|
|
||||||
overall community
|
|
||||||
|
|
||||||
Examples of unacceptable behavior include:
|
Examples of unacceptable behavior include:
|
||||||
|
|
||||||
- The use of sexualized language or imagery, and sexual attention or
|
- The use of sexualized language or imagery, and sexual attention or advances of any kind
|
||||||
advances of any kind
|
|
||||||
- Trolling, insulting or derogatory comments, and personal or political attacks
|
- Trolling, insulting or derogatory comments, and personal or political attacks
|
||||||
- Public or private harassment
|
- Public or private harassment
|
||||||
- Publishing others' private information, such as a physical or email
|
- Publishing others' private information, such as a physical or email address, without their explicit permission
|
||||||
address, without their explicit permission
|
- Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||||
- Other conduct which could reasonably be considered inappropriate in a
|
|
||||||
professional setting
|
|
||||||
|
|
||||||
## Enforcement Responsibilities
|
## Enforcement Responsibilities
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ You can add support for a new language, so you can solve the challenges with eve
|
|||||||
- Create a new template inside `templates/solution` folder with the file extension of the new programming language, with the basic boilerplate to read from `stdin` and print to `stdout` the result
|
- Create a new template inside `templates/solution` folder with the file extension of the new programming language, with the basic boilerplate to read from `stdin` and print to `stdout` the result
|
||||||
- Every programming language should have at least one working solution for `challenges/hello-world`.
|
- Every programming language should have at least one working solution for `challenges/hello-world`.
|
||||||
|
|
||||||
To generate the solution for the `hello-world` challenge with your new language, run the command `programming-challenges generate solution --challenge="hello-world" --github-user="<your-github-user>" --language="<your-new-language>" --solution="function"`
|
To generate the solution for the `hello-world` challenge with your new language, run the command `programming-challenges generate solution --challenge="hello-world" --github-user="<your-github-user>" --language="<your-new-language>" --solution="function"`
|
||||||
|
|
||||||
Before submitting the new programming language, make sure it passes all the tests by running `programming-challenges run test --affected`
|
Before submitting the new programming language, make sure it passes all the tests by running `programming-challenges run test --affected`
|
||||||
|
|
||||||
|
37
README.md
37
README.md
@ -1,21 +1,21 @@
|
|||||||
<h1 align="center">programming-challenges</h1>
|
<h1 align="center">programming-challenges</h1>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<strong>Programming exercises and challenges to improve your algorithmic logic.</strong>
|
<strong>Programming exercises and challenges to improve your algorithmic logic.</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="./CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat" alt="CONTRIBUTING" /></a>
|
<a href="./CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat" alt="CONTRIBUTING" /></a>
|
||||||
<a href="./LICENSE"><img src="https://img.shields.io/badge/licence-MIT-blue.svg" alt="Licence MIT"/></a>
|
<a href="./LICENSE"><img src="https://img.shields.io/badge/licence-MIT-blue.svg" alt="Licence MIT"/></a>
|
||||||
<a href="./CODE_OF_CONDUCT.md"><img src="https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg" alt="Contributor Covenant" /></a>
|
<a href="./CODE_OF_CONDUCT.md"><img src="https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg" alt="Contributor Covenant" /></a>
|
||||||
<br />
|
<br />
|
||||||
<a href="https://github.com/theoludwig/programming-challenges/actions/workflows/cli.yml"><img src="https://github.com/theoludwig/programming-challenges/actions/workflows/cli.yml/badge.svg?branch=master" alt="CLI" /></a>
|
<a href="https://github.com/theoludwig/programming-challenges/actions/workflows/cli.yml"><img src="https://github.com/theoludwig/programming-challenges/actions/workflows/cli.yml/badge.svg?branch=master" alt="CLI" /></a>
|
||||||
<a href="https://github.com/theoludwig/programming-challenges/actions/workflows/challenges.yml"><img src="https://github.com/theoludwig/programming-challenges/actions/workflows/challenges.yml/badge.svg?branch=master" alt="Challenges" /></a>
|
<a href="https://github.com/theoludwig/programming-challenges/actions/workflows/challenges.yml"><img src="https://github.com/theoludwig/programming-challenges/actions/workflows/challenges.yml/badge.svg?branch=master" alt="Challenges" /></a>
|
||||||
<a href="https://conventionalcommits.org"><img src="https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg" alt="Conventional Commits" /></a>
|
<a href="https://conventionalcommits.org"><img src="https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg" alt="Conventional Commits" /></a>
|
||||||
<br/>
|
<br/>
|
||||||
<a href="https://gitpod.io/#https://github.com/theoludwig/programming-challenges"><img src="https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod" alt="Gitpod ready-to-code"/></a>
|
<a href="https://gitpod.io/#https://github.com/theoludwig/programming-challenges"><img src="https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod" alt="Gitpod ready-to-code"/></a>
|
||||||
<br/> <br/>
|
<br/> <br/>
|
||||||
<img src="./logo.png" width="120" alt="programming-challenges Logo" />
|
<img src="./logo.png" width="120" alt="programming-challenges Logo" />
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
## 📜 About
|
## 📜 About
|
||||||
@ -80,17 +80,20 @@ programming-challenges --help
|
|||||||
# Generate a new challenge
|
# Generate a new challenge
|
||||||
programming-challenges generate challenge --github-user="YourGitHubName" --challenge="hello-world"
|
programming-challenges generate challenge --github-user="YourGitHubName" --challenge="hello-world"
|
||||||
|
|
||||||
|
# Search for a challenge not yet solved in a specific programming language
|
||||||
|
programming-challenges search --language="rust"
|
||||||
|
|
||||||
# Generate a new solution
|
# Generate a new solution
|
||||||
programming-challenges generate solution --github-user="YourGitHubName" --challenge="hello-world" --solution="function" --language="python"
|
programming-challenges generate solution --github-user="YourGitHubName" --challenge="hello-world" --solution="function" --language="python"
|
||||||
|
|
||||||
# Test a solution
|
|
||||||
programming-challenges run test --challenge="hello-world" --solution="function" --language="python"
|
|
||||||
|
|
||||||
# Run a solution with specific `input.txt` file
|
# Run a solution with specific `input.txt` file
|
||||||
programming-challenges run solution --challenge="hello-world" --solution="function" --language="python" --input-path="./challenges/hello-world/test/1/input.txt" --output
|
programming-challenges run solution --challenge="hello-world" --solution="function" --language="python" --input-path="./challenges/hello-world/test/1/input.txt" --output
|
||||||
|
|
||||||
# Search for a challenge not yet solved in a specific programming language
|
# Test a solution
|
||||||
programming-challenges search --language="rust"
|
programming-challenges run test --challenge="hello-world" --solution="function" --language="python"
|
||||||
|
|
||||||
|
# Test all the solutions in all the challenges
|
||||||
|
programming-challenges run test --all
|
||||||
```
|
```
|
||||||
|
|
||||||
## 💡 Contributing
|
## 💡 Contributing
|
||||||
|
@ -16,9 +16,7 @@ make?
|
|||||||
### Input
|
### Input
|
||||||
|
|
||||||
- **Line 1:** Single integer `N` for the number of ingredients.
|
- **Line 1:** Single integer `N` for the number of ingredients.
|
||||||
- **`N` next lines:** One for each ingredient. Each of these lines contains two positive integers:
|
- **`N` next lines:** One for each ingredient. Each of these lines contains two positive integers: the first one is the required quantity of this ingredient per cake, the second one is the quantity of this ingredient you have in your kitchen.
|
||||||
the first one is the required quantity of this ingredient per cake, the second one is the quantity of
|
|
||||||
this ingredient you have in your kitchen.
|
|
||||||
|
|
||||||
### Output
|
### Output
|
||||||
|
|
||||||
@ -32,7 +30,7 @@ available ingredients.
|
|||||||
|
|
||||||
## Source
|
## Source
|
||||||
|
|
||||||
[SWERC 2020–2021 - Problem E: Cake](https://swerc.eu/2020/problems/)
|
[SWERC 2020-2021 - Problem E: Cake](https://swerc.eu/2020/problems/)
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
|
@ -21,7 +21,8 @@ This data is comprised of lines, each of which represents a defibrillator. Each
|
|||||||
- Contact Phone number
|
- Contact Phone number
|
||||||
- Longitude (degrees)
|
- Longitude (degrees)
|
||||||
- Latitude (degrees)
|
- Latitude (degrees)
|
||||||
These fields are separated by a semicolon (`;`).
|
|
||||||
|
These fields are separated by a semicolon (`;`).
|
||||||
|
|
||||||
**Beware:** the decimal numbers use the comma (,) as decimal separator. Remember to turn the comma (,) into dot (.) if necessary in order to use the data in your program.
|
**Beware:** the decimal numbers use the comma (,) as decimal separator. Remember to turn the comma (,) into dot (.) if necessary in order to use the data in your program.
|
||||||
|
|
||||||
|
@ -14,37 +14,3 @@ Display a pyramid of stars (`*`) whose height is given and in the right order (`
|
|||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
See the `test` folder for examples of input/output.
|
See the `test` folder for examples of input/output.
|
||||||
|
|
||||||
### Example 1
|
|
||||||
|
|
||||||
#### Input
|
|
||||||
|
|
||||||
```txt
|
|
||||||
normal
|
|
||||||
3
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Output
|
|
||||||
|
|
||||||
```txt
|
|
||||||
*
|
|
||||||
***
|
|
||||||
*****
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example 2
|
|
||||||
|
|
||||||
#### Input
|
|
||||||
|
|
||||||
```txt
|
|
||||||
reverse
|
|
||||||
3
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Output
|
|
||||||
|
|
||||||
```txt
|
|
||||||
*****
|
|
||||||
***
|
|
||||||
*
|
|
||||||
```
|
|
||||||
|
@ -22,9 +22,9 @@ Here are the rules for building a Roman numeral:
|
|||||||
- Subtractions of values are limited to 2 letters only. For example we **cannot** write `8` while doing `IIX`. We must use the addition of letters like this `VIII`.
|
- Subtractions of values are limited to 2 letters only. For example we **cannot** write `8` while doing `IIX`. We must use the addition of letters like this `VIII`.
|
||||||
- Therefore, the first ten numbers are written as `I`, `II`, `III`, `IV`, `V`, `VI`, `VII`, `VIII`, `IX`, `X` . Larger numbers follow the same pattern.
|
- Therefore, the first ten numbers are written as `I`, `II`, `III`, `IV`, `V`, `VI`, `VII`, `VIII`, `IX`, `X` . Larger numbers follow the same pattern.
|
||||||
- You can associate as many symbols as you want to write larger numbers, for example:
|
- You can associate as many symbols as you want to write larger numbers, for example:
|
||||||
- `36` is written as `XXXVI`
|
- `36` is written as `XXXVI`
|
||||||
- `42` is written as `XLII`
|
- `42` is written as `XLII`
|
||||||
- `2448` is written as `MMCDXLVIII`.
|
- `2448` is written as `MMCDXLVIII`.
|
||||||
|
|
||||||
| Symbol | I | V | X | L | C | D | M |
|
| Symbol | I | V | X | L | C | D | M |
|
||||||
| ------ | --- | --- | --- | --- | --- | --- | ---- |
|
| ------ | --- | --- | --- | --- | --- | --- | ---- |
|
||||||
|
@ -19,7 +19,7 @@ export class Challenge implements ChallengeOptions {
|
|||||||
public name: string
|
public name: string
|
||||||
public path: string
|
public path: string
|
||||||
|
|
||||||
constructor(options: ChallengeOptions) {
|
public constructor(options: ChallengeOptions) {
|
||||||
const { name } = options
|
const { name } = options
|
||||||
this.name = name
|
this.name = name
|
||||||
this.path = fileURLToPath(new URL(`./${name}`, Challenge.BASE_URL))
|
this.path = fileURLToPath(new URL(`./${name}`, Challenge.BASE_URL))
|
||||||
|
@ -20,7 +20,7 @@ export interface GitAffectedOptions {
|
|||||||
export class GitAffected implements GitAffectedOptions {
|
export class GitAffected implements GitAffectedOptions {
|
||||||
public base?: string
|
public base?: string
|
||||||
|
|
||||||
constructor(options: GitAffectedOptions = {}) {
|
public constructor(options: GitAffectedOptions = {}) {
|
||||||
this.base = options.base
|
this.base = options.base
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ export class Solution implements SolutionOptions {
|
|||||||
public path: string
|
public path: string
|
||||||
public temporaryFolder: TemporaryFolder
|
public temporaryFolder: TemporaryFolder
|
||||||
|
|
||||||
constructor(options: SolutionOptions) {
|
public constructor(options: SolutionOptions) {
|
||||||
const { programmingLanguageName, challenge, name } = options
|
const { programmingLanguageName, challenge, name } = options
|
||||||
this.programmingLanguageName = programmingLanguageName
|
this.programmingLanguageName = programmingLanguageName
|
||||||
this.challenge = challenge
|
this.challenge = challenge
|
||||||
@ -92,7 +92,9 @@ export class Solution implements SolutionOptions {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static async generate(options: GenerateSolutionOptions): Promise<Solution> {
|
public static async generate(
|
||||||
|
options: GenerateSolutionOptions,
|
||||||
|
): Promise<Solution> {
|
||||||
const { name, challengeName, programmingLanguageName, githubUser } = options
|
const { name, challengeName, programmingLanguageName, githubUser } = options
|
||||||
const challenge = new Challenge({ name: challengeName })
|
const challenge = new Challenge({ name: challengeName })
|
||||||
if (!(await isExistingPath(challenge.path))) {
|
if (!(await isExistingPath(challenge.path))) {
|
||||||
@ -116,7 +118,7 @@ export class Solution implements SolutionOptions {
|
|||||||
return solution
|
return solution
|
||||||
}
|
}
|
||||||
|
|
||||||
static async get(options: GetSolutionOptions): Promise<Solution> {
|
public static async get(options: GetSolutionOptions): Promise<Solution> {
|
||||||
const { name, challengeName, programmingLanguageName } = options
|
const { name, challengeName, programmingLanguageName } = options
|
||||||
const challenge = new Challenge({
|
const challenge = new Challenge({
|
||||||
name: challengeName,
|
name: challengeName,
|
||||||
@ -132,7 +134,9 @@ export class Solution implements SolutionOptions {
|
|||||||
return solution
|
return solution
|
||||||
}
|
}
|
||||||
|
|
||||||
static async getManyByChallenge(challenge: Challenge): Promise<Solution[]> {
|
public static async getManyByChallenge(
|
||||||
|
challenge: Challenge,
|
||||||
|
): Promise<Solution[]> {
|
||||||
const solutionsPath = path.join(challenge.path, "solutions")
|
const solutionsPath = path.join(challenge.path, "solutions")
|
||||||
const languagesSolution = (await fs.promises.readdir(solutionsPath)).filter(
|
const languagesSolution = (await fs.promises.readdir(solutionsPath)).filter(
|
||||||
(name) => {
|
(name) => {
|
||||||
@ -151,7 +155,7 @@ export class Solution implements SolutionOptions {
|
|||||||
return await Solution.getManyByPaths(paths)
|
return await Solution.getManyByPaths(paths)
|
||||||
}
|
}
|
||||||
|
|
||||||
static async getManyByProgrammingLanguages(
|
public static async getManyByProgrammingLanguages(
|
||||||
programmingLanguages?: string[],
|
programmingLanguages?: string[],
|
||||||
): Promise<Solution[]> {
|
): Promise<Solution[]> {
|
||||||
const languages =
|
const languages =
|
||||||
@ -185,7 +189,7 @@ export class Solution implements SolutionOptions {
|
|||||||
* @param paths relative to `challenges` (e.g: `challenges/hello-world/solutions/c/function`)
|
* @param paths relative to `challenges` (e.g: `challenges/hello-world/solutions/c/function`)
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
static async getManyByPaths(paths: string[]): Promise<Solution[]> {
|
public static async getManyByPaths(paths: string[]): Promise<Solution[]> {
|
||||||
const solutions: string[] = []
|
const solutions: string[] = []
|
||||||
for (const path of paths) {
|
for (const path of paths) {
|
||||||
if (await isExistingPath(path)) {
|
if (await isExistingPath(path)) {
|
||||||
|
@ -25,7 +25,7 @@ export class SolutionTestsResult implements SolutionTestsResultOptions {
|
|||||||
"Success:",
|
"Success:",
|
||||||
)} Tests passed! 🎉`
|
)} Tests passed! 🎉`
|
||||||
|
|
||||||
constructor(options: SolutionTestsResultOptions) {
|
public constructor(options: SolutionTestsResultOptions) {
|
||||||
this.tests = options.tests.sort((a, b) => {
|
this.tests = options.tests.sort((a, b) => {
|
||||||
return a.testNumber - b.testNumber
|
return a.testNumber - b.testNumber
|
||||||
})
|
})
|
||||||
|
@ -35,7 +35,7 @@ export class Test implements TestOptions {
|
|||||||
public output: string
|
public output: string
|
||||||
public stdout: string
|
public stdout: string
|
||||||
|
|
||||||
constructor(options: TestOptions) {
|
public constructor(options: TestOptions) {
|
||||||
this.testNumber = options.testNumber
|
this.testNumber = options.testNumber
|
||||||
this.path = options.path
|
this.path = options.path
|
||||||
this.isSuccess = options.isSuccess
|
this.isSuccess = options.isSuccess
|
||||||
@ -44,7 +44,7 @@ export class Test implements TestOptions {
|
|||||||
this.stdout = options.stdout
|
this.stdout = options.stdout
|
||||||
}
|
}
|
||||||
|
|
||||||
static async runAll(solution: Solution): Promise<SolutionTestsResult> {
|
public static async runAll(solution: Solution): Promise<SolutionTestsResult> {
|
||||||
const testsPath = path.join(solution.challenge.path, "test")
|
const testsPath = path.join(solution.challenge.path, "test")
|
||||||
const testsFolders = await fs.promises.readdir(testsPath)
|
const testsFolders = await fs.promises.readdir(testsPath)
|
||||||
const testsNumbers = testsFolders.map((test) => {
|
const testsNumbers = testsFolders.map((test) => {
|
||||||
@ -62,7 +62,7 @@ export class Test implements TestOptions {
|
|||||||
return new SolutionTestsResult({ solution, tests, elapsedTimeMilliseconds })
|
return new SolutionTestsResult({ solution, tests, elapsedTimeMilliseconds })
|
||||||
}
|
}
|
||||||
|
|
||||||
static async getInputOutput(testPath: string): Promise<InputOutput> {
|
public static async getInputOutput(testPath: string): Promise<InputOutput> {
|
||||||
const inputPath = path.join(testPath, "input.txt")
|
const inputPath = path.join(testPath, "input.txt")
|
||||||
const outputPath = path.join(testPath, "output.txt")
|
const outputPath = path.join(testPath, "output.txt")
|
||||||
const input = await fs.promises.readFile(inputPath, { encoding: "utf-8" })
|
const input = await fs.promises.readFile(inputPath, { encoding: "utf-8" })
|
||||||
@ -72,7 +72,9 @@ export class Test implements TestOptions {
|
|||||||
return { input, output }
|
return { input, output }
|
||||||
}
|
}
|
||||||
|
|
||||||
static async runManyWithSolutions(solutions: Solution[]): Promise<number> {
|
public static async runManyWithSolutions(
|
||||||
|
solutions: Solution[],
|
||||||
|
): Promise<number> {
|
||||||
const solutionTestsResultsPromises: Array<Promise<SolutionTestsResult>> = []
|
const solutionTestsResultsPromises: Array<Promise<SolutionTestsResult>> = []
|
||||||
let isSolutionSuccess = true
|
let isSolutionSuccess = true
|
||||||
for (const solution of solutions) {
|
for (const solution of solutions) {
|
||||||
@ -98,7 +100,7 @@ export class Test implements TestOptions {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
static async run(options: TestRunOptions): Promise<Test> {
|
public static async run(options: TestRunOptions): Promise<Test> {
|
||||||
const { input, output } = await Test.getInputOutput(options.path)
|
const { input, output } = await Test.getInputOutput(options.path)
|
||||||
try {
|
try {
|
||||||
const { stdout } = await docker.run(
|
const { stdout } = await docker.run(
|
||||||
|
4371
package-lock.json
generated
4371
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
51
package.json
51
package.json
@ -27,42 +27,41 @@
|
|||||||
"test": "cross-env NODE_ENV=test node --enable-source-maps --test \"build/**/*.test.js\""
|
"test": "cross-env NODE_ENV=test node --enable-source-maps --test \"build/**/*.test.js\""
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chalk": "5.3.0",
|
"chalk": "5.4.1",
|
||||||
"clipanion": "3.2.1",
|
"clipanion": "3.2.1",
|
||||||
"date-and-time": "3.6.0",
|
"date-and-time": "3.6.0",
|
||||||
"execa": "9.5.1",
|
"execa": "9.5.3",
|
||||||
"log-symbols": "6.0.0",
|
"log-symbols": "7.0.0",
|
||||||
"ora": "8.1.1",
|
"ora": "8.2.0",
|
||||||
"replace-in-file": "8.2.0",
|
"replace-in-file": "8.3.0",
|
||||||
"table": "6.8.2",
|
"table": "6.9.0",
|
||||||
"typanion": "3.14.0",
|
"typanion": "3.14.0",
|
||||||
"validate-npm-package-name": "6.0.0"
|
"validate-npm-package-name": "6.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@swc/cli": "0.5.0",
|
"@swc/cli": "0.7.7",
|
||||||
"@swc/core": "1.9.2",
|
"@swc/core": "1.11.24",
|
||||||
"@tsconfig/strictest": "2.0.5",
|
|
||||||
"@types/mock-fs": "4.13.4",
|
"@types/mock-fs": "4.13.4",
|
||||||
"@types/ms": "0.7.34",
|
"@types/ms": "2.1.0",
|
||||||
"@types/node": "22.9.0",
|
"@types/node": "22.15.17",
|
||||||
"@types/sinon": "17.0.3",
|
"@types/sinon": "17.0.4",
|
||||||
"@types/validate-npm-package-name": "4.0.2",
|
"@types/validate-npm-package-name": "4.0.2",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"editorconfig-checker": "6.0.0",
|
"editorconfig-checker": "6.0.1",
|
||||||
"eslint": "9.15.0",
|
"eslint": "9.26.0",
|
||||||
"eslint-config-conventions": "17.0.1",
|
"eslint-config-conventions": "19.2.0",
|
||||||
"eslint-plugin-import-x": "4.4.2",
|
"eslint-plugin-import-x": "4.11.1",
|
||||||
"eslint-plugin-promise": "7.1.0",
|
"eslint-plugin-promise": "7.2.1",
|
||||||
"eslint-plugin-unicorn": "56.0.0",
|
"eslint-plugin-unicorn": "59.0.1",
|
||||||
"get-stream": "9.0.1",
|
"get-stream": "9.0.1",
|
||||||
"globals": "15.12.0",
|
"globals": "16.1.0",
|
||||||
"markdownlint-cli2": "0.15.0",
|
"markdownlint-cli2": "0.18.0",
|
||||||
"markdownlint-rule-relative-links": "3.0.0",
|
"markdownlint-rule-relative-links": "4.1.0",
|
||||||
"mock-fs": "5.4.1",
|
"mock-fs": "5.5.0",
|
||||||
"ms": "2.1.3",
|
"ms": "2.1.3",
|
||||||
"prettier": "3.3.3",
|
"prettier": "3.5.3",
|
||||||
"sinon": "19.0.2",
|
"sinon": "20.0.0",
|
||||||
"typescript": "5.6.3",
|
"typescript": "5.8.3",
|
||||||
"typescript-eslint": "8.14.0"
|
"typescript-eslint": "8.32.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM dart:3.5.4 AS builder
|
FROM dart:3.7.3 AS builder
|
||||||
WORKDIR /usr/src/application
|
WORKDIR /usr/src/application
|
||||||
COPY ./ ./
|
COPY ./ ./
|
||||||
RUN dart compile exe solution.dart -o solution
|
RUN dart compile exe solution.dart -o solution
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM pypy:3.10-bookworm
|
FROM pypy:3.11-bookworm
|
||||||
WORKDIR /usr/src/application
|
WORKDIR /usr/src/application
|
||||||
COPY ./ ./
|
COPY ./ ./
|
||||||
CMD ["python", "solution.py"]
|
CMD ["python", "solution.py"]
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM rust:1.82.0 AS builder
|
FROM rust:1.86.0 AS builder
|
||||||
WORKDIR /usr/src/rust_application
|
WORKDIR /usr/src/rust_application
|
||||||
|
|
||||||
# Cache dependencies
|
# Cache dependencies
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
FROM node:22.11.0 AS builder-dependencies
|
FROM node:22.15.0 AS builder-dependencies
|
||||||
WORKDIR /usr/src/application
|
WORKDIR /usr/src/application
|
||||||
COPY ./package*.json ./
|
COPY ./package*.json ./
|
||||||
RUN npm install
|
RUN npm install
|
||||||
|
|
||||||
FROM node:22.11.0 AS builder
|
FROM node:22.15.0 AS builder
|
||||||
WORKDIR /usr/src/application
|
WORKDIR /usr/src/application
|
||||||
COPY --from=builder-dependencies /usr/src/application/node_modules ./node_modules
|
COPY --from=builder-dependencies /usr/src/application/node_modules ./node_modules
|
||||||
COPY ./ ./
|
COPY ./ ./
|
||||||
|
@ -1,15 +1,37 @@
|
|||||||
{
|
{
|
||||||
"extends": "@tsconfig/strictest/tsconfig.json",
|
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "ESNext",
|
|
||||||
"module": "NodeNext",
|
|
||||||
"lib": ["ESNext"],
|
"lib": ["ESNext"],
|
||||||
"moduleResolution": "NodeNext",
|
|
||||||
"outDir": "./build",
|
"outDir": "./build",
|
||||||
"rootDir": "./cli",
|
"rootDir": "./cli",
|
||||||
"noEmit": true,
|
|
||||||
"checkJs": false,
|
"checkJs": false,
|
||||||
"exactOptionalPropertyTypes": false
|
"exactOptionalPropertyTypes": false,
|
||||||
|
|
||||||
|
"strict": true,
|
||||||
|
"allowUnusedLabels": false,
|
||||||
|
"allowUnreachableCode": false,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noImplicitOverride": true,
|
||||||
|
"noImplicitReturns": true,
|
||||||
|
"noImplicitThis": true,
|
||||||
|
"noImplicitAny": true,
|
||||||
|
"noUncheckedIndexedAccess": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"erasableSyntaxOnly": true,
|
||||||
|
|
||||||
|
"verbatimModuleSyntax": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"allowImportingTsExtensions": false,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"jsx": "preserve",
|
||||||
|
"incremental": true,
|
||||||
|
"noEmit": true,
|
||||||
|
|
||||||
|
"target": "ESNext",
|
||||||
|
"module": "ESNext",
|
||||||
|
"moduleResolution": "Bundler",
|
||||||
|
"resolveJsonModule": true
|
||||||
},
|
},
|
||||||
"exclude": ["node_modules", "challenges", "templates", "temp", "tmp"]
|
"exclude": ["node_modules", "challenges", "templates", "temp", "tmp"]
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user