Post by Aycan iRiCANSelam!
Post by Selem-- What is the exponent of the largest power of two whose base seven
representation doesn't contain three zeros in a row?
(do ((i 10000 (1- i)))
((not (search "000" (write-to-string (expt 2 i) :base 7)))
i))
Bu soru ile uðraþýrken çözemediðim bir problem ile karþýlaþtým. Bu
betiði onbin deðil de yüzbinden geri saydýrýnca tabii ki de zaman
alýyor. Ben de bir kaç kere bölüp nerelerde olduðuna bakmak istedim
ama beceremedim. (Bölüp deðiþkenlerin deðerlerine iþlev çaðrýlarýna
falan bakabiliyorum ama i'nin deðerini bulamadým.) Yardýmcý
olabilecek olursa sevinirim.
Saygýlar,
Alp Özmert
http://hpaste.org/2240
Acemi bir programcý olarak ben de ayný deneme yanýlma çözümünü haskell
ile denedim. Ýlginç bir problemmiþ, üzerinde düþünmesi bile eðitici.
Teþekkürler.
Sevgiler...
--
aycan
Ben de sizin koddan yola cikarak ussun degil de exponent'in kendisinin
bulunmasini sagladim. En son 8833 buldu. Bu iletiyi gonderirken acik
unutmusum programi, bilgisayarin hafizasini doldurdu. Ayni programi
baska dilde (mesela C'de) yazsaydik boyle hafiza kullanilmazdi. Ya
hafizayi dogru kullanan Haskell programi yazmayi bilmiyorum, ya da
programi interpreter'dan calistirdigim icin bazi optimizasyonlar
yapilmiyor. Denemek icin programi derleyeyim dedim, fakat bu sefer de
monadlara takildim.
main = map (putStrLn . show) setC
veya
main = foldl1 (>>) $ map (putStrLn . show) setC
gibi seyler denedim, olmadi. En sonunda
main = foldr1 (>>) $ map (putStrLn . show) setC
seklinde oldu. Ve evet, bu sekilde hafiza problemi yok :)
Haskell'de kod yazmak aslinda zevkli (fonksiyonlari manipule etmek
falan), yalniz okunakli kod yazmasi zor gibi (kendi kodumdan
bahsediyorum).
Bir de asagida tanimladigim parallel fonksiyonu gibi calisan standard
bir fonksiyon yok mu Haskell'de? Soyle bir baktim, bulamadim.
(Afedersiniz, yukaridaki yazi ugrastigim seyleri aninda buraya
yazdigim icin biraz karisik oldu sanirim, uzun zaman sonra Haskell'e
tekrar bakan birinin karsilastigi problemler olarak
degerlendirebilirsiniz).
module Main where
import Numeric
import Char
import List
import Data.List
parallel :: (x -> a, y -> b) -> (x, y) -> (a, b)
parallel (f, g) (x, y) = ((f x), (g y))
setA = iterate (parallel ((+1), (*2))) (0, 1)
setB = [ (x, showIntAtBase 7 (intToDigit) y "") | (x, y) <- setA]
setC = map fst $ filter (not . isInfixOf "000" . snd) setB
main = foldr1 (>>) $ map (putStrLn . show) setC
--
Mehmet