Algoritma Problemi

Python’da aşağıdaki matematik problemini çözen kod yazabilir misiniz. ? Kodları yazarken algoritma mantığına # karakteri ile ayırarak açıklar mısınız.?

1-) 4 adet ‘7’ ve 1 adet ‘1’ rakamları kullanılarak ‘100’ sayısını bulabilir misiniz.

2-) Sonucu bulabilmek için 4 adet işlem yapılmak zorunda ve işlemler + , - , * , / , işemleri olmak zorunda. Tekrar sınırı yok. Yani 3 adet ‘*’ ve 1 adet ‘+’ işlemi yapabilinir, veya 2 adet ‘/’ 2 adet ‘-’ işlemide yapılabilir.

3-) İşlem sıralaması için parantezi nereye koyulacağı kritik önem taşıyor.

2 . sorunuz için infix to postfix dönüşümüne bakabilirsiniz.

A+B*C -> ABC*+

sorunun doğru olduğundan emin misiniz? çünkü yazdığım koda göre 4 tane 7 ve 1 tane 1 ile 100 sayısına ulaşılamıyor.

Evet sorunun doğruluğundan eminim cevap aşağıdaki gibi olması gerekiyor. parantez yapısı çok önemli.
Birde çapma, toplama,bölme, çıkarma işlemlerini herhangibi birisini istediğin tekrarda kullanabilirsin ama toplamda 4 adet işlem yapılmak zorunda.

yazdığın kodu paylaşabilir misin.

Cevap şöyle : (1/7 + 7) * (7+7)

import random
ops = ['+', '-', '*', '/']
dizi=[] 
maths=1
while maths!=100:
   sayi=["7","7","7","7","1"]
   operation1 = random.choice(ops)
   operation2 = random.choice(ops)
   operation3 = random.choice(ops)
   operation4 = random.choice(ops)
   operation5 = random.choice(ops)

   sayi1=random.choice(sayi) 
   sayi.remove(sayi1)
   sayi2=random.choice(sayi)
   sayi.remove(sayi2)
   sayi3=random.choice(sayi)
   sayi.remove(sayi3)
   sayi4=random.choice(sayi)
   sayi.remove(sayi4)
   sayi5=random.choice(sayi)

   islem=str(sayi1) + str(operation1) + str(sayi2)+ str(operation2) + str(sayi3)+ str(operation3) + str(sayi4)+ str(operation4) + str(sayi5))
   maths = eval(islem)
   if islem not in dizi:
      dizi.append(islem) #olasiliklarin tamamlandigini bilmek icin bulduklarini listeye atiyor.
      print("dizi:",len(dizi)) #1280 den fazla olasilik bulamiyor
      print(islem)

parantez hic kullanmadan yaptigim icin bulamamis. maalesef bir fikrim yok parantezle cozum icin.

Butun postfix expression’lari yaratmanin temiz, itertools kullanan bir yolu var mi?

itertools fonksiyonlarinin hic biri eleman esitligine bakmadigi icin kombinatoryel patlama + set kullanarak yapabildim anca, veya bol for/map kullanarak…

Normalde bu dönüşümü ben Stack veri yapısını kullanarak yapıyorum, ama itertools kullanımını hiç düşünmedim.

Donusum kolay. (Postfix’i evaluate etmek de tek bir reduce ile mumkun olsa gerek, simdi bakacagim)
Sikinti “+AB” “A+B” “AB+” “+BA” … seklindeki butun expression’lari uretmek. Sayilardan essiz permutasyon, operatorlerden de tekrarli N-permutasyon alip bunlarin permutasyonunu uretmek gerektigi icin standart itertools fonksiyonlari yeterli olmadi.

Evet, evaluation tek expression’da oldu (ama try+catch icin fonksiyon gerekti):

import functools as ft
import operator as op
import math
import numbers

def safediv(a, b): return math.nan if b == 0 else a / b

exps = [
    [6, 4, op.add],
    [5, 5, op.add],
    [2, 1, 4, op.add, op.mul],
    [1, 4, op.add, 2, op.mul],
    [op.add, 2, 2],
    [2, op.add, 2],
    [7, 7, op.add, 7, 1, 7, op.truediv, op.add, op.mul],
]

def safe_reduce(exp):
    return (lambda v: v[0] if len(v) == 1 else math.nan) \
        (ft.reduce(lambda st, t: st + [t] if isinstance(t, numbers.Number) else [math.nan] if len(st) < 2 else st[:-2] + [t(st[-2], st[-1])], exp, []))

vals = map(safe_reduce, exps)
for exp_val in zip(exps, vals):
    print(exp_val)

Elinize sağlık. Ama ben bunu neden yapmak istediğinizi anlamadım henüz…

Fonksiyonel programlama pratigi olsun diye. Baska nerede, nasil arrow kullanacagim yoksa? :

1 Beğeni

Kısaltılmış fonksiyonlara arrow deniliyor demek ki. Sağolun bir bilgi daha edindik.

Degil; eger lambda veya bazen closure (yanlis) veya anonymous function da denilen fonksiyonlardan bahsediyorsan degil.

Kategori teorisinde monad’larin bir ust sinifi olarak tanimlamislar. Ben fonksiyon monad’indaki (&&&) ile ilgilendim; yukaridaki postta arrowAnd'in tanimina bakarsan iki fonksiyonu ikili bir tuple donduren tek fonksiyona birlestirdigini gorebilirsin.

1 Beğeni