prompts.chatprompts.chatprompts.chat
BotPromptKỹ năngQuy trìnhDanh mụcThẻCao thủ PromptPhong cách
SáchCho trẻ emNhà phát triển
Đăng nhập
CC0 2026 prompts.chat
DeepWikiHướng dẫn...Tài liệuAPIQuyền riêng tưĐiều khoảnHỗ trợGiới thiệuGitHub
Tất cả thẻ

Prompt Travel

66 prompt
Ngôi nhà Trang trại bằng Đá ở Cuối Luống Hoa oải hương tại Provence lúc Bình minh
Hình ảnh
Ngôi nhà Trang trại bằng Đá ở Cuối Luống Hoa oải hương tại Provence lúc Bình minh

Phong cảnh bình minh chân thực (photoreal): những luống hoa oải hương màu tím trải dài hội tụ dọc theo một lối đi bằng đất ở trung tâm hướng về phía ngôi nhà trang trại bằng đá hai tầng có mái ngói đất nung và cửa chớp màu xanh lam nhạt ở một phần ba bên phải khung hình, một cây bách cao vút bên cạnh, một cây sồi đơn độc ở bên trái, mặt trời ở vị trí thấp phía ngoài cùng bên trái, và những ngọn đồi màu xanh lam nhấp nhô. Bước 2 trong quy trình Trang trại Hoa oải hương Provence.

Những luống hoa oải hương màu tím thẳng tắp trải dài dẫn lối về phía một ngôi nhà trang trại bằng đá hai tầng cổ kính tại Provence lúc bình minh, được nhìn từ một góc máy thấp ở cuối lối đi bằng đất nằm chính giữa, trong khung hình ngang rộng tỷ lệ 16:9. Các luống hoa oải hương cắt tỉa tròn trịa lấp đầy toàn bộ nửa dưới của bức ảnh và hội tụ về phía trung cảnh, xen giữa chúng là những lối đi hẹp bằng đất nâu và một lối đi chạy thẳng dọc theo chính giữa. Ngôi nhà trang trại đứng ở một phần ba bên phải khung hình: những bức tường đá thô màu be, mái ngói đất nung màu nâu, những ô cửa sổ nhỏ có cửa chớp màu xanh lam nhạt, cùng những bụi cây xanh phía trước nhà. Một cây bách đơn độc cao vút màu xanh lục sẫm vươn lên ngay sát bên phải ngôi nhà. Ở khoảng trung cảnh phía bên trái, một cây sồi tán tròn màu xanh lục đứng đơn độc trên một gò cỏ thoai thoải. Mặt trời ở vị trí thấp nằm ngay phía trên những ngọn đồi ở ngoài cùng bên trái, tỏa ánh vàng rực rỡ kèm hiệu ứng quầng sáng ống kính dịu nhẹ và làn sương sớm mỏng manh, phủ ánh sáng ấm áp lên khắp ngọn của những luống hoa oải hương. Những ngọn đồi màu xanh lam nhấp nhô trải dài khắp đường chân trời, và một vài đám mây trắng nhỏ trôi bồng bềnh trên bầu trời xanh nhạt chuyển dần sang sắc hồng đào ấm áp ở gần mặt trời. Nhiếp ảnh phong cảnh chân thực (photoreal), góc rộng, màu sắc tự nhiên, tâm trạng thanh bình. Không có người, không có chữ, không có logo.
TravelWorkflowPhotography+3
F@f
0
Trình xây dựng Bản tóm tắt Ý tưởng Bối cảnh Trang trại Hoa oải hương Provence
Văn bản

Xây dựng một bản tóm tắt bối cảnh sẵn sàng cho việc tạo ảnh và tạo chuyển động cho một cảnh quay chủ đạo (hero shot) về ngôi nhà trang trại bằng đá cổ kính ở cuối những luống hoa oải hương tím biếc tại Provence lúc bình minh: ngôi nhà trang trại và cây cối, các luống hoa oải hương, chiều sâu phong cảnh, ánh sáng, các chi tiết cố định, sơ đồ chuyển động và hai prompt hạt giống (seed): một bức ảnh tĩnh tỷ lệ 16:9 và một hoạt cảnh chuyển đổi từ ảnh sang video.

Hãy đóng vai một nhà thiết kế bối cảnh phong cảnh điện ảnh chuyên viết các bản tóm tắt bối cảnh sẵn sàng cho việc tạo ảnh và tạo chuyển động (image-ready và motion-ready). Hãy giúp tôi thiết kế một cảnh quay chủ đạo (hero shot) về một ngôi nhà trang trại bằng đá cổ kính nằm ở cuối những luống hoa oải hương màu tím trải dài tại vùng Provence lúc bình minh. Cảnh quay này trước tiên sẽ được tạo ra dưới dạng một bức ảnh tĩnh và sau đó được tạo chuyển động thành một đoạn video ngắn sử dụng chính bức ảnh đó làm khung hình đầu tiên. Bản tóm tắt của bạn phải làm cho bức ảnh tĩnh giàu các yếu tố có thể chuyển động một cách tự nhiên (các luống hoa oải hương đung đưa trong làn gió nhẹ, sương sớm trôi qua những ngọn đồi, ánh sáng của mặt trời lúc mới mọc từ từ rực lên, những đám mây nhỏ trôi nhẹ, đàn ong bay trên mặt hoa, một hoặc hai chú chim bay ngang bầu trời) đồng thời vẫn giữ cho bố cục sự yên bình, rõ ràng và dễ tạo chuyển động.

Các lựa chọn khởi đầu của tôi:
- Ngôi nhà trang trại: a two-story old stone farmhouse with a terracotta tile roof and pale blue shutters
- Cây cối: one tall dark cypress right beside the house and a lone round oak tree on a grassy rise
- Cánh đồng hoa oải hương: long straight rows of purple lavender with dirt paths between them, converging toward the house
- Phong cảnh: gentle rolling hills fading to blue in the distance
- Thời gian và ánh sáng: sunrise with the sun just above the hills, warm golden light, long shadows, light haze
- Phong cách hình ảnh: photoreal landscape photography, natural colors
- Các từ khóa tâm trạng (Mood words): peaceful, warm, fragrant, timeless

Trước tiên, hãy hỏi tôi trong một tin nhắn ngắn gọn về bất kỳ thông tin nào còn thiếu: vị trí đặt máy quay mà tôi ưa thích (đặt thấp ở cuối một luống hoa oải hương, ngang tầm mắt người đứng trên lối đi, hay hơi nâng cao một chút), ngôi nhà trang trại và cây sồi nên nằm ở phía bên nào của khung hình, mặt trời nên ở đâu, tôi muốn có bao nhiêu sương mù, và bất kỳ yếu tố nào cần tránh (con người, xe hơi, máy kéo, hàng rào, biển báo, những chú chim đòi hỏi chuyển động vỗ cánh phức tạp, chữ viết, logo, hoặc việc sao chép một bức ảnh chụp có thật cụ thể).

Sau đó, hãy lập bản tóm tắt với các phần sau đây:

1. **Tổng quan Bối cảnh (Scene Overview)**: hai hoặc ba câu mô tả địa điểm, thời gian, ánh sáng và cảm xúc của khoảnh khắc đó. Hãy mô tả một khung cảnh Provence tưởng tượng mang đậm tinh thần của vùng đất này, chứ không phải bản sao của một bức ảnh cụ thể hay một trang trại có tên tuổi ngoài đời thực.

2. **Ngôi nhà Trang trại và Cây cối (Farmhouse and Trees)**: vị trí và kích thước của ngôi nhà trang trại trong khung hình, những bức tường đá, mái nhà, cửa chớp, cửa sổ và những bụi cây xung quanh nó, cây bách và cây sồi cùng vị trí chúng đứng, và cách ánh mặt trời ở vị trí thấp chiếu sáng từng chi tiết đó.

3. **Các luống Hoa oải hương và Tiền cảnh (Lavender Rows and Foreground)**: số lượng luống hoa nhìn thấy được, lối đi ở trung tâm, cách các luống hoa hội tụ về phía điểm tụ (vanishing point), màu sắc của những bông hoa dưới ánh nắng và trong bóng râm, cùng kết cấu của những cành hoa gần nhất.

4. **Phong cảnh và Chiều sâu (Landscape and Depth)**: các lớp chiều sâu tính từ thảm hoa oải hương ở tiền cảnh cho đến ngôi nhà trang trại, cây sồi trên gò đất cao, thảm thực vật xanh ở trung cảnh, những ngọn đồi nơi đường chân trời, và cách làn sương mù làm dịu đi từng lớp cảnh vật.

5. **Ánh sáng và Bầu trời (Light and Sky)**: vị trí và độ cao của mặt trời, quầng sáng và sắc ấm trên ống kính xung quanh mặt trời, dải chuyển màu (gradient) của bầu trời, hình dáng và vị trí của những đám mây, chiều dài và hướng của các bóng đổ dọc theo các luống hoa.

6. **Các Chi tiết Hình ảnh Cố định (Fixed Visual Details)**: một danh sách đánh số gồm 8 đến 10 chi tiết bắt buộc phải giữ nguyên giống hệt nhau trong cả bức ảnh tĩnh và trong video (vị trí ngôi nhà trang trại, màu mái nhà và cửa chớp, vị trí cây bách, vị trí cây sồi, hướng của các luống hoa và lối đi trung tâm, vị trí mặt trời, đường chân trời, bố cục đám mây, vị trí máy quay, khung hình).

7. **Sơ đồ Chuyển động (Motion Map)**: một bảng liệt kê mọi yếu tố có thể chuyển động trong video, với các cột: yếu tố, kiểu chuyển động, hướng, tốc độ (rất chậm, chậm, trung bình), và mức độ chuyển động mạnh hay nhẹ. Bao gồm hoa oải hương, làn sương, quầng sáng mặt trời, mây, cây cối, đàn ong hoặc chim chóc, và chuyển động của máy quay. Giữ cho tổng thể chuyển động tinh tế và hợp lý về mặt vật lý, với một hướng gió duy nhất.

8. **Prompt Hạt giống A - Ảnh Tĩnh Chủ đạo (Prompt Seed A - Hero Still Image)**: một prompt tạo ảnh sẵn sàng để sao chép-dán dưới 170 từ cho khung hình ngang rộng tỷ lệ 16:9, có nhắc đến các luống hoa oải hương, ngôi nhà trang trại bằng đá và cảnh bình minh ngay trong câu đầu tiên, kết thúc bằng cụm từ: no people, no text, no logos.

9. **Prompt Hạt giống B - Hoạt cảnh Chuyển đổi từ Ảnh sang Video (Prompt Seed B - Image-to-Video Animation)**: một prompt tạo video sẵn sàng để sao chép-dán dưới 120 từ bắt đầu từ bức ảnh tĩnh chủ đạo làm khung hình đầu tiên, mô tả hoa oải hương đung đưa, làn sương trôi nhẹ, quầng sáng rực lên, những đám mây nhỏ trôi, một chuyển động máy quay tiến vào (push-in) rất chậm dọc theo luống hoa trung tâm trong khoảng 6 giây, và dặn giữ nguyên ngôi nhà trang trại, cây cối, các luống hoa cùng khung hình giống hệt như trong ảnh mà không xuất hiện thêm vật thể mới nào.

Quy tắc: không có người, phương tiện giao thông hay máy móc nông nghiệp; không có chữ viết, biển báo hay logo; không có chuyển động máy quay nhanh hay cắt cảnh; và không có chuyển động nào phá vỡ quy luật vật lý (tất cả cây cối đều nghiêng theo cùng một chiều gió, ngôi nhà và các thân cây lớn không bao giờ dịch chuyển hay biến dạng, mặt trời không nhảy cóc, bóng đổ luôn nhất quán với vị trí mặt trời). Hãy sử dụng các đoạn văn ngắn và danh sách.
TravelPlanningImage To Video+2
F@f
0
Video
Trang trại Hoa oải hương Provence lúc Bình minh (Hoạt cảnh Chuyển đổi từ Ảnh sang Video)

Tạo chuyển động cho bức ảnh trang trại hoa oải hương ở bước 2 làm khung hình đầu tiên thành một cảnh quay êm đềm dài 6 giây: hoa oải hương đung đưa trong làn gió nhẹ, máy quay tiến từ từ dọc theo luống hoa trung tâm về phía ngôi nhà đá, ánh nắng rực sáng dần, làn sương mỏng trôi nhẹ, những chú chim nhỏ bay ngang bầu trời và đàn ong lượn lờ trên các luống hoa. Bước 3 trong quy trình Trang trại Hoa oải hương Provence.

Bắt đầu từ bức ảnh ở bước 2 "Ngôi nhà Trang trại bằng Đá ở Cuối Luống Hoa oải hương tại Provence lúc Bình minh" ("Stone Farmhouse at the End of Lavender Rows in Provence at Sunrise") làm khung hình đầu tiên chính xác tuyệt đối, và tạo chuyển động cho nó thành một cảnh quay điện ảnh êm đềm dài 6 giây. Giữ nguyên ngôi nhà trang trại bằng đá với mái ngói đất nung và những cánh cửa chớp màu xanh lam nhạt ở một phần ba bên phải khung hình, cây bách cao vút bên cạnh, cây sồi đơn độc ở bên trái, các luống hoa oải hương hội tụ cùng lối đi ở giữa, mặt trời ở vị trí thấp phía ngoài cùng bên trái, đường chân trời và bố cục giống hệt như trong bức ảnh. Một làn gió nhẹ làm các luống hoa oải hương đung đưa dịu dàng, tất cả đều nghiêng theo cùng một hướng. Máy quay thực hiện chuyển động tiến vào (push-in) rất chậm rãi và ổn định dọc theo luống hoa trung tâm hướng về phía ngôi nhà trang trại. Ánh sáng vàng rực của mặt trời từ từ sáng lên và làn sương mai mỏng manh trôi nhẹ qua những ngọn đồi phía bên trái. Một vài chú chim nhỏ bay ngang qua bầu trời từ phải sang trái phía trên ngôi nhà, một vài chú ong lượn lờ trên thảm hoa oải hương ở tiền cảnh, và những đám mây trắng nhỏ trôi nhẹ. Chuyển động tự nhiên, chân thực, không cắt cảnh, không có người, không thêm tòa nhà hay vật thể mới, không có chữ. Âm thanh êm dịu của làn gió nhẹ, tiếng chim hót từ xa và tiếng ong vo ve.
TravelVideo GenerationImage To Video+2
F@f
0
Trình Xây dựng Kế hoạch Hậu cần Khách mời Đám cưới (YAML)
Văn bản

Chuyển đổi ngày cưới, địa điểm tổ chức và danh sách khách mời của bạn thành bản kế hoạch hậu cần khách mời định dạng YAML: các trường thông tin xác nhận tham dự (RSVP) và kế hoạch nhắc phản hồi, phân nhóm khách mời, đặt giữ khối phòng khách sạn, lịch đón khách và các chuyến xe trung chuyển, bộ quà tặng chào mừng, theo dõi suất ăn và chế độ ăn kiêng, quy tắc xếp chỗ ngồi, nhu cầu hỗ trợ tiếp cận và gia đình, lịch trình truyền thông, luồng đón tiếp khách trong ngày cưới, phương án dự phòng và người phụ trách từng đầu việc.

1role: Điều phối viên hậu cần đám cưới ấm áp, tỉ mỉ, người giúp các cặp đôi và gia đình đảm bảo mọi khách mời đều được gửi thiệp mời, sắp xếp chỗ ở, đưa đón, xếp chỗ ngồi, phục vụ ăn uống và cập nhật thông tin đầy đủ đúng giờ, để kỳ nghỉ cuối tuần diễn ra đám cưới suôn sẻ và không một ai bị bỏ rơi hay lúng túng
2task: >
3 Chuyển đổi thông tin chi tiết đám cưới, tóm tắt danh sách khách mời và các địa điểm tổ chức của tôi thành một kế hoạch hậu cần khách mời hoàn chỉnh dưới định dạng YAML:
4 kế hoạch thu thập dữ liệu khách mời và xác nhận tham dự (RSVP), bảng phân nhóm khách mời, các bước sắp xếp chỗ ở và giữ khối phòng khách sạn (room block), lịch trình di chuyển
5 và xe trung chuyển (shuttle), đề cương bộ quà tặng chào mừng và cẩm nang thông tin, theo dõi suất ăn và chế độ ăn kiêng, quy tắc
6 xếp sơ đồ chỗ ngồi, nhu cầu hỗ trợ tiếp cận và gia đình, lịch trình gửi thông báo từ thiệp báo hỷ (save-the-dates) cho đến ngày
7 hôm sau đám cưới, luồng di chuyển của khách trong ngày cưới, và kế hoạch dự phòng cho thời tiết xấu, sự cố chậm trễ và khách vắng mặt.
8
9inputs:
10 wedding_date: ${wedding_date:a Saturday in mid-June}
...+112 dòng nữa
TravelPlanningYAML+3
F@f
0
Ảnh Chụp Chân thực Chiếc Thuyền Kayak Vàng trên Vịnh Phát quang Sinh học Dưới Dải Ngân Hà
Hình ảnh
Ảnh Chụp Chân thực Chiếc Thuyền Kayak Vàng trên Vịnh Phát quang Sinh học Dưới Dải Ngân Hà

Ảnh chụp đêm phơi sáng dài chân thực: một chiếc thuyền kayak biển màu vàng trống không nằm ở chính giữa vịnh nhiệt đới phẳng lặng, những vệt phát quang sinh học màu xanh điện xoáy tròn phía sau thuyền hướng về góc dưới bên trái, bờ rừng ngập mặn tối sẫm ở bên trái, Dải Ngân Hà uốn cong phía trên góc phải, và một vài đốm sáng nhỏ xíu ở đường chân trời xa xa.

Một bức ảnh chụp ban đêm chân thực khắc họa một chiếc thuyền kayak biển màu vàng trống không đang trôi nổi trên vịnh nhiệt đới phẳng lặng phát sáng rực rỡ bởi các sinh vật phù du phát quang sinh học màu xanh điện (electric-blue), ngay bên dưới Dải Ngân Hà, trong khung hình ngang rộng tỷ lệ 16:9. Chiếc thuyền kayak dài màu vàng nằm ở chính giữa khung hình, mũi thuyền chếch về phía góc trên bên phải, với các nắp hầm boong tàu hình tròn màu đen, khoang ngồi mở tối màu và các sợi dây chằng mảnh trên boong; không có mái chèo và không có người. Phía sau và xung quanh chiếc thuyền, những vệt sáng phát quang màu xanh điện rực rỡ xoáy tròn và lan tỏa khắp mặt nước tối sẫm hướng về phía góc dưới bên trái, tựa như những dải ruy băng ánh sáng được khuấy lên dọc theo đường thuyền trôi qua. Bóng đen của hàng cây rừng ngập mặn chạy dọc theo bờ biển bên trái, bộ rễ chằng chịt của chúng lộ ra ngay trên ngấn nước, thuôn nhỏ dần về phía đường chân trời thấp gần chính giữa bức ảnh. Dải Ngân Hà uốn vòng cung qua góc trên bên phải của bầu trời với những dải bụi vũ trụ mềm mại và ánh sáng dịu nhẹ, nổi bật trên nền trời đêm xanh tím than thẫm dày đặc những vì sao nhỏ li ti. Mặt nước phẳng lặng như gương và tối thẫm, in bóng những ánh sao mờ ảo cùng những gợn sóng lăn tăn dịu nhẹ, và một vài đốm sáng ấm áp nhỏ xíu lấp lánh nơi đường chân trời xa tắp ở phía bên phải. Phong cách nhiếp ảnh thiên văn phơi sáng dài, ống kính góc rộng, chi tiết sắc nét, màu sắc tự nhiên, bầu không khí tĩnh lặng và kỳ diệu. Không có người, không có chữ.
TravelPhotographyVisual+2
F@f
0
Trình Xây dựng Bản mô tả Ý tưởng Cảnh Kênh đào Cối xay gió Hà Lan
Văn bản

Xây dựng bản mô tả chi tiết sẵn sàng tạo ảnh và tạo chuyển động cho một cảnh quay chủ đạo (hero shot) về những chiếc cối xay gió bằng gạch dọc theo con kênh vùng đất lấn biển Hà Lan thẳng tắp, êm đềm lúc bình minh: cối xay gió, bóng phản chiếu trên kênh, hai bên bờ và chiếc thuyền chèo, chiều sâu phong cảnh, ánh sáng, các chi tiết cố định, sơ đồ chuyển động và hai câu lệnh (prompt) gốc: một ảnh tĩnh tỷ lệ 16:9 và một hoạt ảnh chuyển từ ảnh sang video.

Hãy đóng vai một nhà thiết kế bối cảnh phong cảnh điện ảnh chuyên viết các bản mô tả cảnh quay (scene brief) sẵn sàng để tạo ảnh tĩnh và tạo chuyển động video. Hãy giúp tôi thiết kế một cảnh quay chủ đạo (hero shot) khắc họa những chiếc cối xay gió truyền thống bằng gạch đứng dọc theo một con kênh vùng đất lấn biển (polder) Hà Lan thẳng tắp, êm đềm lúc bình minh. Cảnh này trước tiên sẽ được tạo ra dưới dạng một bức ảnh tĩnh và sau đó được làm hoạt ảnh thành một đoạn video ngắn sử dụng chính bức ảnh đó làm khung hình đầu tiên. Bản mô tả của bạn phải làm cho bức ảnh tĩnh giàu các yếu tố có thể chuyển động một cách tự nhiên (cánh buồm cối xay gió quay chậm rãi, bóng phản chiếu như gương lấp lánh trên mặt kênh, lau sậy đung đưa nơi mép nước, làn sương sớm là là trên đồng cỏ, ánh bình minh dịu nhẹ) trong khi vẫn giữ cho bố cục tĩnh tại, rõ ràng và dễ làm hoạt ảnh.

Các lựa chọn ban đầu của tôi:
- Cối xay gió: five round tapered brick windmills with dark caps and wooden lattice sails, standing in a row along one bank
- Kênh đào: a long straight canal with still, mirror-like water receding to a vanishing point
- Hai bên bờ: grass and reeds on both sides, a narrow dirt path along a grassy dike on the opposite bank
- Chi tiết tiền cảnh: a small dark wooden rowboat moored at the water's edge
- Phong cảnh: flat green meadows with low mist and a distant line of trees
- Thời gian và ánh sáng: sunrise, soft pink, lilac, and gold sky with a warm glow near the horizon
- Phong cách hình ảnh: photoreal landscape photography, natural colors
- Các từ chỉ cảm xúc (Mood): peaceful, quiet, timeless, fresh

Trước tiên, hãy hỏi tôi trong một tin nhắn ngắn gọn về bất kỳ thông tin nào còn thiếu: vị trí đặt máy quay mà tôi muốn (thấp sát mép nước, ngang tầm mắt người đứng trên bờ, hay hơi cao hơn một chút), các cối xay gió nên đứng ở bờ bên nào, cối xay gió gần nhất nên nằm gần đến mức nào, quầng sáng bình minh nên đặt ở đâu, tôi muốn độ dày của sương mù ra sao, và những thứ cần tránh xuất hiện (con người, người đi xe đạp, thuyền đang chạy, ô tô, tua-bin gió hiện đại, đường dây điện, biển báo, chữ viết, logo, hoặc việc sao chép lại một bức ảnh chụp có thật cụ thể).

Sau đó, hãy lập bản mô tả bao gồm các phần sau:

1. **Tổng quan Cảnh quay (Scene Overview)**: hai hoặc ba câu mô tả địa điểm, thời gian, ánh sáng và cảm xúc của khoảnh khắc đó. Hãy mô tả một khung cảnh vùng đất lấn biển tưởng tượng mang đậm tinh thần Hà Lan, chứ không phải bản sao của một bức ảnh cụ thể hay một địa danh có tên thật.

2. **Cối xay gió (Windmills)**: có bao nhiêu cối xay gió, chúng đứng ở bờ nào, kích thước của chiếc gần nhất trong khung hình, phần thân gạch, chóp mái, các ô cửa sổ nhỏ, cánh buồm mắt cáo và góc nghiêng của cánh buồm, cấu trúc đuôi gỗ hoặc khung cột chống, và cách ánh sáng góc thấp chiếu lên chúng.

3. **Kênh đào và Bóng phản chiếu (Canal and Reflections)**: đường dẫn của con kênh hướng về điểm tụ, độ tĩnh lặng của mặt nước, những hình khối nào được phản chiếu xuống mặt nước, và màu sắc bầu trời hiện lên dưới làn nước ra sao.

4. **Hai bên bờ và Tiền cảnh (Banks and Foreground)**: đám lau sậy và thảm cỏ ở mỗi bên bờ, lối mòn trên đê, chiếc thuyền chèo đang neo đậu cùng sợi dây thừng, và bề mặt chất liệu của những bụi cây gần ống kính nhất.

5. **Phong cảnh và Chiều sâu (Landscape and Depth)**: các lớp chiều sâu không gian tính từ chiếc thuyền và bụi lau sậy ở tiền cảnh đến chiếc cối xay gió gần nhất, hàng cối xay gió lùi dần ở phía sau, những cánh đồng cỏ, cho tới hàng cây xa tắp nơi chân trời, cùng cách làn sương mù làm dịu đi từng lớp cảnh.

6. **Ánh sáng và Bầu trời (Light and Sky)**: vị trí của quầng sáng bình minh, dải chuyển màu (gradient) của bầu trời từ tím tử đinh hương sang hồng rồi vàng kim, hình dáng của những dải mây mỏng, và độ mềm mại của bóng đổ.

7. **Các Chi tiết Hình ảnh Cố định (Fixed Visual Details)**: một danh sách đánh số từ 8 đến 10 chi tiết bắt buộc phải giữ nguyên giống hệt nhau giữa bức ảnh tĩnh và đoạn video (số lượng và bờ đặt cối xay gió, vị trí và góc cánh buồm của cối xay gió gần nhất, đường kẻ của con kênh, vị trí thuyền chèo, lối mòn trên đê, đường chân trời, vị trí quầng sáng, bố cục mây, vị trí máy quay, khung hình).

8. **Sơ đồ Chuyển động (Motion Map)**: một bảng liệt kê mọi yếu tố có thể chuyển động trong video, bao gồm các cột: yếu tố, kiểu chuyển động, hướng, tốc độ (rất chậm, chậm, trung bình), và cường độ chuyển động. Bao gồm cánh buồm của từng cối xay gió, bóng phản chiếu, lau sậy, sương mù, ánh sáng, chiếc thuyền chèo và chuyển động của máy quay. Giữ cho tổng thể chuyển động tinh tế và hợp lý về mặt vật lý, thống nhất một hướng gió duy nhất và tất cả các cánh buồm đều quay cùng một chiều.

9. **Prompt Gốc A - Ảnh Tĩnh Chủ đạo (Prompt Seed A - Hero Still Image)**: một câu lệnh tạo ảnh hoàn chỉnh sẵn sàng sao chép và dán, dài dưới 170 từ cho khung hình ngang rộng tỷ lệ 16:9, nêu bật hình ảnh những chiếc cối xay gió, con kênh và ánh bình minh ngay trong câu đầu tiên, kết thúc bằng cụm từ: không có người, không có chữ, không có logo (no people, no text, no logos).

10. **Prompt Gốc B - Hoạt ảnh từ Ảnh sang Video (Prompt Seed B - Image-to-Video Animation)**: một câu lệnh tạo video hoàn chỉnh sẵn sàng sao chép và dán, dài dưới 120 từ, bắt đầu từ bức ảnh tĩnh chủ đạo làm khung hình đầu tiên, mô tả cánh buồm quay chậm rãi, bóng phản chiếu lấp lánh, lau sậy đung đưa, một chuyển động máy quay đẩy nhẹ (push-in) cực kỳ chậm dọc theo con kênh trong khoảng 6 giây, và yêu cầu giữ nguyên các cối xay gió, con kênh, hai bên bờ, chiếc thuyền cùng khung hình giống hệt như trong ảnh mà không sinh thêm vật thể mới.

Quy tắc: không có người, không có động vật đòi hỏi chuyển động phức tạp, không có phương tiện giao thông hay tua-bin hiện đại; không có chữ viết, biển báo hay logo; không chuyển động máy quay nhanh hoặc cắt cảnh; và không có chuyển động nào vi phạm quy luật vật lý (cánh buồm quay quanh trục giữa mà không bị biến dạng, công trình kiến trúc không bao giờ dịch chuyển, bóng phản chiếu đi theo đúng vật thể phía trên, ánh sáng không bị nhảy đột ngột). Hãy trình bày bằng các đoạn văn ngắn và danh sách gạch đầu dòng.
TravelPlanningImage To Video+2
F@f
0
Năm Cối xay gió bằng Gạch Dọc theo Kênh đào Hà Lan Mờ sương lúc Bình minh
Hình ảnh
Năm Cối xay gió bằng Gạch Dọc theo Kênh đào Hà Lan Mờ sương lúc Bình minh

Phong cảnh bình minh chân thực như ảnh chụp: năm cối xay gió bằng gạch với chóp tối màu và cánh buồm mắt cáo xếp thành một hàng dọc bờ trái của con kênh vùng đất lấn biển (polder) thẳng tắp, phẳng lặng như gương, chiếc gần nhất hiện lên to lớn ở bên trái kèm khung gỗ chống đuôi, một chiếc thuyền chèo nhỏ bằng gỗ buộc neo ở góc dưới bên trái, lối mòn trên đê cỏ cùng lau sậy ở bên phải, làn sương sớm là là trên đồng cỏ, và bầu trời sắc hồng, tím tử đinh hương pha vàng kim. Bước 2 trong quy trình Kênh đào Cối xay gió Hà Lan.

Năm cối xay gió truyền thống bằng gạch đứng thành một hàng dọc theo bờ bên trái của một con kênh vùng đất lấn biển (polder) Hà Lan dài, thẳng tắp và phẳng lặng lúc bình minh, nhìn từ góc máy thấp ngay sát mép nước, trong khung hình ngang rộng tỷ lệ 16:9. Cối xay gió gần nhất hiện lên to lớn ở một phần ba bên trái khung hình: phần thân xây bằng gạch nâu dáng tròn thuôn dần lên trên với những ô cửa sổ nhỏ, phần chóp mái tối màu, và bốn cánh buồm khung gỗ mắt cáo xếp thành hình chữ X nghiêng, cùng phần đuôi gỗ dài và các cột chống xiên xuống mặt đất ở phía bên trái của nó. Bốn cối xay gió còn lại lùi dần dọc theo cùng bờ bên trái hướng về điểm tụ gần chính giữa khung hình, mỗi chiếc nhỏ dần và mờ ảo hơn trong làn sương. Con kênh chạy thẳng tắp về phía xa với mặt nước phẳng như gương phản chiếu hình ảnh những chiếc cối xay gió và bầu trời. Ở góc dưới bên trái, một chiếc thuyền chèo nhỏ bằng gỗ sẫm màu được neo đậu giữa đám lau sậy xanh mướt, buộc bằng một sợi dây thừng. Ở bờ bên phải, một con đê phủ cỏ với những bụi lau sậy cao dọc mép nước và một lối mòn nhỏ bằng đất chạy dài về phía xa, cạnh một đồng cỏ bằng phẳng phủ làn sương sớm là là và một hàng cây mờ nhạt ở tận chân trời. Bầu trời rực sáng sắc tím tử đinh hương, hồng và vàng kim dịu nhẹ cùng những dải mây mỏng kéo thành vệt, sáng rực nhất ở gần đường chân trời ngay chếch về bên phải tâm ảnh. Nhiếp ảnh phong cảnh chân thực, ống kính góc rộng, màu sắc tự nhiên, bầu không khí thanh bình. Không có người, không có chữ, không có logo.
TravelWorkflowPhotography+3
F@f
0
Video
Kênh đào Cối xay gió Hà Lan lúc Bình minh (Hoạt ảnh từ Ảnh sang Video)

Tạo chuyển động cho bức ảnh kênh đào cối xay gió Hà Lan ở bước 2 làm khung hình đầu tiên thành một cảnh quay êm đềm dài 6 giây: cánh buồm mắt cáo của cối xay gió gần nhất quay rõ ràng trong khi những cánh buồm ở xa cũng quay theo, máy quay tiến chậm rãi dọc theo kênh đào, bóng phản chiếu lấp lánh, lau sậy đung đưa, chiếc thuyền chèo buộc neo đứng yên, và ánh bình minh sắc hồng pha vàng dịu nhẹ giữ nguyên. Bước 3 trong quy trình Kênh đào Cối xay gió Hà Lan.

Bắt đầu từ bức ảnh ở bước 2 "Năm Cối xay gió bằng Gạch Dọc theo Kênh đào Hà Lan Mờ sương lúc Bình minh" làm khung hình đầu tiên chính xác, và tạo chuyển động cho nó thành một cảnh quay điện ảnh êm đềm dài 6 giây. Giữ nguyên năm cối xay gió bằng gạch ở bờ bên trái, cối xay gió lớn gần nhất ở một phần ba bên trái với khung gỗ chống đuôi, con kênh chạy thẳng tắp, chiếc thuyền chèo buộc neo ở góc dưới bên trái, lối mòn trên đê cỏ và đám lau sậy ở bờ bên phải, đồng cỏ mờ sương, đường chân trời và bố cục giống hệt như trong ảnh. Trong làn gió nhẹ, những cánh buồm mắt cáo của cối xay gió gần nhất quay chậm rãi và rõ nét quanh trục giữa, và những cánh buồm của các cối xay gió phía xa cũng quay theo, tất cả cùng quay theo một chiều. Máy quay thực hiện chuyển động đẩy nhẹ (push-in) cực kỳ chậm rãi và ổn định dọc theo con kênh hướng về phía điểm tụ. Bóng phản chiếu như gương trên mặt kênh lấp lánh dịu nhẹ, những bụi lau sậy dọc hai bên bờ đung đưa khe khẽ, và chiếc thuyền chèo vẫn đứng yên tại chỗ neo. Ánh sáng giữ nguyên sắc hồng và vàng dịu nhẹ của buổi bình minh. Chuyển động tự nhiên, chân thực, không cắt cảnh, không có người, không xuất hiện thêm tòa nhà hay vật thể mới, không có chữ. Âm thanh dịu êm của làn gió nhẹ, tiếng cánh buồm gỗ kẽo kẹt và tiếng chim hót từ xa.
TravelVideo GenerationImage To Video+2
F@f
0
Trình Lập Kế hoạch Cắm trại Cuối tuần cho Gia đình (YAML)
Văn bản

Chuyển đổi thông tin gia đình, khu cắm trại, ngày đi và dụng cụ của bạn thành bản kế hoạch cắm trại cuối tuần định dạng YAML: đặt chỗ và các quy định cần xác nhận, an toàn về thời tiết, sông nước, lửa trại và phòng tránh trẻ đi lạc, danh sách đồ dùng cần mang theo từng danh mục kèm trạng thái đã có, mượn, thuê hoặc mua, sơ đồ dựng trại, thực đơn thân thiện với trẻ nhỏ và kế hoạch sắp xếp thùng đá, lịch trình hàng ngày xoay quanh giờ ngủ trưa kèm phương án dự phòng ngày mưa, mẹo giúp trẻ ngủ ngon, phân công việc cho các thành viên, quy trình thu dọn không để lại dấu vết (leave-no-trace), và phần đánh giá sau chuyến đi.

1role: Người lập kế hoạch cắm trại gia đình thân thiện, luôn đề cao sự an toàn, chuyên giúp các bậc phụ huynh tổ chức kỳ nghỉ cuối tuần thư giãn tại khu cắm trại cùng con nhỏ, từ khâu đặt chỗ và chuẩn bị hành lý đến bữa ăn, giấc ngủ, hoạt động vui chơi và nguyên tắc không để lại dấu vết, giúp chuyến đi vừa vui vẻ cho các bé vừa nhẹ nhàng, dễ quán xuyến cho người lớn
2task: >
3 Chuyển đổi thông tin gia đình, điểm đến, ngày đi và dụng cụ của tôi thành một bản kế hoạch cắm trại cuối tuần
4 hoàn chỉnh cho gia đình dưới định dạng YAML: tóm tắt chuyến đi kèm mức độ sẵn sàng và các rủi ro, danh sách kiểm tra
5 đặt chỗ và giấy phép, kế hoạch thời tiết và an toàn, danh sách đồ dùng chung và cá nhân theo từng danh mục, kế hoạch
6 dựng trại, thực đơn đơn giản kèm chiến lược sắp xếp thùng đá và bảo quản thực phẩm, lịch trình thân thiện với trẻ nhỏ
7 cho từng ngày có thời gian nghỉ ngơi yên tĩnh và ý tưởng dự phòng cho ngày mưa, mẹo giữ ấm và giúp trẻ ngủ ngon,
8 phân công công việc cho từng thành viên trong gia đình, danh sách kiểm tra thu dọn và không để lại dấu vết, cùng phần
9 đánh giá ngắn gọn sau chuyến đi.
10
...+114 dòng nữa
TravelPlanningYAML+3
F@f
0
Tranh Màu nước Phóng khoáng vẽ Thuyền Gondola ở Venice trên Kênh đào Lớn lúc Bình minh
Hình ảnh
Tranh Màu nước Phóng khoáng vẽ Thuyền Gondola ở Venice trên Kênh đào Lớn lúc Bình minh

Tranh màu nước phóng khoáng trên giấy có vân: ba chiếc thuyền gondola màu đen có bạt phủ neo đậu bên cạnh những cột buộc thuyền kẻ sọc đỏ trắng trên Kênh đào Lớn (Grand Canal) lúc bình minh, bóng dáng một vương cung thánh đường mái vòm phong cách Baroque và những cung điện mờ ảo cùng tháp chuông bên kia mặt nước, bầu trời sắc hồng đào và tím oải hương dịu nhẹ, cùng những bóng phản chiếu màu tím và hồng đứt quãng trên mặt nước tĩnh lặng.

Một bức tranh màu nước phóng khoáng, giàu chất thơ vẽ những chiếc thuyền gondola có bạt phủ đang neo đậu trên Kênh đào Lớn (Grand Canal) ở Venice lúc bình minh, trong khung hình ngang tỷ lệ 4:3 trên nền giấy vẽ màu nước ép lạnh (cold-press) có vân nổi. Ở góc dưới bên trái, ba chiếc thuyền gondola dài màu đen nằm sát cạnh nhau, được bọc trong lớp bạt phủ màu xám xanh sẫm, một chiếc có tấm bạt màu nâu vàng nhạt, mũi thuyền cong vút và vật trang trí bằng kim loại ở mũi của chiếc gondola đầu tiên vươn cao ở sát rìa ngoài cùng bên trái. Những cây cột gỗ buộc thuyền cao vút với các đường kẻ sọc xoắn ốc màu đỏ trắng và phần chóp nhọn nhỏ đứng trên mặt nước trải dọc khu vực giữa và bên phải khung hình, một số cột được nối với những chiếc thuyền gondola bằng dây thừng và dây xích chùng xuống. Bên kia kênh đào, đường chân trời mờ sương được vẽ mềm mại của những cung điện (palazzo) cổ kính trải dài về phía bên phải cùng một tháp chuông mảnh mai, và ở phía bên trái là một vương cung thánh đường lớn có mái vòm phong cách Baroque với các mái vòm nhỏ hơn và tháp đèn lồng, mang dáng dấp của nhà thờ Santa Maria della Salute, in bóng ngược sáng. Bầu trời rực lên những lớp màu loang (wash) dịu nhẹ sắc hồng đào, vàng mơ và tím oải hương cùng những đám mây trôi bồng bềnh. Mặt nước tĩnh lặng phản chiếu hình ảnh những cây cột, thuyền gondola và bầu trời bằng những nét cọ dọc đứt quãng mang sắc tím, hồng và trắng. Nhìn rõ nét cọ vẽ, hiệu ứng màu loang ướt trên nền ướt (wet-in-wet blooms), các hạt sắc tố lắng đọng (granulating pigments), đường viền mềm mại và nền giấy trắng ẩn hiện bên dưới. Cảm xúc buổi sớm mai yên bình, lãng mạn. Không có người, không có chữ viết, không có chữ ký.
TravelVisualArt+2
F@f
0
Trình Xây dựng Bản mô tả Ý tưởng Cảnh Lối đi Đom đóm trong Rừng Trúc
Văn bản

Biến một ý tưởng ngắn gọn thành bản mô tả sẵn sàng tạo ảnh và chuyển động cho một cảnh quay chủ đạo (hero shot) về lối đi lát đá bước chân xuyên qua rừng trúc cao lúc chạng vạng với đom đóm và cây cầu gỗ nhỏ: lối đi và dòng suối, tường trúc và tán lá, cây cầu, đom đóm, ánh sáng và sương mù, các chi tiết cố định, bản đồ chuyển động, cùng hai câu lệnh gốc (prompt seeds): một ảnh tĩnh 16:9 và một hoạt họa từ ảnh sang video.

Hãy đóng vai một nhà thiết kế bối cảnh điện ảnh chuyên viết các bản mô tả cảnh quay sẵn sàng để tạo ảnh tĩnh và tạo chuyển động. Hãy giúp tôi thiết kế một cảnh quay chủ đạo (hero shot) về một lối đi bộ yên tĩnh xuyên qua khu rừng trúc cao vút lúc chạng vạng, được thắp sáng bởi những chú đom đóm. Cảnh quay này trước tiên sẽ được tạo thành một bức ảnh tĩnh, sau đó được làm hoạt họa thành một đoạn video ngắn sử dụng chính bức ảnh đó làm khung hình đầu tiên. Bản mô tả của bạn phải làm cho bức ảnh tĩnh giàu các yếu tố có thể chuyển động tự nhiên (đom đóm bay lơ lửng và nhấp nháy, thân và lá trúc đung đưa, làn sương thấp cuộn trôi trên mặt đất, dòng suối nông lấp lánh, ánh sáng xanh cuối cùng của buổi chạng vạng) trong khi vẫn giữ được bố cục tĩnh lặng, đối xứng, dễ nhìn và dễ làm hoạt họa.

Ý tưởng ban đầu của tôi: a stone path between tall bamboo at dusk, with fireflies and a little wooden bridge

Các lựa chọn ban đầu của tôi:
- Lối đi: an old stepping-stone path running straight away from the camera toward the center of the frame
- Rừng trúc: tall, dense green bamboo stems rising on both sides, their tops closing into a canopy with a gap of sky in the middle
- Mặt nước: a shallow stream trickling down the middle of the path over stones
- Điểm nhấn trung tâm: a small arched wooden footbridge with railings crossing in the middle distance
- Đom đóm: many small glowing yellow-green fireflies scattered through the air and the undergrowth
- Bầu không khí: low mist hanging around the bridge and over the path
- Thời gian và ánh sáng: deep blue twilight just after sunset, a few clouds in the sky gap
- Phong cách hình ảnh: photoreal night landscape photography, natural colors
- Từ khóa cảm xúc: calm, magical, hushed, inviting

Trước tiên, hãy hỏi tôi trong một tin nhắn ngắn gọn về bất kỳ thông tin nào còn thiếu: độ cao của máy quay (thấp gần mặt đá, ngang tầm mắt người đứng, hay hơi nâng cao), mức độ căn giữa và đối xứng mà tôi mong muốn cho lối đi, độ sáng và số lượng đom đóm, lượng sương mù nhiều hay ít, cây cầu nên ở gần hay xa, và bất kỳ yếu tố nào cần tránh (con người, động vật, đèn lồng, công trình xây dựng, chữ viết, logo, hoặc việc sao chép một bức ảnh chụp có thật cụ thể hay một địa danh có tên tuổi).

Sau đó, hãy lập bản mô tả bao gồm các phần sau:

1. **Tổng quan Cảnh quay (Scene Overview)**: hai hoặc ba câu về địa điểm, khoảnh khắc, ánh sáng và cảm xúc chủ đạo. Hãy mô tả một khu rừng trúc tưởng tượng mang đậm tinh thần Đông Á, chứ không phải bản sao từ một bức ảnh cụ thể hay một rừng trúc nổi tiếng có thật ngoài đời.

2. **Lối đi và Dòng suối (Path and Stream)**: hình dáng và đường dẫn của những phiến đá bước chân hướng về điểm tụ, kết cấu bề mặt đá và lớp rêu, cách dòng suối nông chảy dọc theo lối đi từ dưới gầm cầu, và những vị trí mặt nước bắt sáng.

3. **Tường trúc và Tán lá (Bamboo Walls and Canopy)**: độ dày của thân trúc, khoảng cách và các đốt trúc ở mỗi bên, cách chúng vươn cao và nghiêng vào trong, tán lá phía trên, khoảng hở của bầu trời, cùng những bụi dương xỉ và thảm cỏ dưới chân trúc.

4. **Cây cầu đi bộ (The Footbridge)**: kích thước trong khung hình, hình dáng nhịp vòm, lan can gỗ, khoảng trống tối hơn bên dưới gầm cầu, và cách sương mù tụ lại xung quanh cầu.

5. **Đom đóm (Fireflies)**: mật độ, kích thước, màu sắc, cách chúng phân bổ trong không trung, dưới lớp cây bụi tầng thấp và qua các lớp chiều sâu không gian, cũng như cách ánh sáng của chúng nổi bật trên nền trúc tối mà không bị giống như những ngôi sao hay hạt bụi bokeh.

6. **Ánh sáng, Bầu trời và Sương mù (Light, Sky, and Mist)**: dải chuyển màu của bầu trời chạng vạng nơi khoảng hở tán lá, ánh sáng môi trường màu xanh lạnh, những điểm nhấn màu xanh lục ấm áp của đom đóm, các lớp sương mù và độ mềm mại của bóng đổ.

7. **Các Chi tiết Hình ảnh Cố định (Fixed Visual Details)**: danh sách đánh số từ 8 đến 10 chi tiết bắt buộc phải giữ nguyên giống hệt nhau giữa bức ảnh tĩnh và đoạn video (đường dẫn của lối đi, vị trí dòng suối, vị trí và hình dáng cây cầu, tường trúc ở hai bên, hình dáng khoảng hở bầu trời, các vùng sương mù, vị trí máy quay, khung hình, sự phân bổ tổng thể của đom đóm).

8. **Bản đồ Chuyển động (Motion Map)**: một bảng liệt kê mọi yếu tố có thể chuyển động trong video, bao gồm các cột: yếu tố, loại chuyển động, hướng chuyển động, tốc độ (rất chậm, chậm, trung bình), và cường độ chuyển động. Bao gồm đom đóm (trôi lơ lửng và nhấp nháy), thân và lá trúc, sương mù, dòng suối, ánh sáng và chuyển động của máy quay. Giữ cho tổng thể chuyển động tinh tế và hợp lý về mặt vật lý, với duy nhất một hướng gió thổi.

9. **Câu lệnh Gốc A - Ảnh tĩnh Chủ đạo (Prompt Seed A - Hero Still Image)**: một câu lệnh tạo ảnh sẵn sàng để dán (dưới 170 từ) cho khung hình ngang rộng tỷ lệ 16:9, nêu bật lối đi rừng trúc, đom đóm và cây cầu đi bộ lúc chạng vạng ngay trong câu đầu tiên, và kết thúc bằng: không có người, không có chữ viết, không có logo.

10. **Câu lệnh Gốc B - Hoạt họa từ Ảnh sang Video (Prompt Seed B - Image-to-Video Animation)**: một câu lệnh tạo video sẵn sàng để dán (dưới 120 từ) bắt đầu từ bức ảnh tĩnh chủ đạo làm khung hình đầu tiên, mô tả đom đóm bay lơ lửng và nhấp nháy, rừng trúc đung đưa nhẹ nhàng, sương mù cuộn trôi tầm thấp, dòng suối lấp lánh, một chuyển động máy quay trượt (dolly) tiến về phía trước cực kỳ chậm rãi dọc theo lối đi hướng tới cây cầu trong khoảng 6 giây, đồng thời dặn giữ nguyên lối đi, rừng trúc, cây cầu, bầu trời và bố cục khung hình giống hệt như trong ảnh mà không xuất hiện thêm vật thể mới nào.

Quy tắc: không có người, động vật, đèn lồng hoặc công trình xây dựng; không có chữ viết, biển hiệu hoặc logo; không chuyển động máy quay nhanh hoặc cắt cảnh; và không có chuyển động nào vi phạm quy luật vật lý (thân trúc uốn cong từ gốc chứ không bị kéo giãn, cây cầu và những phiến đá tuyệt đối đứng yên, đom đóm trôi chậm rãi chứ không tạo vệt sáng dài, ánh sáng không bị nhảy đột ngột). Hãy sử dụng các đoạn văn ngắn và danh sách liệt kê.
TravelPlanningImage To Video+2
F@f
0
Lối đi bộ trong Rừng Trúc với Đom đóm và Cây cầu gỗ lúc Chạng vạng
Hình ảnh
Lối đi bộ trong Rừng Trúc với Đom đóm và Cây cầu gỗ lúc Chạng vạng

Phong cảnh chạng vạng chân thực như ảnh chụp: một lối đi lát đá bước chân chạy thẳng về phía trước giữa những bức tường trúc cao vút hướng tới một cây cầu gỗ nhỏ hình vòm, một dòng suối nông chảy róc rách dọc chính giữa lối đi từ bên dưới gầm cầu, hàng trăm chú đom đóm màu vàng lục phát sáng trong không trung và bụi cây tầng thấp, làn sương mỏng lơ lửng quanh cây cầu, và bầu trời chạng vạng xanh thẫm hiện ra qua tán lá. Bước 2 trong quy trình Lối đi Đom đóm trong Rừng Trúc.

Một lối đi bộ lát đá bước chân yên tĩnh chạy thẳng về phía trước xuyên qua khu rừng trúc cao vút lúc chạng vạng, được thắp sáng bởi hàng trăm chú đom đóm phát sáng, hướng tới một cây cầu gỗ nhỏ hình vòm ở khoảng cách trung cảnh, được nhìn từ một góc máy thấp, căn giữa ngay tại điểm bắt đầu của lối đi, trong khung hình ngang rộng tỷ lệ 16:9. Những phiến đá bước chân lớn, phẳng màu xám dẫn lối từ chính giữa phía dưới khung hình hướng về phía cây cầu, với một dòng suối nông chảy róc rách dọc chính giữa lối đi qua những viên đá nhỏ, tuôn ra từ dưới gầm cầu và bắt lấy ánh sáng xanh nhạt. Những bức tường dày đặc gồm các thân trúc xanh cao mảnh khảnh với các đốt trúc rõ nét vươn lên ở cả hai bên và hơi nghiêng vào trong, phần ngọn nhiều lá của chúng đóng khung một khoảng hở hẹp của bầu trời chạng vạng xanh thẫm với những đám mây mềm mại ở chính giữa phía trên. Cây cầu gỗ nhỏ có độ cong nhẹ nhàng và lan can đơn giản, với khoảng trống màu nhạt bên dưới gầm cầu. Làn sương trắng thấp lơ lửng quanh cây cầu và trôi nhẹ qua lối đi cùng lớp cây cỏ tầng thấp. Nhiều chú đom đóm nhỏ xíu màu vàng lục phát sáng rải rác trong không trung, xen giữa những thân trúc, và phía trên những bụi dương xỉ, cỏ dại cùng những tảng đá phủ rêu dọc hai bên rìa lối đi. Bầu không khí chạng vạng màu xanh lạnh điểm xuyết sắc vàng lục ấm áp của đom đóm, nhiếp ảnh phong cảnh ban đêm chân thực, màu sắc tự nhiên, tâm trạng bình yên và huyền diệu. Không có người, không có chữ viết, không có logo.
TravelWorkflowPhotography+2
F@f
0
Video
Đom đóm trong Rừng Trúc lúc Chạng vạng (Hoạt họa từ Hình ảnh sang Video)

Chuyển thể bức ảnh lối đi bộ trong rừng trúc ở bước 2 làm khung hình đầu tiên thành một cảnh quay êm dịu dài 6 giây: máy quay trượt (dolly) chậm rãi dọc theo những phiến đá bước chân hướng về phía cây cầu gỗ đi bộ, đom đóm bay lơ lửng và nhấp nháy, những thân trúc đung đưa nhẹ nhàng, làn sương thấp cuộn trôi trên lối đi, dòng suối lấp lánh và sắc xanh thẫm của buổi chạng vạng vẫn giữ nguyên. Bước 3 trong quy trình Lối đi Đom đóm trong Rừng Trúc.

Bắt đầu từ hình ảnh ở bước 2 "Lối đi bộ trong Rừng Trúc với Đom đóm và Cây cầu gỗ lúc Chạng vạng" làm khung hình đầu tiên chính xác, sau đó chuyển thể nó thành một cảnh quay điện ảnh êm dịu dài 6 giây. Giữ nguyên lối đi lát đá bước chân, dòng suối nông chảy dọc chính giữa lối đi, cây cầu gỗ nhỏ hình vòm ở khoảng cách trung cảnh, những bức tường trúc cao vút ở cả hai bên, khoảng hở của bầu trời chạng vạng xanh thẫm, làn sương mù quanh cây cầu và bố cục giống hệt như trong bức ảnh. Máy quay thực hiện một chuyển động trượt (dolly) tiến về phía trước cực kỳ chậm rãi và mượt mà dọc theo lối đi hướng tới cây cầu. Những chú đom đóm màu vàng lục trôi nhẹ nhàng trong không trung và chớp tắt dịu dàng ở những thời điểm khác nhau. Thân và lá trúc đung đưa khẽ khàng trong làn gió nhẹ, tất cả đều nghiêng theo cùng một hướng. Làn sương thấp cuộn trôi chậm rãi qua lối đi và bao quanh cây cầu, trong khi dòng suối lấp lánh và gợn sóng khi chảy về phía máy quay. Ánh sáng chạng vạng màu xanh lạnh giữ nguyên sự ổn định. Chuyển động tự nhiên, chân thực, không cắt cảnh, không có người, không có động vật, không thêm vật thể mới, không có chữ viết. Âm thanh êm dịu của tiếng nước chảy róc rách, tiếng lá trúc xào xạc và tiếng côn trùng buổi tối.
TravelVideo GenerationImage To Video+2
F@f
0
Áp phích du lịch phong cách Giữa thế kỷ (Mid-Century) vẽ vịnh hẹp Na Uy với chiếc phà màu đỏ
Hình ảnh
Áp phích du lịch phong cách Giữa thế kỷ (Mid-Century) vẽ vịnh hẹp Na Uy với chiếc phà màu đỏ

Áp phích du lịch in lụa phẳng phong cách giữa thế kỷ 20 trong khung dọc 3:4, không có chữ: một đĩa mặt trời lớn màu vàng mù tạt trên bầu trời vàng nhạt, những vách đá dốc đứng màu xám và xanh lá điểm xuyết các mảng tuyết cùng một thác nước trắng mảnh mai đóng khung vịnh hẹp, những đỉnh núi phủ tuyết ở cuối vịnh, làn nước xanh mòng két thẫm với những đường sóng trắng, một chiếc phà nhỏ màu đỏ-trắng kéo theo vệt sóng ở góc dưới bên trái, và những ngôi nhà gỗ màu đỏ mái trắng bên bờ phải.

Một bức minh họa áp phích du lịch hiện đại phong cách giữa thế kỷ 20 (mid-century modern) vẽ cảnh vịnh hẹp (fjord) Na Uy cùng một chiếc phà nhỏ màu đỏ, trong khung hình dọc tỷ lệ 3:4, theo phong cách in lụa phẳng và không có chữ. Một đĩa mặt trời màu vàng mù tạt tròn trịa hoàn hảo, kích thước lớn treo ở vị trí trung tâm phía trên giữa bầu trời màu vàng bơ nhạt. Những vách đá dốc đứng vươn cao ở cả hai bên tựa như một cánh cổng: ở bên trái là những vách đá màu xám đá phiến cao vút xen lẫn các gờ cỏ màu xanh ô liu và những mảng tuyết trắng, cùng một thác nước trắng mảnh mai, dài đổ dọc vách đá xuống mặt nước; ở bên phải là một vách đá màu xám có tuyết phủ trên sườn dốc phía trên và một sườn đồi rừng cây xanh thẫm ở phía dưới. Ở tận cùng của vịnh hẹp, những đỉnh núi sắc nhọn phủ đầy tuyết trong sắc trắng và xám nhạt khép lại tầm nhìn ở khu vực chính giữa. Làn nước màu xanh mòng két thẫm chiếm một phần ba phía dưới khung hình, được vẽ bằng những đường gợn sóng và bóng phản chiếu đơn giản màu trắng và xanh lam nhạt. Ở tiền cảnh góc dưới bên trái, một chiếc phà nhỏ màu đỏ-trắng với khoang tàu màu trắng, boong trên màu đỏ và cột buồm ngắn đang lướt về phía bên phải, để lại một vệt sóng trắng kéo dài phía sau về bên trái. Trên một mũi đất phủ cỏ dọc theo bờ bên phải là một ngôi làng nhỏ gồm khoảng sáu ngôi nhà gỗ màu đỏ có mái màu trắng, điểm xuyết vài tán cây màu xanh thẫm và đường bờ biển nhiều đá màu nhạt. Bảng màu giới hạn gồm xám đá phiến, xanh mòng két, xanh ô liu và xanh rừng thẫm, đỏ, kem và vàng mù tạt, các mảng hình học được giản lược sắc nét, hiệu ứng trám ảnh (halftone) tinh tế và kết cấu vân giấy hiện rõ, mang đậm cảm hứng quảng cáo du lịch cổ điển thập niên 1950. Không có văn bản, không có chữ cái, không có logo.
TravelVisualDesign+2
F@f
0
Trình xây dựng bản tóm tắt ý tưởng cảnh Suối nước nóng Onsen trên núi tuyết lúc chạng vạng
Văn bản

Chuyển một ý tưởng ngắn gọn thành bản mô tả chi tiết sẵn sàng tạo ảnh và tạo chuyển động cho một cảnh quay chủ đạo (hero shot) về suối nước nóng ngoài trời bốc khói bên cạnh lữ quán truyền thống trên núi phủ tuyết vào giờ xanh: hồ nước và đá tảng, hơi nước, lữ quán và các ô cửa sổ sáng đèn, đèn lồng đá, cây thông và ngọn núi, ánh sáng và tuyết rơi, các chi tiết cố định, sơ đồ chuyển động và hai hạt giống prompt: một ảnh tĩnh 16:9 và một hoạt ảnh chuyển từ ảnh sang video.

Hãy đóng vai một nhà thiết kế bối cảnh phong cảnh điện ảnh chuyên viết các bản tóm tắt cảnh quay (scene brief) sẵn sàng để tạo ảnh tĩnh và tạo chuyển động. Hãy giúp tôi thiết kế một cảnh quay chủ đạo (hero shot) về một suối nước nóng ngoài trời đang bốc khói (onsen) nằm cạnh một lữ quán truyền thống trên núi giữa trời tuyết rơi lúc chạng vạng. Cảnh quay này trước tiên sẽ được tạo thành một bức ảnh tĩnh, sau đó được làm hoạt ảnh thành một đoạn video ngắn sử dụng chính bức ảnh đó làm khung hình đầu tiên. Bản tóm tắt của bạn phải làm cho bức ảnh tĩnh giàu các yếu tố có thể chuyển động một cách tự nhiên (hơi nước trôi bảng lảng và cuộn tròn trên mặt nước, những bông tuyết rơi, lớp tuyết mềm trượt khỏi cành thông, những gợn sóng nhẹ nhàng trên mặt hồ, ánh sáng ấm áp của đèn lồng và cửa sổ) đồng thời giữ cho bố cục tĩnh lặng, cân đối, dễ nhìn và dễ tạo hoạt ảnh.

Ý tưởng ban đầu của tôi: a steaming rock-lined hot spring in the snow next to an old wooden inn, at blue hour, with stone lanterns

Các lựa chọn ban đầu của tôi:
- Hồ nước: a natural outdoor pool of clear teal water framed by dark volcanic rocks capped with snow, filling the center and foreground
- Hơi nước: thick white steam rising from the water and drifting to one side
- Lữ quán: a two-storey traditional Japanese wooden inn on the right with snow-covered tiled roofs and rows of warmly lit windows
- Đèn lồng: two snow-capped stone lanterns glowing softly, one small on the left rocks and one larger near the inn
- Cây cối và núi non: snow-laden pine trees behind the pool and a dark forested mountain slope on the left
- Thời tiết: large soft snowflakes falling slowly
- Thời gian và ánh sáng: deep blue twilight just after sunset, warm amber light from the inn and lanterns
- Phong cách hình ảnh: photoreal travel and landscape photography, natural colors
- Các từ khóa cảm xúc (Mood): quiet, warm, peaceful, wintry, inviting

Trước tiên, hãy hỏi tôi trong một tin nhắn ngắn gọn về bất kỳ thông tin nào còn thiếu: độ cao của máy quay (thấp gần mặt nước, ngang tầm mắt hay hơi nâng cao), lữ quán nên chiếm bao nhiêu phần khung hình, mật độ hơi nước và tuyết rơi dày đến mức nào, độ sáng của cửa sổ và đèn lồng ra sao, liệu tôi có muốn thêm một sự kiện tự nhiên nhỏ trong video hay không (ví dụ như một cụm tuyết trượt khỏi cành thông rơi xuống hồ), và bất kỳ yếu tố nào cần tránh (người, người tắm suối, động vật, chữ viết, biển hiệu, logo, hoặc việc sao chép một lữ quán có thật, bức ảnh hay địa danh cụ thể nào đó).

Sau đó, hãy lập bản tóm tắt bao gồm các phần sau:

1. **Tổng quan khung cảnh (Scene Overview)**: hai hoặc ba câu về địa điểm, khoảnh khắc, ánh sáng và cảm xúc. Hãy mô tả một lữ quán suối nước nóng trên núi tưởng tượng mang đậm tinh thần Nhật Bản, không sao chép một ryokan có thật cụ thể hay một bức ảnh nổi tiếng nào.

2. **Hồ nước và Đá tảng (The Pool and Rocks)**: hình dáng và kích thước của hồ trong khung hình, màu sắc và độ trong của nước, những tảng đá tối màu bao quanh cùng lớp tuyết phủ trên đỉnh đá, và những vị trí mặt nước bắt ánh sáng ấm và lạnh.

3. **Hơi nước (Steam)**: độ dày của hơi nước, vị trí bốc lên nhiều nhất, hướng trôi dạt, cách hơi nước làm mềm hậu cảnh và cách thể hiện để nhìn ra đó là làn hơi ấm chứ không phải sương mù hay khói.

4. **Lữ quán (The Inn)**: vị trí, số tầng, hình dáng mái nhà và lớp tuyết phủ trên mái, những bức tường gỗ, những dãy cửa sổ sáng đèn và mức độ chi tiết có thể nhìn thấy xuyên qua làn hơi nước và màn tuyết.

5. **Đèn lồng, Cây cối và Ngọn núi (Lanterns, Trees, and Mountain)**: hai chiếc đèn lồng đá phủ chỏm tuyết cùng ánh sáng tỏa ra từ chúng, những cây thông trĩu tuyết phía sau hồ (bao gồm một cành thông vươn phía trên mặt nước có thể làm rơi tuyết), và sườn núi tối màu nổi bật trên nền trời.

6. **Ánh sáng, Bầu trời và Tuyết (Light, Sky, and Snow)**: bầu trời chạng vạng xanh thẫm, ánh sáng môi trường sắc lạnh phản chiếu trên tuyết, những điểm nhấn màu hổ phách ấm áp từ cửa sổ và đèn lồng, kích thước và mật độ của những bông tuyết đang rơi, cùng độ mềm mại của vùng đổ bóng.

7. **Các chi tiết hình ảnh cố định (Fixed Visual Details)**: danh sách đánh số từ 8 đến 10 chi tiết bắt buộc phải giữ nguyên giống hệt nhau giữa ảnh tĩnh và video (hình dáng và vị trí hồ, viền đá, vị trí lữ quán và đường mái, bố cục cửa sổ, vị trí hai chiếc đèn lồng, hàng cây thông, bóng dáng ngọn núi, vị trí máy quay, khung hình, vùng hơi nước tổng thể).

8. **Sơ đồ chuyển động (Motion Map)**: một bảng liệt kê mọi yếu tố có thể chuyển động trong video, gồm các cột: yếu tố, loại chuyển động, hướng, tốc độ (rất chậm, chậm, trung bình) và cường độ chuyển động. Bao gồm hơi nước, tuyết rơi, mặt nước, ánh sáng đèn lồng và cửa sổ, một cụm tuyết tùy chọn rơi từ cành thông xuống hồ tạo tia nước bắn nhỏ và gợn sóng, cùng chuyển động của máy quay. Giữ cho tổng thể chuyển động tinh tế và hợp lý về mặt vật lý, với một hướng gió nhẹ đồng nhất.

9. **Hạt giống Prompt A - Ảnh tĩnh chủ đạo (Prompt Seed A - Hero Still Image)**: một prompt tạo ảnh sẵn sàng để sao chép và dán, dài dưới 170 từ cho khung hình ngang rộng 16:9, đưa hình ảnh suối nước nóng bốc khói, lữ quán phủ tuyết và đèn lồng đá vào giờ xanh ngay trong câu đầu tiên, kết thúc bằng cụm từ: no people, no text, no logos.

10. **Hạt giống Prompt B - Hoạt ảnh chuyển từ ảnh sang video (Prompt Seed B - Image-to-Video Animation)**: một prompt tạo video sẵn sàng để sao chép và dán, dài dưới 120 từ, bắt đầu từ bức ảnh tĩnh chủ đạo làm khung hình đầu tiên, mô tả làn hơi nước trôi bảng lảng và cuộn tròn, tuyết rơi, ánh sáng ổn định của đèn lồng và cửa sổ, chuyển động đẩy máy chậm rãi, nhẹ nhàng về phía hồ nước và lữ quán trong khoảng 6 giây, và (nếu tôi muốn) một cụm tuyết rơi từ cành thông xuống hồ tạo tia nước bắn nhỏ cùng những gợn sóng lan tỏa, đồng thời yêu cầu giữ nguyên hồ nước, đá tảng, lữ quán, đèn lồng, cây cối và khung hình y hệt như trong ảnh mà không thêm bất kỳ vật thể mới nào.

Quy tắc: không có người, người tắm suối hay động vật; không có chữ viết, biển hiệu hay logo; không di chuyển máy quay nhanh hoặc cắt cảnh; và không có chuyển động nào vi phạm quy luật vật lý (đá tảng, đèn lồng và lữ quán không bao giờ dịch chuyển, hơi nước bốc lên và trôi ngang chứ không đổ ngược xuống dưới, tuyết rơi chậm và đều, cụm tuyết rơi thẳng xuống theo trọng lực và chỉ tạo ra tia nước bắn nhỏ, ánh sáng không nhấp nháy hay nhảy loạn). Hãy trình bày bằng các đoạn văn ngắn và danh sách.
TravelPlanningImage To Video+2
F@f
0
Suối nước nóng ngoài trời bốc khói bên cạnh lữ quán trên núi tuyết vào giờ xanh
Hình ảnh
Suối nước nóng ngoài trời bốc khói bên cạnh lữ quán trên núi tuyết vào giờ xanh

Cảnh tuyết rơi chân thực vào giờ xanh (blue hour): một suối nước nóng viền đá bốc khói với làn nước trong vắt màu xanh mòng két chiếm trọn tiền cảnh, được bao quanh bởi những tảng đá tối màu phủ chỏm tuyết, có một chiếc đèn lồng đá nhỏ phát sáng ở bên trái, một chiếc lớn hơn đặt cạnh lữ quán gỗ hai tầng với mái ngói phủ tuyết và những ô cửa sổ sáng đèn ấm áp ở bên phải, những rặng thông trĩu tuyết và sườn núi tối màu dưới bầu trời xanh thẫm. Bước 2 trong quy trình Suối nước nóng Onsen trên núi tuyết lúc chạng vạng.

Một hồ suối nước nóng ngoài trời đang bốc khói nằm cạnh một lữ quán truyền thống trên núi của Nhật Bản giữa làn tuyết rơi nhẹ nhàng vào giờ xanh (blue hour), được thắp sáng bởi hai chiếc đèn lồng đá rực sáng, nhìn từ góc máy thấp ngay sát mép nước, trong khung hình ngang rộng tỷ lệ 16:9. Một hồ nước tự nhiên trong vắt màu xanh mòng két với ánh xanh lục nhè nhẹ chiếm lĩnh vùng trung tâm và phần giữa phía dưới của khung hình, được bao bọc bởi những tảng đá núi lửa tròn trịa, tối màu với lớp tuyết mới dày đặc phủ trên đỉnh ở tiền cảnh và dọc theo hai bên bờ. Làn hơi nước trắng dày đặc bốc lên từ mặt nước, đậm nhất ở phía bên trái và chính giữa hồ, trôi bồng bềnh lên trên và làm dịu đi nét vẽ của những hàng cây phía sau. Trên những tảng đá bên trái đặt một chiếc đèn lồng đá nhỏ phủ chỏm tuyết với ô cửa phát sáng ấm áp; ở bên phải, gần lữ quán, là một chiếc đèn lồng đá lớn hơn có phần mái rộng phủ đầy tuyết, cũng đang tỏa ánh sáng màu hổ phách ấm áp. Ở phía bên phải khung hình hiện lên một lữ quán bằng gỗ truyền thống hai tầng với những bức tường gỗ sẫm màu, mái hiên sâu và mái ngói phủ tuyết trắng, những dãy dài cửa sổ giấy và kính tỏa ánh sáng màu hổ phách ấm áp từ bên trong. Phía sau hồ nước, những cây thông cao vút đang trĩu nặng tuyết trắng, và ở phía bên trái là một sườn núi phủ rừng tối màu vươn cao nổi bật trên nền trời chạng vạng xanh thẫm. Những bông tuyết lớn mềm mại rơi khắp toàn bộ khung cảnh. Ánh sáng môi trường màu xanh lạnh kết hợp với những điểm nhấn màu hổ phách ấm áp từ cửa sổ và đèn lồng, phong cách nhiếp ảnh phong cảnh và du lịch chân thực như ảnh chụp, màu sắc tự nhiên, mang lại cảm giác tĩnh lặng, ấm cúng và bình yên. Không có người, không có chữ, không có logo.
TravelWorkflowPhotography+2
F@f
0
Video
Suối nước nóng Onsen trên núi tuyết lúc chạng vạng (Hoạt ảnh chuyển ảnh tĩnh thành video)

Tạo chuyển động cho bức ảnh suối nước nóng ở bước 2 làm khung hình đầu tiên thành một cảnh quay êm đềm dài 6 giây: máy quay đẩy chậm vào phía hồ nước và lữ quán, hơi nước trôi bảng lảng và cuộn tròn trên mặt nước màu xanh mòng két, tuyết rơi, đèn lồng và cửa sổ tỏa sáng ổn định, cùng một cụm tuyết rơi từ cành thông xuống hồ tạo nên tiếng bắn nước nhỏ và những gợn sóng lan tỏa. Bước 3 trong quy trình Suối nước nóng Onsen trên núi tuyết lúc chạng vạng.

Bắt đầu từ bức ảnh ở bước 2 "Suối nước nóng ngoài trời bốc khói bên cạnh lữ quán trên núi tuyết vào giờ xanh" làm khung hình đầu tiên chính xác, và tạo chuyển động cho nó thành một cảnh quay điện ảnh êm đềm dài 6 giây. Giữ nguyên hồ suối nước nóng màu xanh mòng két, những tảng đá tối màu phủ chỏm tuyết xung quanh, chiếc đèn lồng đá nhỏ bên trái, chiếc đèn lồng đá lớn hơn bên phải, lữ quán bằng gỗ hai tầng với mái phủ tuyết và những ô cửa sổ sáng đèn ấm áp, những cây thông trĩu nặng tuyết, sườn núi tối màu, bầu trời chạng vạng xanh thẫm và bố cục y hệt như trong ảnh. Máy quay thực hiện chuyển động đẩy nhẹ nhàng, chậm rãi về phía hồ nước và lữ quán. Làn hơi nước trắng dày đặc trôi bảng lảng, cuộn tròn chậm rãi trên mặt nước rồi bốc lên về phía hàng cây. Những bông tuyết lớn mềm mại tiếp tục rơi đều đặn khắp khung cảnh. Đèn lồng và các ô cửa sổ lữ quán tỏa sáng ổn định, không nhấp nháy. Khi cảnh quay đi được khoảng hai phần ba thời lượng, một cụm tuyết nhỏ trượt khỏi cành thông phía trên hồ và rơi thẳng xuống mặt nước gần khu vực trung tâm, tạo ra một tia nước bắn trắng nhỏ cùng những gợn sóng êm dịu lan rộng ra ngoài rồi mờ dần. Cảnh quay kết thúc trong sự tĩnh lặng khi làn hơi nước vẫn tiếp tục trôi. Chuyển động tự nhiên, chân thực, không cắt cảnh, không có người, không có động vật, không thêm vật thể mới, không có chữ. Âm thanh dịu nhẹ của tiếng nước sủi tăm, tiếng nước bắn khẽ khàng và sự tĩnh mịch của tuyết rơi.
TravelVideo GenerationImage To Video+2
F@f
0
Công Cụ Tính Toán & So Sánh Chi Phí Đi Lại
Kỹ năng

So sánh các phương án đi làm - ô tô (xăng hoặc xe điện), phương tiện công cộng, xe đạp, xe đạp điện, đi bộ, kết hợp luân phiên theo ngày và chặng gửi xe đi tàu/buýt (park-and-ride) - theo tháng và năm kèm chi phí tiền mặt, thời gian di chuyển trọn gói từ cửa đến cửa, chi phí thời gian tính theo mức giá trị giờ của riêng bạn, chi phí mỗi chuyến và lượng phát thải CO2. Tự động chọn giữa vé tháng và trả tiền từng lượt dựa trên số ngày bạn đi, tách biệt chi phí vận hành xe với chi phí cố định, đồng thời hiển thị mức giá trị hòa vốn của một giờ. Bao gồm bộ tính toán bằng Python sử dụng thư viện chuẩn (stdlib) kèm tùy chọn --self-test.

---
name: commute-cost-comparison-calculator
description: So sánh các phương án đi làm - ô tô (xăng hoặc xe điện), phương tiện công cộng, xe đạp, xe đạp điện, đi bộ, kết hợp luân phiên theo ngày và chặng gửi xe đi tàu/buýt (park-and-ride) - theo tháng và năm kèm chi phí tiền mặt, thời gian di chuyển trọn gói từ cửa đến cửa, chi phí thời gian tính theo mức giá trị giờ của riêng bạn, chi phí mỗi chuyến và lượng phát thải CO2. Tự động chọn giữa vé tháng và trả tiền từng lượt dựa trên số ngày bạn đi, tách biệt chi phí vận hành xe với chi phí cố định, đồng thời hiển thị mức giá trị hòa vốn của một giờ. Bao gồm bộ tính toán bằng Python sử dụng thư viện chuẩn (stdlib) kèm tùy chọn --self-test.
---

# Công Cụ Tính Toán & So Sánh Chi Phí Đi Lại

Bạn giúp người dùng quyết định cách đi làm bằng việc đặt mọi phương án lên cùng một bàn cân: tốn bao nhiêu tiền mặt, lấy đi bao nhiêu thời gian trong cuộc sống của họ, và khoảng thời gian đó đáng giá bao nhiêu đối với họ. Bạn chỉ tính những khoản thực sự thay đổi theo lựa chọn (nhiên liệu, phí gửi xe, giá vé, chi phí xe đạp), loại bỏ các khoản họ đằng nào cũng phải trả trừ khi họ thực sự bán chiếc ô tô đó, và thể hiện sự đánh đổi bằng một con số rõ ràng: "lái xe tiết kiệm được 32 giờ mất đi mỗi năm và tốn thêm $3,697, vì vậy phương án này chỉ đáng giá nếu một giờ của bạn trị giá hơn $115".

## Các tệp trong kỹ năng này

- `scripts/commute_cost.py` - đọc tệp JSON kịch bản (khoảng cách, số ngày đi làm, giá trị thời gian, các phương án) và in ra bảng so sánh, tóm tắt nổi bật, giá trị thời gian hòa vốn và ghi chú cho từng phương án; hỗ trợ hệ mét (km, L/100 km) và hệ Anh-Mỹ (mi, mpg), xe điện (EV), vé tháng phương tiện công cộng có mức trần chi phí ngày và trợ cấp từ công ty, phương án kết hợp luân phiên theo ngày và chuyến đi nhiều chặng (chỉ dùng thư viện chuẩn của Python 3.8+)
- `references/cost-components.md` - mọi trường thông tin của phương án, những khoản cần đưa vào cho từng loại phương tiện, nơi tra cứu số liệu và các khoảng giá trị điển hình
- `references/time-value-and-assumptions.md` - cách chọn giá trị cho một giờ thời gian, thời gian có thể tận dụng trên phương tiện công cộng, những yếu tố chưa nằm trong tổng chi phí (sức khỏe, độ an toàn, thời tiết, sự linh hoạt) và cách chạy kiểm tra độ nhạy
- `templates/commute-comparison.md` - bản tóm tắt quyết định để gửi lại cho người dùng
- `examples/commute.json` - quãng đường đi làm 11 dặm với các phương án lái xe, xe buýt + tàu điện nhẹ (light rail), xe đạp điện, kết hợp xe đạp điện/phương tiện công cộng và gửi xe đi tàu/buýt (park-and-ride)
- `examples/comparison-output.md` - kết quả đầu ra thực tế của công cụ tính toán cho kịch bản đó

## Quy trình thực hiện

### 1. Thu thập thông tin thực tế
Khoảng cách một chiều, số ngày đi làm mỗi tuần (làm việc kết hợp hybrid ảnh hưởng rất lớn) và số tuần làm việc mỗi năm, số phút di chuyển từ cửa đến cửa cho mỗi phương án (bao gồm cả đi bộ, chờ đợi, gửi xe và chuyển tuyến: hãy hỏi thời gian chuyến đi thực tế chứ không chỉ lấy ước tính trên bản đồ), và thông tin theo từng phương tiện: mức tiêu thụ nhiên liệu của ô tô, giá xăng/dầu hoặc giá điện, phí gửi xe và cầu đường, liệu họ có giữ lại chiếc xe dù không lái đi làm hay không; giá vé lẻ phương tiện công cộng, giá vé tháng, mức trần chi phí ngày, trợ cấp của công ty; giá mua xe đạp hoặc xe đạp điện, tuổi thọ dự kiến và chi phí bảo dưỡng. Hãy hỏi xem một giờ thời gian của họ đáng giá bao nhiêu, hoặc đưa ra một mức mặc định (bằng một nửa mức lương theo giờ của họ) và trình bày phân tích độ nhạy.

### 2. Chạy công cụ tính toán
```
python3 scripts/commute_cost.py examples/commute.json
python3 scripts/commute_cost.py scenario.json --days-per-week 3
python3 scripts/commute_cost.py scenario.json --value-of-time 0 --json
python3 scripts/commute_cost.py --self-test
```
Mã thoát 0 = đã in bảng so sánh, 2 = dữ liệu đầu vào không hợp lệ (thiếu trường, tỷ lệ kết hợp cộng lại không bằng 1, loại phương tiện không xác định, giá âm). Nếu không chạy mã, hãy làm theo các công thức trong `references/cost-components.md`.

### 3. Đọc kết quả
- Bảng được sắp xếp theo tổng chi phí (tiền mặt + chi phí thời gian); dòng tiêu đề chỉ ra phương án rẻ nhất về tiền mặt, rẻ nhất khi tính cả thời gian và nhanh nhất.
- **Giá trị thời gian hòa vốn (Break-even value of time)** so sánh từng phương án với phương án rẻ nhất về tiền mặt: một phương án tốn nhiều tiền hơn chỉ đáng chọn nếu một giờ của bạn có giá trị cao hơn con số được hiển thị. "Never" (Không bao giờ) có nghĩa là phương án đó vừa tốn kém hơn vừa không tiết kiệm được thời gian hữu ích.
- Thời gian ngồi trên phương tiện công cộng mà bạn có thể tận dụng (đọc sách, xử lý email) được khấu trừ thông qua `usable_time_share`; cùng trường này cũng có thể dùng để cộng điểm cho thời gian đạp xe nếu việc đó thay thế cho thời gian tập thể dục mà đằng nào bạn cũng thực hiện. Hãy nêu rõ bạn đã áp dụng cách nào.
- Kiểm tra ghi chú về phương tiện công cộng: khi chỉ đi làm 2-3 ngày một tuần, vé tháng thường đắt hơn trả tiền từng lượt; công cụ tính toán sẽ tự chọn cách rẻ hơn và ghi chú rõ điều đó.

### 4. Bàn giao kết quả
Điền vào `templates/commute-comparison.md`: khuyến nghị gói gọn trong một câu, bảng so sánh, các mức giá trị hòa vốn, những yếu tố làm thay đổi câu trả lời (số ngày làm hybrid, giá nhiên liệu, phí gửi xe, giá trị thời gian), những yếu tố chưa được định giá bằng tiền, và gợi ý dùng thử (ví dụ: thử nghiệm phương án kết hợp trong hai tuần trước khi mua sắm bất cứ thứ gì).

## Ví dụ kết quả
11 dặm mỗi chiều, 5 ngày một tuần, 46 tuần, thời gian được định giá ở mức $20/giờ (`examples/commute.json`). Rẻ nhất về tiền mặt: xe buýt + tàu điện nhẹ ở mức $49/tháng sau khi trừ $50 trợ cấp từ công ty (vé tháng $99 rẻ hơn so với $105 tiền mua vé lẻ). Rẻ nhất khi tính cả thời gian: gửi xe đi tàu/buýt - park and ride ($95 tiền mặt, tổng cộng $361/tháng) vì 80 % thời gian chặng đi tàu có thể tận dụng làm việc khác. Lái xe vào trung tâm thành phố là nhanh nhất (28 phút) nhưng tốn $357/tháng với $12/ngày phí gửi xe và chỉ đáng giá nếu một giờ trị giá hơn $115. Xe đạp điện tốn trọn gói $67/tháng và không phát thải, nhưng không tiết kiệm thời gian hữu ích với các thông số này; phương án này sẽ chiến thắng nếu việc đạp xe thay thế cho thời gian tập gym. Xem `examples/comparison-output.md`.

## Quy tắc

- Chỉ tính những chi phí thực sự thay đổi theo lựa chọn; chỉ đưa chi phí bảo hiểm ô tô, đăng kiểm và lãi vay mua xe vào nếu người đó thực sự từ bỏ chiếc xe (`count_fixed`).
- Sử dụng thời gian thực tế từ cửa đến cửa, bao gồm cả đi bộ, chờ đợi, gửi xe và chuyển tuyến.
- Không bao giờ trình bày giá trị thời gian như một sự thật hiển nhiên: đó là lựa chọn riêng của mỗi người; hãy hiển thị ít nhất một lần chạy kiểm tra độ nhạy (ví dụ: `--value-of-time 0` và mức lương theo giờ của họ).
- Giữ các yếu tố sức khỏe, an toàn và thời tiết nằm ngoài tổng số tiền nhưng hãy đề cập đến chúng; không rao giảng đạo đức về việc đi ô tô hay xe đạp.
- Nêu rõ mọi giả định kèm theo con số cụ thể (giá nhiên liệu, phí gửi xe, khấu hao trên mỗi dặm) để người dùng có thể tự điều chỉnh.
- Sử dụng đơn vị tiền tệ và đơn vị đo lường đúng như người dùng đang sử dụng; không trộn lẫn dặm (miles) và kilômét (kilometres) trong cùng một kịch bản.
FILE:references/cost-components.md
# Các thành phần chi phí và trường thông tin phương án

Các trường của kịch bản: `currency` (USD, EUR, GBP, TRY, ...), `units` (`metric`: km, L/100 km, giá mỗi lít; `imperial`: dặm/miles, mpg, giá mỗi gallon Mỹ), `one_way_distance`, `days_per_week` (mặc định là 5), `weeks_per_year` (mặc định là 46: trừ ngày lễ, ngày nghỉ ốm, công tác), `value_of_time_per_hour`, `options`.

Mọi phương án đều có: `name`, `mode`, `minutes_one_way` (từ cửa đến cửa), `distance_one_way` tùy chọn (mặc định lấy theo khoảng cách của kịch bản), `usable_time_share` tùy chọn (0..1).

## Ô tô (`mode: car`)
| Trường | Ý nghĩa | Giá trị điển hình |
|---|---|---|
| `fuel_economy_mpg` / `fuel_l_per_100km` | mức tiêu thụ thực tế trên tuyến đường này (lái xe trong phố tốn hơn thông số nhãn) | 25-35 mpg / 6-9 L/100 km |
| `fuel_price` | tính theo mỗi gallon / mỗi lít | giá tại trạm xăng địa phương |
| `fuel: "diesel"` | sử dụng hệ số phát thải CO2 của dầu diesel | mặc định là xăng (petrol) |
| `kwh_per_100` + `electricity_price` | xe điện thay vì nhiên liệu đốt trong (kWh trên mỗi 100 dặm hoặc km) | 25-35 kWh/100 mi, 16-22 kWh/100 km |
| `grid_kg_co2_per_kwh` | cường độ phát thải của lưới điện để tính CO2 cho xe điện | mặc định 0.4; 0.05 với thủy điện/điện hạt nhân, 0.7 với lưới điện phụ thuộc nhiều vào than đá |
| `maintenance_per_distance` | lốp xe, bảo dưỡng định kỳ, sửa chữa trên mỗi dặm/km | $0.08-0.12/mi, 0.05-0.08/km |
| `depreciation_per_distance` | phần giá trị mất đi chỉ do số dặm/km chạy thêm (không tính hao mòn theo tuổi xe) | $0.05-0.15/mi |
| `parking_per_day`, `tolls_per_day` | tính trên mỗi ngày đi làm | phí gửi xe tại nơi làm việc có thể chiếm tỷ trọng lớn nhất |
| `fixed_per_year` + `count_fixed` | bảo hiểm, đăng kiểm, lãi vay, khấu hao theo tuổi xe; chỉ được tính khi `count_fixed` là true | chỉ đặt là true nếu việc đi làm là lý do duy nhất để sở hữu chiếc xe |

Chi phí nhiên liệu = 2 x khoảng cách x số ngày / mpg x giá (hoặc x L/100 km / 100 x giá). Khí thải CO2: xăng 2.35 kg/L (8.89 kg mỗi gallon Mỹ), dầu diesel 2.68 kg/L (10.18 kg/gal), xe điện tính bằng số kWh x hệ số phát thải lưới điện.

Các mức chi phí trọn gói trên mỗi dặm (định mức khấu trừ thuế theo dặm, báo cáo "Your Driving Costs" của AAA) đã bao gồm cả chi phí cố định; chúng làm phóng đại chi phí cận biên của việc đi làm khi đằng nào người dùng vẫn giữ lại chiếc xe.

## Phương tiện công cộng (`mode: transit`)
| Trường | Ý nghĩa |
|---|---|
| `fare_per_ride`, `rides_per_day` (mặc định là 2) | giá vé lẻ; cộng thêm một lượt cho mỗi lần chuyển tuyến có thu phí (không được miễn phí) |
| `daily_cap` | mức trần giá vé tối đa trong ngày, nếu hệ thống giao thông có áp dụng |
| `monthly_pass` | giá vé tháng; công cụ tính toán sẽ so sánh 12 vé tháng với chi phí trả từng lượt cho số ngày thực tế đi lại và chọn phương án rẻ hơn |
| `subsidy_per_month` | khoản trợ cấp từ công ty hoặc phúc lợi miễn thuế, được khấu trừ trực tiếp (không bao giờ giảm xuống dưới 0) |
| `co2_g_per_passenger_km` | mặc định 80 g; tàu điện 20-40, xe buýt chạy dầu diesel 80-120 ở mức tải trọng trung bình |
| `usable_time_share` | tỷ lệ thời gian chuyến đi bạn có thể đọc sách hoặc làm việc (có chỗ ngồi, không bị căng thẳng vì chuyển tuyến): 0.2-0.8 |

## Xe đạp, xe đạp điện, đi bộ (`mode: bike | ebike | walk`)
| Trường | Ý nghĩa | Giá trị điển hình |
|---|---|---|
| `purchase_price`, `life_years` | phân bổ đều trong suốt vòng đời sử dụng (mặc định 5 năm); không dùng cho đi bộ | xe đạp điện $1,500-3,500 |
| `maintenance_per_year` | lốp, xích, má phanh, quỹ thay pin cho xe đạp điện | $100-300 |
| `gear_per_year` | đèn, khóa, áo mưa, thay mũ bảo hiểm | $50-150 |
| `kwh_per_100`, `electricity_price` | chi phí sạc xe đạp điện | 1-2 kWh trên mỗi 100 dặm |
| `other_per_month` | phí gửi xe đạp, thuê tủ đồ, thẻ phòng tắm | 0-30 |
Chi phí sở hữu được tính toàn bộ ngay cả trong phương án kết hợp: bạn vẫn phải trả tiền mua chiếc xe đạp dù đi 3 hay 5 ngày một tuần.

## Kết hợp (`mode: mix`)
`"shares": {"E-bike": 0.6, "Bus + light rail": 0.4}` chia số ngày đi làm giữa các phương án khác nhau (tổng các tỷ lệ cộng lại bằng 1). Mỗi phần được tính chi phí theo đúng số ngày sử dụng của phần đó, vì vậy phần đi phương tiện công cộng trong 2 ngày một tuần thường sẽ chuyển sang hình thức trả tiền từng lượt. Hãy sử dụng chế độ này cho việc đạp xe phụ thuộc vào thời tiết, lái xe kết hợp (hybrid), hoặc những ngày đi chung xe (carpool).

## Nhiều chặng (`mode: multi`)
`"legs": [ {car leg}, {transit leg} ]` cùng với `transfer_minutes`. Mỗi chặng cần có `distance_one_way` và `minutes_one_way` riêng; chi phí và số phút sẽ được cộng dồn lại. Hãy dùng chế độ này cho hình thức gửi xe đi tàu/buýt (park and ride), xe đạp + tàu hỏa, hoặc đi bộ + xe buýt.

## Lấy số liệu ở đâu
- Mức tiêu thụ nhiên liệu: xem trên đồng hồ hành trình (trip computer) của ô tô trong suốt một tuần đi làm thực tế.
- Phí gửi xe và giá vé: trang bảng giá của đơn vị vận hành; kiểm tra các phúc lợi từ công ty (trợ cấp phương tiện công cộng trước thuế, quy đổi chỗ đỗ xe thành tiền mặt - parking cash-out).
- Thời gian từ cửa đến cửa: bấm giờ một chuyến đi thực tế cho mỗi chiều vào đúng khung giờ cao điểm đi làm; cộng thêm 5 phút dự phòng cho sự dao động khi tìm chỗ đỗ xe hoặc chờ tàu/buýt.
FILE:references/time-value-and-assumptions.md
# Giá trị thời gian và những yếu tố chưa nằm trong tổng chi phí

## Cách chọn giá trị thời gian
- Không có con số nào là đúng tuyệt đối: đó là mức giá trị mà một giờ đi làm thực sự mang lại cho chính người đó.
- Mốc tham chiếu phổ biến: khoảng một nửa mức lương thực nhận theo giờ đối với việc di chuyển cá nhân (hướng dẫn định giá thời gian di chuyển của Bộ Giao thông Vận tải Hoa Kỳ sử dụng mức 50 % thu nhập theo giờ cho các chuyến đi cá nhân tại địa phương; di chuyển công tác được định giá ở mức 100 %).
- Một người hưởng lương cố định, không thể kiếm thêm thu nhập nhờ giảm thời gian đi lại có thể chọn mức giá trị thấp hơn; một người làm nghề tự do (freelancer) có thể tính phí cho những giờ tiết kiệm được sẽ chọn mức cao hơn.
- Luôn trình bày phân tích độ nhạy: `--value-of-time 0` (chỉ tính tiền mặt), mức giá trị đã chọn, và toàn bộ mức lương theo giờ của họ. Nếu thứ hạng các phương án không thay đổi, quyết định đó là vững chắc.

## Thời gian có thể tận dụng
`usable_time_share` khấu trừ khoảng thời gian bạn có thể tận dụng làm việc khác. Hướng dẫn ước tính sơ bộ:
| Tình huống | Tỷ lệ |
|---|---|
| Lái xe, đạp xe giữa dòng giao thông, đứng trên xe buýt đông đúc | 0 |
| Đi xe buýt có chỗ ngồi, các chặng ngắn, phải chuyển tuyến | 0.2-0.4 |
| Đi tàu có chỗ ngồi và bàn làm việc, hơn 20 phút liên tục không phải đổi chuyến | 0.6-0.8 |
| Đạp xe hoặc đi bộ giúp thay thế cho thời gian tập thể dục mà đằng nào bạn cũng làm | 0.3-0.7 (hãy nêu rõ điều này) |

## Những yếu tố không nằm trong tổng số tiền (cần đề cập đến)
- **Sức khỏe:** đạp xe hoặc đi bộ thường xuyên gắn liền với sức khỏe tim mạch tốt hơn; một số người đánh giá rất cao lợi ích này, số khác lại không quan tâm. Hãy sử dụng `usable_time_share` nếu họ muốn quy đổi lợi ích này thành tiền.
- **Độ an toàn:** rủi ro tai nạn giao thông trên mỗi dặm khác nhau tùy theo phương tiện và tuyến đường; một làn đường dành riêng cho xe đạp có rào chắn bảo vệ sẽ làm thay đổi hoàn toàn bức tranh tổng thể.
- **Thời tiết và mùa vụ:** hãy sử dụng phương án kết hợp (ví dụ: 60 % số ngày đi xe đạp) thay vì giả định ngày nào cũng có thể đạp xe.
- **Độ ổn định (Reliability):** một chuyến tàu mất 40 phút với biên độ dao động 10 phút có thể tốt hơn một chuyến lái xe trung bình 30 phút nhưng dao động từ 25 đến 60 phút; hãy hỏi về các khoản phạt hoặc hậu quả khi trễ giờ (ví dụ: đón con muộn tại nhà trẻ).
- **Sự linh hoạt và giá trị quyền chọn:** việc có sẵn ô tô để tạt qua giải quyết việc vặt trên đường, hoặc cho các tình huống khẩn cấp; dịch vụ thuê xe theo giờ hoặc ngân sách đi taxi có thể thay thế cho những ngày hiếm hoi đó (cộng thêm vào mục `other_per_month`).
- **Mức độ căng thẳng và sự thoải mái:** đừng định giá bằng tiền, nhưng hãy hỏi người dùng về yếu tố này.

## Các kịch bản kiểm tra độ nhạy đáng thực hiện
- Làm việc kết hợp (Hybrid work): `--days-per-week 3` thường làm đảo ngược sự lựa chọn giữa vé tháng và trả tiền từng lượt, đồng thời khiến việc sở hữu chiếc ô tô thứ hai trở nên kém kinh tế hơn hẳn.
- Phí gửi xe: sự thay đổi về giá gửi xe (hoặc khoản tiền công ty thưởng khi không dùng chỗ đỗ xe) thường là đòn bẩy đơn lẻ lớn nhất.
- Giá nhiên liệu hoặc giá điện biến động +-25 %.
- Bán chiếc ô tô thứ hai: chạy lại tính toán với `count_fixed: true` cho phương án ô tô để thấy toàn bộ khoản tiền tiết kiệm được.

## Kiểm tra tính hợp lý trước khi trình bày
- Chi phí tiền mặt mỗi chuyến khi lái xe tối thiểu phải bằng chi phí nhiên liệu + phí gửi xe mỗi chuyến.
- Chi phí tiền mặt mỗi tháng cho phương tiện công cộng không được vượt quá giá vé tháng trừ khi vé tháng không bao phủ hết tuyến đường đó.
- Số giờ mỗi tháng = số phút một chiều x 2 x số ngày mỗi tháng / 60.
- Nếu phương án "chiến thắng" phụ thuộc vào một mức giá trị thời gian cách quá xa so với con số người dùng đưa ra, hãy nói rõ điều đó một cách thẳng thắn.
FILE:templates/commute-comparison.md
# Các phương án đi làm: <nhà> đến <nơi làm việc>

**Chuyến đi:** <11 dặm mỗi chiều, 5 ngày/tuần, 46 tuần/năm>   **Giá trị thời gian áp dụng:** <$20/giờ (khoảng một nửa lương theo giờ)>
**Khuyến nghị:** <một câu, ví dụ: "Gửi xe đi tàu/buýt (Park and ride): $95/tháng tiền mặt, 40 phút từ cửa đến cửa, phần lớn thời gian đi tàu có thể tận dụng để xử lý email">

## Bảng so sánh (theo tháng)
| Phương án | Tiền mặt | Từ cửa đến cửa | Số giờ | Chi phí thời gian | Tổng cộng | CO2 kg/năm |
|---|---|---|---|---|---|---|
| <Park and ride> | <$95> | <40 min> | <25.6> | <$266> | <$361> | <999> |
| <Bus + light rail> | <$49> | <46 min> | <29.4> | <$411> | <$460> | <651> |

## Khi nào một phương án đắt đỏ hơn mới đáng tiền
| Phương án | Chi phí tăng thêm mỗi năm | Số giờ mất đi được tiết kiệm | Đáng giá nếu một giờ trị giá trên |
|---|---|---|---|
| <Drive downtown> | <$3,697> | <32> | <$115/hour> |

## Những yếu tố sẽ làm thay đổi câu trả lời
- <Làm việc kết hợp (3 ngày): vé tháng phương tiện công cộng không còn có lợi; trả tiền từng lượt ...>
- <Khoản tiền thưởng không dùng chỗ đỗ xe từ công ty sẽ khiến việc lái xe đắt thêm $230/tháng nữa>
- <Nếu chuyến đi bằng xe đạp điện thay thế cho việc tập gym, phương án xe đạp điện sẽ vươn lên ...>

## Những yếu tố chưa được định giá bằng tiền
- <sức khỏe, độ an toàn trên tuyến đường, những ngày thời tiết xấu, độ ổn định giờ giấc, nhu cầu dùng ô tô để đón con đi học>

## Các giả định
- <nhiên liệu $3.40/gal ở mức tiêu thụ 28 mpg; bảo dưỡng $0.10/mi; khấu hao theo số dặm $0.08/mi; phí gửi xe $12/ngày>
- <vé tháng phương tiện công cộng $99, trợ cấp từ công ty $50/tháng, 30 % thời gian đi xe buýt/tàu có thể tận dụng>
- <vẫn giữ ô tô để đi cuối tuần, do đó chi phí bảo hiểm và đăng kiểm không được tính vào>

## Bước tiếp theo
<Thử nghiệm phương án kết hợp trong hai tuần trước khi mua xe đạp điện; bấm giờ thực tế từng chuyến từ cửa đến cửa.>
FILE:examples/commute.json
{
  "currency": "USD",
  "units": "imperial",
  "one_way_distance": 11,
  "days_per_week": 5,
  "weeks_per_year": 46,
  "value_of_time_per_hour": 20,
  "options": [
    {
      "name": "Drive downtown",
      "mode": "car",
      "minutes_one_way": 28,
      "fuel_economy_mpg": 28,
      "fuel_price": 3.4,
      "maintenance_per_distance": 0.1,
      "depreciation_per_distance": 0.08,
      "parking_per_day": 12,
      "tolls_per_day": 0,
      "fixed_per_year": 1900,
      "count_fixed": false
    },
    {
      "name": "Bus + light rail",
      "mode": "transit",
      "minutes_one_way": 46,
      "fare_per_ride": 2.75,
      "monthly_pass": 99,
      "subsidy_per_month": 50,
      "usable_time_share": 0.3
    },
    {
      "name": "E-bike",
      "mode": "ebike",
      "minutes_one_way": 42,
      "purchase_price": 2200,
      "life_years": 5,
      "maintenance_per_year": 250,
      "gear_per_year": 100,
      "kwh_per_100": 1.5,
      "electricity_price": 0.17
    },
    {
      "name": "E-bike 3 days, transit 2 days",
      "mode": "mix",
      "shares": {"E-bike": 0.6, "Bus + light rail": 0.4}
    },
    {
      "name": "Park and ride",
      "mode": "multi",
      "transfer_minutes": 6,
      "legs": [
        {"mode": "car", "distance_one_way": 4, "minutes_one_way": 10, "fuel_economy_mpg": 28, "fuel_price": 3.4,
         "maintenance_per_distance": 0.1, "depreciation_per_distance": 0.08, "parking_per_day": 0},
        {"mode": "transit", "distance_one_way": 7, "minutes_one_way": 24, "fare_per_ride": 2.75, "monthly_pass": 99,
         "subsidy_per_month": 50, "usable_time_share": 0.8}
      ]
    }
  ]
}
FILE:examples/comparison-output.md
# So sánh chi phí đi làm

Một chiều: 11 dặm   Số ngày đi làm: 19.2/tháng (230/năm)   Giá trị thời gian: $20.00/giờ   Tiền tệ: USD

| Phương án | Tiền mặt / tháng | Tiền mặt / năm | Mỗi chuyến | Từ cửa đến cửa (một chiều) | Số giờ / tháng | Chi phí thời gian / tháng | Tổng cộng / tháng | CO2 kg / năm |
|---|---|---|---|---|---|---|---|---|
| Park and ride | $95.22 | $1,143 | $2.48 | 40 min | 25.6 | $266 | **$361** | 999 |
| Bus + light rail | $49.00 | $588 | $1.28 | 46 min | 29.4 | $411 | **$460** | 651 |
| E-bike 3 days, transit 2 days | $66.48 | $798 | $1.73 | 44 min | 27.9 | $487 | **$553** | 261 |
| E-bike | $66.91 | $803 | $1.75 | 42 min | 26.8 | $537 | **$604** | 0 |
| Drive downtown | $357 | $4,285 | $9.32 | 28 min | 17.9 | $358 | **$715** | 1,607 |

Được sắp xếp theo tổng chi phí (tiền mặt + chi phí thời gian).

## Điểm nổi bật

- Rẻ nhất về tiền mặt: **Bus + light rail** ($49.00/tháng).
- Rẻ nhất khi tính cả thời gian: **Park and ride** ($361/tháng ở mức $20.00/giờ).
- Nhanh nhất: **Drive downtown** (28 phút một chiều, 17.9 giờ/tháng).

## Giá trị thời gian hòa vốn (so với Bus + light rail, phương án rẻ nhất về tiền mặt)

| Phương án | Tiền mặt tăng thêm / năm | Số giờ mất đi tiết kiệm được / năm | Đáng giá nếu một giờ của bạn trị giá hơn |
|---|---|---|---|
| Drive downtown | $3,697 | 32 | $115/hour |
| E-bike | $215 | không có (mất thêm 75 giờ) | không bao giờ xét về chi phí: phương án này không tiết kiệm thời gian hữu ích |
| E-bike 3 days, transit 2 days | $210 | không có (mất thêm 45 giờ) | không bao giờ xét về chi phí: phương án này không tiết kiệm thời gian hữu ích |
| Park and ride | $555 | 87 | $6.35/hour |

## Ghi chú cho từng phương án

- **Drive downtown** (car): mỗi tháng: nhiên liệu/năng lượng $51.20, bảo dưỡng + khấu hao $75.90, phí gửi xe + cầu đường $230; chi phí cố định (bảo hiểm, đăng kiểm) không được tính: đằng nào bạn vẫn giữ lại chiếc xe
- **Bus + light rail** (transit): mỗi tháng: tiền vé $49.00; dùng vé tháng (rẻ hơn mức $105/tháng nếu trả từng lượt cho 19.2 ngày/tháng); đã khấu trừ trợ cấp từ công ty $50.00/tháng
- **E-bike** (ebike): mỗi tháng: tiền xe + bảo dưỡng $65.83, nhiên liệu/năng lượng $1.08; chi phí sở hữu được tính toàn bộ (chúng không giảm đi vào những ngày bạn không đạp xe)
- **E-bike 3 days, transit 2 days** (mix): E-bike 60 % số ngày (11.5/tháng): chi phí sở hữu được tính toàn bộ (chúng không giảm đi vào những ngày bạn không đạp xe); Bus + light rail 40 % số ngày (7.7/tháng): trả tiền từng lượt (mua vé tháng sẽ tốn tới $99.00/tháng cho 7.7 ngày/tháng)
- **Park and ride** (multi): chặng 2 (transit): dùng vé tháng (rẻ hơn mức $105/tháng nếu trả từng lượt cho 19.2 ngày/tháng); chặng 2 (transit): đã khấu trừ trợ cấp từ công ty $50.00/tháng

Chi phí thời gian = số giờ x giá trị thời gian x (1 - tỷ lệ chuyến đi bạn có thể tận dụng để đọc sách hoặc làm việc). Chưa bao gồm: lợi ích sức khỏe, rủi ro tai nạn, những ngày thời tiết xấu và giá trị quyền chọn của việc có sẵn ô tô; xem references/time-value-and-assumptions.md.
FILE:scripts/commute_cost.py
#!/usr/bin/env python3
"""Commute cost comparison calculator (Python 3.8+ standard library only).

Compares commute options - car (fuel or electric), transit, bike, e-bike, walking,
day-share mixes ("bike 3 days, train 2 days") and same-day multi-leg trips ("drive to
the station, then train") - per month and per year: cash cost, time spent, time cost at
your own hourly value, total, cost per trip and CO2. For transit it picks the cheaper of
pay-per-ride (with a daily cap) and a monthly pass for the days you actually ride; for
cars it separates running costs from fixed costs you would keep paying anyway. It also
prints break-even values of time: how much an hour must be worth to you before a faster,
dearer option pays off.

Usage:
  python3 commute_cost.py scenario.json [--value-of-time 25] [--days-per-week 3] [--json]
  python3 commute_cost.py --self-test
scenario.json: {"currency": "USD", "units": "imperial"|"metric", "one_way_distance": 11,
  "days_per_week": 5, "weeks_per_year": 46, "value_of_time_per_hour": 20,
  "options": [{"name": "...", "mode": "car|transit|bike|ebike|walk|mix|multi", ...}]}
See references/cost-components.md for every option field.
Exit codes: 0 = comparison printed, 2 = bad input.
"""
import argparse, json, sys

PETROL_CO2 = {"metric": 2.35, "imperial": 8.89}   # kg CO2 per litre / per US gallon burned (diesel: 2.68 / 10.18)
DIESEL_CO2 = {"metric": 2.68, "imperial": 10.18}
KM_PER_UNIT = {"metric": 1.0, "imperial": 1.609344}
LABELS = {"energy": "fuel/energy", "running": "maintenance + depreciation", "parking_tolls": "parking + tolls",
          "fixed": "fixed costs", "fares": "fares", "ownership": "bike + upkeep", "other": "other"}
MODES = {"car", "transit", "bike", "ebike", "walk", "mix", "multi"}
SYMBOLS = {"USD": "$", "EUR": "€", "GBP": "£", "TRY": "₺", "CAD": "C$", "AUD": "A$", "JPY": "¥", "INR": "₹"}


class InputError(Exception):
    pass


def num(o, key, default=None, lo=0.0, hi=None, who=""):
    v = o.get(key, default)
    if v is None:
        raise InputError(f"{who}: '{key}' is required")
    if isinstance(v, bool) or not isinstance(v, (int, float)):
        raise InputError(f"{who}: '{key}' must be a number")
    if v < lo or (hi is not None and v > hi):
        raise InputError(f"{who}: '{key}' = {v} is out of range" + (f" ({lo}..{hi})" if hi is not None else f" (>= {lo})"))
    return float(v)


def car_cost(o, sc, days, who):
    """Annual cost dict for a car over `days` commute days."""
    units = sc["units"]
    d = num(o, "distance_one_way", sc["distance"], who=who) * 2 * days      # user units per year
    if "kwh_per_100" in o:
        kwh = d / 100 * num(o, "kwh_per_100", who=who)
        energy = kwh * num(o, "electricity_price", who=who)
        co2 = kwh * num(o, "grid_kg_co2_per_kwh", 0.4, who=who)
    else:
        if units == "imperial":
            vol = d / num(o, "fuel_economy_mpg", lo=1, who=who)
        else:
            vol = d / 100 * num(o, "fuel_l_per_100km", lo=0.5, who=who)
        energy = vol * num(o, "fuel_price", who=who)
        co2 = vol * (DIESEL_CO2 if o.get("fuel") == "diesel" else PETROL_CO2)[units]
    running = d * (num(o, "maintenance_per_distance", 0, who=who) + num(o, "depreciation_per_distance", 0, who=who))
    daily = days * (num(o, "parking_per_day", 0, who=who) + num(o, "tolls_per_day", 0, who=who))
    fixed = num(o, "fixed_per_year", 0, who=who) if o.get("count_fixed", False) else 0.0
    return {"energy": energy, "running": running, "parking_tolls": daily, "fixed": fixed,
            "co2": co2, "notes": ([] if o.get("count_fixed", False) or not o.get("fixed_per_year") else
                                  ["fixed costs (insurance, registration) not counted: you keep the car anyway"])}


def transit_cost(o, sc, days, who):
    rides = num(o, "rides_per_day", 2, lo=1, who=who)
    fare = num(o, "fare_per_ride", who=who)
    cap = o.get("daily_cap")
    per_day = fare * rides if cap is None else min(fare * rides, num(o, "daily_cap", who=who))
    payg_year = per_day * days
    best, note = payg_year, "pay per ride"
    if o.get("monthly_pass") is not None:
        pass_year = num(o, "monthly_pass", who=who) * 12
        months_days = days / 12
        if pass_year < payg_year:
            best, note = pass_year, f"monthly pass (cheaper than {fmt_plain(payg_year / 12, sc['sym'])}/month pay per ride at {months_days:.1f} days/month)"
        else:
            note = f"pay per ride (pass would cost {fmt_plain(pass_year / 12, sc['sym'])}/month at {months_days:.1f} days/month)"
    subsidy = num(o, "subsidy_per_month", 0, who=who) * 12
    best = max(0.0, best - subsidy)
    km = num(o, "distance_one_way", sc["distance"], who=who) * 2 * days * KM_PER_UNIT[sc["units"]]
    co2 = km * num(o, "co2_g_per_passenger_km", 80, who=who) / 1000
    return {"fares": best, "co2": co2, "notes": [note] + ([f"employer subsidy {fmt_plain(subsidy / 12, sc['sym'])}/month deducted"] if subsidy else [])}


def bike_cost(o, sc, days, who, mode):
    d = num(o, "distance_one_way", sc["distance"], who=who) * 2 * days
    own = 0.0
    if mode != "walk":
        life = num(o, "life_years", 5, lo=0.5, who=who)
        own = num(o, "purchase_price", 0, who=who) / life
    own += num(o, "maintenance_per_year", 0, who=who) + num(o, "gear_per_year", 0, who=who)
    energy = 0.0
    if mode == "ebike":
        kwh = d / 100 * num(o, "kwh_per_100", 1.2, who=who)
        energy = kwh * num(o, "electricity_price", 0, who=who)
    extra = num(o, "other_per_month", 0, who=who) * 12
    return {"ownership": own, "energy": energy, "other": extra, "co2": 0.0,
            "notes": ["ownership costs counted in full (they do not shrink on days you do not ride)"] if own else []}


def option_cost(o, sc, days, who):
    mode = o.get("mode")
    if mode == "car":
        c = car_cost(o, sc, days, who)
    elif mode == "transit":
        c = transit_cost(o, sc, days, who)
    elif mode in ("bike", "ebike", "walk"):
        c = bike_cost(o, sc, days, who, mode)
    else:
        raise InputError(f"{who}: mode '{mode}' is not allowed here (use car, transit, bike, ebike, walk)")
    minutes = num(o, "minutes_one_way", who=who, lo=1)
    cash = sum(v for k, v in c.items() if k not in ("co2", "notes"))
    return {"cash": cash, "minutes": minutes, "co2": c["co2"], "notes": c["notes"],
            "usable": num(o, "usable_time_share", 0, hi=1, who=who),
            "breakdown": {k: v for k, v in c.items() if k not in ("co2", "notes")}}


def evaluate(sc_raw, value_override=None, dpw_override=None):
    if not isinstance(sc_raw, dict) or not isinstance(sc_raw.get("options"), list) or not sc_raw["options"]:
        raise InputError("scenario needs an 'options' list")
    units = sc_raw.get("units", "metric")
    if units not in KM_PER_UNIT:
        raise InputError("units must be 'metric' or 'imperial'")
    cur = sc_raw.get("currency", "USD")
    sc = {"units": units, "distance": num(sc_raw, "one_way_distance", who="scenario", lo=0.1),
          "sym": SYMBOLS.get(cur, f"{cur} ")}
    dpw = dpw_override if dpw_override is not None else num(sc_raw, "days_per_week", 5, lo=0.5, hi=7, who="scenario")
    wpy = num(sc_raw, "weeks_per_year", 46, lo=1, hi=52, who="scenario")
    days = dpw * wpy
    vot = value_override if value_override is not None else num(sc_raw, "value_of_time_per_hour", 0, who="scenario")
    by_name = {}
    for i, o in enumerate(sc_raw["options"]):
        if not isinstance(o, dict) or not o.get("name") or o.get("mode") not in MODES:
            raise InputError(f"option {i + 1}: needs a 'name' and a 'mode' ({', '.join(sorted(MODES))})")
        if o["name"] in by_name:
            raise InputError(f"option name '{o['name']}' is used twice")
        by_name[o["name"]] = o
    results = []
    for o in sc_raw["options"]:
        who = o["name"]
        if o["mode"] == "mix":
            shares = o.get("shares")
            if not isinstance(shares, dict) or not shares:
                raise InputError(f"{who}: mix needs 'shares', e.g. {{\"Bike\": 0.6, \"Transit\": 0.4}}")
            tot = sum(shares.values())
            if abs(tot - 1) > 0.001:
                raise InputError(f"{who}: shares add up to {tot:g}, not 1")
            cash = co2 = hours = eff = 0.0
            notes, parts = [], []
            for nm, sh in shares.items():
                if nm not in by_name or by_name[nm]["mode"] in ("mix",):
                    raise InputError(f"{who}: share '{nm}' must name another non-mix option")
                sub = by_name[nm]
                part = multi_cost(sub, sc, days * sh, nm) if sub["mode"] == "multi" else option_cost(sub, sc, days * sh, nm)
                cash += part["cash"]; co2 += part["co2"]
                h = part["minutes"] * 2 * days * sh / 60
                hours += h; eff += h * (1 - part["usable"])
                parts.append(f"{nm} {sh * 100:.0f} % of days ({days * sh / 12:.1f}/month): {part['notes'][0] if part['notes'] else 'as above'}")
            minutes = hours * 60 / (2 * days)
            results.append(row(who, "mix", cash, minutes, hours, eff, vot, co2, days, parts))
            continue
        part = multi_cost(o, sc, days, who) if o["mode"] == "multi" else option_cost(o, sc, days, who)
        hours = part["minutes"] * 2 * days / 60
        results.append(row(who, o["mode"], part["cash"], part["minutes"], hours, hours * (1 - part["usable"]), vot,
                           part["co2"], days, part["notes"], part.get("breakdown")))
    return {"currency": sc_raw.get("currency", "USD"), "units": units, "one_way_distance": sc["distance"],
            "days_per_year": days, "days_per_month": days / 12, "value_of_time_per_hour": vot,
            "options": results, "break_even": break_even(results)}


def multi_cost(o, sc, days, who):
    legs = o.get("legs")
    if not isinstance(legs, list) or len(legs) < 2:
        raise InputError(f"{who}: multi needs at least two 'legs'")
    cash = co2 = minutes = 0.0
    notes, usable_min = [], 0.0
    for j, leg in enumerate(legs, 1):
        if leg.get("mode") in ("mix", "multi"):
            raise InputError(f"{who} leg {j}: legs cannot be mix or multi")
        if "distance_one_way" not in leg:
            raise InputError(f"{who} leg {j}: each leg needs its own 'distance_one_way'")
        p = option_cost(leg, sc, days, f"{who} leg {j}")
        cash += p["cash"]; co2 += p["co2"]; minutes += p["minutes"]
        usable_min += p["minutes"] * p["usable"]
        notes += [f"leg {j} ({leg['mode']}): {n}" for n in p["notes"]]
    minutes += num(o, "transfer_minutes", 0, who=who)
    return {"cash": cash, "co2": co2, "minutes": minutes, "notes": notes or ["legs summed"],
            "usable": usable_min / minutes if minutes else 0.0}


def row(name, mode, cash, minutes, hours, eff_hours, vot, co2, days, notes, breakdown=None):
    tcost = eff_hours * vot
    return {"name": name, "mode": mode, "cash_year": cash, "cash_month": cash / 12, "minutes_one_way": minutes,
            "hours_month": hours / 12, "lost_hours_month": eff_hours / 12, "time_cost_month": tcost / 12, "total_month": (cash + tcost) / 12,
            "total_year": cash + tcost, "cost_per_trip": cash / (2 * days), "co2_kg_year": co2,
            "notes": notes, "breakdown": breakdown or {}}


def break_even(results):
    """For each option, the hourly value of time at which it ties with the cheapest-cash option.
    Uses lost hours (time you cannot use for reading or work), the same basis as the time cost."""
    base = min(results, key=lambda r: r["cash_year"])
    out = []
    for r in results:
        if r is base:
            continue
        extra = r["cash_year"] - base["cash_year"]
        hours_saved = (base["lost_hours_month"] - r["lost_hours_month"]) * 12
        if hours_saved > 0.01:
            out.append({"option": r["name"], "vs": base["name"], "extra_cash_year": extra,
                        "hours_saved_year": hours_saved, "break_even_per_hour": extra / hours_saved})
        else:
            out.append({"option": r["name"], "vs": base["name"], "extra_cash_year": extra,
                        "hours_saved_year": hours_saved, "break_even_per_hour": None})
    return out


def fmt_plain(v, sym="$"):
    return f"{sym}{v:,.0f}" if abs(v) >= 100 else f"{sym}{v:,.2f}"


def render(res):
    sym = SYMBOLS.get(res["currency"], res["currency"] + " ")
    f = lambda v: fmt_plain(v, sym)
    du = "mi" if res["units"] == "imperial" else "km"
    out = [f"# Commute cost comparison", "",
           f"One way: {res['one_way_distance']:g} {du}   Commute days: {res['days_per_month']:.1f}/month ({res['days_per_year']:.0f}/year)   "
           f"Value of time: {f(res['value_of_time_per_hour'])}/hour   Currency: {res['currency']}", "",
           "| Option | Cash / month | Cash / year | Per trip | Door to door (one way) | Hours / month | Time cost / month | Total / month | CO2 kg / year |",
           "|---|---|---|---|---|---|---|---|---|"]
    rs = res["options"]
    for r in sorted(rs, key=lambda r: r["total_month"]):
        out.append(f"| {r['name']} | {f(r['cash_month'])} | {f(r['cash_year'])} | {f(r['cost_per_trip'])} | {r['minutes_one_way']:.0f} min | "
                   f"{r['hours_month']:.1f} | {f(r['time_cost_month'])} | **{f(r['total_month'])}** | {r['co2_kg_year']:,.0f} |")
    cheapest = min(rs, key=lambda r: r["cash_year"])
    best_total = min(rs, key=lambda r: r["total_year"])
    fastest = min(rs, key=lambda r: r["minutes_one_way"])
    out += ["", "Sorted by total (cash + time cost).", "",
            "## Headline", "",
            f"- Cheapest in cash: **{cheapest['name']}** ({f(cheapest['cash_month'])}/month).",
            f"- Cheapest once time counts: **{best_total['name']}** ({f(best_total['total_month'])}/month at {f(res['value_of_time_per_hour'])}/hour).",
            f"- Fastest: **{fastest['name']}** ({fastest['minutes_one_way']:.0f} min one way, {fastest['hours_month']:.1f} h/month)."]
    out += ["", f"## Break-even value of time (vs {cheapest['name']}, the cheapest in cash)", "",
            "| Option | Extra cash / year | Lost hours saved / year | Worth it if your hour is worth more than |", "|---|---|---|---|"]
    for b in res["break_even"]:
        if b["break_even_per_hour"] is None:
            verdict = "never on cost: it does not save usable time" if b["extra_cash_year"] > 0 else "always: same cash, no more lost time"
            hs = f"{b['hours_saved_year']:.0f}" if b["hours_saved_year"] >= 0 else f"none ({-b['hours_saved_year']:.0f} more lost)"
            out.append(f"| {b['option']} | {f(b['extra_cash_year'])} | {hs} | {verdict} |")
        else:
            out.append(f"| {b['option']} | {f(b['extra_cash_year'])} | {b['hours_saved_year']:.0f} | {f(b['break_even_per_hour'])}/hour |")
    out += ["", "## Notes per option", ""]
    for r in rs:
        bd = ", ".join(f"{LABELS.get(k, k)} {f(v / 12)}" for k, v in r["breakdown"].items() if v) if r["breakdown"] else ""
        out.append(f"- **{r['name']}** ({r['mode']}): " + "; ".join(([f"per month: {bd}"] if bd else []) + r["notes"]))
    out += ["", "Time cost = hours x value of time x (1 - share of the trip you can use for reading or work). "
            "Not included: health benefits, accident risk, weather days and the option value of having a car; "
            "see references/time-value-and-assumptions.md."]
    return "\n".join(out) + "\n"


def self_test():
    base = {"currency": "USD", "units": "metric", "one_way_distance": 10, "days_per_week": 5, "weeks_per_year": 48,
            "value_of_time_per_hour": 20}
    car = {"name": "Car", "mode": "car", "minutes_one_way": 20, "fuel_l_per_100km": 8, "fuel_price": 1.5,
           "maintenance_per_distance": 0.05, "parking_per_day": 5}
    tr = {"name": "Transit", "mode": "transit", "minutes_one_way": 40, "fare_per_ride": 2.5, "monthly_pass": 80}
    bike = {"name": "Bike", "mode": "bike", "minutes_one_way": 35, "purchase_price": 1000, "life_years": 5, "maintenance_per_year": 100}
    def ev(*opts, **kw):
        sc = dict(base, options=list(opts)); sc.update(kw.pop("sc", {}))
        return evaluate(sc, **kw)
    def get(res, n):
        return next(r for r in res["options"] if r["name"] == n)
    cases = []
    def case(name, fn):
        try:
            ok, err = bool(fn()), ""
        except Exception as e:  # noqa
            ok, err = False, repr(e)
        cases.append((name, ok, err))
    # car: 240 days * 20 km = 4800 km; fuel 384 L * 1.5 = 576; maint 240; parking 1200 -> 2016/year
    case("car annual cash (fuel + maintenance + parking)", lambda: abs(get(ev(car), "Car")["cash_year"] - 2016) < 0.01)
    case("car CO2 petrol 2.35 kg/L", lambda: abs(get(ev(car), "Car")["co2_kg_year"] - 384 * 2.35) < 0.01)
    case("diesel CO2 factor", lambda: abs(get(ev(dict(car, fuel="diesel")), "Car")["co2_kg_year"] - 384 * 2.68) < 0.01)
    case("fixed costs excluded unless count_fixed", lambda: get(ev(dict(car, fixed_per_year=1500)), "Car")["cash_year"] == get(ev(car), "Car")["cash_year"])
    case("fixed costs included with count_fixed", lambda: abs(get(ev(dict(car, fixed_per_year=1500, count_fixed=True)), "Car")["cash_year"] - 3516) < 0.01)
    case("EV uses kWh and electricity price", lambda: abs(get(ev(dict(car, kwh_per_100=18, electricity_price=0.3, fuel_l_per_100km=None)), "Car")["breakdown"]["energy"] - 4800 / 100 * 18 * 0.3) < 0.01)
    case("imperial mpg and $/gal", lambda: abs(get(ev({"name": "Car", "mode": "car", "minutes_one_way": 20, "fuel_economy_mpg": 30, "fuel_price": 3.6}, sc={"units": "imperial"}), "Car")["cash_year"] - 4800 / 30 * 3.6) < 0.01)
    case("imperial CO2 8.89 kg/gal", lambda: abs(get(ev({"name": "Car", "mode": "car", "minutes_one_way": 20, "fuel_economy_mpg": 30, "fuel_price": 3.6}, sc={"units": "imperial"}), "Car")["co2_kg_year"] - 160 * 8.89) < 0.01)
    # transit: per ride 5/day*240 = 1200 vs pass 960 -> pass
    case("transit picks monthly pass when cheaper", lambda: abs(get(ev(tr), "Transit")["cash_year"] - 960) < 0.01)
    case("transit picks pay-per-ride at 2 days/week", lambda: abs(get(ev(tr, dpw_override=2), "Transit")["cash_year"] - 5 * 96) < 0.01)
    case("daily cap applied", lambda: abs(get(ev(dict(tr, monthly_pass=None, daily_cap=4)), "Transit")["cash_year"] - 4 * 240) < 0.01)
    case("employer subsidy deducted, never below 0", lambda: get(ev(dict(tr, subsidy_per_month=100)), "Transit")["cash_year"] == 0)
    case("bike ownership spread over life", lambda: abs(get(ev(bike), "Bike")["cash_year"] - 300) < 0.01)
    case("ebike electricity", lambda: abs(get(ev(dict(bike, name="E", mode="ebike", kwh_per_100=1.5, electricity_price=0.3)), "E")["breakdown"]["energy"] - 4800 / 100 * 1.5 * 0.3) < 0.01)
    case("walk has no purchase cost", lambda: get(ev({"name": "Walk", "mode": "walk", "minutes_one_way": 120, "purchase_price": 999}), "Walk")["cash_year"] == 0)
    case("time cost = hours x value", lambda: abs(get(ev(car), "Car")["time_cost_month"] - 20 * 2 * 240 / 60 * 20 / 12) < 0.01)
    case("usable time share discounts transit time", lambda: abs(get(ev(dict(tr, usable_time_share=0.5)), "Transit")["time_cost_month"] - 40 * 2 * 240 / 60 * 20 * 0.5 / 12) < 0.01)
    case("value-of-time override", lambda: get(ev(car, value_override=0), "Car")["time_cost_month"] == 0)
    case("per trip = annual cash / trips", lambda: abs(get(ev(car), "Car")["cost_per_trip"] - 2016 / 480) < 0.001)
    # mix: bike 60 % of days, transit 40 % -> transit 96 days: per ride 480 vs pass 960 -> per ride
    mixo = {"name": "Mix", "mode": "mix", "shares": {"Bike": 0.6, "Transit": 0.4}}
    case("mix: bike ownership full + transit pay-per-ride on its days", lambda: abs(get(ev(bike, tr, mixo), "Mix")["cash_year"] - (300 + 480)) < 0.01)
    case("mix: time weighted by days", lambda: abs(get(ev(bike, tr, mixo), "Mix")["minutes_one_way"] - (0.6 * 35 + 0.4 * 40)) < 0.01)
    multi = {"name": "P+R", "mode": "multi", "transfer_minutes": 5, "legs": [
        {"mode": "car", "distance_one_way": 3, "minutes_one_way": 8, "fuel_l_per_100km": 8, "fuel_price": 1.5, "parking_per_day": 2},
        {"mode": "transit", "distance_one_way": 7, "minutes_one_way": 20, "fare_per_ride": 2.5, "monthly_pass": 80}]}
    case("multi: legs summed + transfer", lambda: (lambda r: abs(r["minutes_one_way"] - 33) < 0.01 and abs(r["cash_year"] - (1440 * 0.08 * 1.5 + 480 + 960)) < 0.01)(get(ev(multi), "P+R")))
    case("break-even: car vs cheapest", lambda: (lambda res: (lambda b: abs(b["break_even_per_hour"] - (2016 - 300) / ((35 - 20) * 2 * 240 / 60)) < 0.01)(next(b for b in res["break_even"] if b["option"] == "Car")))(ev(car, bike)))
    case("break-even uses lost hours (usable transit time)", lambda: next(b for b in ev(dict(tr, usable_time_share=0.75, subsidy_per_month=60), bike)["break_even"] if b["option"] == "Bike")["break_even_per_hour"] is None)
    case("break-even: slower and dearer -> None", lambda: next(b for b in ev(car, tr, bike)["break_even"] if b["option"] == "Transit")["break_even_per_hour"] is None)
    case("render has headline and table", lambda: "Cheapest in cash: **Bike**" in render(ev(car, tr, bike)) and "| Car |" in render(ev(car, tr, bike)))
    case("render uses currency symbol", lambda: "€" in render(ev(car, sc={"currency": "EUR"})))
    def bad(*opts, **sc):
        try:
            ev(*opts, sc=sc); return False
        except InputError:
            return True
    case("mix shares must sum to 1", lambda: bad(bike, tr, dict(mixo, shares={"Bike": 0.6, "Transit": 0.6})))
    case("mix share must name an option", lambda: bad(bike, dict(mixo, shares={"Bike": 0.5, "Train": 0.5})))
    case("unknown mode rejected", lambda: bad({"name": "Boat", "mode": "boat", "minutes_one_way": 5}))
    case("duplicate names rejected", lambda: bad(car, car))
    case("missing fuel economy rejected", lambda: bad({"name": "Car", "mode": "car", "minutes_one_way": 20, "fuel_price": 1.5}))
    case("negative price rejected", lambda: bad(dict(car, fuel_price=-1)))
    case("bad units rejected", lambda: bad(car, units="furlongs"))
    case("usable share above 1 rejected", lambda: bad(dict(tr, usable_time_share=1.5)))
    passed = 0
    for name, ok, err in cases:
        passed += ok
        print(("PASS " if ok else "FAIL ") + name + ("" if ok else f"  {err}"))
    print(f"{passed}/{len(cases)} passed")
    return 0 if passed == len(cases) else 1


def main(argv=None):
    ap = argparse.ArgumentParser(description="Compare commute options per month and year, including time value")
    ap.add_argument("scenario", nargs="?")
    ap.add_argument("--value-of-time", type=float, help="override value_of_time_per_hour")
    ap.add_argument("--days-per-week", type=float, help="override days_per_week (e.g. 3 for hybrid work)")
    ap.add_argument("--json", action="store_true")
    ap.add_argument("--self-test", action="store_true")
    a = ap.parse_args(argv)
    if a.self_test:
        return self_test()
    if not a.scenario:
        ap.error("give a scenario JSON file, or --self-test")
    try:
        with open(a.scenario, encoding="utf-8") as fh:
            sc = json.load(fh)
        if a.days_per_week is not None and not 0.5 <= a.days_per_week <= 7:
            raise InputError("--days-per-week must be 0.5..7")
        res = evaluate(sc, a.value_of_time, a.days_per_week)
    except json.JSONDecodeError as e:
        print(f"error: scenario is not valid JSON: {e}", file=sys.stderr)
        return 2
    except (OSError, InputError, UnicodeDecodeError) as e:
        print(f"error: {e}", file=sys.stderr)
        return 2
    print(json.dumps(res, indent=2) if a.json else render(res), end="" if not a.json else "\n")
    return 0


if __name__ == "__main__":
    sys.exit(main())
Personal FinanceBudgetingDecision Making+2
F@f
0
Trước3 / 3