diff --git a/config.json b/config.json index 8f375585..5a27456d 100644 --- a/config.json +++ b/config.json @@ -335,6 +335,14 @@ "prerequisites": [], "difficulty": 5 }, + { + "slug": "relative-distance", + "name": "Relative Distance", + "uuid": "c5895419-cba5-446f-b6df-08919b15b568", + "practices": [], + "prerequisites": [], + "difficulty": 5 + }, { "slug": "minesweeper", "name": "Minesweeper", diff --git a/exercises/practice/relative-distance/.docs/instructions.md b/exercises/practice/relative-distance/.docs/instructions.md new file mode 100644 index 00000000..64ca4e43 --- /dev/null +++ b/exercises/practice/relative-distance/.docs/instructions.md @@ -0,0 +1,39 @@ +# Instructions + +Your task is to determine the degree of separation between two individuals in a family tree. +This is similar to the pop culture idea that every Hollywood actor is [within six degrees of Kevin Bacon][six-bacons]. + +- You will be given an input, with all parent names and their children. +- Each name is unique, a child _can_ have one or two parents. +- The degree of separation is defined as the shortest number of connections from one person to another. +- If two individuals are not connected, return a value that represents "no known relationship." + Please see the test cases for the actual implementation. + +## Example + +Given the following family tree: + +```text + ┌──────────┐ ┌──────────┐ ┌───────────┐ + │ Helena │ │ Erdős ├─────┤ Shusaku │ + └───┬───┬──┘ └─────┬────┘ └────┬──────┘ + ┌───┘ └───────┐ └───────┬───────┘ +┌─────┴────┐ ┌────┴───┐ ┌─────┴────┐ +│ Isla ├─────┤ Tariq │ │ Kevin │ +└────┬─────┘ └────┬───┘ └──────────┘ + │ │ +┌────┴────┐ ┌────┴───┐ +│ Uma │ │ Morphy │ +└─────────┘ └────────┘ +``` + +The degree of separation between Tariq and Uma is 2 (Tariq → Isla → Uma). +There's no known relationship between Isla and Kevin, as there is no connection in the given data. +The degree of separation between Uma and Isla is 1. + +~~~~exercism/note +Isla and Tariq are siblings and have a separation of 1. +Similarly, this implementation would report a separation of 2 from you to your father's brother. +~~~~ + +[six-bacons]: https://en.wikipedia.org/wiki/Six_Degrees_of_Kevin_Bacon diff --git a/exercises/practice/relative-distance/.docs/introduction.md b/exercises/practice/relative-distance/.docs/introduction.md new file mode 100644 index 00000000..34073b40 --- /dev/null +++ b/exercises/practice/relative-distance/.docs/introduction.md @@ -0,0 +1,12 @@ +# Introduction + +You've been hired to develop **Noble Knots**, the hottest new dating app for nobility! +With centuries of royal intermarriage, things have gotten… _complicated_. +To avoid any _oops-we're-twins_ situations, your job is to build a system that checks how closely two people are related. + +Noble Knots is inspired by Iceland's "[Islendinga-App][islendiga-app]," which is backed up by a database that traces all known family connections between Icelanders from the time of the settlement of Iceland. +Your algorithm will determine the **degree of separation** between two individuals in the royal family tree. + +Will your app help crown a perfect match? + +[islendiga-app]: https://web.archive.org/web/20250816223614/http://www.islendingaapp.is/information-in-english/ diff --git a/exercises/practice/relative-distance/.meta/config.json b/exercises/practice/relative-distance/.meta/config.json new file mode 100644 index 00000000..0382661b --- /dev/null +++ b/exercises/practice/relative-distance/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "zcl_relative_distance.clas.abap" + ], + "test": [ + "zcl_relative_distance.clas.testclasses.abap" + ], + "example": [ + ".meta/zcl_relative_distance.clas.abap" + ] + }, + "blurb": "Given a family tree, calculate the degree of separation.", + "source": "vaeng", + "source_url": "https://github.com/exercism/problem-specifications/pull/2537" +} diff --git a/exercises/practice/relative-distance/.meta/tests.toml b/exercises/practice/relative-distance/.meta/tests.toml new file mode 100644 index 00000000..66c91ba0 --- /dev/null +++ b/exercises/practice/relative-distance/.meta/tests.toml @@ -0,0 +1,31 @@ +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. + +[4a1ded74-5d32-47fb-8ae5-321f51d06b5b] +description = "Direct parent-child relation" + +[30d17269-83e9-4f82-a0d7-8ef9656d8dce] +description = "Sibling relationship" + +[8dffa27d-a8ab-496d-80b3-2f21c77648b5] +description = "Two degrees of separation, grandchild" + +[34e56ec1-d528-4a42-908e-020a4606ee60] +description = "Unrelated individuals" + +[93ffe989-bad2-48c4-878f-3acb1ce2611b] +description = "Complex graph, cousins" + +[2cc2e76b-013a-433c-9486-1dbe29bf06e5] +description = "Complex graph, no shortcut, far removed nephew" + +[46c9fbcb-e464-455f-a718-049ea3c7400a] +description = "Complex graph, some shortcuts, cross-down and cross-up, cousins several times removed, with unrelated family tree" diff --git a/exercises/practice/relative-distance/.meta/zcl_relative_distance.clas.abap b/exercises/practice/relative-distance/.meta/zcl_relative_distance.clas.abap new file mode 100644 index 00000000..8dc2f2cb --- /dev/null +++ b/exercises/practice/relative-distance/.meta/zcl_relative_distance.clas.abap @@ -0,0 +1,147 @@ +CLASS zcl_relative_distance DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + TYPES: + BEGIN OF ty_family, + parent TYPE string, + children TYPE string_table, + END OF ty_family, + ty_family_tree TYPE STANDARD TABLE OF ty_family WITH KEY parent. + + METHODS degree_of_separation + IMPORTING + family_tree TYPE ty_family_tree + person_a TYPE string + person_b TYPE string + RETURNING + VALUE(result) TYPE i. + PROTECTED SECTION. + PRIVATE SECTION. + TYPES: + BEGIN OF ty_connection, + person TYPE string, + relative TYPE string, + END OF ty_connection, + ty_graph TYPE STANDARD TABLE OF ty_connection WITH EMPTY KEY, + ty_names TYPE STANDARD TABLE OF string WITH EMPTY KEY, + BEGIN OF ty_queue_item, + person TYPE string, + degree TYPE i, + END OF ty_queue_item, + ty_queue TYPE STANDARD TABLE OF ty_queue_item WITH EMPTY KEY. + + METHODS build_graph + IMPORTING + family_tree TYPE ty_family_tree + RETURNING + VALUE(result) TYPE ty_graph. + + METHODS add_connection + IMPORTING + source TYPE string + target TYPE string + CHANGING + graph TYPE ty_graph. + + METHODS has_person + IMPORTING + graph TYPE ty_graph + candidate TYPE string + RETURNING + VALUE(result) TYPE abap_bool. + + METHODS relatives_of + IMPORTING + graph TYPE ty_graph + source TYPE string + RETURNING + VALUE(result) TYPE ty_names. + +ENDCLASS. + + +CLASS zcl_relative_distance IMPLEMENTATION. + METHOD degree_of_separation. + result = -1. + DATA(graph) = build_graph( family_tree ). + + IF has_person( graph = graph candidate = person_a ) = abap_false. + RETURN. + ENDIF. + + IF has_person( graph = graph candidate = person_b ) = abap_false. + RETURN. + ENDIF. + + DATA(queue) = VALUE ty_queue( ( person = person_a degree = 0 ) ). + DATA(visited) = VALUE ty_names( ( person_a ) ). + + WHILE lines( queue ) > 0. + DATA(current) = queue[ 1 ]. + DELETE queue INDEX 1. + + IF current-person = person_b. + result = current-degree. + RETURN. + ENDIF. + + LOOP AT relatives_of( graph = graph source = current-person ) ASSIGNING FIELD-SYMBOL(). + IF NOT line_exists( visited[ table_line = ] ). + APPEND TO visited. + APPEND VALUE #( person = degree = current-degree + 1 ) TO queue. + ENDIF. + ENDLOOP. + ENDWHILE. + ENDMETHOD. + + METHOD build_graph. + LOOP AT family_tree ASSIGNING FIELD-SYMBOL(). + LOOP AT -children ASSIGNING FIELD-SYMBOL(). + add_connection( + EXPORTING + source = -parent + target = + CHANGING + graph = result ). + add_connection( + EXPORTING + source = + target = -parent + CHANGING + graph = result ). + + LOOP AT -children ASSIGNING FIELD-SYMBOL(). + IF <> . + add_connection( + EXPORTING + source = + target = + CHANGING + graph = result ). + ENDIF. + ENDLOOP. + ENDLOOP. + ENDLOOP. + ENDMETHOD. + + METHOD add_connection. + IF NOT line_exists( graph[ person = source relative = target ] ). + APPEND VALUE #( person = source relative = target ) TO graph. + ENDIF. + ENDMETHOD. + + METHOD has_person. + result = line_exists( graph[ person = candidate ] ). + ENDMETHOD. + + METHOD relatives_of. + LOOP AT graph ASSIGNING FIELD-SYMBOL() WHERE person = source. + APPEND -relative TO result. + ENDLOOP. + ENDMETHOD. + + +ENDCLASS. diff --git a/exercises/practice/relative-distance/package.devc.xml b/exercises/practice/relative-distance/package.devc.xml new file mode 100644 index 00000000..ef1dd468 --- /dev/null +++ b/exercises/practice/relative-distance/package.devc.xml @@ -0,0 +1,10 @@ + + + + + + Exercism: Relative Distance + + + + diff --git a/exercises/practice/relative-distance/zcl_relative_distance.clas.abap b/exercises/practice/relative-distance/zcl_relative_distance.clas.abap new file mode 100644 index 00000000..4a937d5e --- /dev/null +++ b/exercises/practice/relative-distance/zcl_relative_distance.clas.abap @@ -0,0 +1,33 @@ +CLASS zcl_relative_distance DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + TYPES: + BEGIN OF ty_family, + parent TYPE string, + children TYPE string_table, + END OF ty_family, + ty_family_tree TYPE STANDARD TABLE OF ty_family WITH KEY parent. + + METHODS degree_of_separation + IMPORTING + family_tree TYPE ty_family_tree + person_a TYPE string + person_b TYPE string + RETURNING + VALUE(result) TYPE i. + PROTECTED SECTION. + PRIVATE SECTION. + +ENDCLASS. + + +CLASS zcl_relative_distance IMPLEMENTATION. + METHOD degree_of_separation. + " add solution here + ENDMETHOD. + + +ENDCLASS. diff --git a/exercises/practice/relative-distance/zcl_relative_distance.clas.testclasses.abap b/exercises/practice/relative-distance/zcl_relative_distance.clas.testclasses.abap new file mode 100644 index 00000000..9c3d03ca --- /dev/null +++ b/exercises/practice/relative-distance/zcl_relative_distance.clas.testclasses.abap @@ -0,0 +1,264 @@ +CLASS ltcl_relative_distance DEFINITION FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PRIVATE SECTION. + DATA cut TYPE REF TO zcl_relative_distance. + METHODS setup. + METHODS test_direct_parent_child FOR TESTING RAISING cx_static_check. + METHODS test_sibling_relationship FOR TESTING RAISING cx_static_check. + METHODS test_two_degrees_grandchild FOR TESTING RAISING cx_static_check. + METHODS test_unrelated_individuals FOR TESTING RAISING cx_static_check. + METHODS test_complex_graph_cousins FOR TESTING RAISING cx_static_check. + METHODS test_complex_graph_no_shortcut FOR TESTING RAISING cx_static_check. + METHODS test_complex_with_shortcuts FOR TESTING RAISING cx_static_check. + +ENDCLASS. + + +CLASS ltcl_relative_distance IMPLEMENTATION. + + METHOD setup. + cut = NEW zcl_relative_distance( ). + ENDMETHOD. + + METHOD test_direct_parent_child. + DATA(family_tree) = VALUE zcl_relative_distance=>ty_family_tree( + ( parent = 'Vera' children = VALUE #( ( |Tomoko| ) ) ) + ( parent = 'Tomoko' children = VALUE #( ( |Aditi| ) ) ) ). + + cl_abap_unit_assert=>assert_equals( + act = cut->degree_of_separation( + family_tree = family_tree + person_a = 'Vera' + person_b = 'Tomoko' ) + exp = 1 ). + ENDMETHOD. + + METHOD test_sibling_relationship. + DATA(family_tree) = VALUE zcl_relative_distance=>ty_family_tree( + ( parent = 'Dalia' children = VALUE #( ( |Olga| ) ( |Yassin| ) ) ) ). + + cl_abap_unit_assert=>assert_equals( + act = cut->degree_of_separation( + family_tree = family_tree + person_a = 'Olga' + person_b = 'Yassin' ) + exp = 1 ). + ENDMETHOD. + + METHOD test_two_degrees_grandchild. + DATA(family_tree) = VALUE zcl_relative_distance=>ty_family_tree( + ( parent = 'Khadija' children = VALUE #( ( |Mateo| ) ) ) + ( parent = 'Mateo' children = VALUE #( ( |Rami| ) ) ) ). + + cl_abap_unit_assert=>assert_equals( + act = cut->degree_of_separation( + family_tree = family_tree + person_a = 'Khadija' + person_b = 'Rami' ) + exp = 2 ). + ENDMETHOD. + + METHOD test_unrelated_individuals. + DATA(family_tree) = VALUE zcl_relative_distance=>ty_family_tree( + ( parent = 'Priya' children = VALUE #( ( |Rami| ) ) ) + ( parent = 'Kaito' children = VALUE #( ( |Elif| ) ) ) ). + + cl_abap_unit_assert=>assert_equals( + act = cut->degree_of_separation( + family_tree = family_tree + person_a = 'Priya' + person_b = 'Kaito' ) + exp = -1 ). + ENDMETHOD. + + METHOD test_complex_graph_cousins. + DATA(family_tree) = VALUE zcl_relative_distance=>ty_family_tree( + ( parent = 'Aiko' children = VALUE #( ( |Bao| ) ( |Carlos| ) ) ) + ( parent = 'Bao' children = VALUE #( ( |Dalia| ) ( |Elias| ) ) ) + ( parent = 'Carlos' children = VALUE #( ( |Fatima| ) ( |Gustavo| ) ) ) + ( parent = 'Dalia' children = VALUE #( ( |Hassan| ) ( |Isla| ) ) ) + ( parent = 'Elias' children = VALUE #( ( |Javier| ) ) ) + ( parent = 'Fatima' children = VALUE #( ( |Khadija| ) ( |Liam| ) ) ) + ( parent = 'Gustavo' children = VALUE #( ( |Mina| ) ) ) + ( parent = 'Hassan' children = VALUE #( ( |Noah| ) ( |Olga| ) ) ) + ( parent = 'Isla' children = VALUE #( ( |Pedro| ) ) ) + ( parent = 'Javier' children = VALUE #( ( |Quynh| ) ( |Ravi| ) ) ) + ( parent = 'Khadija' children = VALUE #( ( |Sofia| ) ) ) + ( parent = 'Liam' children = VALUE #( ( |Tariq| ) ( |Uma| ) ) ) + ( parent = 'Mina' children = VALUE #( ( |Viktor| ) ( |Wang| ) ) ) + ( parent = 'Noah' children = VALUE #( ( |Xiomara| ) ) ) + ( parent = 'Olga' children = VALUE #( ( |Yuki| ) ) ) + ( parent = 'Pedro' children = VALUE #( ( |Zane| ) ( |Aditi| ) ) ) + ( parent = 'Quynh' children = VALUE #( ( |Boris| ) ) ) + ( parent = 'Ravi' children = VALUE #( ( |Celine| ) ) ) + ( parent = 'Sofia' children = VALUE #( ( |Diego| ) ( |Elif| ) ) ) + ( parent = 'Tariq' children = VALUE #( ( |Farah| ) ) ) + ( parent = 'Uma' children = VALUE #( ( |Giorgio| ) ) ) + ( parent = 'Viktor' children = VALUE #( ( |Hana| ) ( |Ian| ) ) ) + ( parent = 'Wang' children = VALUE #( ( |Jing| ) ) ) + ( parent = 'Xiomara' children = VALUE #( ( |Kaito| ) ) ) + ( parent = 'Yuki' children = VALUE #( ( |Leila| ) ) ) + ( parent = 'Zane' children = VALUE #( ( |Mateo| ) ) ) + ( parent = 'Aditi' children = VALUE #( ( |Nia| ) ) ) + ( parent = 'Boris' children = VALUE #( ( |Oscar| ) ) ) + ( parent = 'Celine' children = VALUE #( ( |Priya| ) ) ) + ( parent = 'Diego' children = VALUE #( ( |Qi| ) ) ) + ( parent = 'Elif' children = VALUE #( ( |Rami| ) ) ) + ( parent = 'Farah' children = VALUE #( ( |Sven| ) ) ) + ( parent = 'Giorgio' children = VALUE #( ( |Tomoko| ) ) ) + ( parent = 'Hana' children = VALUE #( ( |Umar| ) ) ) + ( parent = 'Ian' children = VALUE #( ( |Vera| ) ) ) + ( parent = 'Jing' children = VALUE #( ( |Wyatt| ) ) ) + ( parent = 'Kaito' children = VALUE #( ( |Xia| ) ) ) + ( parent = 'Leila' children = VALUE #( ( |Yassin| ) ) ) + ( parent = 'Mateo' children = VALUE #( ( |Zara| ) ) ) + ( parent = 'Nia' children = VALUE #( ( |Antonio| ) ) ) + ( parent = 'Oscar' children = VALUE #( ( |Bianca| ) ) ) + ( parent = 'Priya' children = VALUE #( ( |Cai| ) ) ) + ( parent = 'Qi' children = VALUE #( ( |Dimitri| ) ) ) + ( parent = 'Rami' children = VALUE #( ( |Ewa| ) ) ) + ( parent = 'Sven' children = VALUE #( ( |Fabio| ) ) ) + ( parent = 'Tomoko' children = VALUE #( ( |Gabriela| ) ) ) + ( parent = 'Umar' children = VALUE #( ( |Helena| ) ) ) + ( parent = 'Vera' children = VALUE #( ( |Igor| ) ) ) + ( parent = 'Wyatt' children = VALUE #( ( |Jun| ) ) ) + ( parent = 'Xia' children = VALUE #( ( |Kim| ) ) ) + ( parent = 'Yassin' children = VALUE #( ( |Lucia| ) ) ) + ( parent = 'Zara' children = VALUE #( ( |Mohammed| ) ) ) ). + + cl_abap_unit_assert=>assert_equals( + act = cut->degree_of_separation( + family_tree = family_tree + person_a = 'Dimitri' + person_b = 'Fabio' ) + exp = 9 ). + ENDMETHOD. + + METHOD test_complex_graph_no_shortcut. + DATA(family_tree) = VALUE zcl_relative_distance=>ty_family_tree( + ( parent = 'Aiko' children = VALUE #( ( |Bao| ) ( |Carlos| ) ) ) + ( parent = 'Bao' children = VALUE #( ( |Dalia| ) ( |Elias| ) ) ) + ( parent = 'Carlos' children = VALUE #( ( |Fatima| ) ( |Gustavo| ) ) ) + ( parent = 'Dalia' children = VALUE #( ( |Hassan| ) ( |Isla| ) ) ) + ( parent = 'Elias' children = VALUE #( ( |Javier| ) ) ) + ( parent = 'Fatima' children = VALUE #( ( |Khadija| ) ( |Liam| ) ) ) + ( parent = 'Gustavo' children = VALUE #( ( |Mina| ) ) ) + ( parent = 'Hassan' children = VALUE #( ( |Noah| ) ( |Olga| ) ) ) + ( parent = 'Isla' children = VALUE #( ( |Pedro| ) ) ) + ( parent = 'Javier' children = VALUE #( ( |Quynh| ) ( |Ravi| ) ) ) + ( parent = 'Khadija' children = VALUE #( ( |Sofia| ) ) ) + ( parent = 'Liam' children = VALUE #( ( |Tariq| ) ( |Uma| ) ) ) + ( parent = 'Mina' children = VALUE #( ( |Viktor| ) ( |Wang| ) ) ) + ( parent = 'Noah' children = VALUE #( ( |Xiomara| ) ) ) + ( parent = 'Olga' children = VALUE #( ( |Yuki| ) ) ) + ( parent = 'Pedro' children = VALUE #( ( |Zane| ) ( |Aditi| ) ) ) + ( parent = 'Quynh' children = VALUE #( ( |Boris| ) ) ) + ( parent = 'Ravi' children = VALUE #( ( |Celine| ) ) ) + ( parent = 'Sofia' children = VALUE #( ( |Diego| ) ( |Elif| ) ) ) + ( parent = 'Tariq' children = VALUE #( ( |Farah| ) ) ) + ( parent = 'Uma' children = VALUE #( ( |Giorgio| ) ) ) + ( parent = 'Viktor' children = VALUE #( ( |Hana| ) ( |Ian| ) ) ) + ( parent = 'Wang' children = VALUE #( ( |Jing| ) ) ) + ( parent = 'Xiomara' children = VALUE #( ( |Kaito| ) ) ) + ( parent = 'Yuki' children = VALUE #( ( |Leila| ) ) ) + ( parent = 'Zane' children = VALUE #( ( |Mateo| ) ) ) + ( parent = 'Aditi' children = VALUE #( ( |Nia| ) ) ) + ( parent = 'Boris' children = VALUE #( ( |Oscar| ) ) ) + ( parent = 'Celine' children = VALUE #( ( |Priya| ) ) ) + ( parent = 'Diego' children = VALUE #( ( |Qi| ) ) ) + ( parent = 'Elif' children = VALUE #( ( |Rami| ) ) ) + ( parent = 'Farah' children = VALUE #( ( |Sven| ) ) ) + ( parent = 'Giorgio' children = VALUE #( ( |Tomoko| ) ) ) + ( parent = 'Hana' children = VALUE #( ( |Umar| ) ) ) + ( parent = 'Ian' children = VALUE #( ( |Vera| ) ) ) + ( parent = 'Jing' children = VALUE #( ( |Wyatt| ) ) ) + ( parent = 'Kaito' children = VALUE #( ( |Xia| ) ) ) + ( parent = 'Leila' children = VALUE #( ( |Yassin| ) ) ) + ( parent = 'Mateo' children = VALUE #( ( |Zara| ) ) ) + ( parent = 'Nia' children = VALUE #( ( |Antonio| ) ) ) + ( parent = 'Oscar' children = VALUE #( ( |Bianca| ) ) ) + ( parent = 'Priya' children = VALUE #( ( |Cai| ) ) ) + ( parent = 'Qi' children = VALUE #( ( |Dimitri| ) ) ) + ( parent = 'Rami' children = VALUE #( ( |Ewa| ) ) ) + ( parent = 'Sven' children = VALUE #( ( |Fabio| ) ) ) + ( parent = 'Tomoko' children = VALUE #( ( |Gabriela| ) ) ) + ( parent = 'Umar' children = VALUE #( ( |Helena| ) ) ) + ( parent = 'Vera' children = VALUE #( ( |Igor| ) ) ) + ( parent = 'Wyatt' children = VALUE #( ( |Jun| ) ) ) + ( parent = 'Xia' children = VALUE #( ( |Kim| ) ) ) + ( parent = 'Yassin' children = VALUE #( ( |Lucia| ) ) ) + ( parent = 'Zara' children = VALUE #( ( |Mohammed| ) ) ) ). + + cl_abap_unit_assert=>assert_equals( + act = cut->degree_of_separation( + family_tree = family_tree + person_a = 'Lucia' + person_b = 'Jun' ) + exp = 14 ). + ENDMETHOD. + + METHOD test_complex_with_shortcuts. + DATA(family_tree) = VALUE zcl_relative_distance=>ty_family_tree( + ( parent = 'Aiko' children = VALUE #( ( |Bao| ) ( |Carlos| ) ) ) + ( parent = 'Bao' children = VALUE #( ( |Dalia| ) ) ) + ( parent = 'Carlos' children = VALUE #( ( |Fatima| ) ( |Gustavo| ) ) ) + ( parent = 'Dalia' children = VALUE #( ( |Hassan| ) ( |Isla| ) ) ) + ( parent = 'Fatima' children = VALUE #( ( |Khadija| ) ( |Liam| ) ) ) + ( parent = 'Gustavo' children = VALUE #( ( |Mina| ) ) ) + ( parent = 'Hassan' children = VALUE #( ( |Noah| ) ( |Olga| ) ) ) + ( parent = 'Isla' children = VALUE #( ( |Pedro| ) ) ) + ( parent = 'Javier' children = VALUE #( ( |Quynh| ) ( |Ravi| ) ) ) + ( parent = 'Khadija' children = VALUE #( ( |Sofia| ) ) ) + ( parent = 'Liam' children = VALUE #( ( |Tariq| ) ( |Uma| ) ) ) + ( parent = 'Mina' children = VALUE #( ( |Viktor| ) ( |Wang| ) ) ) + ( parent = 'Noah' children = VALUE #( ( |Xiomara| ) ) ) + ( parent = 'Olga' children = VALUE #( ( |Yuki| ) ) ) + ( parent = 'Pedro' children = VALUE #( ( |Zane| ) ( |Aditi| ) ) ) + ( parent = 'Quynh' children = VALUE #( ( |Boris| ) ) ) + ( parent = 'Ravi' children = VALUE #( ( |Celine| ) ) ) + ( parent = 'Sofia' children = VALUE #( ( |Diego| ) ( |Elif| ) ) ) + ( parent = 'Tariq' children = VALUE #( ( |Farah| ) ) ) + ( parent = 'Uma' children = VALUE #( ( |Giorgio| ) ) ) + ( parent = 'Viktor' children = VALUE #( ( |Hana| ) ( |Ian| ) ) ) + ( parent = 'Wang' children = VALUE #( ( |Jing| ) ) ) + ( parent = 'Xiomara' children = VALUE #( ( |Kaito| ) ) ) + ( parent = 'Yuki' children = VALUE #( ( |Leila| ) ) ) + ( parent = 'Zane' children = VALUE #( ( |Mateo| ) ) ) + ( parent = 'Aditi' children = VALUE #( ( |Nia| ) ) ) + ( parent = 'Boris' children = VALUE #( ( |Oscar| ) ) ) + ( parent = 'Celine' children = VALUE #( ( |Priya| ) ) ) + ( parent = 'Diego' children = VALUE #( ( |Qi| ) ) ) + ( parent = 'Elif' children = VALUE #( ( |Rami| ) ) ) + ( parent = 'Farah' children = VALUE #( ( |Sven| ) ) ) + ( parent = 'Giorgio' children = VALUE #( ( |Tomoko| ) ) ) + ( parent = 'Hana' children = VALUE #( ( |Umar| ) ) ) + ( parent = 'Ian' children = VALUE #( ( |Vera| ) ) ) + ( parent = 'Jing' children = VALUE #( ( |Wyatt| ) ) ) + ( parent = 'Kaito' children = VALUE #( ( |Xia| ) ) ) + ( parent = 'Leila' children = VALUE #( ( |Yassin| ) ) ) + ( parent = 'Mateo' children = VALUE #( ( |Zara| ) ) ) + ( parent = 'Nia' children = VALUE #( ( |Antonio| ) ) ) + ( parent = 'Oscar' children = VALUE #( ( |Bianca| ) ) ) + ( parent = 'Priya' children = VALUE #( ( |Cai| ) ) ) + ( parent = 'Qi' children = VALUE #( ( |Dimitri| ) ) ) + ( parent = 'Rami' children = VALUE #( ( |Ewa| ) ) ) + ( parent = 'Sven' children = VALUE #( ( |Fabio| ) ) ) + ( parent = 'Tomoko' children = VALUE #( ( |Gabriela| ) ) ) + ( parent = 'Umar' children = VALUE #( ( |Helena| ) ) ) + ( parent = 'Vera' children = VALUE #( ( |Igor| ) ) ) + ( parent = 'Wyatt' children = VALUE #( ( |Jun| ) ) ) + ( parent = 'Xia' children = VALUE #( ( |Kim| ) ) ) + ( parent = 'Yassin' children = VALUE #( ( |Lucia| ) ) ) + ( parent = 'Zara' children = VALUE #( ( |Mohammed| ) ) ) ). + + cl_abap_unit_assert=>assert_equals( + act = cut->degree_of_separation( + family_tree = family_tree + person_a = 'Wyatt' + person_b = 'Xia' ) + exp = 12 ). + ENDMETHOD. + +ENDCLASS. diff --git a/exercises/practice/relative-distance/zcl_relative_distance.clas.xml b/exercises/practice/relative-distance/zcl_relative_distance.clas.xml new file mode 100644 index 00000000..99fc5a1a --- /dev/null +++ b/exercises/practice/relative-distance/zcl_relative_distance.clas.xml @@ -0,0 +1,17 @@ + + + + + + ZCL_RELATIVE_DISTANCE + E + Exercism: Relative Distance + 1 + X + X + X + X + + + +