Re: [cs-lisp] Re: Bram Cohen'in İşe Alma Sorusu (Merhaba Liste)

16 views
Skip to first unread message

Aycan iRiCAN

unread,
Aug 13, 2007, 6:26:07 PM8/13/07
to cs-...@cs.bilgi.edu.tr, core-h...@googlegroups.com
Alp Özmert yazmış:
> Selam!
>
> Selem <necr...@gmail.com> yazmış:
>
>
>> -- What is the exponent of the largest power of two whose base seven
>> representation doesn't contain three zeros in a row?
>>
>
> Hiç de optimal olmayan bir çözüm:
>
> (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

Mehmet Yavuz Selim Soyturk

unread,
Aug 14, 2007, 5:52:06 AM8/14/07
to cs-...@cs.bilgi.edu.tr, core-h...@googlegroups.com

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

Evrim Ulu

unread,
Aug 14, 2007, 6:48:27 AM8/14/07
to core-h...@googlegroups.com
Mehmet Yavuz Selim Soyturk wrote:

>Bir de asagida tanimladigim parallel fonksiyonu gibi calisan standard
>bir fonksiyon yok mu Haskell'de? Soyle bir baktim, bulamadim
>
>

http://www.cee.hw.ac.uk/~dsg/gph/

GPH, Glasgow Parallel Haskell <http://www.cee.hw.ac.uk/%7Edsg/gph/>
is an extension of Haskell for parallel programming. It adds just
two new primitives to the language, namely, a form of parallel
composition *par*, and sequential composition *seq*. With judicious
use of *par* and *seq* it is possible to express how a program
should be evaluated in parallel.

--
Saglicakla,

Evrim Ulu <ev...@core.gen.tr>
Kor Bilisim Teknolojileri
http://www.core.gen.tr/

Evrim Ulu

unread,
Aug 14, 2007, 6:55:51 AM8/14/07
to core-h...@googlegroups.com
Ah ya, yine algida seciciligimin kurbani olmu$um, neyse listede extra
bilgi olsun:)

Aycan iRiCAN

unread,
Aug 14, 2007, 7:06:28 AM8/14/07
to core-h...@googlegroups.com
Mehmet Yavuz Selim Soyturk yazmış:
Bu güzel inceleme için teşekkürler. Paralel işleme yerine zip kullanarak
da bunu yapmak mümkün sanırım:

setA = iterate (*2) 1
setB = zip [1..] [ showIntAtBase 7 (intToDigit) x "" | x <- setA]
setC = filter (not . isInfixOf "000" . snd) setB

main = foldr1 (>>) $ map (putStrLn . show . fst) setC

Sevgiler...

--
aycan

myavuzselim

unread,
Aug 14, 2007, 8:09:55 AM8/14/07
to core-haskell
> 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
>
> Bu güzel inceleme için teşekkürler. Paralel işleme yerine zip kullanarak
> da bunu yapmak mümkün sanırım:
>
> setA = iterate (*2) 1
> setB = zip [1..] [ showIntAtBase 7 (intToDigit) x "" | x <- setA]
> setC = filter (not . isInfixOf "000" . snd) setB
>
> main = foldr1 (>>) $ map (putStrLn . show . fst) setC
>
> Sevgiler...
>
> --
> aycan

Ben tesekkur ederim. Bir an Haskell'in tembel oldugunu unutup tek
seferde birden fazla is yaptirmaya calistigim icin biraz
karmasiklastirmisim ben kodu.

Reply all
Reply to author
Forward
0 new messages