2010 yılının Haziran ayından beri TÜBİTAK her ay başında 3 adet ödüllü kriptoloji sorusu yayınlıyor. Bu soruların cevaplarını ve ödül kazananları da diğer ayın başında yayınlıyor. Tek sayfalık bir site içerisinde bütün açıklamalar, içinde bulunduğumuz ayın soruları ve geçmiş ayların soru-cevapları mevcut.
Ödül: 3 adet TÜBİTAK Popüler Bilim Kitabı
Site bağlantısı: https://bilgem.tubitak.gov.tr/tr/content/odullu-kriptoloji-yarismasi
Şifreleme sanatının yani kriptolojinin mantığını anlamak için mükemmel bir çalışma. Eğer soruların sıkı takipçisi olursanız bakış açınızı değiştirecek bir algı yapısı oluşturabilirsiniz.
İlk defa başlayanlar için önerim, geçmiş ayların soruları cevapları ile birlikte yayınlandığı için tüm geçmiş soruları inceleyin. Kriptoloji soruları nasıl çözülür, neler baz alınır, nelere dikkat edilir hepsini öğrenmiş olursunuz.
Soru tiplerinin çoğunluğunu oluşturan harf-rakam ilişkisidir. Kelimelerin harflerinin rakamsal karşılıkları ile rastgele oluşturulan algoritmalar bulunmaya çalışılır ve istenen kelime için uygulandığında cevaba ulaşılır.
Harf Rakam ilişkisi
Türkçe alfabenin sıralanışına göre ilk harf olan A’nın rakamsal değeri 0 olarak alınır ve B=1, C=2, Ç=3 şeklinde devam eder. Bu şekilde kelimelerden oluşan sistemler aslında onların sayı karşılıklarına uygulanan bir algoritmadır.
Bu çalışmayı kolaylaştıracak bir program yazdım. Programın amacı sorularda verilen kelimelerin rakamsal değerlerini hızlıca çıkarmak ve toplamlarını, 1. ve 2., 2. ve 3., 1. ve sonuncu vb. harf değerlerinin toplamını otomatik olarak hesaplamasıdır. Aynı zamanda bazı sorularda kullanılan mod29 değerine göre de toplama işlemlerini yapabilir. Bana bir çok soruda rahatlık sağladı.
Örnek olarak 2019 Aralık ayının 3. sorusuna bakacak olursak:
göcen -> 9
gölbez -> 20
enik -> 30
taylak -> -19
buzağı -> 16
sıpa -> -13
civciv -> 3? soru işareti değeri kaçtır?
Rakam değerlerinden çıkarılması gereken algoritma şu şekilde; kelimelerin son üç harf değerinin toplamı ilk harf değerinin iki katından çıkarılmıştır.
Kodlar
Programı kendinize göre özelleştirebilmeniz için kodları github üzerinden paylaşıyorum. İlgi duyanlar daha fazla soru tipine hitap edebilmesi için düzenleyebilir.
https://github.com/fatihyldrim/tubitak-kriptoloji
Windows form kodları:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
using System; using System.Windows.Forms; namespace Harf_Rakam { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { txt_Kelime1.Enabled = true; txt_Kelime2.Enabled = false; txt_Kelime3.Enabled = false; txt_Kelime4.Enabled = false; txt_Kelime5.Enabled = false; txt_Kelime6.Enabled = false; } private char[] harfler = new char[] { 'a', 'b', 'c', 'ç', 'd', 'e', 'f', 'g', 'ğ', 'h', 'ı', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'ö', 'p', 'r', 's', 'ş', 't', 'u', 'ü', 'v', 'y', 'z' }; private void btn_Uret_Click(object sender, EventArgs e) { lbl_RakamDegerleri1.Text = rakambul(txt_Kelime1.Text); lbl_RakamDegerleri2.Text = rakambul(txt_Kelime2.Text); lbl_RakamDegerleri3.Text = rakambul(txt_Kelime3.Text); lbl_RakamDegerleri4.Text = rakambul(txt_Kelime4.Text); lbl_RakamDegerleri5.Text = rakambul(txt_Kelime5.Text); lbl_RakamDegerleri6.Text = rakambul(txt_Kelime6.Text); if (CalissinMi(chcD1, chcY1)) lbl_toplam1.Text = toplam(lbl_RakamDegerleri1.Text); if (CalissinMi(chcD2, chcY1)) lbl_toplam2.Text = toplam(lbl_RakamDegerleri2.Text); if (CalissinMi(chcD3, chcY1)) lbl_toplam3.Text = toplam(lbl_RakamDegerleri3.Text); if (CalissinMi(chcD4, chcY1)) lbl_toplam4.Text = toplam(lbl_RakamDegerleri4.Text); if (CalissinMi(chcD5, chcY1)) lbl_toplam5.Text = toplam(lbl_RakamDegerleri5.Text); if (CalissinMi(chcD6, chcY1)) lbl_toplam6.Text = toplam(lbl_RakamDegerleri6.Text); int[] adet = new int[] { 0, 1 }; if (CalissinMi(chcD1, chcY2)) lbl_12top1.Text = toplam(lbl_RakamDegerleri1.Text, adet); if (CalissinMi(chcD2, chcY2)) lbl_12top2.Text = toplam(lbl_RakamDegerleri2.Text, adet); if (CalissinMi(chcD3, chcY2)) lbl_12top3.Text = toplam(lbl_RakamDegerleri3.Text, adet); if (CalissinMi(chcD4, chcY2)) lbl_12top4.Text = toplam(lbl_RakamDegerleri4.Text, adet); if (CalissinMi(chcD5, chcY2)) lbl_12top5.Text = toplam(lbl_RakamDegerleri5.Text, adet); if (CalissinMi(chcD6, chcY2)) lbl_12top6.Text = toplam(lbl_RakamDegerleri6.Text, adet); adet = new int[] { 1, 2 }; if (CalissinMi(chcD1, chcY3)) lbl_23top1.Text = toplam(lbl_RakamDegerleri1.Text, adet); if (CalissinMi(chcD2, chcY3)) lbl_23top2.Text = toplam(lbl_RakamDegerleri2.Text, adet); if (CalissinMi(chcD3, chcY3)) lbl_23top3.Text = toplam(lbl_RakamDegerleri3.Text, adet); if (CalissinMi(chcD4, chcY3)) lbl_23top4.Text = toplam(lbl_RakamDegerleri4.Text, adet); if (CalissinMi(chcD5, chcY3)) lbl_23top5.Text = toplam(lbl_RakamDegerleri5.Text, adet); if (CalissinMi(chcD6, chcY3)) lbl_23top6.Text = toplam(lbl_RakamDegerleri6.Text, adet); adet = new int[] { 0, 1, 2 }; if (CalissinMi(chcD1, chcY4)) lbl_123top1.Text = toplam(lbl_RakamDegerleri1.Text, adet); if (CalissinMi(chcD2, chcY4)) lbl_123top2.Text = toplam(lbl_RakamDegerleri2.Text, adet); if (CalissinMi(chcD3, chcY4)) lbl_123top3.Text = toplam(lbl_RakamDegerleri3.Text, adet); if (CalissinMi(chcD4, chcY4)) lbl_123top4.Text = toplam(lbl_RakamDegerleri4.Text, adet); if (CalissinMi(chcD5, chcY4)) lbl_123top5.Text = toplam(lbl_RakamDegerleri5.Text, adet); if (CalissinMi(chcD6, chcY4)) lbl_123top6.Text = toplam(lbl_RakamDegerleri6.Text, adet); if (CalissinMi(chcD1, chcY5)) lbl_1Stop1.Text = toplam(lbl_RakamDegerleri1.Text, new int[] { 0, -1 }); if (CalissinMi(chcD2, chcY5)) lbl_1Stop2.Text = toplam(lbl_RakamDegerleri2.Text, new int[] { 0, -1 }); if (CalissinMi(chcD3, chcY5)) lbl_1Stop3.Text = toplam(lbl_RakamDegerleri3.Text, new int[] { 0, -1 }); if (CalissinMi(chcD4, chcY5)) lbl_1Stop4.Text = toplam(lbl_RakamDegerleri4.Text, new int[] { 0, -1 }); if (CalissinMi(chcD5, chcY5)) lbl_1Stop5.Text = toplam(lbl_RakamDegerleri5.Text, new int[] { 0, -1 }); if (CalissinMi(chcD6, chcY5)) lbl_1Stop6.Text = toplam(lbl_RakamDegerleri6.Text, new int[] { 0, -1 }); if (CalissinMi(chcD1, chcY6)) lbl_2S2top1.Text = toplam(lbl_RakamDegerleri1.Text, new int[] { 1, -2 }); if (CalissinMi(chcD2, chcY6)) lbl_2S2top2.Text = toplam(lbl_RakamDegerleri2.Text, new int[] { 1, -2 }); if (CalissinMi(chcD3, chcY6)) lbl_2S2top3.Text = toplam(lbl_RakamDegerleri3.Text, new int[] { 1, -2 }); if (CalissinMi(chcD4, chcY6)) lbl_2S2top4.Text = toplam(lbl_RakamDegerleri4.Text, new int[] { 1, -2 }); if (CalissinMi(chcD5, chcY6)) lbl_2S2top5.Text = toplam(lbl_RakamDegerleri5.Text, new int[] { 1, -2 }); if (CalissinMi(chcD6, chcY6)) lbl_2S2top6.Text = toplam(lbl_RakamDegerleri6.Text, new int[] { 1, -2 }); } private bool CalissinMi(CheckBox chcD, CheckBox chcY) { bool sonuc = false; if (chcD.Checked && chcY.Checked) sonuc = true; else sonuc = false; return sonuc; } private string toplam(string yazi) { string[] degerler = yazi.Split(new[] { " , " }, StringSplitOptions.None); int toplam = 0; for (int i = 0; i < degerler.Length - 1; i++) { toplam += Convert.ToInt32(degerler[i]); } if (chcMod29.Checked) { toplam = toplam % 29; } return toplam.ToString(); } private string toplam(string yazi, int[] Harfler) { string[] degerler = yazi.Split(new[] { " , " }, StringSplitOptions.None); int toplam = 0; if (Harfler[1] == -1) Harfler[1] = degerler.Length - 2; if (Harfler[1] == -2) Harfler[1] = degerler.Length - 3; for (int i = 0; i < Harfler.Length; i++) { toplam += Convert.ToInt32(degerler[Harfler[i]]); } if (chcMod29.Checked) { toplam = toplam % 29; } return toplam.ToString(); } private string rakambul(string yazi) { string deger = ""; for (int i = 0; i < yazi.Length; i++) { char a = yazi[i]; for (int k = 0; k < 29; k++) { if (harfler[k] == a) { deger += k.ToString() + " , "; } } } return deger; } private void chcD1_CheckedChanged(object sender, EventArgs e) { if (chcD1.Checked) txt_Kelime1.Enabled = true; else txt_Kelime1.Enabled = false; } private void chcD2_CheckedChanged(object sender, EventArgs e) { if (chcD2.Checked) txt_Kelime2.Enabled = true; else txt_Kelime2.Enabled = false; } private void chcD3_CheckedChanged(object sender, EventArgs e) { if (chcD3.Checked) txt_Kelime3.Enabled = true; else txt_Kelime3.Enabled = false; } private void chcD4_CheckedChanged(object sender, EventArgs e) { if (chcD4.Checked) txt_Kelime4.Enabled = true; else txt_Kelime4.Enabled = false; } private void chcD5_CheckedChanged(object sender, EventArgs e) { if (chcD5.Checked) txt_Kelime5.Enabled = true; else txt_Kelime5.Enabled = false; } private void chcD6_CheckedChanged(object sender, EventArgs e) { if (chcD6.Checked) txt_Kelime6.Enabled = true; else txt_Kelime6.Enabled = false; } } } |