Programlama soru çözümü

Sanch

Hectopat
Katılım
3 Temmuz 2019
Mesajlar
1.539
Çözümler
16
Daha fazla  
Cinsiyet
Erkek
Selam dostlar, kendimi geliştirmek için programlama soruları çözüyordum da bir soruda takıldım ve sizinle paylaşmak istedim. Bir iş için başvuru sorularıymış bu bulduklarım, yazılan kodların kullanılmaması ve başvuru suistimali olmaması için link vermeyeceğim. İki soruyu da atıyorum, ilkini çözdüm ama ikinciyi yapamadım. Yapamadım derken şöyle: Soruyu anlayamadım, anlasam belki bir ihtimal yapardım.

Çözdüğünüz dil fark etmez, benim amacım mantığı kavramak. İsterseniz hiç kod yazmayıp mantığını da direk yazabilirsiniz.

1. Atlı karınca

Bir lunaparkta atlı karınca var. Atlı karıncaya her seferinde k kişi binebiliyor. Atlı karınca bir gün içerisinde r defa çalışıyor.

Atlı karıncaya binmek isteyen n adet grup var. Her grupta 1 veya daha fazla kişi bulunabiliyor.

Her turda, sıradaki ilk gruptan başlayarak atlı karıncaya biniliyor. Eğer bir grubun tamamı için yer kalmadıysa daha fazla kişi binmeden tur başlıyor. Dolayısıyla atlı karınca tam dolmadan da çalışabiliyor. Tur bittikten sonra atlı karıncaya binen gruplar, bindikleri sırada, kuyruğun en arkasına yeniden katılıyor.

Atlı karıncaya her binen kişi 1 TL’ye bilet alıyor.

Örneğin, r=4, k=6 varsayalım. Atlı karıncaya binecek dört grup var ve bunların kişi sayıları 1, 4, 2, 1. ilk turda ilk iki grup sığabilir [1,4]. İlk tur bitince bu iki grup sıranın en sonuna geçecek ve sıra 2, 1, 1, 4 haline gelecek. İkinci turda [2, 1, 1] şeklinde 4 kişi sığabilecek. Şimdi sıra 4, 2, 1, 1 haline geldi. Üçüncü turda atlı karıncaya 6 kişi binecek [4, 2]. Sıra 1, 1, 4, 2 oldu. Dördüncü ve son turda altı kişi binecek, [1, 1, 4]. Atlı karınca toplamda 21 lira kazanmış oldu.

Input
İlk satırda boşlukla ayrılmış 3 adet rakam yer alacak: r, k ve n. İkinci satırda boşlukla ayrılmış şekilde n adet rakam yer alacak. Bu rakamlar gruplardaki kişi sayısını belirtecek. Örnek ınput.

4 6 4.
1 4 2 1.

Output
Program toplam kazanılan parayı yazacak

Optimizasyon ipuçları


1 – Sıranın o anki durumu için önceden hesaplama yapıldıysa yeniden hesaplama yerine önceden hesaplamanın sonucu kullanılabilir.

2 – En fazla n + 1 tur sonra sıranın durumu önceki durumlardan biri haline gelecek ve bir döngü oluşacaktır.

Python:
degerler=input().split(" ")
R=int(degerler[0])
k=int(degerler[1])
sayilar=input().split(" ")
for i in range(len(sayilar)):
sayilar[I]=int(sayilar[I])
para=0.
total=0.
l=0.
while R>0:
while total<k:
if not(total+sayilar[l]>k):
total+=sayilar[l]
l+=1.
else:
break.
for i in range(0,l):
asd=sayilar.pop(0)
para+=asd.
sayilar.append(asd)
l=0.
total=0.
R-=1.
print(para)

2. Maaş hesaplaması

Bir çalışanın maaşı içerisinde devlete verilen vergiler ve çeşitli kesintiler bulunmaktadır. Tüm kesinti ve vergilerin de içerisinde bulunduğu tutara brüt maaş, çalışanın eline geçen paraya ise net maaş denmektedir.

Brüt maaş = net maaş + kesintiler + vergiler.

Devlet brüt maaşı belli olan bir personel için net maaş hesaplamasının ne şekilde olacağını belirtmiştir. Çok basit bir örnek olarak,

Kesintiler = brüt maaş * 0.1.

Vergiler = brüt maaş * 0.2.

Şeklinde bir formül ile brüt maaşı belli bir personelin net maaşının ne kadar olduğu hesaplanabilmektedir.

Kesinti ve vergilerin hesaplaması gerçekte karmaşık formüllere ve değişkenlere bağlı olduğu için, net maaşı belli personelin brüt maaşının hesaplanması formüle edilememektedir. Dolayısıyla net maaşı belli personelin brüt maaşını bulabilmek için brütten net maaş hesaplayan formül kullanılmalıdır. Dolayısıyla, “X liralık net maaş için ne kadarlık brüt maaş gerekir?” Sorusunun cevabı için önce tahmini bir brüt tutar kullanılıp bunun neti hesaplanmalı, aradaki farka göre tahminler devam etmelidir.

Elinizde.

Double netmaaşhesapla(double brütmaaş)

Şeklinde, brüt maaş alıp net maaş dönen bir metodunuz olduğunu varsayın.

Bu metodu kullanan ve recursive (özyineli) olan, net maaşı alıp bundan brüt maaşı hesaplayan bir metot yazın.

Not: Ortalama olarak X tutarındaki bir net maaşın 1.5X civarında brüt tutarı olduğunu varsayıp tahminlerinizi ona göre yaptırabilirsiniz.

Ben soru ikiyi anlayamadım, yardımcı olursanız sevinirim. İlk soruyu da cevaplayabilirsiniz isterseniz, farklı çözümler görmem işime yarar.

Umarım bu konu cevap almadan Technopat Sosyal aleminde yok olmaz.
 

Hocam, yaşınız kaçtı? Ben programlamaya yeni başladım. Hocalarım bana üniversitede öğrenirsin, derslerine asıl diyorlar da ben ikisini de bir arada götürmeye çalışıyorum. Dedikleri gibi üniversitede öğretiyorlar mı? Temel bilgileri falan.
Bu sene üniversite sınavına gireceğim.
 
Hocam yaşınız kaçtı, ben programlamaya yeni başladım hocalarım bana üniversitede öğrenirsin derslerine asıl diyorlarda ben ikisini de bir arada götürmeye çalışıyorum. Dedikleri gibi üniversitede öğretiyorlar mı? Temel bilgileri falan.

Bu sene üniversite sınavına gireceğim.
15 yaşındayım, henüz ben de acemiyim.
Hocalarınız bence çok haklı, ben de bu senelerde yazılımı vesaire salıp derslerime bakmayı planlıyorum veya gelecek sene. Güzel bir üniversite kazandıktan sonra gerisinin geleceği bir gerçek. Ama hobi olarak yapabilirsiniz bence. Boş zamanlarınızda yazılım çalışmak bence gayet güzel bir aktivite olur.

@umutsahinus
 
Kanka diyor ki yarı brute force kullanarak tersini hesaplayan bir fonksiyon yaz.
Bu şu demek, yaklaşık olarak 4,5k brüt maaşı olan bir adamın eline net olarak 3k maaş geçiyormuş ancak tam değil bu oran. Sana bu 3k yı verecek, senden 4.5 k ya yakın olan tam değeri isteyecekmiş. Yapman gereken şey ise binary search'ı araştırmak. Yani adamın sana verdiği methoda 1 vereceksin, sana bir şey döndürecek, 2 vereceksin sana bir şey döndürecek. Bunları yorumlayarak sana 3k vereceği sayıyı bulmanı istiyor.

Yazacağın method 3 değişken alacak. Biri "aradığın değer", diğeri "son denediğin değer" sonuncusu ise "sondan bir önceki denediğin değer". Daha sonra recursive olarak döneceksin bu fonksiyonu.

Eğer son denediğin değer %0.05 gibi bir hata payı ile doğru net maaşı döndürüyorsa, son denediğin değeri return edeceksin. Buraya giremediyse şuna bakacaksın.
Sana verilen fonksiyonun döndürdüğü net maaş, son denediğin ve sondan önceki denediğin brut maaşın arasında mı? Eğer arasındaysa ikisinin ortalamasını alıp bu ortalamayı son değerin ve aradığın değerle birlikte kendi fonksiyonuna yeniden vereceksin.
Eğer sana verilen fonksiyonun döndürdüğü net maaş son denediğin ve sondan önceki denediğin brut maaşın üstündeyse, kendi fonksiyonuna son denediğin değer + 10 ve son denediğin değer ve aradığın değeri vereceksin.
Eğer sana verilen fonksiyonun döndürdüğü net maaş son denediğin ve sondan önceki denediğin brut maaşın altındaysa, kendi fonksiyonuna son denediğin değer - 10 ve son denediğin değer ve aradığın değeri vereceksin.

İlk okuduğunda karışık gelebilir ama bu sıralı listeleri hızlıca aramamızı sağlayan binary search adını verdiğimiz bir yöntem. Önce binary searchı araştır, sonra bu soruyu kolayca çözersin.
 
Kanka diyor ki yarı brute force kullanarak tersini hesaplayan bir fonksiyon yaz.
Bu şu demek, ortalama olarak 4,5k brüt maaşı olan bir adamın eline net olarak 3k maaş geçiyormuş ancak tam 3k değil. Sana bu 3k ya yakın değeri verecekmiş, senden 4.5 k lık değeri isteyecekmiş. Yapman gereken şey ise binary search'ı araştırmak.

Yazacağın method 3 değişken alacak. Biri aradığın değer, diğeri son denediğin değer, sondan bir önceki denediğin değer. Daha sonra recursive olarak döneceksin bu fonksiyonu.

Eğer son denediğin değer %0.05 gibi bir hata payı ile doğru net maaşı döndürüyorsa, son denediğin değeri return edeceksin. Buraya giremediyse şuna bakacaksın.
Sana verilen fonksiyonun döndürdüğü net maaş, son denediğin ve sondan önceki denediğin brut maaşın arasında mı? Eğer arasındaysa ikisinin ortalamasını alıp bu ortalamayı son değerin ve aradığın değerle birlikte kendi fonksiyonuna yeniden vereceksin.
Eğer sana verilen fonksiyonun döndürdüğü net maaş son denediğin ve sondan önceki denediğin brut maaşın üstündeyse, kendi fonksiyonuna son denediğin değer + 10 ve son denediğin değer ve aradığın değeri vereceksin.
Eğer sana verilen fonksiyonun döndürdüğü net maaş son denediğin ve sondan önceki denediğin brut maaşın altındaysa, kendi fonksiyonuna son denediğin değer - 10 ve son denediğin değer ve aradığın değeri vereceksin.

İlk okuduğunda karışık gelebilir ama bu sıralı listeleri hızlıca aramamızı sağlayan binary search adını verdiğimiz bir yöntem. Önce binary searchı araştır, sonra bu soruyu kolayca çözersin.
Okuyunca karmaşık, biraz anlamaya çalışmalıyım :D. Elinize sağlık.
 
Genel mantığı kavradım, sağ olun.
Ha bir de şunu eklemek istiyorum,
"methoda 1 vereceksin, sana bir şey döndürecek, 2 vereceksin sana bir şey döndürecek. Bunları yorumlayarak sana 3k vereceği sayıyı bulmanı istiyor."
Derken arasındaki oranı almaktan bahsetmiyorum, deneye deneye gitmen gerektiğini söylüyorum. Çünkü eğer adamın sana verdiği method bol if else'li farklı aralıklarda farklı matematiksel hesaplara sahip bir fonksiyon ise oran kurmaya çalıştığında yanılırsın. Daha açık konuşmak gerekirse,

3k'nın karşılığını mı arıyorsun?
4500'den başlayacaksın. Fazla mı geldi? 4400'e ineceksin, hala mı fazla? 4300'e ineceksin. Bu sefer az mı geldi? 4350'ye çıkacaksın, Hâlâ mı az? 4375'e çıkacaksın. Hâlâ mı az? 4388'e çıkacaksın. Vs vs, bu şekilde deneyerek bulacaksın.

Bu arada bunu yazınca hatırladım ki binary search'de son denediğin ve sondan önceki denediğini değil, alt sınır ve üst sınırı tutuyorsun :D Ama mantık kafanda oluşmuştur artık sanırım 3 mesajda. Özür dilerim iyi bir öğretmen değilim açıklığa kavuşturmam birkaç mesaj sürdü :D
 

Geri
Yukarı