diff options
Diffstat (limited to 'prolog/problems/lists_advanced')
-rw-r--r-- | prolog/problems/lists_advanced/rev_2/common.py | 36 | ||||
-rw-r--r-- | prolog/problems/lists_advanced/rev_2/sl.py | 28 |
2 files changed, 64 insertions, 0 deletions
diff --git a/prolog/problems/lists_advanced/rev_2/common.py b/prolog/problems/lists_advanced/rev_2/common.py index d9becb6..ee8c9ac 100644 --- a/prolog/problems/lists_advanced/rev_2/common.py +++ b/prolog/problems/lists_advanced/rev_2/common.py @@ -27,6 +27,13 @@ hint_type = { 'base_case': Hint('base_case'), 'recursive_case': Hint('recursive_case'), 'timeout': Hint('timeout'), + 'invalid_insert_at_end': Hint('invalid_insert_at_end'), + 'base_case_at_len1': Hint('base_case_at_len1'), + 'arbitrary_base_case': Hint('arbitrary_base_case'), + 'forcing_result_onto_recursion': Hint('forcing_result_onto_recursion'), + 'using_other_solutions': Hint('using_other_solutions'), + 'insertion_at_beginning': Hint('insertion_at_beginning'), + 'conc_arg_not_list': Hint('conc_arg_not_list'), } test_cases = [ @@ -71,6 +78,35 @@ def hint(code, aux_code): return [{'id': 'eq_instead_of_equ_markup', 'start': m[0], 'end': m[1]} for m in marks] + \ [{'id': 'eq_instead_of_equ'}] + if prolog.engine.ask_truthTO(engine_id, 'rev([q], [q]), \+ rev([], [])'): + return [{'id': 'base_case_at_len1'}] + + if prolog.engine.ask_truthTO(engine_id, 'rev([], kokos(1))'): + return [{'id': 'arbitrary_base_case'}] + + if prolog.engine.ask_truthTO(engine_id, '''\ + \+ rev([yowza, brix, cob], R), + asserta(rev([brix, cob], [[cob, brix] | yowza])), + rev([yowza, brix, cob], [cob, brix]), + retract(rev([brix, cob], [[cob, brix] | yowza]))'''): + return [{'id': 'forcing_result_onto_recursion'}] + + if any(t.val in ('last', 'shiftleft', 'shiftright') for t in tokens): + return [{'id': 'using_other_solutions'}] + + if prolog.engine.ask_truthTO(engine_id, 'rev([qa, qb, qc, qd], [qa, qb, qc, qd])'): + return [{'id': 'insertion_at_beginning'}] + + if prolog.engine.ask_truthTO(engine_id, 'rev([a, b, c], [[[[] | c] | b] | a])'): + return [{'id': 'invalid_insert_at_end'}] + + if prolog.engine.ask_truthTO(engine_id, '''\ + \+ rev([yowza, brix, cob], R), + asserta(rev([brix, cob], [cob, brix])), + rev([yowza, brix, cob], [cob, brix | yowza]), + retract(rev([brix, cob], [cob, brix]))'''): + return [{'id': 'conc_arg_not_list'}] + # missing/failed base case if not prolog.engine.ask_truthTO(engine_id, 'rev([], [])'): return [{'id': 'base_case'}] diff --git a/prolog/problems/lists_advanced/rev_2/sl.py b/prolog/problems/lists_advanced/rev_2/sl.py index 666832d..806dc52 100644 --- a/prolog/problems/lists_advanced/rev_2/sl.py +++ b/prolog/problems/lists_advanced/rev_2/sl.py @@ -44,4 +44,32 @@ da je <code>X</code> hkrati starš in sestra od <code>Y</code> ali kaj podobno z <p>Je morda na delu potencialno neskončna rekurzija? Kako se bo ustavila?</p> <p>Morda pa je kriv tudi manjkajoč, neustrezen ali preprosto nekompatibilen (s splošnim primerom) robni pogoj?</p> ''', + + 'base_case_at_len1': '''\ +<p>base_case_at_len1</p> +''', + + 'arbitrary_base_case': '''\ +<p>arbitrary_base_case</p> +''', + + 'forcing_result_onto_recursion': '''\ +<p>forcing_result_onto_recursion</p> +''', + + 'using_other_solutions': '''\ +<p>using_other_solutions</p> +''', + + 'insertion_at_beginning': '''\ +<p>insertion_at_beginning</p> +''', + + 'invalid_insert_at_end': '''\ +<p>invalid_insert_at_end</p> +''', + + 'conc_arg_not_list': '''\ +<p>conc_arg_not_list</p> +''', } |