Форум программистов, компьютерный форум, киберфорум
Языки JVM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/26: Рейтинг темы: голосов - 26, средняя оценка - 5.00
Заблокирован

Clojure Числа Армстронга

25.06.2014, 17:10. Показов 6143. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Самовлюблённое число, или совершенный цифровой инвариант (англ. pluperfect digital invariant, PPDI) или число Армстронга — натуральное число, которое в данной системе счисления равно сумме своих цифр, возведённых в степень, равную количеству его цифр. Иногда чтобы считать число таковым, достаточно, чтобы степени, в которые возводятся цифры, были равны m — тогда число можно назвать m-самовлюблённым.

Например, десятичное число 153 — число Армстронга, потому что:

1³ + 5³ + 3³ = 153
Не ради корысти, лишь забавы ради. Написано на AutoLISP. Алгоритм простой.
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
(defun armstrong-p (n / r deg)
  ;; Функция проверяющая число на самовлюбленность
  ;; (armstrong-p 548834)
  (setq r   0
        i   n
        deg (strlen (itoa n))
  )
  (while (> i 0)
    (setq r (+ r (expt (rem i 10) deg))
          i (/ i 10)
    )
  )
  (= n r)
)
 
 
(defun armstrong (n / r)
  ;; Функция возвращающая список чисел Армстронга
  ;; (armstrong 88593477) ==> ( 0 1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208
  ;;                            9474 54748 92727 93084 548834 1741725 4210818
  ;;                            9800817 9926315 24678050 24678051 88593477 )
  (setq r '())
  (while (<= 0 n)
    (if (armstrong-p n)
      (setq r (cons n r))
    )
    (setq n (1- n))
  )
  r
)
2
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.06.2014, 17:10
Ответы с готовыми решениями:

Clojure Ошибка при запуске локального сервера на Clojure в IntellijIDEA
Выводится ошибка по строке, которой даже нет. По отдельности все функции компилируются без сообщений об ошибках. Но при запуске...

Clojure Как полностью удалить пакеты Clojure и Leiningen в убунту
Всем доброе время суток! Подскажите, пожалуйста. как полностью удалить из убунту пакеты clojure и Leiningen. В ркзультате установки...

Clojure Почему невозможно настроить intellij idea для работы с clojure? windows
Получается только emacs. Плюсы emacs - интерактивный встроенный туториал. Даже если и с emacs ничего не получится то его можно будет...

48
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
26.06.2014, 12:45
Студворк — интернет-сервис помощи студентам
лок наверное нужно компилятору оставить, или CL не умеет? Это скомпилированный нейтив
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
;; racket lang [url]http://racket-lang.org[/url]
(define (armstrong? n)
  (let loop ((k n) (pow (string-length (number->string n))) (acc 0))
    (if (= k 0) (= n acc)
        (loop (quotient k 10) pow (+ acc (expt (remainder k 10) pow))))))
 
(define (armstrong low n (acc null))
  (if (< n low) (set! stor (append acc stor))
      (if (armstrong? n) (armstrong low (sub1 n) (append (list n) acc))
          (armstrong low (sub1 n) acc))))
 
(define stor '())
 
(define (thread-arm n)
  (let* ((k (quotient n 4))
         (t1 (thread (lambda () (armstrong 0 (sub1 k)))))
         (t2 (thread (lambda () (armstrong (* k 3) (add1 (* k 4))))))
         (t3 (thread (lambda () (armstrong (* k 2) (sub1 (* k 3))))))
         (t4 (thread (lambda () (armstrong k (sub1 (* k 2)))))))
    (thread-wait t1)
    (thread-wait t2)
    (thread-wait t3)
    (thread-wait t4))
  (sort stor <)) ;; можно не сортировать без необходимости
 
(time (thread-arm 88593477))
;cpu time: 44557 real time: 44624 gc time: 116
;'(0 1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474 54748 92727 93084
;548834 1741725 4210818 9800817 9926315 24678050 24678051 88593477)
3
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
26.06.2014, 20:47
Цитата Сообщение от castorsky Посмотреть сообщение
лок наверное нужно компилятору оставить, или CL не умеет? Это скомпилированный нейтив
А где у тебя лок?
0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
26.06.2014, 21:05
нет его, да и не нужен.
0
Заблокирован
26.06.2014, 21:08  [ТС]
Что-то мне подсказывает, что нужно экономить на итерациях. Например, если число заканчивается на единицу и является самовлюбленным, то число на единицу меньше точно будет числом Армстронга. Все числа, состоящие из цифр числа Армстронга не являются самовлюбленными. Возможно есть еще что-то...
0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
26.06.2014, 21:48
ur_naz, смысл? Это же не простые числа, которые востребованы практически. Где применяются числа Армстронга?
0
Заблокирован
26.06.2014, 21:50  [ТС]
Цитата Сообщение от castorsky Посмотреть сообщение
смысл? Это же не простые числа, которые востребованы практически. Где применяются числа Армстронга?
А вдруг это врата в пороллельные миры
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
26.06.2014, 22:13
Цитата Сообщение от castorsky Посмотреть сообщение
нет его, да и не нужен.
set! + append атомарная операция?

1-й поток заапендил свой результат к пустому stor
2-й поток начал аппендить свой результат к stor после первого
в это же время 3-й поток начал аппендить свой результат к stor пока еще после первого
2-й поток set! stor со своим результатом
3-й поток set! stor со своим результатом
в итоге результат 2-го потока потерян.

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от ur_naz Посмотреть сообщение
пороллельные
порнолольные

0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
26.06.2014, 22:14
и там обитает он
Изображения
 
1
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
26.06.2014, 23:18
Я считал что для этого уровня языков локами занимается компилятор. Например, в CTMCP на языке Oz такой трюк вполне жизнеспособен, а вот в ракете нет.
Lisp
1
2
3
4
5
6
7
8
9
10
11
(define x '())
(define y '())
(define z '())
 
(let* ((t1 (thread (lambda () (set! x (range 100500)))))
       (t2 (thread (lambda () (set! y (filter odd? x)))))
       (t3 (thread (lambda () (set! z (apply + y))))))
  (thread-wait t3)
  (thread-wait t1)
  (thread-wait t2)
  z)
рабочий пример на Oz
Code
1
2
3
4
5
6
local Xs Ys S in
    thread Xs={Generate 0 100500} end
    thread Ys={Filter Xs IsOdd} end
    thread S={Sum Ys 0} end
    {Browse S}
end
Добавлено через 2 минуты
в таком случае можно семафорчик поставить.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
27.06.2014, 07:50
Цитата Сообщение от castorsky Посмотреть сообщение
рабочий пример на Oz
Дык там явно указано, что Xs Ys и S — thread, а у тебя x, y и z — простые переменные, откуда компилятор может знать, нужно их синхронизировать или нет?

Цитата Сообщение от castorsky Посмотреть сообщение
в таком случае можно семафорчик поставить.
Или использовать каналы.

Типа того:
Lisp
1
2
3
4
5
6
7
8
(define x (make-channel))
(define y (make-channel))
(define z (make-channel))
 
(let* ((t1 (thread (lambda () (channel-put x (range 100500)))))
       (t2 (thread (lambda () (channel-put y (filter odd? (channel-get x))))))
       (t3 (thread (lambda () (channel-put z (apply + (channel-get y)))))))
  (channel-get z))
1
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
27.06.2014, 09:23
Цитата Сообщение от korvin_ Посмотреть сообщение
Дык там явно указано, что Xs Ys и S — thread, а у тебя x, y и z
Нет, Xs... такие же переменные. Биндятся параллельно, опрашивая состояние друг друга, лочатся неявно. При чем,если в ракете (как и в Си) thread возвращает id потока, то в Oz thread...end возвращает результат вычислений. Обмен сообщениями между потоками от нас спрятан, таким образом мы избавляемся от заботы о явной синхронизации.
Цитата Сообщение от korvin_ Посмотреть сообщение
ткуда компилятор может знать, нужно их синхронизировать или нет?
Ну Oz умеет, почему бы и лиспам не научиться.
Цитата Сообщение от korvin_ Посмотреть сообщение
Или использовать каналы.
или так. Семафорчик я подразумевал в прошлый пример, например так:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
;; racket lang [url]http://racket-lang.org[/url]
(define lock-semaph (make-semaphore 1))
(define stor '())
 
(define (armstrong? n)
  (let loop ((k n) (pow (string-length (number->string n))) (acc 0))
    (if (= k 0) (= n acc)
        (loop (quotient k 10) pow (+ acc (expt (remainder k 10) pow))))))
 
(define (armstrong low n (acc null))
  (if (< n low) (begin 
                  (semaphore-wait lock-semaph)
                  (set! stor (append acc stor))
                  (semaphore-post lock-semaph))
      (if (armstrong? n) (armstrong low (sub1 n) (append (list n) acc))
          (armstrong low (sub1 n) acc))))
 
(define (thread-arm n)
  (let* ((k (quotient n 4))
         (t1 (thread (lambda () (armstrong 0 (sub1 k)))))
         (t2 (thread (lambda () (armstrong (* k 3) (add1 (* k 4))))))
         (t3 (thread (lambda () (armstrong (* k 2) (sub1 (* k 3))))))
         (t4 (thread (lambda () (armstrong k (sub1 (* k 2)))))))
    (thread-wait t1)
    (thread-wait t2)
    (thread-wait t3)
    (thread-wait t4))
  (sort stor <))
0
Заблокирован
27.06.2014, 22:43  [ТС]
castorsky, я так понимаю у вас идет разделение на 4 потока и потом самый долгий ждут те, что поменьше. А можно сделать так. что вычисления распределялись автоматически, то есть пока выполняется один долгий процесс, параллельно вычислялись бы несколько более мелких...
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
28.06.2014, 09:31
Цитата Сообщение от ur_naz Посмотреть сообщение
я так понимаю у вас идет разделение на 4 потока и потом самый долгий ждут те, что поменьше. А можно сделать так. что вычисления распределялись автоматически, то есть пока выполняется один долгий процесс, параллельно вычислялись бы несколько более мелких...
Достаточно раздробить задачу на большее количество потоков, но тут и так все достаточно равномерно.
0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
28.06.2014, 10:19
ur_naz, немного не так. Нет разницы в каком порядке ждать, они все равно работают "параллельно", главное дождаться окончания всех.
0
75 / 24 / 0
Регистрация: 23.06.2014
Сообщений: 33
04.07.2014, 00:03
Tcl, еще его называют "Lisp on Drugs" ,
код:
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
proc arm? n {
    set e [string length $n]
    return [expr[list [join [split $n {}] **$e+]**$e == $n]]
}
 
proc arm n {
    set l {}
    for {set i 0} {$i <= $n} {incr i} { if {[arm? $i]} { lappend l $i } }
    return $l
}
 
proc test {} {
    set t [lindex [time { set l [arm 88593477] }] 0]
    puts $l
    puts [format {time: %.3f seconds} [expr {$t / 1000000.0}]]
}
 
test

результат:
0 1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474 54748 92727 93084 548834 1741725 4210818 9800817 9926315 24678050 24678051 88593477
time: 1227.961 seconds
Название: facepalm,house-dfb6b5898f5edf288d7fdbdf6bf1edf6_m.jpg
Просмотров: 83

Размер: 13.7 Кб
тормоза из-за преобразования строки в список, полученного списка в строку, ну и expr на сырой строке работает гораздо медленней, чем когда выражение скомпилировано в байт-код.
Улучшенная версия:
Ruby
1
2
3
4
5
6
7
8
9
proc arm n {
    for {set i 0} {$i <= $n} {incr i} {
        set s 0
        set e [string length $i]
        for {set v $i} {$v != 0} {set v [expr {$v / 10}]} { incr s [expr {($v % 10) ** $e}] }
        if {$s == $i} { lappend l $i }
    }
    return $l
}

time: 333.027 seconds
multi-thread версия:
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
proc arm n {
    set t 4
    tsv::set sv l {}
    set k [expr {$n / $t}]
    for {set i 0} {$i < $t} {incr i} {
        thread::send -async [thread::create {
            proc armi {n m} {
                while {$n <= $m} {
                    set s 0
                    set d [string length $n]
                    for {set v $n} {$v != 0} {set v [expr {$v / 10}]} {
                        incr s [expr {($v % 10) ** $d}]
                    }
                    if {$s == $n} { tsv::lappend sv l $n }
                    incr n
                }
            }
            thread::wait
        }][list armi [expr {$k * ($t - $i - 1)}] [expr {$i ? $k * ($t - $i) - 1} : $n]] r
    }
    for {set i 0} {$i < $t} {incr i} { vwait r }
    return [lsort -integer [tsv::get sv l]]
}

time: 125.999 seconds
Улучшение почти в 10 раз! Неплохо для скприптового языка?

Clozure CL (число в строку почему-то очень медленно преобразуется):
код
Lisp
1
2
3
4
5
6
7
8
9
10
(defun nd (n)
  (1+ (loop while (> n 9) do (setf n (truncate n 10)) summing 1)))
 
(defun arm (n)
  (loop for i from 0 to n
     when (loop with e = (nd i)
             for k = i then (truncate k 10) until (zerop k)
             for x = (expt (rem k 10) e) sum x into s
             finally (return (= s i)))
     collect i))

took 84,599 milliseconds (84.599 seconds) to run.
Racket, реализация от castorsky:
cpu time: 61729 real time: 61838 gc time: 298
кстати, абсолютно непонятно, как у него многопоточная версия работает быстрее? У меня она работает несколько медленнее. А в документации сказано: "Other functions, such as thread, support the creation of reliably concurrent tasks. However, threads never run truly in parallel, even if the hardware and operating system support parallelism" и "Threads run concurrently, in the sense that one thread can preempt another without its cooperation, but threads currently all run on the same processor (i.e., the same underlying OS process and thread)"

Абсолютный победитель :-) :
код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <cmath>
#include <mutex>
#include <future>
#include <chrono>
#include <vector>
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;
using namespace std::chrono;
 
inline unsigned upow(unsigned b, unsigned e) {
    unsigned p = 1;
    while (e--) p *= b;
    return p;
}
 
inline bool is_arm(unsigned n) {
    unsigned s = 0;
    unsigned e = static_cast<unsigned>(log10(n) + 1);
    for (auto v = n; v != 0; v /= 10) s += upow(v % 10, e);
    return s == n;
}
 
vector<unsigned> arm4(unsigned n) {
    vector<unsigned> l;
    mutex mtx;
    future<void> f[4];
    auto k = n / 4;
    auto fn = [&mtx, &l](unsigned n, unsigned m) {
        for (; n <= m; ++n) {
            if (is_arm(n)) {
                mtx.lock();
                l.push_back(n);
                mtx.unlock();
            }
        }
    };
    for (auto i = 0; i < 4; ++i) f[i] = async(launch::async, fn, k * i, i < 3 ? k * (i + 1) : n);
    for (auto i = 0; i < 4; ++i) f[i].get();
    sort(begin(l), end(l));
    return l;
}
 
int main() {
    auto b = steady_clock::now();
    auto l = arm4(88593477);
    auto e = steady_clock::now();
    for (auto e : l) std::cout << e << ' ';
    cout << "\ntime: " << fixed << setprecision(3)
         << duration_cast<duration<double>>(e - b).count() << " seconds\n";
}

time: 3.526 seconds
ЗЫ: clujure разочаровал своими тормозами, вроде java байт-код в натив должен преобразовываться, а работает представленная в треде программа немного быстрее, чем самая медленная реализация на тикле.
3
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
04.07.2014, 03:04
user user, а на SBCL не прогоните?
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
(declaim (optimize (speed 3) (safety 0) (debug 0) (space 0)))
 
(declaim (inline pow))
 
(defun pow (x k)
  (declare (type fixnum x k))
  (let ((p 1))
    (declare (type fixnum p))
    (loop
      repeat k
      do (setf p (the fixnum (* p x)))
      finally (return p))))
 
(declaim (inline armstrongp))
 
(defun armstrongp (n)
  (declare (type fixnum n))
  (let ((p 1))
    (declare (type fixnum p))
    (let ((n n))
      (declare (type fixnum n))
      (loop
        (when (< n 10) (return))
        (setf n (the fixnum (floor n 10)))
        (incf p)))
   (let ((b n)
        (r 0)
        (s 0))
    (declare (type fixnum p b r s))
    (loop
      (multiple-value-setq (b r) (floor b 10))
      (incf s (the fixnum (pow r p)))
      (when (zerop b) (return (= s n)))))))
 
(defun armstrong (n)
  (declare (type fixnum n))
  (let ((res '()))
    (dotimes (i n (nreverse res))
      (declare (fixnum i))
      (when (armstrongp i)
        (push i res)))))
 
(time (armstrong 88593478))
Добавлено через 26 минут
А лучше вот такой:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
(declaim (optimize (speed 3) (safety 0) (debug 0) (space 0)))
 
(declaim (inline pow))
 
(defun pow (x k)
  (declare (type fixnum x k))
  (let ((p 1))
    (declare (type fixnum p))
    (loop
      repeat k
      do (setf p (the fixnum (* p x)))
      finally (return p))))
 
(declaim (inline armstrongp))
 
(defun armstrongp (n)
  (declare (type fixnum n))
  (let ((p 1))
    (declare (type fixnum p))
    (let ((n n))
      (declare (type fixnum n))
      (loop
        (when (< n 10) (return))
        (setf n (the fixnum (floor (the unsigned-byte n) 10)))
        (incf p)))
   (let ((b n)
        (r 0)
        (s 0))
    (declare (type fixnum p b r s))
    (loop
      (multiple-value-setq (b r) (floor (the unsigned-byte b) 10))
      (incf s (the fixnum (pow r p)))
      (when (zerop b) (return (= s n)))))))
 
(defun armstrong (n)
  (declare (type fixnum n))
  (let ((res '()))
    (dotimes (i n (nreverse res))
      (declare (fixnum i))
      (when (armstrongp i)
        (push i res)))))
Для теста -
(time (armstrong 88593478))
У меня через dotimes, неохота было единицу прибавлять.
3
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
04.07.2014, 13:00
Цитата Сообщение от user user Посмотреть сообщение
кстати, абсолютно непонятно, как у него многопоточная версия работает быстрее?
ну а если так?
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
lenin@lenin-host:~/samples$ cat arm.rkt && raco exe arm.rkt && ./arm
#lang racket
 
;; racket lang [url]http://racket-lang.org[/url]
(define (armstrong? n)
  (let loop ((k n) (pow (string-length (number->string n))) (acc 0))
    (if (= k 0) (= n acc)
        (loop (quotient k 10) pow (+ acc (expt (remainder k 10) pow))))))
 
(define (armstrong n (acc null))
  (if (< n 0) acc 
      (if (armstrong? n) (armstrong (sub1 n) (append (list n) acc))
          (armstrong (sub1 n) acc))))
 
(time (armstrong 88593477))
 
#cpu time: 43569 real time: 43628 gc time: 92
#'(0 1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474 54748 92727 93084
# 548834 1741725 4210818 9800817 9926315 24678050 24678051 88593477)
lenin@lenin-host:~/samples$
Добавлено через 2 минуты
Цитата Сообщение от castorsky Посмотреть сообщение
Это скомпилированный нейтив
user user, невнимательно читаете
1
 Аватар для smoke853
505 / 511 / 42
Регистрация: 12.12.2013
Сообщений: 484
04.07.2014, 19:46
Clojure multi-thread версия:
Кликните здесь для просмотра всего текста
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
(def result (atom (sorted-set)))
 
(defn imp-arm-num? [n]
  (letfn [(num->coll [n]
            (let [n (atom n)
                  acc (atom nil)]
              (while (pos? @n)
                (swap! acc conj (rem @n 10))
                (swap! n quot 10))
              @acc))
          (result [coll]
            (let [acc (atom 0)
                  len (count coll)]
              (doseq [v coll]
                (swap! acc + (Math/pow v len)))
              (== @acc n)))]
    (result (num->coll n))))
;; => #'user/imp-arm-num?
 
(defn imp-arm-coll [start end]
  (let [n (atom end)]
    (while (>= @n start)
      (when (imp-arm-num? @n)
        (swap! result conj @n))
      (swap! n dec))))
;; => #'user/imp-arm-coll
 
(let [q (quot 88593477 4)
      t1 (future (imp-arm-coll 0 q))
      t2 (future (imp-arm-coll (inc q) (* q 2)))
      t3 (future (imp-arm-coll (inc (* q 2)) (* q 3)))
      t4 (future (imp-arm-coll (inc (* q 3)) 88593477))]
  (time (do @t1 @t2 @t3 @t4 (println @result))))
;; #{0 1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474 54748 92727 93084 548834 1741725 4210818 9800817 9926315 24678050 24678051 88593477}
;; "Elapsed time: 53528.303507 msecs"
;; => nil

P.S. в теме многопоточности и т.п. я вообще не разбираюсь на данный момент, поэтому за основу взял функцию thread-arm, которую написал castorsky, переписал на Clojure, вроде работает Возможно на Clojure можно написать более грамотно, но пока что так.
1
Заблокирован
04.07.2014, 22:54  [ТС]
Я тут подсмотрел, последнее число армстронга имеет 39 знаков, так что оптимизировать есть что...
1
75 / 24 / 0
Регистрация: 23.06.2014
Сообщений: 33
05.07.2014, 06:30
Цитата Сообщение от helter Посмотреть сообщение
user user, а на SBCL не прогоните?
А лучше вот такой:
Прогоню, чего ж не прогнать
Code
1
2
3
4
5
6
7
8
* (time (armstrong 88593478))
 
Evaluation took:
  13.353 seconds of real time
  13.353686 seconds of total run time (13.353686 user, 0.000000 system)
  100.01% CPU
  30,667,618,101 processor cycles
  0 bytes consed
Отлично!
И на ccl быстрее на 10 секунд работает. А вот clisp'у все эти оптимизации по барабану и моя версия работает на нем быстрее.

Цитата Сообщение от castorsky Посмотреть сообщение
ну а если так?
Ну теперь все встало на свои места - время работы многопоточной версии равно времени однопоточной
Цитата Сообщение от castorsky Посмотреть сообщение
user user, невнимательно читаете
Прочитал и зачем то подумал, что "скомпилированный" относится и ко всем предыдущим постам Поэтому и на своей балалайке гонял исполняемый файл, чтобы народу было с чем сравнивать относительно других реализаций, т.е. к примеру однопоточная версия на тикле должна на вашем компе работать примерно в полтора раза быстрее, чем на моем ноуте.

Цитата Сообщение от smoke853 Посмотреть сообщение
Clojure multi-thread версия:
Code
1
"Elapsed time: 161184.062218 msecs"
Все равно печально для компилируемого строго-типизированного языка: работает медленнее, чем аналогичная программа на бестиповом скриптовом тикле. А сам язык конечно интересный и привнес что-то новое в лисповый мир. Думаю, рано или поздно авторы языка озаботятся вопросами производительности.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.07.2014, 06:30

Clojure Присвоение ввода с клавиатуры переменной в Clojure
Мне нужен код делающий следующее : 1. Присвоить ввод с клавы переменной. 2. &quot;Сложить&quot; её со строкой &quot;Привет, &quot;. 3....

Clojure Clojure. Последовательность создается задом-наперед
Делаю из SICP задание &quot;треугольник Пифагора&quot;. Вот процедура, которая принимает на вход последовательность, а возвращает...

Clojure Clojure, lein-droid, Android ламерство
Пытаюсь разбираться с программированием под Андройд на Lisp'е. Сразу скажу -- имею очень поверхностное представление, как о Java, так и о...

Clojure Простые числа
Здравствуйте. Нужно написать функцию (предикат), определяющую, являются ли ее аргументы взаимно простыми числами. Используя...

Clojure Ввод данных пользователем в Clojure
Как получать данные от пользователя? На такой код ругается: (defn sum (apply + numbers))


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru