diff --git a/lectures/8-steeple-chase/8-steeple-chase.md b/lectures/8-steeple-chase/8-steeple-chase.md new file mode 100644 index 0000000..68d7794 --- /dev/null +++ b/lectures/8-steeple-chase/8-steeple-chase.md @@ -0,0 +1,17 @@ +# ღობეებზე გადახტომა + +## ამოცანა: + +წარმოვიდგინოთ, რომ გვაქ შემდეგი ამოცანა კარელი 9 სიგრძის სამყაროში, სამყაროს სიმაღლე არ არის ცნობილი. კარელი +1x1 წერტილში, მის წინ სადღაც არის აღმართული ღობეები (კედლები), რეალურად სად არის არ ვიცით ღობეები და რა სიმაღლის არის კედლები ეგეც არ არის ჩვენთვის ცნობილი. ჩვენი ამოცანაა, რომ კარელი გადაახტეს თითოეულ ღობეს და მივიდეს სამყაროს ბოლოში, ანუ 9x1 წერტილში. რას ნიშნავს, რომ შემოუაროს ღობეს? ღობეს შემოვლა ნიშნავს, რომ გადაახტეს თითოეულ ღობეს და სვლა განაგრძოს ისევ წინა მიმართულებით. საბოლოოდ, ვიცით, რომ სამყაროს სიგრძე არის 9, არ ვიცით სამყაროს სიგანე, არ ვიცით სად არის ღობეები და მათი სიმაღლეები და უნდა მივიყვანოთ კარელი 9x1 წერტილში, ისე რომ, იმოძრაოს მხოლოდ წინ, თუკი შეხვდება ღობე გადაახტეს და გააგრძელოს სვლა. ანუ ამოხსნა უნდა მუშაობდეს სხვადასხვა კონფიგურაციის სამყაროებისთვის და უფრო განზოგადებული ამოხსნა უნდა დავწეროთ. + +## როგორ ამოვხსნათ? + +პირველი რაც უნდა შევამჩნიოთ არის ის, რომ სამყაროს სიგრძე არის 9 ზომის. საერთოდ ღობეები, რომ არ იყოს უბრალოდ for ციკლს გამოვიყენებდით, 8-ჯერ დავატრიალებდით ციკლს და `move()` მეთოდით მივიდოდით ბოლოში, მაგრამ გზაში გხვდება ღობეები და შესაბამისად უნდა შევამოწმოთ ღობე არის თუ არ არის. თუ არის უნდა გადავახტეთ, თუ არ არის უნდა `move()` მეთოდით უბრალოდ გადავალთ. + +## ამოხსნის გარჩევა + +`run()` მეთოდში გვიწერია 8-იანი ციკლი. თუ კარელის წინ კედელი არ არის, ანუ ღობე არ არის მაშინ უბრალოდ გადავდივართ, ხოლო თუ ჩვენს წინ კედელია, ვიძახებთ `jumpHurdle()` მეთოდს. ცხადია, ეს მეთოდი კარელმა არ იცოდა და შესაბამისად ჩვენ უნდა ვასწავლოთ მას, ანუ იმპლემენტაცია დავწეროთ, რომ შემდგომ სადაც დაგჭირდება გამოვიძახოთ იგი. როდესაც ამ მეთოდს გამოვიძახებთ კარელი დგას კედლის მარცხენა ძირში და ამ მეთოდის გამოძახების შემდგომ კარელი უნდა აღმოჩნდეს ღობის მარჯვენა ძირში. აღვწერთ `private void jumpHurdle()`, შევნიშნოთ, რომ ეს მეთოდი არის private და მხოლოდ `run()` მეთოდი არის ერთადერთი public, დანარჩენი ყველა ჩვენ მიერ აღწერილი მეთოდი არის private. +`jumpHurdle()` მეთოდში გვხვდება `ascendHurdle()` და `descendHurdle()` მეთოდები, რომლებიც ასევე ახალი მეთოდებია, ანუ ჯერ არ გვისწავლებია კარელისთვის. რეალურად ჩვენ ახლა დავყავით ქვეამოცანებად ღობეზე გადახტომის პრობლემა. ანუ ჯერ უნდა ავიდეთ ღობეზე, გავაკეთოთ `move()` და შემდგომ ისევ ქვევით ჩავიდეთ. +ვნახოთ, რას აკეთებს `ascendHurdle()`. ამ მეთოდის დაწყებამდე კარელი არის ღობის წინ და გვინდა, აღმოჩნდეს ღობის თავზე. უნდა მოტრიალდეს კარელი მარცხნივ და მანამ სანამ მარჯვნივ დაბლოკილია (`rightIsBlocked()`) მიდის წინ. როდესაც ეს while ციკლი დასრულდება მის მარჯვნივ კედელი აღარ იქნება და მოვატრიალებთ მარჯვნივ. +ახლა განვიხილოთ `descendHurdle()` ამ მეთოდის ვიძახებთ `move()`-ის შემდეგ, ანუ ახლა მარჯნივ უნდა მოტრიალდეს, შემდეგ `moveToWall()`, ანუ მიდის ძირამდე და შემდეგ `turnLeft()`. `moveToWall()` ყველაზე მარტივია, უბრალოდ `while` ციკლია და კარელი მიდის წინ მანამ სანამ წინ კედელი არ არის. ანუ ბოლო მეთოდის შემდგომ ვატრიალებთ კარელს მარცხნივ და ფაქტობრივად მთავრდება მთლიანი მეთოდი და გადავახტით ღობეს. diff --git a/lectures/8-steeple-chase/9x10.w b/lectures/8-steeple-chase/9x10.w new file mode 100644 index 0000000..c918fc8 --- /dev/null +++ b/lectures/8-steeple-chase/9x10.w @@ -0,0 +1,32 @@ +Dimension: (9, 10) +Wall: (3, 1) west +Wall: (3, 2) west +Wall: (3, 3) west +Wall: (4, 1) west +Wall: (4, 2) west +Wall: (6, 1) west +Wall: (6, 2) west +Wall: (6, 3) west +Wall: (6, 4) west +Wall: (6, 5) west +Wall: (6, 6) west +Wall: (7, 1) west +Wall: (7, 2) west +Wall: (7, 3) west +Wall: (7, 4) west +Wall: (7, 5) west +Wall: (7, 6) west +Wall: (7, 7) west +Wall: (9, 1) west +Wall: (9, 2) west +Wall: (9, 3) west +Wall: (9, 4) west +Wall: (9, 5) west +Wall: (9, 6) west +Wall: (9, 7) west +Wall: (9, 8) west +Wall: (9, 9) west +Karel: (1, 1) east + +BeeperBag: INFINITE +Speed: 0.00 diff --git a/lectures/8-steeple-chase/9x20.w b/lectures/8-steeple-chase/9x20.w new file mode 100644 index 0000000..4f8ee69 --- /dev/null +++ b/lectures/8-steeple-chase/9x20.w @@ -0,0 +1,62 @@ +Dimension: (9, 20) +Wall: (3, 1) west +Wall: (3, 2) west +Wall: (3, 3) west +Wall: (3, 4) west +Wall: (3, 5) west +Wall: (3, 6) west +Wall: (3, 7) west +Wall: (3, 8) west +Wall: (5, 1) west +Wall: (5, 2) west +Wall: (5, 3) west +Wall: (5, 4) west +Wall: (5, 5) west +Wall: (5, 6) west +Wall: (5, 7) west +Wall: (5, 8) west +Wall: (5, 9) west +Wall: (5, 10) west +Wall: (5, 11) west +Wall: (5, 12) west +Wall: (5, 13) west +Wall: (5, 14) west +Wall: (6, 1) west +Wall: (6, 2) west +Wall: (6, 3) west +Wall: (6, 4) west +Wall: (6, 5) west +Wall: (6, 6) west +Wall: (6, 7) west +Wall: (6, 8) west +Wall: (6, 9) west +Wall: (6, 10) west +Wall: (6, 11) west +Wall: (6, 12) west +Wall: (6, 13) west +Wall: (6, 14) west +Wall: (6, 15) west +Wall: (6, 16) west +Wall: (8, 1) west +Wall: (8, 2) west +Wall: (8, 3) west +Wall: (8, 4) west +Wall: (8, 5) west +Wall: (8, 6) west +Wall: (8, 7) west +Wall: (8, 8) west +Wall: (8, 9) west +Wall: (8, 10) west +Wall: (8, 11) west +Wall: (8, 12) west +Wall: (8, 13) west +Wall: (8, 14) west +Wall: (8, 15) west +Wall: (8, 16) west +Wall: (8, 17) west +Wall: (8, 18) west +Wall: (8, 19) west +Karel: (1, 1) east + +BeeperBag: INFINITE +Speed: 0.00 diff --git a/lectures/8-steeple-chase/SteepleChase.java b/lectures/8-steeple-chase/SteepleChase.java new file mode 100644 index 0000000..d57c040 --- /dev/null +++ b/lectures/8-steeple-chase/SteepleChase.java @@ -0,0 +1,42 @@ +import stanford.karel.*; + +public class SteepleChase extends SuperKarel { + + public void run() { + for (int i = 0; i < 8; i++) { + if (frontIsClear()) { + move(); + } else { + jumpHurdle(); + } + } + } + + private void jumpHurdle() { + ascendHurdle(); + move(); + descendHurdle(); + } + + private void ascendHurdle() { + turnLeft(); + while (rightIsBlocked()) { + move(); + } + turnRight(); + } + + private void descendHurdle() { + turnRight(); + moveToWall(); + turnLeft(); + } + + private void moveToWall() { + while (frontIsClear()) { + move(); + } + } + +} + diff --git a/lectures/8-steeple-chase/world.png b/lectures/8-steeple-chase/world.png new file mode 100644 index 0000000..cd53042 Binary files /dev/null and b/lectures/8-steeple-chase/world.png differ