Level 3.3.2 - addSmart | Karel Programmierung

preview_player
Показать описание
Videos von Marcel Isler

Videos von Christian Ottenhaus

Vielen Dank für die kostenlose Bereitstellung des Programms!
Рекомендации по теме
Комментарии
Автор

Vielen Dank für dein Video, ohne diesem hätte ich das Level nicht lösen können!

gradlinho
Автор

Hey, danke für das Video. Mein Code ist mittlerweile so unübersichtlich und fürt dennoch nicht zu 100% zum Ziel, weshalb ich das nochmal von vorne programmieren muss. Deine Lösung ist super logisch und gut erklärt.

bast
Автор

Hey Marcel, die beiden Konditionen zu 1+0 und 0+1 kannst du übrigens auch zusammenfassen! Das sieht bei Karel so aus:
else if((onBeeper() && !beeperAhead()) || (!onBeeper() && beeperAhead()))//0+1 OR 1+0

Man muss nur um die jeweiligen Konditionen nochmal ein Paar Klammern setzen, dann kann man dazwischen ein && oder || reinhauen.
Dadurch dass die Ausführung bei beiden ja dieselbe ist, funktioniert das ganz easy.

Ansonsten top Video und schöne, elegante Lösung! Meine sah am Ende fast genauso aus

infiltratorzero
Автор

Mir haben eure Ansätze geholfen, ich habe es zu Erst versucht es ohne extra Weg für alle Möglichkeiten zu lösen, bin dann aber hierbei herausgekommen:

void addSmart()
{
repeat (9)
{
if (rightIsClear())
{
if (frontIsClear())
{
if (!onBeeper()&&beeperAhead())
{
ablegen();
}
if (onBeeper()&&!beeperAhead())
{
ablegen();
}
if
{
turnRight();
moveForward();
turnLeft();
}
if
{
turnRight();
moveForward();
turnLeft();
analyse();
}
}

}
}
}
void ablegen()
{
moveForward();
moveForward();
dropBeeper();
turnRight();
moveForward();
turnRight();
moveForward();
moveForward();
turnAround();
}
void analyse()
{
if (!rightIsClear())
{
moveForward();
moveForward();
dropBeeper();
turnRight();
}
else
{
if (!onBeeper()&&!beeperAhead())
{
ablegen();
}
else
{
if (onBeeper()&&beeperAhead())
{
ablegen();
analyse();
}
else
{
turnRight();
moveForward();
turnLeft();
analyse();
}
}

}
}

void drop()
{
moveForward();
moveForward();
dropBeeper();
turnRight();
}

tobiashansmann
Автор

funktioniert alles, jedoch am Ende hat Karel ein Fehler bei der Prüfung (es gibt keine 256er Blöcke wo addiert werden. heisst deine Summe stimmt nicht um 256 diff. )

Switchsyde
Автор

Super Video und angenehme Stimme.
Eigentlich doch ganz einfach 🤔
Aber selber drauf zu kommen ist für mich immer schwieriger 🙄

rmn
Автор

Ich habe mir einen Ansatz mit einer Schleife für die Gespeicherten ausgedacht (siehe void save):


void addSmart()
{
while (rightIsClear())
{
while // 0+0
{
next();
}
while // 1+0 oder 0+1
{
drop();
return();
}
if (onBeeper())
{
next();
if (rightIsClear())
{
save();
}
}
}
}

void next()
{
turnRight();
moveForward();
turnLeft();
}
void return()
{
turnRight();
moveForward();
turnRight();
moveForward();
moveForward();
turnAround();
}
void drop()
{
moveForward();
moveForward();
dropBeeper();
}
void save()
{
if (!onBeeper()&&!beeperAhead()) // wieder normal
{
drop();
return();
addSmart();
}
if (onBeeper()&&beeperAhead()) // 1+1
{
drop();
return();
while (rightIsClear())
{
save();
}
}
else
{
if (rightIsClear())
{
next();
}
if (rightIsClear())
{
save();
}
}

}

danielmousichidis
Автор

Das hier ist meine Lösung: (vom Grundprinzip her ähnlich wie deine) :)

void addSmart()
{
while (rightIsClear())
{
// 1 u. 2
if (onBeeper() && beeperAhead())
{
nextColumn(); // y = 1
savingMode();
}
// !1 u. !2
if (!onBeeper() && !beeperAhead())
{
nextColumn(); // y = 0
}
// 1 o. 2
if ((!onBeeper() && beeperAhead()) || (onBeeper() && !beeperAhead()))
{
putNumber(); // y = 0
}
}
}
void savingMode()
{
// 1 u. 2
if (onBeeper() && beeperAhead())
{
putNumber(); // y = 1
savingMode();
}
// !1 u. !2
if ((!onBeeper() && !beeperAhead()) && rightIsClear())
{
putNumber(); // y = 0
addSmart();
}
// 1 o. 2
if ((!onBeeper() && beeperAhead()) || (onBeeper() && !beeperAhead()))
{
nextColumn();// y = 1
savingMode();
}
}
void moveTwo()
{
repeat(2)
{
moveForward();
}
}
void putNumber()
{
moveTwo();
dropBeeper();
turnRight();
moveForward();
turnRight();
moveTwo();
turnAround();

}
void nextColumn()
{
if (rightIsClear())
{
turnRight();
moveForward();
turnLeft();
}
}

nielsgoedicke