mirror of
https://github.com/theoludwig/programming-challenges.git
synced 2024-12-08 00:45:29 +01:00
feat(solutions): add offset-arrays/typescript/function
This commit is contained in:
parent
b9d99fb522
commit
0e6bca44b2
@ -0,0 +1,3 @@
|
|||||||
|
# offset-arrays/typescript/function
|
||||||
|
|
||||||
|
Created by [@Divlo](https://github.com/Divlo) on 29 June 2021.
|
@ -0,0 +1,88 @@
|
|||||||
|
import readline from 'readline'
|
||||||
|
|
||||||
|
const input: string[] = []
|
||||||
|
const readlineInterface = readline.createInterface({
|
||||||
|
input: process.stdin,
|
||||||
|
output: process.stdout
|
||||||
|
})
|
||||||
|
readlineInterface.on('line', (value) => {
|
||||||
|
input.push(value)
|
||||||
|
})
|
||||||
|
readlineInterface.on('close', solution)
|
||||||
|
|
||||||
|
interface AssignmentValues {
|
||||||
|
[key: string]: number
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Assignments {
|
||||||
|
[key: string]: AssignmentArray
|
||||||
|
}
|
||||||
|
|
||||||
|
class AssignmentArray {
|
||||||
|
public identifier: string
|
||||||
|
public firstIndex: number
|
||||||
|
public lastIndex: number
|
||||||
|
public values: AssignmentValues
|
||||||
|
|
||||||
|
constructor(assignment: string) {
|
||||||
|
const [identifier, rest] = assignment.split('[')
|
||||||
|
const [indexes, valuesString] = rest.split(']')
|
||||||
|
const [firstIndexString, lastIndexString] = indexes.split('..')
|
||||||
|
const firstIndex = parseInt(firstIndexString)
|
||||||
|
const lastIndex = parseInt(lastIndexString)
|
||||||
|
|
||||||
|
const [, numbersString] = valuesString.split('=')
|
||||||
|
const numbersStringArray = numbersString.trim().split(' ')
|
||||||
|
const numbers = numbersStringArray.map((number) => Number(number))
|
||||||
|
const values: AssignmentValues = {}
|
||||||
|
let index = 0
|
||||||
|
for (
|
||||||
|
let virtualIndex = firstIndex;
|
||||||
|
virtualIndex <= lastIndex;
|
||||||
|
virtualIndex++
|
||||||
|
) {
|
||||||
|
values[virtualIndex] = numbers[index]
|
||||||
|
index++
|
||||||
|
}
|
||||||
|
|
||||||
|
this.identifier = identifier
|
||||||
|
this.firstIndex = firstIndex
|
||||||
|
this.lastIndex = lastIndex
|
||||||
|
this.values = values
|
||||||
|
}
|
||||||
|
|
||||||
|
public getByIndex(index: number): number {
|
||||||
|
return this.values[index]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function solution(): void {
|
||||||
|
const assignments: Assignments = {}
|
||||||
|
const assignmentsLength = parseInt(input[0])
|
||||||
|
let assignmentIndex = 0
|
||||||
|
for (
|
||||||
|
assignmentIndex = 0;
|
||||||
|
assignmentIndex < assignmentsLength;
|
||||||
|
assignmentIndex++
|
||||||
|
) {
|
||||||
|
const assignment = input[assignmentIndex + 1]
|
||||||
|
const assignmentArray = new AssignmentArray(assignment)
|
||||||
|
assignments[assignmentArray.identifier] = assignmentArray
|
||||||
|
}
|
||||||
|
const operation = input[assignmentIndex + 1]
|
||||||
|
const [simplifiedOperation] = operation.split(']')
|
||||||
|
const nested = simplifiedOperation.split('[')
|
||||||
|
const lastOperationIndex = nested.length - 1
|
||||||
|
const operationIdentifiers = nested.slice(0, lastOperationIndex)
|
||||||
|
const operationIndex = parseInt(nested[lastOperationIndex])
|
||||||
|
let currentValue: number | null = null
|
||||||
|
for (let index = operationIdentifiers.length - 1; index >= 0; index--) {
|
||||||
|
const currentIdentifier = operationIdentifiers[index]
|
||||||
|
if (currentValue == null) {
|
||||||
|
currentValue = assignments[currentIdentifier].getByIndex(operationIndex)
|
||||||
|
} else {
|
||||||
|
currentValue = assignments[currentIdentifier].getByIndex(currentValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(currentValue)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user