All posts by Soner Gönül

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’

Bloomberg Mülakat Sorusu – Matrix Diagonal Sum

Leetcode içerisinde bulunan “Matrix Diagonal Sum” sorusunun açıklaması ve çözümü. Bu soruda sizi jagged array olarak verilen bir matris içerisindeki iki diagonalde bulunan elemanların toplamını bulmanız isteniyor.

► Leetcode 1572. Matrix Diagonal Sum: https://leetcode.com/problems/matrix-diagonal-sum/

► Problem açıklaması:

Given a square matrix mat, return the sum of the matrix diagonals. Only include the sum of all the elements on the primary diagonal and all the elements on the secondary diagonal that are not part of the primary diagonal.

Example 1:

Input:

mat = [[1,2,3], [4,5,6], [7,8,9]]

Output: 25

Explanation: Diagonals sum: 1 + 5 + 9 + 3 + 7 = 25 Notice that element mat[1][1] = 5 is counted only once.

Example 2:

Input:

mat = [[1,1,1,1], [1,1,1,1], [1,1,1,1], [1,1,1,1]]

Output: 8

Example 3:

Input:

mat = [[5]]

Output: 5

Constraints: n == mat.length == mat[i].length

1 <= n <= 100

1 <= mat[i][j] <= 100

Leetcode kolay seviyede Linked List soruları – 1. Kısım

Leetcode içerisindeki Linked List veri yapısı ile ilgili kolay soruları çözüyoruz.

Çözdüğümüz soruların linkleri:

1290. Convert Binary Number in a Linked List to Integer: https://leetcode.com/problems/convert-binary-number-in-a-linked-list-to-integer/

876. Middle of the Linked List: https://leetcode.com/problems/middle-of-the-linked-list/

206. Reverse Linked List: https://leetcode.com/problems/reverse-linked-list/

21. Merge Two Sorted Lists: https://leetcode.com/problems/merge-two-sorted-lists/

Kaç yaşındasın sen?

Bir gün karşınıza Ozan Güven çıkıp ta “Kaç yaşındasın sen?” derse ne yapardınız? Basit bir soru değil mi bu? Ancak, sorunun ayrıntı düzeyine ve bakış açınıza bağlı olarak cevap değişebilir.

Peki soruyu şöyle değiştirelim o zaman; “Kaç dakikadır yaşıyorsun?”. Bu soruyu yanıtlamak için, kolayca elde edilebilecek olandan çok daha fazla bilgiye ihtiyacımız var:

  • Doğum tarihiniz ve tam saati
  • Doğumunuzun zaman dilimi (veya konumu)
  • Bir yaz saati uygulamasına geri dönüş geçişi sırasında doğduysanız, (bazı saat dilimlerinde) saatler geriye doğru hareket ettiğinde – örneğin, 2:59:59 AM’den 2:00:00 AM’ye kadar. 2:30’da doğduysanız, o gece 2:30 saati aslında iki defa yaşandığı için hangisinde doğduğunuzu bilmeniz gerekir.
  • UTC olarak ifade edilen geçerli evrensel saat.

Çoğu insan tüm bu bilgilere düzenli olarak sahip değildir ve genellikle umursamıyoruz da bu tarz bilgileri. Neden umursayalım ki? Birisi ne kadar süredir hayatta, ölü, evli, çalışıyor veya benzeri bir soru sorduğunda, genellikle “30 yıl” veya “6 ay” veya bazen “2 yıl, 4 ay ve” gibi takvimsel bir cevap veriyor oluruz.

Bu, bir takvimin kullanılması anlamına gelir ve genellikle modern zamanlardaki Gregoryen (yani Miladi) takvimini önemsiyoruz.

Burada temel şudur; takvimsel bir ölçü birimi, zaman geçişinin insanlaştırılmış bir ifadesidir. Bu, bilgisayarın tipik olarak ölçtüğü ve programcılar için genellikle kafa karışıklığı yaratan geçen süreden oldukça farklı bir kavram.

Üstelik buna “Doğu Asya yaş hesaplaması” gibi kavramları eklemiyorum bile. Binlerce yıldır Kore, Japonya, Vietnam, Çin gibi ülkelerde insanlar 1 yaşında doğuyorlar. Ve yaşları doğum günlerinde değil de, yılbaşında artıyor. Yani bir bebek 31 Aralık’ta doğduğunda, ertesi gün aslında iki yaşına giriyor. Sizinkinin ne olduğunu öğrenmek istiyorsanız, şu basit denklemi takip edin: İçinde bulunduğunuz yılı alın, doğum yılınızı çıkarın ve bir ekleyin.

Üstelik Kore gibi ülkelerde, “yaş” kavramı çok önemlidir. Sizden yaşlı insanlara karşı saygılı olma Kore kültürünün önemli bir parçası. Bir kişi sizden 1 yaş büyük bile olsa, o kişi ile birlikte bir şeyler yemenizi, içmenizi ve hatta konuşmanızı değiştirebilir. Çin ve Vietnam’da bu hesaplama genellikle yaşlı insanlar tarafından kullanılırken, Kore’de bu herkes tarafından kullanılıyor.

Yüzlerce yıldır Koreliler yaşı hesaplamak için dünyanın çoğundan farklı bir yöntem kullandılar. Bazen ay yaşı, nominal yaş veya Doğu Asya yaşı hesaplaması olarak anılır, ancak Kore’de buna sadece Kore yaşı denir. Yöntemin kökenleri Asya’nın farklı bölgelerine yayılmadan önce Çin’dedir, ancak bugün Güney Kore herkesin hala kullandığı tek ülkedir.

Ozan güven “Kaç yaşındasın sen?” diye sorduğunda karşısındaki kişi “19” demişti. Buna karşılık olarak ta Ozan güven “16 yaşında bi tane adamsın.” diyerek karşılık vermişti. Yaş kavramının bu kadar karışık olduğu bir dünyada, belki de ozan güven haklıdır, kim bilir..