From 5a9a28d224df25d40c5c9162ee6fd22ea8a9a1c3 Mon Sep 17 00:00:00 2001 From: nkovz Date: Thu, 26 Jan 2023 16:14:41 +0400 Subject: [PATCH] add lecture-8 --- lectures/8-steeple-chase/8-steeple-chase.md | 17 ++++++ lectures/8-steeple-chase/9x10.w | 32 ++++++++++ lectures/8-steeple-chase/9x20.w | 62 ++++++++++++++++++++ lectures/8-steeple-chase/SteepleChase.java | 42 +++++++++++++ lectures/8-steeple-chase/world.png | Bin 0 -> 17625 bytes 5 files changed, 153 insertions(+) create mode 100644 lectures/8-steeple-chase/8-steeple-chase.md create mode 100644 lectures/8-steeple-chase/9x10.w create mode 100644 lectures/8-steeple-chase/9x20.w create mode 100644 lectures/8-steeple-chase/SteepleChase.java create mode 100644 lectures/8-steeple-chase/world.png 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 0000000000000000000000000000000000000000..cd53042ca66839c3432001a12bacab983797c229 GIT binary patch literal 17625 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 literal 0 HcmV?d00001