/*
robot.d (28.03.2012)
Sorunun orijinali bir Türk üniversitesi hocasına* aittir. Kısaca, sayı doğrusu
gibi bir duvarda ki: <____-3____-2____-1____0____+1____+2____+3____>
bir robotun açık kapıyı (sayıyı) bulma çilesini azaltmamız isteniyor...:)
Açık kapı negatif numaralarda da olabileceği için her iki tarafı (Batı/Doğu)
kontrol etmesi gerekiyor. Bunun için main()'de sırayla bir o yana bir bu yana
deli gibi dönen robotumuzu kodladık. Acaba robotumuz bataryasını en iyi şekilde
kullanabilmek için hangi algoritmaya ihtiyacı var?
Kurallar:
=========
o Yapıyı (robot{}) değiştirmemek kaydıyla main() içinde kod kullanımı serbest!
o Ancak hafızadan rasgele üretilen sayıyı tespit etmek yasak; bunu bilmiyor...
o Sadece doğru kapıyı bulduğunda (girdi = true) döngünün sonlanması yeterli ve
o Test için rasgele aralık genişletilebilir veya sabit bir sayı seçilebilir.
Dip Not: Robotumuzun açık kapıyı bulma dışında bir sorunu daha var! Hep sağ
tarafına dönebiliyor. Dolayısıyla solunda dönmesi için 3 değerini parametre
olarak vermeniz yetiyor. Zaten asıl enerjiyi ileri/geri gitmede harcıyor...
Programlama: Salih Dinçer
*/
import std.stdio, std.random;
enum yön { Kuzey, Doğu, Güney, Batı }
struct Robot {
// Tam tur dönerken ve 1 metre giderken harcadığı enerji 1 mWatt
double harcananKw = 0;
yön yönü;
int konumu;
int kapısı;
bool girdi = false;
void sağaDön(int xKere) {
for (; xKere > 0; xKere--)
{
if (yönü != yön.Batı) {
yönü++;
} else {
yönü = yön.Kuzey;
}
harcananKw += 0.00025;
}
if (yönü == yön.Güney && konumu == kapısı)
{
girdi = true;
}
}
void xMetreGit(int xMetre) {
if (yönü == yön.Doğu)
{
konumu += xMetre;
}
if (yönü == yön.Batı)
{
konumu -= xMetre;
}
harcananKw += xMetre/1000;
writef("%.3f Kw. harcandı, (%s): %d numaralı kapıda \r",
this.harcananKw/1000,
this.yönü,
this.konumu);
}
}
void main() {
Robot robot;
robot.kapısı = uniform (int.min>>16, int.max>>16);
int xSay = 0;
robot.sağaDön(2); // Güneye bakıyor...
while (!robot.girdi)
{
robot.sağaDön(xSay % 2 == 1 ? 1 : 3);
// Çiftse batı (-), tekse doğu (+) duvarına dönüyor...
robot.xMetreGit(++xSay); // Kontrol etmediği kapıya gidiyor...
robot.sağaDön(xSay % 2 == 1 ? 1 : 3);
// Tekrar güneye bakıyor ve kontrol ediyor...
}
writeln();
}
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]