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

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

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

Вступ

Tuple багато в чому досить схожий на Vector (одновимірний array). Однак є кілька важливих відмінностей.

  • Кортежі записують у круглих дужках ( ), а не в квадратних [ ], хоча круглі дужки можна опускати, коли зміст однозначний.
  • Кортежі не обовʼязково мають бути однорідними: тип кожного елемента зберігається окремо.
  • Кортежі незмінні.

Незмінність дозволяє компілятору краще оптимізувати код і робить кортежі продуктивнішими за вектори, тому їм варто віддавати перевагу там, де змінність не потрібна.

julia> t = (3, 5.2, "xyz")
(3, 5.2, "xyz")

# Non-homogeneous:
julia> dump(t)
Tuple{Int64, Float64, String}
  1: Int64 3
  2: Float64 5.2
  3: String "xyz"

julia> t[2]
5.2

# Immutable:
julia> t[2] = 7.3
ERROR: MethodError: no method matching setindex!(::Tuple{Int64, Float64, String})

Також є конструктор Tuple(), який перетворює будь-яку колекцію, яку можна перебрати, на кортеж. Зручно, що він розглядає рядок тексту (англ. string) як колекцію символів, яку можна перебрати.

julia> Tuple("Julia")
('J', 'u', 'l', 'i', 'a')

Для будь-якого кортежу можна отримати доступ до елементів за індексом або перебрати їх.

Будь-який суто числовий кортеж також можна використати в математичних функціях, як-от sum(), точнісінько як масиви.

Розпакування

Кортеж можна розпакувати на окремі елементи за допомогою множинного присвоєння. Для елементів, які не потрібні, використаймо підкреслення _ як змінну-заглушку.

julia> tup = (1, "Julia", true)
(1, "Julia", true)

julia> num, name, _ = tup
(1, "Julia", true)

julia> uppercase(name), 2num
("JULIA", 2)

Програмістам Python синтаксис множинного присвоєння добре знайомий.

Іменовані кортежі

Tuple містить лише значення. NamedTuple поєднує кожне значення з іменем.

До окремих полів тоді можна отримати доступ через «крапкову» нотацію:

julia> nt = (a = 1, b = 7.3)
(a = 1, b = 7.3)

julia> dump(nt)
@NamedTuple{a::Int64, b::Float64}
  a: Int64 1
  b: Float64 7.3

julia> nt.b
7.3

Імʼя всередині зберігається як Symbol (незмінний тип, перед яким ставиться двокрапка :), тому доступний альтернативний синтаксис:

julia> nt[:b]
7.3

Легко отримати окремо або імена (їх також називають ключами), або значення:

julia> nt
(a = 1, b = 7.3)

julia> keys(nt)
(:a, :b)

julia> values(nt)
(1, 7.3)

Зауважмо, що ітерація за іменованим кортежем дає лише значення, а імена ігноруються.

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

Вказівки

Азара та Руї - напарники, які змагаються в пошуку скарбів на піратську тему. В одного з них є список скарбів із координатами на карті, а в другого - список назв місць із координатами на карті. Також їм дали порожні карти, на яких місце старту позначено як «ВИ ТУТ».

Список Азари Список Руї
Скарб Координати
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

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

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

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

julia> get_cooordinate( ("Scrimshaw Whale's Tooth", "2A") )
"2A"

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

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

julia> convert_coordinate("2A")
('2', 'A')

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

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

julia> compare_records(("Brass Spyglass", "4B"), ("Seaside Cottages", ('1', 'C'), "blue"))
false

julia> compare_records(("Model Ship in Large Bottle", "8A"), ("Harbor Managers Office", ('8', 'A'), "purple"))
true

4. Обʼєднати зіставлені записи

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

Якщо координати не збігаються, поверніть порожній кортеж. За потреби переформатуйте координати, щоб порівняння було точним.

julia> create_record(("Brass Spyglass", "4B"), ("Abandoned Lighthouse", ('4', 'B'), "Blue"))
("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")

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

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

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