Algoritma Problemi

#1

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

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

A+B*C -> ABC*+
#3

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.

#4

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)

#5
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.

#6

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…

#7

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

#8

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.

#9

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)
#10

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

#11

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

1 Like
#12

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

#13

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 Like