Euler - 11

Euler serisinin onbirinci yazısında, Project Euler’in 11. sorusunu çözeceğiz;

Orjinal Soru;

In the 20×20 grid below, four numbers along a diagonal line have been marked in red.

08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48

The product of these numbers is 26 × 63 × 78 × 14 = 1788696.

What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid?
Türkçesi;

Aşağıdaki 20×20 boyutundaki tabloda çapraz yerleştirilmiş 4 rakam kırmızı renkle işaretlenmiştir.

08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48

Bu 4 rakamın çarpımı 26 × 63 × 78 × 14 = 1788696.

Bu 20×20 boyutundaki tablodaki birbirini takip eden 4 rakamın (yukarıdan-aşağıya, soldan-sağa, çapraz) çarpımlarının en büyüğü kaçtır?

Önce siz çözmeyi deneyin, çözemezseniz;

Not : Bu makalede kullandığım kodların bazılarını internette yaptığım araştırmalar sonucunda yazdım, benzer çözümlere başka sitelerde de rastlayabilirsiniz ;)

İstanbul Üniversitesi Etkinliği Mart 2014

22 Mart 2013 tarihinde düzenlenen etkinlikte Muammer Benzeş ve Ahmet Sertay Halka ile birlikte İstanbul Üniversitesi‘ndeydik.

Etkinliği gerçekleştirmemizi sağlayan hocamız İrfan Şimşek‘e ve etkinliğe katılan tüm öğrenci arkadaşlara çok teşekkür ederiz.

Windows Phone 8 uygulama arkaplan görselini Bing servislerinden almak

Windows Phone 8 için geliştirdiğiniz uygulamanın veya Button, Image gibi nesnelerin arkaplan görselinin periyodik olarak değişmesini isteyebilirsiniz. Böylece uygulamanızın içerisinde sürekli olarak güncellenen bir bölüm oluşturabilirsiniz.

Microsoft‘un geliştirdiği arama motoru olan Bing, ana arama ekranının arkaplan görselini periyodik olarak arkaplan görselini değiştirir.

Öncelikle Bing‘in arkaplan görselini nasıl değiştirdiğini anlamamız lazım. Eğer Bing tarayıcınızda açıldıktan sonra yaptığı isteklere bakacak olursanız, http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1 adresine bir çağrı yaptığını görebilirsiniz.

Bu isteğin parametreleri;

format, bu parametre ile dönüş cevabının xml formatında olması sağlanıyor idx, bu parametre ile Bing’in arkaplan görsellerinden kaçıncı sıradakinin alınacağı belirleniyor n, bu parametre ile kaç görselin bilgisinin alınacağı belirleniyor

http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1 adresine yapacağımız istek ile Bing‘in ilk sıradaki arkaplan görsellerinin bilgilerini xml formatında elde edeceğiz.

Öncelikle MainPage.xaml dosyasını aşağıdaki gibi güncelleyelim;

<phone:PhoneApplicationPage x:Class=”BingBackground.MainPage” xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” xmlns:phone=”clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone” xmlns:shell=”clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone” xmlns:d=”http://schemas.microsoft.com/expression/blend/2008” xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006” mc:Ignorable=”d” FontFamily=”{StaticResource PhoneFontFamilyNormal}” FontSize=”{StaticResource PhoneFontSizeNormal}” Foreground=”{StaticResource PhoneForegroundBrush}” SupportedOrientations=”Portrait” Orientation=”Portrait” shell:SystemTray.IsVisible=”True”>

&lt;StackPanel&gt;
    &lt;StackPanel.Background&gt;
        &lt;ImageBrush x:Name="imgBackground"&gt;&lt;/ImageBrush&gt;
    &lt;/StackPanel.Background&gt;
&lt;/StackPanel&gt;

</phone:PhoneApplicationPage></pre>

Böylece StackPanel nesnesinin arkaplanını imgBackground isimli ImageBrush nesnesi ile güncelleyebileceğiz.

MainPage.xaml.cs dosyasında yeralan MainPage class’ının constructor‘ında LoadBackgroundImage() method’unu çağıralım. LoadBackgroundImage() method’unda WebClient sınıfından yeni bir örnek oluşturup http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1 adresine istek yapacağız;

private async void LoadBackgroundImage()
{
    WebClient client = new WebClient();

    client.DownloadStringCompleted += (sender, e) =>
    {
        if (e.Error == null && !string.IsNullOrEmpty(e.Result))
        {
            var doc = XDocument.Parse(e.Result);

            var url = (from node in doc.Descendants("url") select node.Value).FirstOrDefault();

            var uri = new Uri("http://www.bing.com" + url);

            client.OpenReadCompleted += (s, args) =>
            {
                var image = new BitmapImage();
                image.SetSource(args.Result);

                imgBackground.ImageSource = image;
            };
            client.OpenReadAsync(uri);
        }
    };

    client.DownloadStringAsync(new Uri("http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1"));
}


DownloadStringAsync() method'unu kullanarak yaptığımız isteğin cevabını DownloadStringCompleted event'i ile alabiliyoruz. string tipindeki cevabın *boş* veya *hatalı* olmadığını kontrol ettikten sonra XDocument sınıfının **static** Parse() method'unu kullanarak *parse* ediyoruz.

*url* isimli **element**'in içinde yeralan arkaplan görseli adresinin başına *http://www.bing.com* bilgisini ekliyoruz, böylece **Bing**'in arkaplan görselinin adresini tam olarak elde ediyoruz.

Aynı *WebClient* değişkenini kullanarak tam adresini elde ettiğimiz görsel dosyasına ulaşmak için OpenReadAsync() method'unu çağırıyoruz ve cevabı OpenReadCompleted event'i ile elde ediyoruz.

*OpenReadCompleted* event'i içerisinde elde ettiğimiz Stream ile yeni bir BitmapImage nesnesini dolduruyoruz ve *MainPage.xaml* içerisinde tanımladığımız *imgBackground* nesnesinin görseli olarak belirliyoruz.

Böylece **Bing**'in arkaplan görseli değiştikçe bizim uygulamamızda ilgili alanın görseli değişecektir.

Global Game Jam 2014

Global Game Jam 2014 etkinliği 24 Ocak 2014 - 26 Ocak 2014 tarihleri arasında İzmir Ekonomi Üniversitesi Konferans Salonu‘nda gerçekleştirildi.

Ben de konuşmacı , mentor ve juri üyesi sıfatları ile etkinliğe katıldım ve açıkçası çok keyifli zaman geçirdim.

Global Game Jam nedir?

Global Game Jam, IGDA (International Game Developers Association - Uluslararası Oyun Geliştiricileri Derneği) Eğitim Odak Grubu‘nun yönlendirmesiyle ortaya çıkan, tüm dünyada eş zamanlı gerçekleştirilen bir oyun geliştirme etkinliğidir.

GGJ dünyada oyun geliştirilmesi amacıyla birçok öğrenciyi, profesyoneli ve akademisyeni bir araya getiren dünya genelindeki en büyük oyun geliştirme organizasyonudur.

GGJ 2014 etkinliğinde, dünya genelinde 72 ülkede 488 etkinlik alanında 23198 katılımcı ile 4290 oynanabilir oyun yalnızca 48 saat içerisinde geliştirilmiştir. GGJ etkinliğine ev sahipliği yapan etkinlik merkezleri yerel oyun sektörünün gelişmesine katkı sağlarken, katılımcılara çeşitli açılardan faydalar sağlamaktadır.

Windows Phone 8 - XNA Oyunu / Savaşa Hayır

Bu yazımı okumadan önce Windows Phone ve XNA konusundaki diğer makalelerimi okumanızı öneririm.

Önce görseller;

Savaşa Hayır : BackgroundSavaşa Hayır : Drop 1 0Savaşa Hayır : Drop 1 1Savaşa Hayır : Drop 2 0Savaşa Hayır : Drop 2 1Savaşa Hayır : Plane 0Savaşa Hayır : Plane 1Savaşa Hayır : Plane 2Savaşa Hayır : Plane 3Savaşa Hayır : Plane 4Savaşa Hayır : Plane 5

İlk olarak XNA Game Studio 4.0 grubundaki Windows Phone Game şablonundan SavasaHayir isimli projeyi oluşturalım;

Windows Phone : XNA Game Project Template

Game1.cs dosyasının ismini GameLoop.cs olarak değiştirdikten sonra, Plane isminde yeni bir class ekleyelim;

public class Plane { public Texture2D Texture;

public int Location;

public int Speed; }</pre>

Plane sınıfı sayesinde, ekrana getireceğimiz uçakların telefon ekranındaki konumlarını, hızlarını ve görsellerini bileceğiz.

Drop isminde yeni bir class daha ekleyelim ve aşağıdaki kod parçası ile güncelleyelim;

public class Drop
{
    public bool IsBox;

    public bool IsParachute;

    public Vector2 Location;
}

GameLoop sınıfına geri dönelim ve sınıf seviyesindeki değişkenlere aşağıdakileri ekleyelim;

GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;

Random r = new Random();

Texture2D BackgroundTexture;

Texture2D BoxTexture;
Texture2D BoxParachuteTexture;

Texture2D HumanTexture;
Texture2D HumanParachuteTexture;

Texture2D[] PlaneTextures = new Texture2D[6];

List<Plane> PlaneList = new List<Plane>();

List<Drop> DropList = new List<Drop>();

TimeSpan LastPlaneDate = TimeSpan.Zero;

int PlaneCount;
int DropCount;
int HelpCount;

Yukarıdaki kodlar için daha önce yazmış olduğum Windows Phone ve XNA konusundaki diğer makalelerimi okumanızı öneririm.

GameLoop sınıfının constructor‘ında aşağıdaki atama işlerini yapalım;

public GameLoop()
{
    graphics = new GraphicsDeviceManager(this);
    Content.RootDirectory = "Content";

    TargetElapsedTime = TimeSpan.FromTicks(333333);

    InactiveSleepTime = TimeSpan.FromSeconds(1);

    graphics.PreferredBackBufferWidth = 480;
    graphics.PreferredBackBufferHeight = 800;

    graphics.IsFullScreen = true;
}

LoadContent method’unda Texture2D tipindeki değişkenlerimize değer atayalım;

spriteBatch = new SpriteBatch(GraphicsDevice);

BackgroundTexture = Content.Load<Texture2D>("Background");

for (int iLoop = 0; iLoop < 6; iLoop++)
{
    PlaneTextures[iLoop] = Content.Load<Texture2D>("Plane" + iLoop);
}

BoxTexture = Content.Load<Texture2D>("Drop1_0");
BoxParachuteTexture = Content.Load<Texture2D>("Drop1_1");

HumanTexture = Content.Load<Texture2D>("Drop2_0");
HumanParachuteTexture = Content.Load<Texture2D>("Drop2_1");

Update method’unda Plane ve Drop listesindeki elemanların yerlerini güncelliyoruz;

</pre><pre class="brush:csharp">foreach (var plane in PlaneList) { plane.Location += plane.Speed; }

foreach (var drop in DropList) { drop.Location.Y += 4; }</pre>

Son uçak üretme zamanımızdan itibaren 5000ms (5sn) geçtiyse yeni uçak üretme kodunu ekliyoruz;

LastPlaneDate += gameTime.ElapsedGameTime;

if (LastPlaneDate > TimeSpan.FromMilliseconds(5000))
{
    var plane = new Plane();

    plane.Texture = PlaneTextures[r.Next(0, 6)];

    plane.Speed = r.Next(3, 8);

    PlaneList.Add(plane);

    PlaneCount++;

    LastPlaneDate = TimeSpan.Zero;
}

Windows Phone oyunlarında, oyuncunun ekrana dokunduğu noktaların listesini TouchPanel sınıfının static GetState methodundan dönen TouchCollection ile alabilmekteyiz.

TouchCollection koleksiyonunun her bir elemanı TouchLocation tipindedir, State özelliğinin TouchLocationState enum’ından Pressed değerinde olduğunu kontrol ederek, ilgili noktaya dokunulduğu durumu yakalayabiliriz.

Eğer dokunulan nokta bir Plane ile kesişiyorsa, rastgele yeni bir Drop düşürebiliriz, Drop ile kesişiyorsa paraşütünün açılmasını sağlayabiliriz;

foreach (var tl in TouchPanel.GetState())
{
    if (tl.State == TouchLocationState.Pressed)
    {
        var touchArea = new Rectangle((int)tl.Position.X, (int)tl.Position.Y, 1, 1);

        foreach (var plane in PlaneList)
        {
            var planeArea = new Rectangle(plane.Location, 20, plane.Texture.Width, plane.Texture.Height);

            if (planeArea.Intersects(touchArea))
            {
                var drop = new Drop();

                drop.Location = new Vector2(tl.Position.X, 20);

                drop.IsBox = (r.Next(0, 2) == 0);

                DropList.Add(drop);

                DropCount++;

                return;
            }
        }

        foreach (var drop in DropList)
        {
            var dropArea = new Rectangle((int)drop.Location.X, (int)drop.Location.Y, 100, 200);

            if (!drop.IsParachute && dropArea.Intersects(touchArea))
            {
                drop.IsParachute = true;

                HelpCount++;

                return;
            }
        }
    }
}

Son olarak Draw method’unda elimizdeki arkaplan görselini, ekrandaki uçakları, paraşütü açılmış ve açılmamış nesneleri ekrana çizdireceğiz;

GraphicsDevice.Clear(Color.CornflowerBlue);

spriteBatch.Begin();

spriteBatch.Draw(BackgroundTexture, Vector2.Zero, Color.White);

foreach (var plane in PlaneList)
{
    spriteBatch.Draw(plane.Texture, new Vector2(plane.Location, 20), Color.White);
}

foreach (var drop in DropList)
{
    if (drop.IsBox && drop.IsParachute)
    {
        spriteBatch.Draw(BoxParachuteTexture, drop.Location, Color.White);
    }
    else if (drop.IsBox && !drop.IsParachute)
    {
        spriteBatch.Draw(BoxTexture, drop.Location, Color.White);
    }
    else if (!drop.IsBox && drop.IsParachute)
    {
        spriteBatch.Draw(HumanParachuteTexture, drop.Location, Color.White);
    }
    else
    {
        spriteBatch.Draw(HumanTexture, drop.Location, Color.White);
    }
}

spriteBatch.End();


Oyun'dan bir ekran görüntüsü;

![Savaşa Hayır : Screenshot](/assets/uploads/2014/01/SavasaHayir-2.jpg)

Engin Polat hakkında

Chief Architect, Microsoft RD, Microsoft MVP

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 458

Creative Commons Lisansı