Skip to content

add lecture-8 #172

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions lectures/8-steeple-chase/8-steeple-chase.md
Original file line number Diff line number Diff line change
@@ -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` ციკლია და კარელი მიდის წინ მანამ სანამ წინ კედელი არ არის. ანუ ბოლო მეთოდის შემდგომ ვატრიალებთ კარელს მარცხნივ და ფაქტობრივად მთავრდება მთლიანი მეთოდი და გადავახტით ღობეს.
32 changes: 32 additions & 0 deletions lectures/8-steeple-chase/9x10.w
Original file line number Diff line number Diff line change
@@ -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
62 changes: 62 additions & 0 deletions lectures/8-steeple-chase/9x20.w
Original file line number Diff line number Diff line change
@@ -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
42 changes: 42 additions & 0 deletions lectures/8-steeple-chase/SteepleChase.java
Original file line number Diff line number Diff line change
@@ -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();
}
}

}

Binary file added lectures/8-steeple-chase/world.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.