alpsahin/tubitak-olimpiyat-dataset-v2 huggingface dataset:
Ortaokul Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 13

[12-13 soruları için açıklama] 
[GÖRSEL]
Yukarıdaki Can’ın odasının haritası verilmiştir. Siyah ile gösterilen kareler engelleri, beyaz ile gösterilen 
kareler boş alanları temsil etmektedir. Can boş alanları temizlemek için bir robot süpürge tasarlamış ve robot 
süpürgesinin algoritmasını aşağıdaki şekilde oluşturmuştur: 
● Robot süpürge sadece 1 birim yukarı, aşağı, sola veya sağa gidebilmekte ancak çapraz 
gidememektedir. 
● Robot her bir birim için o birimin kaç kez ziyaret edildiği bilgisini hafızasında saklar ve 
başlangıçta tüm birimlerin ziyaret değeri sıfırdır. 
● Robot süpürge öncelikle gidebileceği birimler içerisinden hiç ziyaret edilmemiş bir birime ilerler 
ve o birimin ziyaret sayısını 1 artırır ve o birimi temizler, eğer birden fazla ziyaret edilmemiş 
birim varsa: 
o  Öncelik sırası öncelikliden başlayarak: Yukarı > Sağ > Sol > Aşağı şeklindedir. 
● Eğer robotun gidebileceği tüm birimler daha önceden ziyaret edilmiş birimlerse, robot daha önce 
en az sayıda ziyaret ettiği birimi tercih eder ve o birimin ziyaret sayısını 1 artırır. Burada eşitlik 
olması durumunda: 
o Öncelik sırası öncelikliden başlayarak: Aşağı > Sol > Sağ > Yukarı şeklindedir. 
● Süpürge önce başlatıldığı birimi temizlemekte ve o birimin ziyaret sayısını bir artırmaktadır. 
● Tüm kareler en az 1 kez ziyaret edildiğinde robot süpürge temizliği bitirmektedir.

---

Can’ın algoritmasına göre süpürgeler tüm birimler ziyaret edilmemiş şekilde ve işaretli birimlerden temizliğe başlayıp ilgili birimin ziyaret edilme sayısını bir artırarak temizliğe başladığında, Can robot süpürgeyi hangi birimden başlatırsa temizlik bittiğinde birimlerin toplam ziyaret edilme sayısı en fazla olur?

Şıklar:
A) [GÖRSEL] | B) [GÖRSEL] | C) [GÖRSEL] | D) [GÖRSEL] | E) [GÖRSEL]

Cevap: E [GÖRSEL]

Çözüm:
[GÖRSEL]
Ortaokul Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 14

[14-15 soruları için açıklama] 
Bir okulda 110 öğrenci İngilizce, Fransızca ve Almanca dillerinden en az birini öğrenmektedir. Size 
aşağıdaki bilgiler veriliyor: 
● 65 öğrenci İngilizce öğreniyor. 
● 40 öğrenci Almanca öğreniyor. 
● 25 öğrenci hem İngilizce hem Fransızca öğreniyor. 
● 15 öğrenci hem İngilizce hem Almanca öğreniyor. 
● 10 öğrenci hem Fransızca hem Almanca öğreniyor. 
● 5 öğrenci üç dili birden öğreniyor. 

---

Sadece İngilizce öğrenen kaç öğrenci vardır?

Şıklar:
A) 25 | B) 30 | C) 35 | D) 40 | E) 45

Cevap: B 30

Çözüm:
5 öğrenci 3 dili birden öğrendiğine göre sadece İngilizce ve Fransızca öğrenen öğrenci sayısı 25 - 5 = 20'dir. Benzer şekilde sadece İngilizce ve Almanca öğrenen öğrenci sayısı 15 - 5 = 10'dur. Öyleyse sadece İngilizce öğrenen öğrenci sayısı 65 - 20 - 10 - 5 = 30'dur.
Ortaokul Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 15

[14-15 soruları için açıklama] 
Bir okulda 110 öğrenci İngilizce, Fransızca ve Almanca dillerinden en az birini öğrenmektedir. Size 
aşağıdaki bilgiler veriliyor: 
● 65 öğrenci İngilizce öğreniyor. 
● 40 öğrenci Almanca öğreniyor. 
● 25 öğrenci hem İngilizce hem Fransızca öğreniyor. 
● 15 öğrenci hem İngilizce hem Almanca öğreniyor. 
● 10 öğrenci hem Fransızca hem Almanca öğreniyor. 
● 5 öğrenci üç dili birden öğreniyor. 

---

Aşağıdakilerden hangisi yanlıştır?

Şıklar:
A) Almanca öğrenenlerin sayısı en az iki dil öğrenenlerin sayısını eşittir | B) Sadece Almanca öğrenenlerin sayısı sadece Fransızca öğrenenlerin sayısına eşittir | C) Fransızca öğrenenlerin çoğu başka bir dil daha öğrenmektedir | D) Almanca öğrenmeyenlerin çoğu Fransızca öğrenmektedir | E) Fransızca veya Almanca öğrenenlerin yarısı İngilizce öğrenmektedir

Cevap: E Fransızca veya Almanca öğrenenlerin yarısı İngilizce öğrenmektedir

Çözüm:
30 öğrenci sadece İngilizce, 20 öğrenci sadece Fransızca, 20 öğrenci sadece Almanca öğrenmektedir. Sadece İngilizce ve Almanca öğrenen 10, sadece İngilizce ve Fransızca öğrenen 20, sadece Almanca ve Fransızca öğrenen 5 öğrenci vardır. 5 öğrenci ise 3 dili de öğrenmektedir. Bu bilgilere göre Fransızca veya Almanca öğrenen 20 + 20 + 10 +20 + 5 + 5 = 80 öğrenci vardır. Bu öğrencilerden 65 – 30 = 35 tanesi İngilizce öğrenmektedir. Bu yüzden E şıkkında verilen ifade yanlıştır. Diğer ifadelerin tamamı doğrudur.
Ortaokul Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 16

Bir saat, her 15 dakikada bir özel bir sinyal veriyor. Sabah saat 9:00'da başlayan bir deneyde, bu saat toplam 250 sinyal veriyor. Deney sona erdiğinde saat kaç olur?

Şıklar:
A) 7:15 | B) 9:45 | C) 12:15 | D) 19:30 | E) 23:15

Cevap: E 23:15

Çözüm:
İlk ve son sinyal arasında 249 aralık vardır. Deney  \( 249 \times 15 = 3735 \)  dakika sürmüştür. Bu da 62 saat 15 dakika eder. Bu süreden 2 günü (48 saat) çıkartırsak saatimiz 14 saat 15 dakika ilerlemiştir. Deney bittiğinde saat 23:15'dir.
Ortaokul Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 17

Bir tiyatro sahnesinde 5 kadın ve 3 erkek sırayla dizilecektir. İki erkek yanyana gelmeyecek şekilde kaç farklı dizilim gerçekleştirilebilir?

Şıklar:
A) 2400 | B) 14400 | C) 19200 | D) 28800 | E) 40320

Cevap: B 14400

Çözüm:
5 kadın kendi aralarında 5! = 120 şekilde dizilir. Kadınlar dizildikten sonra başta 1 boşluk, arada 4 boşluk ve sonda 1 boşluk olmak üzere toplam 6 boşluk olur. Erkekler bu 6 boşluktan 3 tanesine yerleşecekleridir. Erkekler boşluklara 6! /3! = 120 şekilde yerleştirilebilir. Bu yüzden cevap 120×120 = 14400'tür.
Ortaokul Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 18

[18-19 soruları için açıklama]
Ayşe, Berk, Can ve Derya adlı 4 çocuk koşu yarışması yapmaya karar veriyorlar. Yarışmanın sonucuna ilişkin çocuklar aşağıdaki tahminlerde bulunuyorlar.
• Ayşe diyor ki: "Ben Can'dan önce geleceğim."
• Berk diyor ki: "Derya birinci olacak."
• Can diyor ki: "Ben üçüncü olacağım."
• Derya diyor ki: "Berk benden daha kötü bir sırada olacak."

---

Bütün çocuklar doğru tahminde bulundularsa yarışı kim son sırada tamamlamıştır?

Şıklar:
A) Ayşe | B) Berk | C) Can | D) Derya | E) Tahminler arasında çelişki vardır

Cevap: B Berk

Çözüm:
Tahminler arasında bir çelişki yoktur ve olarası tek sıralama DACB şeklindedir. Yarışı sor sırada tamamlayan Berk’tir.
Ortaokul Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 19

[18-19 soruları için açıklama]
Ayşe, Berk, Can ve Derya adlı 4 çocuk koşu yarışması yapmaya karar veriyorlar. Yarışmanın sonucuna ilişkin çocuklar aşağıdaki tahminlerde bulunuyorlar.
• Ayşe diyor ki: "Ben Can'dan önce geleceğim."
• Berk diyor ki: "Derya birinci olacak."
• Can diyor ki: "Ben üçüncü olacağım."
• Derya diyor ki: "Berk benden daha kötü bir sırada olacak."

---

Çocukların yaptığı 4 tahminden sadece 1 tanesinin yanlış olduğunu varsayalım. Yarışmanın sonucunda çocuklar kaç farklı şekilde sıralanmış olabilirler?

Şıklar:
A) 3 | B) 4 | C) 5 | D) 6 | E) 8

Cevap: A 3

Çözüm:
Ayşe'nin tahmini yanlışsa sıralama DBCA şeklinde olmak zorundadır. Berk'in tahmini yanlışsa sıralama ADCB şeklinde olmak zorundadır. Can'ın tahmini yanlışsa sıralama DBCA ve DABC şeklinde olabilir. Derya'nın tahminin yanlış olduğunu varsayalım. Berk Derya'dan daha iyi sırada olmak zorundadır. Ancak Berk'in doğru tahmininden dolayı da Derya birinci olmak zorundadır. Bu da bir çelişkidir. Bu yüzden olası 4 durum vardır.
Ortaokul Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 21

[21-30] Sorular İçin Açıklama
● Soruları C programlama dili çerçevesinde cevaplayınız.
● Derleyici olarak gcc kullanıldığını varsayınız.
● Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini
varsayınız.

---

```c
int main() {
int x = 12, y = 6;
x = (-x) / (y++) * (++y) - x % y;
printf("%d", x);
return 0;
}
```
Yukarıdaki kod paracağı çalıştırıldığında ekrana yazdığı değer ne olur?

Şıklar:
A) 0 | B) 4 | C) 5 | D) 11 | E) 15

Cevap: C 5

Çözüm:
Öncelikle x = 12 ve y = 6 olarak tanımlanmıştır. Sonraki satırda öncelikli olarak  \( (-x) / (y++) \)  işlemi gerçekleşecektir ancak bölme işleminden önce parantez içlerindeki - ve ++ işlemleri gerçekleşir.  \( (-x) \)  olduğundan x'in değeri 1 azaltılarak 11 olarak işleme alınır.  \( (y++) \)  işlemi ise y değerini 6 olarak kullandıktan sonra değeri 1 artırarak 7 yapmış olur. Bu yüzden işlem 11/6 olarak yapılır ve tam sayı bölme işlemi C programlama dilinde kalansız olarak yapıldığı için bu işlemin sonucu 1 olur.
İşlemin devamında önceki kısmın devamı olan 1 * (++y) işlemi yapılacaktır. Yine işlem önceliği parantez içerisinde olacaktır. Bir önceki işlemde y değeri 7 olmuştur ancak burada ++ işareti y'nin önünde olduğundan değerin artırılması işlemden önce yapılacaktır. Bu yüzden 1 * 8 = 8 olacaktır.
Sonrasında 8 - x % y işlemi kalmıştır. Burada % işleminin önceliği vardır. Bu aşamadaki x değeri 11 y değeri ise 8 dir o yüzden x % y işlemi sonucu 11 mod 8 = 3 olacaktır.
Son aşamada 8 - 3 = 5 olacaktır. İşlem sonucu 5 olmalıdır.
Ortaokul Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 23

[21-30] Sorular İçin Açıklama
● Soruları C programlama dili çerçevesinde cevaplayınız.
● Derleyici olarak gcc kullanıldığını varsayınız.
● Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini
varsayınız.

---

```c
int f1(int n) {
if (n == 0)
return 1;
return n * f1(n - 1);
}
int f2(int n) {
if (n <= 1)
return 1;
return f1(n / 2) - f2(n - 2) * (n / 3);
}
int main() {
int result = f2(9);
printf("%d", result);
return 0;
}
```
Yukarıdaki kod parçası hangi çıktıyı üretir?

Şıklar:
A) 12 | B) 24 | C) 56 | D) 6 | E) 18

Cevap: E 18

Çözüm:
f1 fonksiyonu faktöriyel hesabı yapmaktadır, f2(9) çağrısı yapıldığında, adımlar şu şekilde işler:
f2(9) = f1(9 / 2) - f2(9 - 2) * (9/3) = f1(4) - f2(7) * 3
f1(4) = 24
f2(9) = 24 - f2(7) * 3 (bulmamız gereken sonuç bu denklemdir.)
f2(7) = f1(7 / 2) - f2(7 - 2) * (7/3) = f1(3) - f2(5) * 2
f1(3) = 6
f2(7) = 6 - f2(5) * 2
f2(5) = f1(5 / 2) - f2(5 - 2) * (5/3) = f1(2) - f2(3) * 1
f1(2) = 2
f2(5) = 2 - f2(3) * 1
f2(3) = f1(3 / 2) - f2(3 - 2) * (3/3) = f1(1) - f2(1) * 1
f1(1) = 1
f2(3) = 1 - f2(1) * 1
f2(1) = 1, yukarıya doğru eksik fonksiyon değerleri tamamlandığında
f2(3) = 1 - f2(1) * 1 = 1 - 1 * 1 = 0
f2(5) = 2 - f2(3) * 1 = 2 - 0 * 1 = 2
f2(7) = 6 - f2(5) * 3 = 6 - 2 * 2 = 2
f2(9) = 24 - f2(7) * 3 = 24 - 2 * 3 = 18
Ortaokul Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 26

[21-30] Sorular İçin Açıklama
● Soruları C programlama dili çerçevesinde cevaplayınız.
● Derleyici olarak gcc kullanıldığını varsayınız.
● Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini
varsayınız.

---

Aşağıda verilen *metod* fonksiyonu, bir sayının son hanesinin geçerli bir kontrol basamağı olup olmadığını kontrol etmeyi amaçlamaktadır. Örneğin, 1523 sayısı geçerli kontrol basamağına sahiptir. Buna göre, verilen isle fonksiyonu için *metod* fonksiyonunun boş bırakılan kısmına ne gelmelidir?
```c
int isle(int n) {
int m = ((n % 10 + 1) * (n / 10 + 1)) % (n / 2 + 1);
return m > 9 ? isle(m) : m;
}
bool metod(int x) {
return __________________________;
}
```

Şıklar:
A) x == isle(x) | B) x == isle(x / 10) | C) (x % 10) == isle(x) | D) (x % 10) == isle(x / 10) | E) isle(x % 100) == isle(x / 10) % 10

Cevap: D (x % 10) == isle(x / 10)

Çözüm:
Kontrol basamağı, *T.C. Kimlik Numarasında* da kullanılan ve hatalı giriş ya da yanlış veri beyanını kontrol etmeyi amaçlayan yaygın bir yöntemdir. D şıkkında, isle(x / 10) ile sayının birler basamağı dışındaki kısmı özyinelemeli *isle* fonksiyonuna verilerek tek haneli bir kontrol basamağı üretilmekte ve akabinde bu kontrol basamağının, sayının son hanesine (x % 10) eşitliği kontrol edilmektedir. Eğer eşitlik sağlanıyorsa, sayının son hanesi geçerli bir kontrol basamağıdır. Dolayısıyla
Ortaokul Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 27

[21-30] Sorular İçin Açıklama
● Soruları C programlama dili çerçevesinde cevaplayınız.
● Derleyici olarak gcc kullanıldığını varsayınız.
● Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini
varsayınız.

---

Aşağıda verilen kod için metod(1234567890, 10) çağrısının sonucu şıklardan hangisi olabilir? Verilen koddası x ifadesi x değişkenin adresini gösterir. Bu adres metod fonksiyonu her çağrıldığında farklı olabilir. (long)(&x) ifadesi ise x değişkenin adresini bir tam sayıya çevirir.
```c
int metod(long x, int i)
{
long k = ((long)(&x) + i) % 10;
long s = 1;
for (int i=0; i<k && s < x / 100; i++)
s *= 10;
if (i > 0) {
long z = x / s;
long y = (z / 10 * 10) * s + (x % s) * 10 + (z % 10);
return metod(y, i - 1);
} else
return x;
}
```

Şıklar:
A) 1468037295 | B) 1246803295 | C) 5194860237 | D) 3476821490 | E) 9468037215

Cevap: A 1468037295

Çözüm:
Verilen *metod* fonksiyonu bir sayının basamaklarını karıştırma (basamakların yerinin değişmesi) işlevini görmektedir. metod fonksiyonu özyinelemeli olarak çalıştırılacağı için &x her defasında farklı bir değer üretecektir. For döngüsündeki s < x / 100 koşulu yüzünden s hiçbir zaman en soldaki basamağın yerini değiştirecek kadar büyüyemez ve dolayısıyla en soldaki basamağın yeri hiçbir zaman değişmez. Bu durumu sağlayan sadece A ve B şıklarıdır. Fakat B şıkkında 7 basamağı yok olmuş ve yerine 2 basamağı gelmiş böylece 2 basamağından iki adet oluşmuştur. Fakat verilen *metod* fonksiyonu basamakların sadece yerini değiştirdiği için böyle bir durum oluşamaz.
Ortaokul Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 29

[21-30] Sorular İçin Açıklama
● Soruları C programlama dili çerçevesinde cevaplayınız.
● Derleyici olarak gcc kullanıldığını varsayınız.
● Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini
varsayınız.

---

Aşağıda verilen fonksiyon için [A, B] aralığında minimum değeri bulan bir kod verilmiştir.
[GÖRSEL]
[A, B]=[-5, 5] aralığında \(f(x) = 1 - \min(\frac{1}{x^2+1}, \frac{x}{4})\) fonksiyonun grafiği
```c
double enKucukBul(double A, double B, int miter) {
double min_val = DBL_MAX;
double x_opt = 0.0;
double step = (B - A) / 10.0;
for (int iter = 0; iter < miter; iter++) {
for (double x = A; x <= B; x += step) {
double val = f(x);
if (val < min_val) {
min_val = val;
x_opt = x;
}
}
A = x_opt - step;
B = x_opt + step;
step /= 2.0;
}
return x_opt;
}
```
Verilen metodun A=-5 ve B=5 için çalıştırılması durumunda ifadelerden hangisi yanlıştır?

Şıklar:
A) Verilen kod herhangi bir fonksiyon için [A, B] aralığındaki en küçük değeri miter arttırıldıkça daha da azalan bir hata payı ile bulur | B) miter değeri arttırıldıkça \(f(x)\)'in en küçük değerine daha çok yaklaşılır | C) miter=1 için \(f(x)\) fonksiyonu -5 ile 5 arasında 11 değer için hesaplanır | D) miter=1 için enKucukBul metodu x_opt olarak 1 değerini döndürür | E) miter=2 için enKucukBul metodu x_opt olarak 1.5 değerini döndürür

Cevap: A Verilen kod herhangi bir fonksiyon için [A, B] aralığındaki en küçük değeri miter arttırıldıkça daha da azalan bir hata payı ile bulur

Çözüm:
Kod, fonksiyonun [A, B] aralığındaki tüm en küçük değerleri garantili olarak bulmaz. Adım boyunun (step) 
yetersizliği ve örnekleme yoğunluğunun azlığı nedeniyle, ani değişimlerin olduğu bölgelerde en küçük 
değerler kaçırılabilir. Doğru cevap A şıkkıdır.
Ortaokul Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 30

[21-30] Sorular İçin Açıklama
● Soruları C programlama dili çerçevesinde cevaplayınız.
● Derleyici olarak gcc kullanıldığını varsayınız.
● Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini
varsayınız.

---

qsort metodu, dizileri sıralamak amacıyla kullanılan ve C programlama dilinin standart kütüphanesinde yer alan bir fonksiyondur. qsort(points, n, sizeof(Point), cmetod); çağrısı için points dizisi n adet Point tipinde nokta tutmaktadır. qsort metoduna yapılan bu çağrı için aşağıdaki ifadelerden hangisi doğrudur?
```c
typedef struct {
double x;
double y;
} Point;
int signum(double x) {
return (x > 0) - (x < 0);
}
int cmetod(const void* a, const void* b) {
Point* p1 = (Point*)a;
Point* p2 = (Point*)b;
if (fabs(p1->y - p2->y) < 1e-8)
return signum(p1->x - p2->x);
else
return p1->y < p2->y ? -1 : 1;
}
```

Şıklar:
A) Noktalar önce x değerine göre artan sırayla, eşit x'lerde y değerine göre artan sırayla sıralanır. | B) Noktalar sadece x değerine göre azalan sırayla sıralanır. | C) Noktalar önce y değerine göre artan, eşit y'lerde x değerine göre artan sırayla sıralanır. | D) cmetod fonksiyonu sadece x değerini dikkate aldığı için y sıralaması yapılmaz. | E) signum fonksiyonu, qsort içinde doğrudan karşılaştırma yapmak için kullanılır ve x değerlerinin sıralamasında etkilidir.

Cevap: C Noktalar önce y değerine göre artan, eşit y'lerde x değerine göre artan sırayla sıralanır.

Çözüm:
fabs(p1->y - p2->y) < 1e-8 ifadesi, iki noktanın y koordinatlarının eşit olup olmadığını kontrol eder (tamsayı olmadığı için == operatorü kullanılması tercih edilmez). Eğer y değerleri eşitse, sıralama x değerlerine göre yapılır. Bu durumda, signum fonksiyonu kullanılarak, ilk noktanın x değeri ikinci noktadan küçükse -1, eşitse 0, büyükse 1 döndürülür. Eğer y değerleri eşit değilse, sıralama y değerlerine göre yapılır. Bu durumda, ilk noktanın y değeri daha küçükse -1, değilse (yani daha büyükse) 1 döndürülür. y değerleri eşit olmadığı sürece 0 döndürülmesine gerek yoktur. Bu nedenle, sıralama işlemi önce y değerine göre artan şekilde, y değerleri eşit olan durumlarda ise x değerine göre artan şekilde gerçekleştirilir.