Leetcode Çözümleri | Three Consecutive Odds

Leetcode içerisinde bulunan “Three Consecutive Odds” sorusunun açıklaması ve çözümü. Bu soruda size verilen bir tam sayı dizisinde, 3 tane yan yana tek sayı olup olmadığını bulmanız isteniyor.

➡️ Leetcode 1550. Three Consecutive Odds: https://leetcode.com/problems/three-consecutive-odds/

➡️ Problem açıklaması:

Given an integer array arr, return true if there are three consecutive odd numbers in the array. Otherwise, return false.

Example 1:

Input: arr = [2,6,4,1]

Output: false

Explanation: There are no three consecutive odds.

Example 2:

Input: arr = [1,2,34,3,4,5,7,23,12]

Output: true

Explanation: [5,7,23] are three consecutive odds.

Constraints:

1 <= arr.length <= 1000

1 <= arr[i] <= 1000

Visual Studio 2022 ile gizli karakterleri görün!

Visual Studio 2022 17.0.3 release’i ile gelen özelliklerden biri de “bidirectional” yani çift yönlü karakterleri artık editörde görebiliyoruz.

Kodun yanlış sunulmasına izin veren potansiyel olarak kötü amaçlı bir istismarı önlemek için, Visual Studio artık iki yönlü metin kontrol karakterlerinin editör içerisindeki karakterlerin sırasını değiştirmesine izin vermeyecek.

Bu özelliği Tools –> Options –> Text Editor –> General page altındaki “Show bidirectional text control characters” kısmında açıp kapatabilirsiniz. Default’ta açık geliyor.

Bidirectional karakter olarak adlandırılan karakterlerin tüm listesi şu şekilde; U+061c, U+200e-U+200f, U+202a-U+202e, U+2066-U+2069

Kaynak:

https://docs.microsoft.com/en-us/visualstudio/releases/2022/release-notes#bidirectional-text-control-character-rendering

https://en.wikipedia.org/wiki/Left-to-right_mark

https://www.fileformat.info/info/unicode/char/200e/index.htm

C# 10 Yenilikleri – CallerArgumentExpression attribute kullanımı

C# 10 ile gelen yeniliklerden biri de CallerArgumentExpression attribute kullanımı.

CallerArgumentExpression attribute kullanımı size parametre olarak verdiğiniz expression’ın string halini size geri döndürüyor. Diğer compiler servis attribute’ler gibi bu da optional.

using System.Runtime.CompilerServices;

void Write(object obj, [CallerArgumentExpression("obj")] string? msg = null)
{
    Console.WriteLine($"Expression şu: {msg}");
}

Write(new object());
Write("Merhaba");
Write(42 + 42 + 42);
Write(() lambda { });

int i = 42;
Write(i);

// Expression şu: new object()
// Expression şu: "Merhaba"
// Expression şu: 42 + 42 + 42
// Expression şu: () lambda  { }
// Expression şu: i

Kaynak: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/caller-argument-expression

LeetCode Çözümleri | Add Digits

Leetcode içerisinde bulunan “Add Digits” sorusunun açıklaması ve çözümü. Bu soruda sizi verilen bir tam sayının rakamları toplamı tek hane olana kadar toplayıp geriye döndürmeniz isteniyor.

➡️ LeetCode 258. Add Digits: https://leetcode.com/problems/add-digits/

➡️ Problem açıklaması:

Given an integer num, repeatedly add all its digits until the result has only one digit, and return it.

Example 1:

Input: num = 38

Output: 2

Explanation: The process is

38 —- 3 + 8 —- 11

11 —- 1 + 1 —- 2

Since 2 has only one digit, return it.

Example 2:

Input: num = 0

Output: 0

Constraints:

0 <= num <= 2^31 – 1

⚠️Follow up: Could you do it without any loop/recursion in O(1) runtime?

.NET 6 Yenilikleri – Nuget paket validasyonu

.NET 6 ile gelen yeniliklerden biri de EnablePackageValidation kullanımı.

Bu tag nuget paketlerinizin validasyonunun sağlıyor. Peki ne bu validasyonlar?

  • Sürümler arasında birbirini bozan değişiklik olup olmadığını doğrular.
  • Paketin, farklı runtime implementasyonlarına özgü uygulamalar için aynı public API yapısına sahip olup olmadığını doğrular.
  • Geliştiricilerin uygulanabilirlik açıklarını yakalamasına yardımcı olur.

Projenizin .csproj dosyası içerisinde PropertyGroup altında kullanabilirsiniz bu tag’ı.

<PropertyGroup>
  <EnablePackageValidation>true</EnablePackageValidation>
</PropertyGroup>

Kaynak:

https://docs.microsoft.com/en-us/dotnet/fundamentals/package-validation/overview

Şanslı olmadan nasıl zengin olunur?

Naval Ravikant’ın “Şanslı olmadan nasıl zengin olunur?” şeklinde bir twitter thread‘ine denk geldim. Kendisi girişimcilerin yoda’sı olarak bilinir. Uber, FourSquare, Twitter, Clubhouse, Stack Overflow, OpenDNS vb. 100’e yakın şirketin kurulma zamanlarında ciddi yatırımlar yapmış bir kişi.

➡️ Para veya statü değil, zenginlik arayın. Zenginlik, uyurken kazanılan varlıklara sahip olmaktır. Para, zamanı ve zenginliği nasıl aktardığımızdır. Statü, sosyal hiyerarşideki yerinizdir.

➡️ Etik bir zenginlik yaratmanın mümkün olduğunu anlayın. Zenginliği gizlice hor görürseniz, o sizden kaçar.

➡️ Statü oyunları oynayan insanları görmezden gelin. Bu kişiler servet yaratma oyunları oynayan insanlara saldırarak statü kazanırlar.

➡️ Zamanını kiraya vererek zengin olmayacaksın. Finansal özgürlüğünüzü kazanmak için öz sermayeye – bir iş parçasına – sahip olmalısınız.

➡️ Toplumun istediği ama hali hazırda nasıl elde edeceğini bilmediği şeyi topluma ölçeklenebilir şekilde vererek zengin olacaksınız.

➡️ Uzun vadeli insanlarla uzun vadeli oyunlar oynayabileceğiniz bir sektör seçin.

➡️ İnternet, olası kariyer alanını büyük ölçüde genişletti. Çoğu insan bunu henüz anlamadı.

➡️ Tekrarlanan oyunlar oynayın. Zenginlik, ilişkiler veya bilgide olsun, hayattaki tüm getiriler bileşik faizden gelir. (Bileşik faiz nedir? Faizin ana paraya eklenmesiyle artan miktarın da faize tabi olması durumu)

➡️ Yüksek zekaya, enerjiye ve hepsinden önemlisi dürüstlüğe sahip iş ortakları seçin.

➡️ Sinik ve karamsar kişilerle ortak olmayın.

➡️ Satmayı öğrenin. İnşa etmeyi öğrenin. Her ikisini de yapabilirseniz, durdurulamaz olacaksınız.

➡️ Kendinizi özgül bilgi, hesap verebilirlik ve kaldıraçla (avantaj, koz) donatın.

➡️ Özgül bilgi, eğitilemeyeceğiniz bilgidir. Eğer toplum seni eğitebilirse, bir başkasını da eğitebilir ve o kişi senin yerine geçebilir.

➡️ Özgül bilgi, şu anda sıcak olan şeyden ziyade gerçek merakınızı ve tutkunuzu takip ederek bulunur.

➡️ Özgül bilgi oluşturmak size oyun gibi gelecek, ancak başkalarına iş gibi görünecek.

➡️ Özgül bilgiler okullarda değil, çıraklık yoluyla öğretilir.

➡️ Özgül bilgi genellikle oldukça teknik veya yaratıcıdır. Dış kaynaklı veya otomatik olamaz.

➡️ Sorumluluğu benimseyin ve kendi adınıza ticari riskler alın. Toplum sizi sorumluluk, eşitlik ve kaldıraçla ödüllendirecektir.

➡️ En sorumlu kişilerin tekil, halka açık ve riskli markaları vardır: Oprah, Trump, Kanye, Elon.

➡️ Bana yeterince uzun bir kaldıraç ve duracak bir yer verin, dünyayı yerinden oynatayım.- Arşimed

➡️ Servet kaldıraç gerektirir. İş gücü, marjinal bir çoğaltma maliyeti olmaksızın sermayeden, insanlardan ve ürünlerden gelir.

➡️ Sermaye para demektir. Para toplamak için, belirli bilginizi hesap verebilir şekilde uygulayın ve sonuçta iyi bir muhakeme gösterin.

➡️ Emek, sizin için çalışan insanlar demektir. Bu, en eski ve en çok mücadele edilen kaldıraç biçimidir. Emek gücü anne babanızı etkileyecek, ancak hayatınızı bunun peşinde koşarak harcamayın.

➡️ Sermaye ve emek, izin verilen kaldıraçtır. Herkes sermayenin peşinde ama birinin onu size vermesi gerekiyor. Herkes liderlik etmeye çalışıyor ama birinin seni takip etmesi gerekiyor.

➡️ Kod ve medya izinsiz kaldıraçtır. Yeni zenginlerin arkasındaki kaldıraç onlar. Siz uyurken sizin için çalışan yazılım ve medya oluşturabilirsiniz. ➡️ Bir robotlar ordusu serbestçe kullanılabilir durumdadır. – sadece ısı ve alan verimliliği için veri merkezlerine doluşturuldu. bunu kullanın.

➡️ Kod yazamıyorsanız, kitap ve blog yazın, video veya podcast kaydedin.

➡️ Kaldıraç, kararınız için bir kuvvet çarpanıdır.

➡️ Yargılama deneyim gerektirir, ancak temel becerileri öğrenerek daha hızlı inşa edilebilir.

➡️ “İş” diye bir beceri yoktur. İş kitaplarından ve iş kurslarından kaçının.

➡️ Mikro ekonomi, oyun teorisi, psikoloji, ikna, etik, matematik ve bilgisayarları inceleyin.

➡️ Okumak dinlemekten daha hızlıdır. Yapmak, izlemekten daha hızlıdır.

➡️ Karışık olmayan bir takviminiz varken bile “bir kahve yapmak” için çok meşgul olmalısınız.

➡️ İstekli bir kişisel saatlik ücret belirleyin ve uygulayın. Bir sorunu çözmek, saatlik ücretinizden daha az tasarruf sağlayacaksa, görmezden gelin. Bir görevi dışarıdan temin etmek, saatlik ücretinizden daha az maliyetli olacaksa, onu dışarıdan temin edin.

➡️ Elinden geldiğince çok çalış. Kiminle çalıştığınız ve ne üzerinde çalıştığınız ne kadar çok çalıştığınızdan daha önemli olsa da.

➡️ Yaptığınız işte dünyanın en iyisi olun. Bu doğru olana kadar ne yaptığınızı yeniden tanımlamaya devam edin.

➡️ Hızlı zengin olma planları yoktur. Bu sadece senin üzerinden zengin olan başka biridir.

➡️ Özgül bilgiyi kaldıraçla uygulayın ve sonunda hak ettiğinizi elde edeceksiniz.

➡️ Ve son olarak, sonunda zengin olduğunuzda, ilk başta aradığınız şeyin bu olmadığını anlayacaksınız. Ama bu başka bir gün için.

Kaynak:

https://twitter.com/naval/status/1002103360646823936

https://drive.google.com/file/d/1_NnIOSfJZhhDQyg2L4K-wwjWXZQTCYUE/view

Yazılım görüşmelerinde soruya yaklaşım tekniği

Daniel Habib isimli bir programcı, yazılım görüşmelerinde konu ne olursa olsun nasıl bir yaklaşım sergilemeniz gerektiği konusunda bir spreadsheet oluşturmuş.

1. İnceleme

  • İnput’un ne olduğunu açıkça belirttim mi?
  • İstenen output’un ne olduğunu netleştirdim mi?
  • Elle çözülebilecek basit bir örnek oluşturdum mu?
  • Tüm aksiyomları yazdım mı?
  • Tüm constraints‘ler benim için ok midir?
  • Tüm akla yatkın varsayımları yazıp türettim mi?

2. Strateji

  • Brute force bir çözüm için beyin fırtınası yaptım mı?
  • Brute force çözümün çalışma zamanını analiz ettim mi?
  • Brute force çözümün space gereksinimini analiz ettim mi?
  • İnput’un memory üzerindeki kapladığı büyüklük ne kadar?
  • Daha iyi, daha karmaşık bir çözüm bulabildim mi?
  • Bu çözümün time complexity‘sini analiz ettim mi?
  • Bu çözümün space complexity‘sini analiz ettim mi?
  • Bu çözümü doğrudan ilk uyguladığım basit çözümümle karşılaştırdım mı?
  • Kodlamaya başladığımda kendime güveniyor muyum?
  • Aklıma gelen tüm yaklaşımları düşündüm mü?
  • İstediğim stratejiyi açıkça yazdım mı?
  • Açıkça base case‘leri dikkate aldım mı? Takıldığım durumlarda ne kadar iyi idare ettim?

3. Kodlama

  • Kodum ne kadar temiz yazılmıştı?
  • Off-by-one hatalarını kontrol ettim mi? Yani index’lerin 0’dan başlaması veya while içerisinde <= yerine < kullanımı gibi.
  • Kodlama sırasında hangi fonksiyonları kullanacağımı tahmin edebildim mi?
  • İnceleme kısmında yaptığım “Beyin fırtınası stratejim” sorunu çözdü mü?
  • Kodlama süreci ne kadar sorunsuzdu?
  • Yazdığım kod ile çözümümü anlatabildim mi?
  • Kodumdaki ilginç fonksiyonların avantajlarından yararlandım mı?

4. Review

  • Time complexit’yi kanıtladım mı?
  • Space complexit’yi kanıtladım mı?
  • Farklı test senaryoları yazıp bunları uyguladım mı?
  • Ne kadar önemsiz olursa olsun satır satır mı gittim?
  • Kodumu gözden geçirirken herhangi bir değişiklik yapmam gerekti mi?

Kaynak: https://docs.google.com/spreadsheets/d/1gy9cmPwNhZvola7kqnfY3DElk7PYrz2ARpaCODTp8Go/htmlview?pru=AAABfLycr3M*TqxdBeNP9JuAGHyhyIwE_A

C# 10 Yenilikleri – Struct ve Anonymous type’larda with kullanımı

C# 10 ile gelen yeniliklerden biri de struct ve anonymous type’larda gelen with kullanımı.

C# 9 ile hayatımıza with expression’ı girmişti. With ile solundaki operand’ın property ve field’ları ile, sağında verilen özellikler göz önüne alınarak yeni bir kopyasını oluşturur. C# 9 ile gelen with kullanımı sadece record tipi için geçerliydi.

Kısaca bir kullanım olarak;

var p1 = new Person("Soner", "İstanbul" );
// p1.Name: Soner
// p1.City: İstanbul

var p2 = p1 with { City = "Kırklareli" };
// p2.Name: Soner
// p2.City: Kırklareli

public record Person(string Name, string City);

C# 10 ile artık struct ve anonim tiplerde de with kullanımına destek gelmiş oldu. Struct için aynı kodu şu şekilde değiştirebiliriz;

var p1 = new Person();
p1.Name = "Soner";
p1.City = "İstanbul";
// p1.Name: Soner
// p1.City: İstanbul

var p2 = p1 with { City = "Kırklareli" };
// p2.Name: Soner
// p2.City: Kırklareli

public struct Person
{
    public string Name;
    public string City;
}

Anonim tiplerde de aynı şekilde kullanabiliriz;

var p1 = new { Name = "Soner", City = "İstanbul" };
// p1.Name: Soner
// p1.City: İstanbul
var p2 = p1 with { Name = "Ahmet" };
// p2.Name: Ahmet
// p2.City: İstanbul

Kaynak: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/with-expression

.NET 6 Yenilikleri – IANA Time zone desteği

.NET 6 ile gelen yeniliklerden biri de Windows time zone desteğine ilave olarak IANA time zone desteğinin geldi.

.NET 6 ile birlikte bütün platform’larda Windows time zone desteğine ek olarak IANA time zone desteği geldi. Bildiğiniz gibi günümüzde IANA time zone en güncel ve en popüler zaman dili bilgisine sahip yapılardan biri. Bu nedenle bu desteğin gelmesi geliştiriciler için gayet faydalı oldu.

Aşağıdaki kod parçasına bir göz atalım;

var ianaZoneId = "Europe/Istanbul";

var zoneInfo = TimeZoneInfo.FindSystemTimeZoneById(ianaZoneId);
Console.WriteLine(zoneInfo.DisplayName);
// (UTC+03:00) Istanbul

TimeZoneInfo.TryConvertIanaIdToWindowsId(ianaZoneId, out var windowsId);
Console.WriteLine(windowsId);
// Turkey Standard Time

TimeZoneInfo.TryConvertWindowsIdToIanaId(windowsId, out ianaZoneId);
Console.WriteLine(ianaZoneId);
// Europe/Istanbul

Console.WriteLine(zoneInfo.HasIanaId); // True

.NET 5 ve öncesinde yukarıdaki FindSystemTimeZoneById metodu TimeZoneNotFoundException fırlatırdı “Europe/Istanbul” için. Ama artık .NET 6 ile birlikte bu destek sağlanmış oldu.

TryConvertIanaIdToWindowsId ve TryConvertWindowsIdToIanaId statik metodları ile de windows time zone id’den iana time zone id’ye çevirme ve tam tersi işlemi yapabiliyoruz.

HasIanaId property’si ile de TimeZoneInfo instance’ının bir IANA id karşılığı olup olmadığını görebiliyoruz.

IANA time zone resmi sitesi: https://www.iana.org/time-zones

Leetcode Çözümleri | Determine Color of a Chessboard Square

Leetcode içerisinde bulunan “Determine Color of a Chessboard Square” sorusunun açıklaması ve çözümü. Bu soruda size verilen satranç tahtası üzerindeki karenin beyaz bir kare olup olmadığını bulmanız isteniyor.

➡️ Leetcode 1812. Determine Color of a Chessboard Square: https://leetcode.com/problems/determine-color-of-a-chessboard-square/

➡️ Problem açıklaması:

You are given coordinates, a string that represents the coordinates of a square of the chessboard. Below is a chessboard for your reference.

Return true if the square is white, and false if the square is black.

The coordinate will always represent a valid chessboard square. The coordinate will always have the letter first, and the number second.

Example 1:

Input: coordinates = “a1”

Output: false

Explanation: From the chessboard above, the square with coordinates “a1” is black, so return false.

Example 2:

Input: coordinates = “h3”

Output: true

Explanation: From the chessboard above, the square with coordinates “h3” is white, so return true.

Example 3:

Input: coordinates = “c7”

Output: false

Constraints:

coordinates.length == 2

‘a’ <= coordinates[0] <= ‘h’

‘1’ <= coordinates[1] <= ‘8’