LINUX.ORG.RU

Не могу написать код по заданному алгоритму

 ,


2

5

Граждане и гражданки ЛОР не дайте свихнуться, а дайте код на Lisp или Scheme

у меня два списка (а1 а2 а3 ... an) (Р0 Р1 Р2 ... Pn)

в первом проходе получаю списки (а1) (Р0) и решение такого ур-ия

M1 = P0 * a1

в втором проходе получаю списки (a1 a2) (P0 P1) и решение такого ур-ия

M2 = P0 * a2 + (P1 * (a2 - a1))

в третьем проходе плучаю списки (a1 a2 a3) (P0 P1 P2) и решение такого ур-ия

M3 = P0 * a3 + (P1 * (a3 - a1) + P2 *(a3 - a2))

ну и т.д.

Общее уравнение

 i
 Mn = P0 * an + ΣPi * (an - ai)
 i=1

мозги колом встали



Последнее исправление: saufesma (всего исправлений: 2)

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

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

Ну на тогда ещё посмотри:

(defun m (n a p)                                                                                                                                                                       
  (bind ((a (reverse a))                                                                                                                                                               
         (a_n (first a))                                                                                                                                                               
         (p_0 (first p)))                                                                                                                                                              
    (+ (* a_n p_0)                                                                                                                                                                     
       (iter (for c from 1 below n)                                                                                                                                                    
             (for p_i in (rest p))                                                                                                                                                     
             (for a_i in (rest a))                                                                                                                                                     
             (sum (* p_i (- a_n a_i)))))))

(defun s (a p)                                                                                                                                                                         
  (iter (for n from 1 to (length a))                                                                                                                                                   
        (for sub-a = (subseq a 0 n))                                                                                                                                                   
        (for sub-p = (subseq p 0 n))                                                                                                                                                   
        (collect (m n sub-a sub-p))))
turtle_bazon ★★★★★
()
  1. Списки а и Р разной длины.

  2. Во второй и третьей формулах лишние скобки (с точки зрения арифметики).

  3. В третьей формуле отсутствует Р2, следовательно, общая формула не верна.

Лисп - прагматичный язык, схема/рекета - академичные. Догадаешься почему лисперы в тред не пишут?

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

Списки а и Р разной длины

там норм всё

Во второй и третьей формулах лишние скобки (с точки зрения арифметики).

без них алгоритм не получался, в всяком случае в моей голове

В третьей формуле отсутствует Р2, следовательно, общая формула не верна.

виноват опечатка

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

Догадаешься почему лисперы в тред не пишут?

monk, no-such-file, turtle_bazon пишут же в тред, не понял в чём вопрос.

saufesma
() автор топика

nth выдаёт n-ный элемент списка, проходя каждый раз от его головы, поэтому вариант @paramon имеет квадратичную сложность от длины списка.

elt для списков эквивалентен nth, поэтому вариант @no-such-file тоже имеет квадратичную сложность + накладные расходы на вызовы обобщённой функции.

@turtle_bazon создаёт копию списка a (reverse).

@monk проходит список два раза: сначала в функции last, потом в for/sum.

Вот вариант без этих недостатков, зато с возможностью переполнения в bignum если числа P * a большие:

(defun m (a p n)
  (loop
    :for p-i :in (cdr p)
    :for a-i :in a
    :repeat (1- n)
    :sum (* p-i a-i) :into a-p
    :sum p-i :into p-sum
    :finally (return (- (* (+ (car p) p-sum)
                           a-i)
                        a-p))))

(defun solve (a p)
  (loop
    :for i :from 1 :to (length a)
    :collect (m a p i)))
Jini ★★
()
Ответ на: комментарий от Jini

Вот вариант без этих недостатков, зато с возможностью переполнения в bignum если числа P * a большие:

Никто не утверждает, что они малые и даже что целые.

Вот вариант без этих недостатков

Если заниматься оптимизацией, то можно сделать вариант без повторного суммирования начал списков.

(define (solve a p [result null] [a-prev 0] [sum-p 0] [sum-a*p 0])
  (if (null? a)
      (reverse result)
      (let* ([a-i (first a)]
             [p-i (first p)]
             [sum-p* (+ sum-p p-i)]
             [sum-a*p* (+ sum-a*p (* a-prev p-i))])
        (solve (rest a) (rest p)
               (cons (- (* sum-p* a-i) sum-a*p*) result)            
               a-i sum-p* sum-a*p*))))

;; если всё-таки нужен только Mn, а не весь список
(define (m a p n)
  (list-ref (solve a p) (sub1 n)))
monk ★★★★★
()
Ответ на: комментарий от Jini

elt для списков

Я предлагал использовать vector и не иметь этих проблем в принципе. По смыслу ТСу нужен массив коэффициентов по i, нафига тут список?

расходы на вызовы обобщённой функции

Вряд ли у ТСа гигабайты данных. Моё решение оптимально по сумме времени решения + время исполнения. When in doubt, use brute force - как завещали классики.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

а на питоне уже всё давно бы было написано и выполнило своё предназначение

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

monk, no-such-file, turtle_bazon пишут же в тред, не понял в чём вопрос

Вопрос в том, почему лисперы игнорируют этот тред. Из перечисленных тобой, только turtle_bazon позиционировал себя лиспером. Но и он, после долгих выяснений чего же ты хочешь, лишь переписал алгоритм no-such-file на iterate вместо loop.

(подсказка) на лиспе пишут не только лисперы, но и просто грамотные программисты.

Ты бы ещё Дениску (den73) в лисперы записал))) Чел пишет на паскале, независимо от того какой язык использует, наглядно демонстрируя перефраз: «Хороший фортран-программист…»

Списки а и Р разной длины там норм всё

Что «норм»? Список а с 1 до n, список Р с 0 до n. В примере показываешь списки равной длины. Обобщенной формуле не указал верхнюю границу. Тебе лень корректно оформить вопрос? Первый ответ от лиспера (реального).

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

Преждевременная оптимизация? Да ещё не зная условий? Студенту простительно. А ты студент?

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

Что «норм»? Список а с 1 до n, список Р с 0 до n. В примере показываешь >списки равной длины.

просто в самой задаче на рис. первым идет Р поэтому решил обозначить 0, (а) это расстояние которое от Р0 до Р1 присвоил индекс 1.

Обобщенной формуле не указал верхнюю границу.

 i=m
 ΣMn = P0 * an + ΣPi * (an - ai)
 i=1

Тебе лень корректно оформить вопрос? Первый ответ от лиспера (реального).

Где-то поторопился, ну....

Ты бы ещё Дениску (den73) в лисперы записал

monk, no-such-file, turtle_bazon я их никуда не записывал, просто на форуме они больше выделяются в Лисп, вот и всё, а лично я их не знаю.

И по спискам

(a0 a1 a2 ... n) (P0 P1 P2 ... n)

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

существуют ли среды или языки позволяющие просто загнать «Mn = P0 * an + ΣPi * (an - ai)» и не писать алгоритмов?

Позвольте представить Юлю:

Σ = sum
M(a,p,m=length(a)) = p[1]a[1] ∪ [ p[1]a[n]+ Σ(p[i]*(a[n]-a[i]) for i ∈ 2:n) for n ∈ 2:m]

Тест:

julia> M([50 120 170],[100 100 100])
3-element Array{Int64,1}:
  5000
 12000
 22000

anonymous
()
Ответ на: комментарий от no-such-file

а на питоне

Реквестирую решение на comprehensions, в свете соседнего треда.

a, P = [50, 120, 170], [100, 100, 100]
λ, π, ρ, Σ = len, print, range, sum
Mn = [Σ(P[i]*(a[n]-[0,*a][i]) for i in ρ(n+1)) for n in ρ(λ(P))]
π(*Mn); π(Σ(Mn))
5000 19000 34000
58000

Пук.

anonymous
()
Ответ на: комментарий от no-such-file

А что до читаемости, то синтаксис лиспа целиком и полностью из таких вот «кампрехеншонов» состоит. Да ведь?

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

Где-то поторопился, ну….

В этом посте я вижу, как минимум, пять ошибок в двух местах.

Среди нынешней молодёжи распространено мнение, что программист обязан хорошо владеть английским и знать математику. в реальности для программирования необходимо, а частые достаточно, владеть формальной логикой и быть внимательным. Педантично внимательным.

Ты уже два дня не можешь правильно сформулировать задание. Уверен, что программирование это твоё?

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

Педантично внимательным.

Без вопросов. Верное высказывание.

Где-то в интернете увидел без указания верхней границы, так и записал

  i 
 Mn = P0 * an + ΣPi * (an - ai)
 i=1

исправляюсь

 i=m 
 Mn = P0 * an + ΣPi * (an - ai)
 i=1

В этом посте я вижу, как минимум, пять ошибок в двух местах.

Будте добры указать.

Уверен, что программирование это твоё?

Это хобби.

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

Правильно сформулированная задача — половина дела.

Кто ж с этим спорит. Это же в любой области деятельности человека.

saufesma
() автор топика
Ответ на: комментарий от no-such-file

Слушай, я разобрался как этот зверь loop работает. А мог бы ты побольше примеров с этим зверем сбросить?

saufesma
() автор топика

Нашел только для M_n. В общем случае надо вспоминать как конструировать глаголы с помощью союзов

a =: 1 2 3 4
p =: 1 0 2 1

s1 =: {.@:[ * {:@:]
s2 =: +/@:[ * {:@:]
s3 =: +/@:*
total =: s1 + s2 - s3
p total a
  => 9
deadplace
()
Ответ на: комментарий от anonymous

Первый ответ от лиспера (реального) Виталий Светославович, вы?

anonymous
()

дайте код на Lisp или Scheme

(ns equation
  (:require [clojure.test :refer [deftest is testing] :as t]))

(declare Ms M sum)

(defn Ms
  "Sequence of Ms given as and Ps."
  [as Ps]
  (map #(M % as Ps)
       (range 0 (count as))))

(defn M
  "Single value of M at index n (zero-based).

  M(n) = P0 * an + ΣPi * (an - ai); i = 1, n - 1.

  Example:
  as = (а1 а2 а3 ... an)
  Ps = (Р0 Р1 Р2 ... Pn)

  M1 = P0 * a1
  M2 = P0 * a2 + (P1 * (a2 - a1))
  M3 = P0 * a3 + (P1 * (a3 - a1) + P2 * (a3 - a2))
                 |             sum               |"
  [n as Ps]
  (let [P0 (first Ps)
        a (nth as n)]
    (+ (* P0 a) (sum n as Ps))))

(defn sum
  "Single value of right-hand sum at index n (zero-based).

  sum(n) = ΣPi * (an - ai); i = 1, n-1."
  [n as Ps]
  (reduce + 0
          (map (fn [i]
                 (* (nth (rest Ps) i)
                    (- (nth as n)
                       (nth as i))))
               (range 0 n))))


(deftest equation-test
  (is (= '() (Ms [] [])))
  (is (= '(5000) (Ms [50] [100])))
  (is (= '(5000 5000) (Ms [50 120] [100 -100])))
  (is (= '(5000 5000 0) (Ms [50 120 170] [100 -100 -100]))))

(t/run-tests)

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

А чтобы не расслаблялся.

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

переписал алгоритм no-such-file на iterate вместо loop

Я просто написал свой вариант когда увидел то, что приходит и то, что выходит. Вариант другой особо не смотрел. Что значит, что, наверное, мы одинаково поняли ТС.

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

какие-то проблемы с резолвингом имени

У меня как работало, так и работает. Он наверное имел в виду, что там жизни нет.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Нет, из некоторых мест lisper.ru не резолвится, действительно.

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

А где же тот господин, archimag? Самоликвидировался?

archimag же владелец этого. :) И от лиспа он отошёл уже. На работе у него JS.

turtle_bazon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.