Trong một trong những dải xkcd mang tính biểu tượng hơn, Randall Munroe đã hình dung ra các mốc thời gian của một số bộ phim trong các biểu đồ kể chuyện:
(Bấm vào để xem phiên bản lớn hơn.)
Nguồn: xkcd số 657 .
Đưa ra một đặc điểm của dòng thời gian của một bộ phim (hoặc một số câu chuyện khác), bạn sẽ tạo ra một biểu đồ như vậy. Đây là một cuộc thi phổ biến, vì vậy câu trả lời có nhiều phiếu (net) nhất sẽ giành chiến thắng.
Yêu cầu tối thiểu
Để thắt chặt thông số kỹ thuật một chút, đây là bộ tính năng tối thiểu mỗi câu trả lời phải thực hiện:
Lấy làm đầu vào một danh sách các tên nhân vật, theo sau là một danh sách các sự kiện. Mỗi sự kiện là một danh sách các nhân vật sắp chết hoặc một danh sách các nhóm nhân vật (biểu thị các nhân vật hiện đang ở cùng nhau). Dưới đây là một ví dụ về cách tường thuật Công viên kỷ Jura có thể được mã hóa:
["T-Rex", "Raptor", "Raptor", "Raptor", "Malcolm", "Grant", "Sattler", "Gennaro", "Hammond", "Kids", "Muldoon", "Arnold", "Nedry", "Dilophosaurus"] [ [[0],[1,2,3],[4],[5,6],[7,8,10,11,12],[9],[13]], [[0],[1,2,3],[4,7,5,6,8,9,10,11,12],[13]], [[0],[1,2,3],[4,7,5,6,8,9,10],[11,12],[13]], [[0],[1,2,3],[4,7,5,6,9],[8,10,11,12],[13]], [[0,4,7],[1,2,3],[5,9],[6,8,10,11],[12],[13]], [7], [[5,9],[0],[4,6,10],[1,2,3],[8,11],[12,13]], [12], [[0, 5, 9], [1, 2, 3], [4, 6, 10, 8, 11], [13]], [[0], [5, 9], [1, 2], [3, 11], [4, 6, 10, 8], [13]], [11], [[0], [5, 9], [1, 2, 10], [3, 6], [4, 8], [13]], [10], [[0], [1, 2, 9], [5, 6], [3], [4, 8], [13]], [[0], [1], [9, 5, 6], [3], [4, 8], [2], [13]], [[0, 1, 9, 5, 6, 3], [4, 8], [2], [13]], [1, 3], [[0], [9, 5, 6, 3, 4, 8], [2], [13]] ]
Ví dụ, dòng đầu tiên có nghĩa là ở đầu biểu đồ, T-Rex là một người đơn độc, ba Raptors ở cùng nhau, Malcolm chỉ có một mình, Grant và Sattler ở cùng nhau, v.v. Sự kiện thứ hai đến cuối cùng có nghĩa là hai trong số các Raptors chết .
Làm thế nào chính xác bạn mong đợi đầu vào là tùy thuộc vào bạn, miễn là loại thông tin này có thể được chỉ định. Ví dụ, bạn có thể sử dụng bất kỳ định dạng danh sách thuận tiện. Bạn cũng có thể mong đợi các nhân vật trong các sự kiện sẽ lại là tên nhân vật đầy đủ, v.v.
Bạn có thể (nhưng không phải) cho rằng mỗi danh sách các nhóm chứa mỗi nhân vật sống trong chính xác một nhóm. Tuy nhiên, bạn không nên cho rằng các nhóm hoặc nhân vật trong một sự kiện theo thứ tự đặc biệt thuận tiện.
Kết xuất với màn hình hoặc tệp (dưới dạng vector hoặc đồ họa raster) một biểu đồ có một dòng cho mỗi ký tự. Mỗi dòng phải được dán nhãn bằng một tên nhân vật ở đầu dòng.
- Đối với mỗi sự kiện thông thường, phải có một số mặt cắt ngang của biểu đồ trong đó các nhóm nhân vật rõ ràng giống với sự gần gũi của các dòng tương ứng.
- Đối với mỗi sự kiện cái chết, các dòng của các nhân vật có liên quan phải chấm dứt trong một đốm nhìn thấy được.
- Bạn không phải tái tạo bất kỳ tính năng nào khác của âm mưu của Randall, bạn cũng không phải tái tạo phong cách vẽ của anh ấy. Các đường thẳng với các nét sắc nét, tất cả đều màu đen, không có nhãn tiếp theo và một tiêu đề là hoàn toàn tốt để tham gia cuộc thi. Cũng không cần sử dụng không gian một cách hiệu quả - ví dụ: bạn có khả năng đơn giản hóa thuật toán của mình bằng cách chỉ di chuyển các dòng xuống dưới để đáp ứng với các ký tự khác, miễn là có một hướng thời gian rõ ràng.
Tôi đã thêm một giải pháp tham chiếu đáp ứng chính xác các yêu cầu tối thiểu này.
Làm cho nó đẹp
Đây là một cuộc thi phổ biến, vì vậy, trên hết, bạn có thể thực hiện bất kỳ điều gì bạn muốn. Bổ sung quan trọng nhất là một thuật toán bố trí hợp lý làm cho biểu đồ dễ đọc hơn - ví dụ, điều này làm cho các đường uốn cong dễ theo dõi và làm giảm số lượng đường cắt cần thiết. Đây là vấn đề thuật toán cốt lõi của thách thức này! Các phiếu sẽ quyết định mức độ hiệu quả của thuật toán của bạn trong việc giữ cho biểu đồ gọn gàng.
Nhưng đây là một số ý tưởng khác, hầu hết trong số đó dựa trên biểu đồ của Randall:
Đồ trang trí:
- Đường màu.
- Một tiêu đề cho cốt truyện.
- Dòng ghi nhãn kết thúc.
- Tự động định tuyến lại các dòng đã đi qua một phần bận rộn.
- Phong cách vẽ tay (hoặc khác? Như tôi đã nói, không cần phải tái tạo phong cách của Randall nếu bạn có ý tưởng tốt hơn) cho các đường kẻ và phông chữ.
- Định hướng tùy chỉnh của trục thời gian.
Biểu cảm bổ sung:
- Đặt tên sự kiện / nhóm / cái chết.
- Biến mất và xuất hiện lại dòng.
- Nhân vật nhập muộn.
- Các điểm nổi bật chỉ ra các thuộc tính (có thể chuyển nhượng?) Của các ký tự (ví dụ: xem ringbearer trong biểu đồ LotR).
- Mã hóa thông tin bổ sung trong trục nhóm (ví dụ thông tin địa lý như trong biểu đồ LotR).
- Du hành thời gian?
- Thực tế thay thế?
- Một nhân vật biến thành người khác?
- Hai nhân vật hợp nhất? (Một nhân vật tách ra?)
- 3D? (Nếu bạn thực sự đi xa đến thế, vui lòng đảm bảo rằng bạn thực sự đang sử dụng thứ nguyên bổ sung để hình dung đôi khi!)
- Bất kỳ tính năng có liên quan khác, có thể hữu ích để hình dung tường thuật của một bộ phim (hoặc cuốn sách, v.v.).
Tất nhiên, nhiều trong số này sẽ yêu cầu đầu vào bổ sung và bạn có thể tự do tăng định dạng đầu vào của mình khi cần thiết, nhưng vui lòng ghi lại cách nhập dữ liệu.
Vui lòng bao gồm một hoặc hai ví dụ để thể hiện các tính năng bạn đã triển khai.
Giải pháp của bạn sẽ có thể xử lý bất kỳ đầu vào hợp lệ nào, nhưng nó hoàn toàn tốt nếu nó phù hợp với một số loại tường thuật nhất định hơn các loại tường thuật khác.
Tiêu chí bỏ phiếu
Tôi không ảo tưởng rằng tôi có thể nói với mọi người cách họ nên bỏ phiếu, nhưng đây là một số hướng dẫn được đề xuất theo thứ tự quan trọng:
- Downvote câu trả lời khai thác sơ hở, tiêu chuẩn hoặc người khác, hoặc mã hóa cứng một hoặc nhiều kết quả.
- Không đưa ra các câu trả lời không đáp ứng các yêu cầu tối thiểu (cho dù phần còn lại có thể lạ mắt đến mức nào).
- Đầu tiên và quan trọng nhất, nâng cao các thuật toán bố trí đẹp. Điều này bao gồm các câu trả lời không sử dụng nhiều không gian dọc trong khi giảm thiểu việc vượt qua các đường để giữ cho biểu đồ dễ đọc hoặc quản lý để mã hóa thông tin bổ sung vào trục dọc. Hình dung các nhóm mà không tạo ra một mớ hỗn độn lớn sẽ là trọng tâm chính của thử thách này, vì vậy đây vẫn là một cuộc thi lập trình với một vấn đề thuật toán thú vị.
- Upvote các tính năng tùy chọn có thêm sức mạnh biểu cảm (nghĩa là không chỉ là trang trí thuần túy).
- Cuối cùng, upvote trình bày tốt đẹp.
[[x,y,z]]
sẽ có nghĩa là tất cả các nhân vật hiện đang ở cùng nhau. Nhưng nếu sự kiện không chứa danh sách, mà chỉ có các ký tự trực tiếp, thì đó là một cái chết, vì vậy trong cùng một tình huống [x,y,z]
có nghĩa là ba nhân vật đó sẽ chết. Vui lòng sử dụng định dạng khác, với một dấu hiệu rõ ràng về việc một cái gì đó là một sự kiện chết hoặc nhóm nếu điều đó giúp bạn. Các định dạng trên chỉ là một gợi ý. Miễn là định dạng đầu vào của bạn ít nhất là biểu cảm, bạn có thể sử dụng một cái gì đó khác.