From 1eae572b3854231a5af88c4fe2ecfc0fd258ab6e Mon Sep 17 00:00:00 2001 From: Aleksander Sadikov Date: Mon, 21 Mar 2016 16:09:35 +0100 Subject: Hints and plans for palindrome/1 added. --- .../problems/lists_advanced/palindrome_1/common.py | 10 ++++++-- prolog/problems/lists_advanced/palindrome_1/sl.py | 28 +++++++++++++++------- 2 files changed, 27 insertions(+), 11 deletions(-) (limited to 'prolog/problems') diff --git a/prolog/problems/lists_advanced/palindrome_1/common.py b/prolog/problems/lists_advanced/palindrome_1/common.py index bbd28fb..2299e45 100644 --- a/prolog/problems/lists_advanced/palindrome_1/common.py +++ b/prolog/problems/lists_advanced/palindrome_1/common.py @@ -32,7 +32,8 @@ hint_type = { 'one_base_case_missing': Hint('one_base_case_missing'), 'arbitrary_base_case': Hint('arbitrary_base_case'), 'last_used': Hint('last_used'), - 'final_hint': Hint('final_hint'), + 'final_hint_1': Hint('final_hint_1'), + 'final_hint_2': Hint('final_hint_2'), } test_cases = [ @@ -62,7 +63,12 @@ def test(code, aux_code): hints = [{'id': 'test_results', 'args': {'passed': n_correct, 'total': len(test_cases)}}] if n_correct == len(test_cases): - hints += [{'id': 'final_hint'}] + tokens = prolog.util.tokenize(code) + if prolog.util.Token('NAME', 'rev') not in tokens: + hints += [{'id': 'final_hint_1'}] + if prolog.util.Token('NAME', 'rev') in tokens and \ + (prolog.util.Token('EQU', '=') in tokens or prolog.util.Token('EQ', '==') in tokens): + hints += [{'id': 'final_hint_2'}] return n_correct, len(test_cases), hints def hint(code, aux_code): diff --git a/prolog/problems/lists_advanced/palindrome_1/sl.py b/prolog/problems/lists_advanced/palindrome_1/sl.py index ce6dedc..39b054a 100644 --- a/prolog/problems/lists_advanced/palindrome_1/sl.py +++ b/prolog/problems/lists_advanced/palindrome_1/sl.py @@ -35,8 +35,7 @@ implicitno že kar v argumentih predikata (glavi stavka).

''', 'base_case': '''\ -

Si pomislil na robni pogoj? Kaj je najbolj enostaven primer, ko je element v seznamu? -Do katerega elementa najlažje prideš?

+

Si pomislil na robni pogoj? Kateri seznam predstavlja najkrajši možen palindrom?

''', 'predicate_always_false': '''\ @@ -44,7 +43,7 @@ Do katerega elementa najlažje prideš?

Če je ime pravilno, se morda splača preveriti tudi, če se nisi zatipkal kje drugje, je morda kakšna pika namesto vejice ali obratno, morda kakšna spremenljivka z malo začetnico?

Možno je seveda tudi, da so tvoji pogoji prestrogi ali celo nemogoči (kot bi bila npr. zahteva, -da je X hkrati starš in sestra od Y ali kaj podobno zlobnega).

+da je N enako kot N + 1 ali kaj podobno logično zlobnega).

''', 'timeout': '''\ @@ -53,22 +52,33 @@ da je X hkrati starš in sestra od Y ali kaj podobno z ''', '[X,X]_instead_of_[]_base_case': '''\ -

[X,X]_instead_of_[]_base_case')

+

Vsekakor je [X,X] povsem dober robni pogoj, a ne pokrije posebnega primera, ko je vhod kar prazen seznam. To je +seveda stvar definicije, a da bomo imeli vsi enake rešitve, prosim, popravi.

''', 'one_base_case_missing': '''\ -

one_base_case_missing

+

Jemlješ po dva elementa stran ob vsakem prehodu rekurzije? Kako se to zaključi? Liho, sodo? ;)

+

Poskusi naslednja dva primera, eden bo lepo deloval, drugi ne. V čem je razlika?

+

?- palindrome([a,b,b,a]).

+

?- palindrome([l,e,v,e,l]).

''', 'arbitrary_base_case': '''\ -

arbitrary_base_case

+

Pazi _ ni enako kot [_]. Prvo predstavlja poljubno spremenljivko, drugo seznam +z enim poljubnim elementom.

''', 'last_used': '''\ -

last_used

+

Predikat last/2 je tukaj štorast, ker pusti zadnji element v seznamu.

''', - 'final_hint': '''\ -

final_hint

+ 'final_hint_1': '''\ +

Zanimivost: veš, da bi to nalogo lahko rešil tudi s samo enim klicem? Kaj se zgodi, če palindrom... khm, +obrneš? ;)

+''', + + 'final_hint_2': '''\ +

Rešitev lahko še dodatno skrajšaš. Kako se lahko znebiš operatorja = (==) +oziroma ga narediš implicitnega?

''', } -- cgit v1.2.1