Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
aliosa

[Yêu cầu] Chuyển đổi tổng hợp list

Các bài được khuyến nghị

Xin nhờ các bạn viết giúp giúp lisp chuyển đổi list như sau

Cho list L1 và một số nguyên N1

Ví dụ:

(setq l1

‘(

    ("1" "1")

    ("2" "2")

    ("3" "3")

    ("4" "4")

    ("5" "5")

    ("6" "6")

    ("7" "7")

    ("8" "8")

    ("9" "9")

    ("10" "10")

    ("11" "11")

    ("12" "12")

    ("13" "13")

    ("14" "14")

    ("15" "15")

    ("16" "16")

    ("17" "17")

    ("18" "18")

    ("19" "19")

    ("20" "20")

))

(setq N 10)

 

Mình muốn lisp chuyển để có kết quả như sau:

 

(

   ("10" "55")

   ("20" "20")

)

 

Giải thích

- Cho N tăng dần với các hệ số 1, 2,3..i. Dừng khi N*i< max(các phần tử thứ nhất trong danh sách) ở ví dụ i=2 ta được:

 

- Phần tử đầu ("10" "55")

+ “10” : Là N*1 = 10*1=10

+ “55”: Là tổng các giá trị thứ 2 có chỉ sổ thứ nhất <=10;  (55=1+2+3+4+5+6+7+8+9+10)

-  Phần tử 2 ("20" "155")

+ “20” : Là N*2 = 10*2=20

+ “155”: Là tổng các giá trị thứ 2 có chỉ sổ thứ nhất <=20;  (155=11+12+13+14+15+16+17+18+19+20)

 

Cảm ơn các bạn giúp đỡ!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Không dùng List L1, sử dụng bằng cách tính toán để chuyển được không bạn?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Code đây bạn :

 

(defun fff(i / L)
  (setq s 10 j 1)
  (Repeat i
    (setq L (append L (list (list (* s j) (* (+ (+ 1 (* 10 (- j 1))) (+ 10 (* 10 (- j 1)))) 5) ))))
    (setq i (1+ i) j (1+ j))
  )
  L
)

Thử :

(fff 1)

(fff 2)

(fff 3)

.....

(defun fff(i / L)
  (setq s 10 j 1)
  (Repeat i
    (setq L (append L (list (list (* s j) (* (+ (+ 1 (* 10 (- j 1))) (+ 10 (* 10 (- j 1)))) 5) ))))
    (setq i (1+ i) j (1+ j))
  )
  L
)
(defun fff(i / L)
  (setq s 10 j 1)
  (Repeat i
    (setq L (append L (list (list (* s j) (* (+ (+ 1 (* 10 (- j 1))) (+ 10 (* 10 (- j 1)))) 5) ))))
    (setq i (1+ i) j (1+ j))
  )
  L
)
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cảm ơn bạn.

Nhờ bạn chỉnh lại giùm là số liệu đầu vào cho một list bất kỳ (L1) và một số N

ví dụ

(setq L1 ‘(

    ("1" "2.2")

    ("2" "3.3")

    ("3" "11")

    ("4" "22")

    ("5" "2")

    ("6" "7")

    ("7" "9")

    ("8" "2")

    ("9" "2.2")

    ("10" "11")

    ("12" "15")

))

và số N=5

 

Lisp thực hiện

(fff L1 N)

 

Được kết quả

'(

("5" "40.5")

("10" "31.2" )

("15" "15")

)

 

Phần tử 1 ("5" "40.5")

+) 5 là i=1 => n*i=5

+) 40.5 =2.2+3.3+11+22+2 (cộng các phẩn tử thứ 2 có phần tử đầu <=5)

 

Phần tử 2 ("10" "31.2" )

+) 10 là i=2 => n*i=10

+) 31.2 =7+9+2+2.2+11  (cộng các phẩn tử thứ 2 có phần tử đầu 5< và <=10)

 

Phần tử 3 ("15" "15")

+) 15 là i=3 => n*i=15

+) 15 =15 (cộng các phẩn tử thứ 2 có phần tử đầu 10< và <=15)

 

Xin lỗi và phần ví dụ đầu mình lấy ngẫu nhiên.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cảm ơn ban Tot77

 

Lisp chạy tốt.

 

Nhờ bạn kiểm tra thêm một số điều kiện sau:

 

- Trường hợp 1:

cho (setq L1 '(("10" "2.2")  ("2" "3.3")))

Gọi hàm (vao l1 2)

=>Kết quả phải trả là: (("2" "2.2") ("4" "0") ("6" "0") ("8" "0") ("10" "2.2"))

 

- Trường hợp 2

Gọi (vao l1 1)

Cũng tương tự

 

Xin nhờ bạn bổ sung thêm nữa

- Chỉ số đầu của phần tử đầu tiên của kết quả như sau:

Ví dụ

  (setq L1 '( ("2" "3")  ("1.5" "2") ("4" "3") )) và n=2

Gọi hàm (vao l1 2)

Ta được (("2" "5") ("4" 3"))

 

Nhưng nếu

  (setq L1 '( ("6" "3")  ("7.5" "2") ("8" "3") )) và n=2

Ta được (("6" "3) ("8" 5"))

 

Tức là giá trị thứ nhất của phần tử đầu tiên là min ( 6 7.5 8 ) và là bội số của n (bằng 6)

, giá trị tiếp theo bằng giá trị trước cộng n*1 (bằng 6+2*1=8)...

 

 

 

 

(setq L1 '(("10" "2.2")
  ("2" "3.3")
 )
)
 
(setq L1 '(("10" "2.2")
  ("2" "3.3")
 )
)
 
(setq L1 '(("10" "2.2")
  ("2" "3.3")
 )
)
 
(setq L1 '(("10" "2.2")
  ("2" "3.3")
 )
)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hoàn hảo! Hoàn hảo và rất nhanh! Xin chân thành cảm ơn!

Mình cứ lo diễn đạt không đạt sợ các bác không hiểu rõ nhưng kết quả hoàn hảo.

Mình sẽ kiểm tra các trường hợp nhưng cơ bản là rất tốt! Xin chân thành cảm ơn!

 

Mình đã test thử

 

(setq L1 '(

    ("2000" "13.04")

    ("2020" "0")

    ("2040" "0")

    ("2053.53" "6.18")

    ("2054.87" "8.49")

    ("2060" "18.44")

    ("2080" "84.6")

    ("2100" "94.65")

    ("2120" "44.59")

    ("2140" "37.1")

    ("2158.22" "74.36")

    ("2188.22" "99.14")

    ("2200" "101.56")

    ("2214.08" "105.03")

    ("2214.33" "62.59")

    ("2220" "65.08")

    ("2240" "81.49")

    ("2256.33" "79")

    ("2260" "74.27")

    ("2280" "55.78")

    ("2290.63" "38.4")

    ("2300" "33.95")

    ("2320" "28.97")

    ("2324.83" "31.97")

    ("2326.66" "34.45")

    ("2328.28" "36.29")

    ("2341.98" "72.47")

    ("2350.46" "154.06")

    ("2360" "209.08")

    ("2367.31" "213.07")

    ("2367.56" "363.71")

    ("2380" "246.21")

    ("2396.83" "137.69")

    ("2426.83" "120.43")

    ("2440" "156.94")

    ("2460" "277.61")

    ("2480" "342.13")

    ("2500" "397.07")

    ("2520" "403.51")

    ("2540" "434.98")

    ("2560" "413.54")

    ("2570.17" "333.85")

    ("2580" "208.77")

    ("2588.44" "133.38")

    ("2618.44" "5.38")

    ("2620" "3.01")

    ("2640" "7.52")

    ("2647.69" "13.8")

    ("2647.94" "2.23")

    ("2660" "2.25")

    ("2684.49" "47.37")

    ("2689.17" "59.8")

    ("2690.27" "62.99")

    ("2700" "107.24")

    ("2720.45" "139.16")

    ("2720.7" "234.94")

    ("2740" "254.46")

    ("2749.95" "148.6")

    ("2775.83" "17.05")

    ("2779.95" "36.57")

    ("2800" "252.63")

    ("2804" "320.96")

    ("2813.77" "361.81")

    ("2820" "302.33")

    ("2840" "94.56")

    ("2860" "23.53")

    ("2872.45" "179.8")

    ("2885.02" "404.33")

    ("2900" "473.66")

    ("2920" "461.43")

    ("2940" "468.95")

    ("2955.13" "444.92")

    ("2985.12" "467.78")

    ("3000" "432.53")

)

)

 

Và kết quả tuyệt vời

 

(("2000" "13.04")
  ("2100" "212.36")
  ("2200" "356.75")
  ("2300" "595.59")
  ("2400" "1527.97")
  ("2500" "1294.18")
  ("2600" "1928.03")
  ("2700" "311.59")
  ("2800" "1083.41")
  ("2900" "2160.98")
  ("3000" "2275.61")
)
 

(("2000" "13.04")

  ("2100" "212.36")

  ("2200" "356.75")

  ("2300" "595.59")

  ("2400" "1527.97")

  ("2500" "1294.18")

  ("2600" "1928.03")

  ("2700" "311.59")

  ("2800" "1083.41")

  ("2900" "2160.98")

  ("3000" "2275.61")

)

 

P/s Bác Tot77 có thể bật mí bí quyết học lisp của bác không! Vì code của bác nhìn thấy rất pro...

(setq L1 '(
    ("2000" "13.04")
    ("2020" "0")
    ("2040" "0")
    ("2053.53" "6.18")
    ("2054.87" "8.49")
    ("2060" "18.44")
    ("2080" "84.6")
    ("2100" "94.65")
    ("2120" "44.59")
    ("2140" "37.1")
    ("2158.22" "74.36")
    ("2188.22" "99.14")
    ("2200" "101.56")
    ("2214.08" "105.03")
    ("2214.33" "62.59")
    ("2220" "65.08")
    ("2240" "81.49")
    ("2256.33" "79")
    ("2260" "74.27")
    ("2280" "55.78")
    ("2290.63" "38.4")
    ("2300" "33.95")
    ("2320" "28.97")
    ("2324.83" "31.97")
    ("2326.66" "34.45")
    ("2328.28" "36.29")
    ("2341.98" "72.47")
    ("2350.46" "154.06")
    ("2360" "209.08")
    ("2367.31" "213.07")
    ("2367.56" "363.71")
    ("2380" "246.21")
    ("2396.83" "137.69")
    ("2426.83" "120.43")
    ("2440" "156.94")
    ("2460" "277.61")
    ("2480" "342.13")
    ("2500" "397.07")
    ("2520" "403.51")
    ("2540" "434.98")
    ("2560" "413.54")
    ("2570.17" "333.85")
    ("2580" "208.77")
    ("2588.44" "133.38")
    ("2618.44" "5.38")
    ("2620" "3.01")
    ("2640" "7.52")
    ("2647.69" "13.8")
    ("2647.94" "2.23")
    ("2660" "2.25")
    ("2684.49" "47.37")
    ("2689.17" "59.8")
    ("2690.27" "62.99")
    ("2700" "107.24")
    ("2720.45" "139.16")
    ("2720.7" "234.94")
    ("2740" "254.46")
    ("2749.95" "148.6")
    ("2775.83" "17.05")
    ("2779.95" "36.57")
    ("2800" "252.63")
    ("2804" "320.96")
    ("2813.77" "361.81")
    ("2820" "302.33")
    ("2840" "94.56")
    ("2860" "23.53")
    ("2872.45" "179.8")
    ("2885.02" "404.33")
    ("2900" "473.66")
    ("2920" "461.43")
    ("2940" "468.95")
    ("2955.13" "444.92")
    ("2985.12" "467.78")
    ("3000" "432.53")
)
)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cũng chẳng có gì gọi là bí quyết cả, học cái gì cũng cần có sự đam mê thì mới khá được.

Mình cũng học hỏi ở người khác, thấy cái gì hay mình tìm hiểu và bắt chước, cộng thêm cái tư duy của mình.

Tôi cũng học hỏi được nhiều từ CadViet đấy chứ.

Nhiều khi viết cho người khác cũng làm mình phải động não và cũng đồng thời giúp cho công việc của mình.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Phiền bạn thêm một lần nữa (so sorry vì không đưa ra ngay từ đầu).

Vẫn phương án như trên nhưng trong trường hợp có 3 phần tử

(setq L1 ‘(

    ("1" "2.2" "1")

    ("2" "3.3" "3")

    ("3" "11" "2")

    ("4" "22" "1")

    ("5" "2" "2")

    ("6" "7" "1")

    ("7" "9" "2")

    ("8" "2" "4")

    ("9" "2.2" "5")

    ("10" "11" "1")

    ("12" "15" "1")

))

Nhờ các bạn giúp!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

- Đối với list có ba phần tử thì phần tử thứ 2 và 3 cũng cộng như phần đối với có 2 phần tử đã làm bạn à. Mình xin phép sửa lại một chút lisp bạn viết như trên. Kết quả chạy ra cũng tốt. Ban kiểm tra giúp mình xem có cần rút gọn hay chỉnh sửa gì không nhé!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

Đăng nhập để thực hiện theo  

×