Треки
/
F#
F#
/
Вправи
/
Полювання за скарбами в Тісбері
Полювання за скарбами в Тісбері

Полювання за скарбами в Тісбері

Навчальна вправа

Вступ

Кортежі

Кортеж - це незмінне групування неназваних, але впорядкованих значень. Кортежі можуть містити будь-які (або кілька) типи даних, зокрема інші кортежі.

Кортежі визначаються як значення, розділені комами, між символами ( і ): (<element_1>, ... , <element_n>).

("one", 2) // Tuple pair (2 values)
("one", 2, true) // Tuple triplet (3 values)

Порівнювати можна лише кортежі однакової довжини та однакових типів (у тому самому порядку). Кортежі мають структурну рівність, тобто вони рівні лише тоді, коли всі їхні значення рівні.

(1, 2) = (1, 2) // Same length, same types, same values, same order
// => true

(1, 2) = (2, 1) // Same length, same types, same values, different order
// => false

(1, 2) = (1, "2") // Same length, different types
// compiler error

(1, 2) = (1, 2, 3) // Different length
// compiler error

Є три способи вилучити значення з кортежу:

  • Функції fst та snd
  • Деконструкція кортежу
  • Зіставлення зі зразком
let person = ("Jordan", 170)

// Option 1: fst/snd
let name1 = fst person
let length2 = snd person

// Option 2: deconstruction
let (name2, length2) = person
// => name2 = "Jordan"
// => length2 = 170

// Option 3: pattern matching
match person with
| name3, length3 -> printf "%s: %d" name3 length3

Вказівки

Азара та Руї працюють в одній команді й змагаються в піратському полюванні за скарбами. В однієї є список скарбів із координатами на карті, в іншої - список назв місць із координатами на карті. Їм також дали порожні карти, на яких позначено місце старту з написом YOU ARE HERE.

Список Азари Список Руї
Скарб Координати
Amethyst Octopus 1F
Angry Monkey Figurine 5B
Antique Glass Fishnet Float 3D
Brass Spyglass 4B
Carved Wooden Elephant 8C
Crystal Crab 6A
Glass Starfish 6D
Model Ship in Large Bottle 8A
Pirate Flag 7F
Robot Parrot 1C
Scrimshaw Whale's Tooth 2A
Silver Seahorse 4E
Vintage Pirate Hat 7E
Назва місця Координати Квадрант
Seaside Cottages (1, 'C') Blue
Aqua Lagoon (Island of Mystery) (1, 'F') Yellow
Deserted Docks (2, 'A') Blue
Spiky Rocks (3, 'D') Yellow
Abandoned Lighthouse (4, 'B') Blue
Hidden Spring (Island of Mystery) (4, 'E') Yellow
Stormy Breakwater (5, 'B') Purple
Old Schooner (6, 'A') Purple
Tangled Seaweed Patch (6, 'D') Orange
Quiet Inlet (Island of Mystery) (7, 'E') Orange
Windswept Hilltop (Island of Mystery) (7, 'F') Orange
Harbor Managers Office (8, 'A') Purple
Foggy Seacave (8, 'C') Purple

Але дещо тут трохи безладно: координати Азари, схоже, відформатовано й відсортовано інакше, ніж координати Руї, і їм доводиться раз у раз переглядати то один список, то інший, щоб зʼясувати, які скарби відповідають яким місцям. Як початківці на F#, вони звернулися до нас по допомогу написати невеличку програму (насправді набір функцій), яка краще впорядкує відомості про їхні пошуки.

1. Витягти координати

Реалізуйте функцію getCooordinate(), яка приймає пару (treasure, coordinate) зі списку Азари й повертає лише витягнуту координату з карти.

getCoordinate ("Scrimshaw Whale's Tooth", "2A")
// "2A"

2. Відформатувати координати

Реалізуйте функцію convertCoordinate(), яка приймає координату у форматі «2A» і повертає кортеж у форматі (2, 'A').

convertCoordinate "2A"
// (2, 'A')

3. Зіставити координати

Реалізуйте функцію compareRecords(), яка приймає пару (treasure, coordinate) і запис (location, coordinate, quadrant) та порівнює координати з кожного з них. Поверніть true, якщо координати «збігаються», і поверніть false, якщо ні. За потреби переформатуйте координати для точного порівняння.

compareRecords ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "blue")
// false

compareRecords ("Model Ship in Large Bottle", "8A") ("Harbor Managers Office", (8, 'A'), "purple")
// true

4. Поєднати зіставлені записи

Реалізуйте функцію createrecord(), яка приймає пару (treasure, coordinate) зі списку Азари та запис (location, coordinate, quadrant) зі списку Руї й повертає (coordinate, location, quadrant, treasure), якщо координати збігаються. Якщо координати не збігаються, поверніть кортеж такої ж форми, але заповнений "". За потреби переформатуйте координати для точного порівняння.

createRecord ("Brass Spyglass", "4B") ("Abandoned Lighthouse", (4, 'B'), "Blue")
// ("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")

createRecord ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "Blue")
// ("", "", "", "")
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
F# Exercism

Час розпочати Полювання за скарбами в Тісбері?

Зареєструйтеся на Exercism, щоб вивчати й опановувати F#, а також 18 концепцій148 вправ та справжнє наставництво від людей, і все це безкоштовно.