- Описание
- Отправленные решения
495. Звёздный навигатор
На заре времён, когда мир был исполнен таинственных сил, люди обнаружили, что небесные светила влияют на их жизни и судьбы. Предания повествуют о мудрецах, которые, наблюдая за звёздами, управляли потоками космической энергии, влияя таким образом на сознание и душевное равновесие людей. Разум каждой звезды был соединён с уникальными вибрациями Вселенной.
Ваша задача — воссоздать древний загадочный инструмент, который разгадывает тайны звёздного неба и подхватывает потоки космической энергии. С этим артефактом мы будем исследовать давно забытые звёздные пути и их воздействие на человеческий разум, тем самым не только повышая нашу продуктивность и творческий потенциал, но и открывая секреты бытия, неведомые до сих пор.
Условие:
Разработайте тип Get
, который позволит по запросу выдавать характеристики звёзд, такие как тип светила, расстояние от Земли, координаты в космосе или другие астрономические параметры.
На входе программа должна получать константный тип массива и строку с путём в формате точечно-скобочной нотации (например, keys.(0-2).val
), а возвращать — литерал значений объектов по заданному пути.
Тип должен позволить запросить информацию по определённым ключам аналогично примерам.
Примеры
const celestialBody = {
cosmicData: {
name: 'Sirius',
type: 'Main Sequence Star',
discoveryDate: 'Unknown Ancient Times',
},
observations: [
{
id: 1,
title: 'Visible Light Spectrum',
observationType: 'Electromagnetic Spectrum',
instrumentUsed: 'Telescope',
spectra: [
{
id: 1,
startWavelength: 390,
endWavelength: 700,
dataPoints: [
{ frequency: 400 },
{ frequency: 500 },
{ frequency: 600 },
],
filters: [
{type: 'High-Pass', cutoffWavelength: 420},
{type: 'Low-Pass', cutoffWavelength: 680},
],
},
],
coordinates: {rightAscension: '06h 45m 08.91728s', declination: '-16° 42′ 58.0171″'},
magnitude: 1.46,
},
{
id: 2,
title: 'Radio Frequency Detection',
observationType: 'Radio Astronomy',
instrumentUsed: 'Radio Telescope',
spectra: [
{
id: 2,
startFrequency: 300,
endFrequency: 900,
dataPoints: [
{ frequency: 400 },
{ frequency: 600 },
{ frequency: 800 },
],
},
],
coordinates: {rightAscension: '06h 45m 08.91728s', declination: '-16° 42′ 58.0171″'},
magnitude: 1.12,
},
],
} as const;
type celestialName = Get<typeof celestialBody, 'cosmicData.name'>; // Sirius
type firstObservationMagnitude = Get<typeof celestialBody, 'observations.0.magnitude'>; // 1.46
type observationsMagnitude = Get<typeof celestialBody, 'observations.(0-2).magnitude'>; // 1.46 | 1.12
type observationInstruments = Get<typeof celestialBody, 'observations.1.instrumentUsed'>; // "Radio Telescope"
type spectraDataPoints = Get<typeof celestialBody, 'observations.0.spectra.0.dataPoints.(0-3)'>; // { frequency: 400 } | { frequency: 500 } | { frequency: 600 }
type secondDataPointIntensity = Get<typeof celestialBody, 'observations.0.spectra.0.dataPoints.1.frequency'>; // 500
Формат ввода
Ваше решение должно содержать определение типа Get
.
type Get<T extends unknown, Path extends string> = ...
Примечание
Код будет выполняться на TypeScript 4.8.4.
Ограничения
Ограничение времени
10 с
Ограничение памяти
640 МБ