LINUX.ORG.RU

Оптимизация кода

 


0

2

Как можно упростить следующую реализацию «решета Эратосфена»?

package tail
import scala.annotation.tailrec

class EratosphenSieve(upperBound : Int) {
    def sieve() : Array[Int] = {
        val inputData = (2 to upperBound).toArray
        sieveRun(inputData, 0, inputData)
    }
    @tailrec
    private def sieveRun(inputData : Array[Int], index : Int, resData : Array[Int]) : Array[Int] = {
        if(index > 0 && inputData.length == resData.length)
        {
            resData
        }else {
            val primary = resData.apply(index);
            sieveRun(resData, index + 1, resData.filter(func => func == primary || func % primary != 0));
        }
    }
}

Всем приятного отдыха )

Перемещено post-factum из talks

Ответ на: комментарий от LongLiveUbuntu

Есть Leksah, плагины для эклипса, sublime, vim, в конце-концов.

keyran ★★
()
Ответ на: комментарий от LongLiveUbuntu

На сях строчек кода будет много больше

4.2

void primes( int n, int* out ) {
	char a[ ++n ];
	memset( a, 0, n );
	for( int i = 2 ; i < n ; ++i )
		if( !a[ i ] && (*out++ = i) )
			for( int j = i ; j < n ; a[ j ] = 1, j += i );
}

пример использования:

int main() {
	static int a[ 100 ];
	primes( 100, a );

	for( int* p = a ; *p ; ++p )
		printf( "%d\n", *p );
}
wota ★★
()
Ответ на: комментарий от J

Не люблю простыни кода, ничего не могу с собой поделать.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от ugoday

Может я единомышленников ищу.

J ★★★★
()
Ответ на: комментарий от LongLiveUbuntu

А рекурсивно?

а зачем? чтоб компилятор в лучшем случае опять все в циклы переделал?

wota ★★
()
Ответ на: комментарий от ugoday

Не с твоим ником высказывать такие претензии.

Завидуешь, что пользователь зарегал односимвольный ник в то время когда уже действовал запрет на бессмысленные ники?

shrub ★★★★★
()
Ответ на: комментарий от J

Поднималась тема на запрет коротких ников, нецензурных и бессмысленного набора букв.

Думается в твоём случае либо уже забили на это, либо сыграл авторитет твоего прошлого аккаунта :)

shrub ★★★★★
()
Последнее исправление: shrub (всего исправлений: 1)
Ответ на: комментарий от shrub

либо сыграл авторитет твоего прошлого аккаунта :)

Однозначно это.

J ★★★★
()
Ответ на: комментарий от LongLiveUbuntu

классический эратосфен без выкрутасов на хаскелле вот:

eratosthenes (x:xs) = x:(eratosthenes $ filter (\y -> y `mod` x /= 0) xs)
---------
*Main> take 50 $ eratosthenes [2..]
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229]

IDE для хаскелла - емакс или вим, что тебе по вкусу больше. Сейчас многие SublimeText нахваливают, но мне он не очень.

provaton ★★★★★
()
Ответ на: комментарий от malbolge

Компактный - это значит: в худшем случае на пол-экрана, а в идеале три-пять строк на функцию. Во сколько команд код развернется на низком уровне - забота компилятора.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

В этом случае я рекомендую ЯП с голосовым управлением, называется «хороший аспирант». В идеале программа занимает один телефонный звонок, в худшем случае пару писем в мыло, сколько экранов займет код и какой компилятор будет задействован вообще не важно;-)

AIv ★★★★★
()

Поздновато я сюда зашел. Ну да ладно, внесу и свою лепту. Clojure для меня - это Huskell с человеческим лицом.

(defn seive [coll] (lazy-seq (cons (first coll) (seive (filter #(> (rem % (first coll)) 0) (rest coll))))))

(take 6 (seive (iterate inc 2)))
=> (2 3 5 7 11 13)
geometer
()
Ответ на: комментарий от LongLiveUbuntu

Неважно. В Eclipse лучше. В Emacs - тоже лучше. Правда в emacs'е не без глюков (в отличие от первых двух вариантов). Если ты переходишь с явы, то я предложил бы тебе Eclipse, хотя тру-лисперы будут морщиться =)

geometer
()
Ответ на: комментарий от geometer

Я сейчас на более умеренной позиции (Scala), но может быть и решусь перейти на Clojure. Я бы Хаскелль с удовольствием пользовал, была бы IDE уровня Netbeans for Java.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

Я бы Хаскелль с удовольствием пользовал, была бы IDE уровня Netbeans for Java

С монадами уже разобрался?

geometer
()
Ответ на: комментарий от LongLiveUbuntu

тот код не очевиден

Ты просек суть оптимизации :)

slackwarrior ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

У меня в Leksah на убунте 11.10 кстати траблы были с отрисовкой текста.
Периодически после выполнения каких-то операций, сейчас не помню каких, просто текст смещался в окне влево, за пределы экрана. Помогал с этим бороться какой-то финт ушами. Я помучился и выпилил эту иде.
Была мысль в gedit писать, там можно плагином терминал встроить как вкладку в нижнюю консоль. Удобно вывод ghci держать сразу перед глазами. Но после Sublime Text 2 гедит выглядит откровенно убого, да и в терминале этом автодополнение по Ctrl-Tab отсутствует в отличие от запуска ghci в обычном терминале.
За вимоимаксы не скажу.

Virtuos86 ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

может быть и решусь перейти на Clojure

Вероятность этого события будет весьма велика когда начнешь читать SICP

geometer
()

кстати не было ж еще кода на С++:

void seive( list<int>& l ) {
    for( int i: l )
        l.remove_if( [i](int x){ return x!=i && !(x%i); } );
}

или в одну строку (как любят функцианальщики):

void seive( list<int>& l ) { for( int i: l ) l.remove_if( [i](int x){ return x!=i && !(x%i); } ); }
wota ★★
()

Не было на Ruby

def eratosthenes(n)
  nums = [0, 0] + (2..n).to_a
  (2..Math.sqrt(n).to_i).each do |i|
    if nums[i].nonzero?
      (i**2..n).step(i) {|m| nums[m] = 0}
    end
  end
  nums.find_all {|m| m.nonzero?}
end
BDSM
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.