Xây dựng đồng hồ kỹ thuật số trong Trò chơi cuộc sống của Conway


479

Nhiệm vụ của bạn là xây dựng một mô phỏng Game of Life đại diện cho đồng hồ kỹ thuật số, đáp ứng các thuộc tính sau:

  1. Đồng hồ hiển thị giờ và phút trong hệ thập phân (ví dụ 12:00, 3:59, 7:24) với một trạng thái khác nhau cho mỗi phút 1.440 trong ngày - một trong hai giờ sẽ đi 0-23 hoặc 1-12 với một chỉ số PM.

  2. Các mô hình là định kỳ, và các vòng lặp trạng thái xung quanh mà không có bất kỳ tương tác bên ngoài.

  3. Các phút cập nhật theo chu kỳ đều đặn - từ một thay đổi phút này sang lần tiếp theo có cùng số lượng thế hệ.

  4. Một người ngoài cuộc ẩn danh có thể nói trong nháy mắt rằng màn hình được cho là đồng hồ kỹ thuật số. Đặc biệt, điều này đòi hỏi:

    • Các chữ số có thể nhìn thấy và phân biệt rõ ràng. Bạn phải có thể nói một cách chắc chắn trong nháy mắt thời gian đang được hiển thị.

    • Các chữ số cập nhật tại chỗ. Mỗi số mới xuất hiện ở cùng một vị trí với số trước đó và có rất ít hoặc không có chuyển động của các hộp giới hạn của các chữ số. (Đặc biệt, một chữ số không chứa 10 chữ số khác nhau ở những nơi khác nhau được phát hiện mỗi khi các chữ số thay đổi.)

    • Các chữ số xuất hiện cạnh nhau, không có quá nhiều khoảng trống giữa chúng.


Chương trình của bạn sẽ được ghi vào những điều sau đây, theo thứ tự (với tiêu chí thấp hơn đóng vai trò là người phá vỡ cho tiêu chí cao hơn):

  • Kích thước hộp giới hạn - hộp hình chữ nhật có diện tích nhỏ nhất chứa hoàn toàn giải pháp đã cho sẽ thắng.

  • Thực hiện nhanh nhất - ít thế hệ nhất để tiến lên một phút chiến thắng.

  • Số lượng tế bào sống ban đầu - số lượng nhỏ hơn chiến thắng.

  • Đầu tiên để đăng bài - trước đó bài thắng.


5
@tuskiomi Không, màn hình phải là số thập phân.
Joe Z.

2
Tôi khá chắc chắn đây là B3 / S23, nhưng bạn có thể xác nhận hoặc từ chối không?
Conor O'Brien

2
"Họ cũng phải cập nhật tại chỗ - mỗi số mới phải xuất hiện ở cùng một nơi với số trước đó." Làm thế nào để bạn xác định "ở cùng một nơi", vì các chữ số không nhất thiết phải là hình chữ nhật.
Martin Ender

4
chữ số thập phân của chúng ta phải rõ ràng như thế nào? là "nếu bạn biết nó là gì và bạn nheo mắt thì bạn có thể cho biết sự khác biệt giữa 0 và 8" hay không, hay nó cần phải vượt qua "một người ngoài cuộc ẩn danh có thể nói nó là gì mà không cần nhắc"?
Sparr

3
cái này cũng được đăng trên blog Hackaday
Anool Mahidharia

Câu trả lời:


1014

11,520 thế hệ trên mỗi đồng hồ đếm / 10,016 x 6,796 hộp / 244,596 số pop

Có bạn đi ... Thật vui.

Chà, thiết kế chắc chắn không tối ưu. Không phải từ quan điểm của hộp giới hạn (các chữ số 7 đoạn đó là rất lớn ), cũng không phải từ số lượng dân số ban đầu (có một số thứ vô dụng, và một số thứ chắc chắn có thể được làm đơn giản hơn) và tốc độ thực thi - tôi ... 'tôi không chắc.

Nhưng, này, nó thật đẹp. Nhìn:

nhập mô tả hình ảnh ở đây

Chạy đi!

Lấy thiết kế từ ý chính này . Sao chép toàn bộ văn bản tập tin vào clipboard.

Mới : đây là phiên bản có cả chỉ số AM và PM cho người yêu cầu.

Chuyển đến trình giả lập cuộc sống JavaScript Conway trực tuyến . Nhấp vào nhập , dán văn bản thiết kế. Bạn nên xem thiết kế. Sau đó, đi đến cài đặt và đặt bước tạo thành 512 hoặc một cái gì đó xung quanh các dòng đó, hoặc bạn sẽ phải đợi mãi để xem màn hình đồng hồ cập nhật.

Nhấp vào chạy , chờ một chút và ngạc nhiên!

Liên kết trực tiếp đến phiên bản trong trình duyệt.

Lưu ý rằng thuật toán duy nhất làm cho thiết kế khổng lồ này có thể sử dụng được là hashlife. Nhưng với điều này, bạn có thể đạt được toàn bộ đồng hồ trong vài giây. Với các thuật toán khác, thật không thực tế khi thậm chí thấy giờ thay đổi.

Làm thế nào nó hoạt động

Nó sử dụng công nghệ p30. Chỉ cần những điều cơ bản, tàu lượn và tàu vũ trụ nhẹ. Về cơ bản, thiết kế đi từ trên xuống:

  • Ở trên đỉnh, có đồng hồ. Đó là một chiếc đồng hồ thời kỳ 11520. Lưu ý rằng bạn cần khoảng 10.000 thế hệ để đảm bảo màn hình được cập nhật phù hợp, nhưng thiết kế vẫn phải ổn định với đồng hồ có thời gian nhỏ hơn (khoảng 5.000 hoặc hơn - đồng hồ cần phải là bội số của 60).
  • Sau đó, có giai đoạn phân phối đồng hồ. Tàu lượn đồng hồ được sao chép trong một cây cân bằng, vì vậy cuối cùng, có 32 tàu lượn đến cùng một thời điểm chính xác đến giai đoạn quầy.
  • Giai đoạn truy cập được thực hiện bằng cách sử dụng chốt RS cho từng trạng thái và cho từng chữ số (chúng tôi đang tính bằng số thập phân). Vì vậy, có 10 trạng thái cho chữ số bên phải của phút, 6 trạng thái cho chữ số bên trái của minuts và 12 trạng thái cho giờ (cả hai chữ số của giờ được hợp nhất ở đây). Đối với mỗi nhóm này, bộ đếm hoạt động giống như một thanh ghi thay đổi.
  • Sau giai đoạn đếm, có các bảng tra cứu. Chúng chuyển đổi các xung trạng thái để hiển thị các hành động BẬT / TẮT.
  • Sau đó, màn hình hiển thị chính nó. Các phân đoạn được thực hiện đơn giản với nhiều chuỗi LWSS. Mỗi phân khúc có chốt riêng để duy trì trạng thái của nó. Tôi có thể đã tạo một logic HOẶC đơn giản cho các trạng thái chữ số để biết rằng một phân đoạn phải BẬT hoặc TẮT và thoát khỏi các chốt này, nhưng sẽ có trục trặc cho các phân đoạn không thay đổi, khi các chữ số thay đổi (vì độ trễ tín hiệu). Và sẽ có những dòng tàu lượn dài đến từ bảng tra cứu đến các phân đoạn chữ số. Vì vậy, nó sẽ không đẹp như thế. Và nó cần phải được. Đúng.

Dù sao, thực sự không có gì bất thường trong thiết kế này. Không có phản ứng tuyệt vời đã được phát hiện trong quá trình này, và không có sự kết hợp thực sự thông minh mà không ai nghĩ đến trước đây. Chỉ các bit được lấy ở đây và ở đó và đặt lại với nhau (và tôi thậm chí không chắc là mình đã làm theo cách "đúng" - tôi thực sự hoàn toàn mới đối với điều này). Nó đòi hỏi rất nhiều kiên nhẫn, tuy nhiên. Làm cho tất cả những chiếc tàu lượn đó xuất hiện đúng lúc, đúng vị trí đã bị trầy xước.

Tối ưu hóa có thể:

  • Thay vì sao chép và phân phối cùng một đồng hồ gốc cho các ô truy cập n , tôi có thể chỉ cần đặt cùng một khối đồng hồ n lần (một lần cho mỗi ô truy cập). Điều này thực sự sẽ đơn giản hơn nhiều. Nhưng sau đó tôi sẽ không thể điều chỉnh nó dễ dàng bằng cách thay đổi đồng hồ tại một điểm duy nhất ... Và tôi có một nền tảng điện tử, và trong một mạch thực, điều đó sẽ là sai lầm khủng khiếp.
  • Mỗi phân khúc có chốt RS riêng. Điều này đòi hỏi các bảng tra cứu để xuất cả hai xung R và S. Nếu chúng ta có một chốt chỉ chuyển trạng thái của nó từ một xung đầu vào chung, chúng ta có thể làm cho các bảng tra cứu lớn bằng một nửa. Có một chốt như vậy cho dấu chấm PM, nhưng nó rất lớn và tôi không thể đưa ra một cái gì đó thiết thực hơn.
  • Làm cho màn hình nhỏ hơn. Nhưng điều đó sẽ không đẹp như thế. Và nó cần phải được. Đúng.

26
Đẹp. Câu trả lời tốt đẹp.
Pavel

33
@Poke đi nào, bạn có thể đã cố gắng tự thêm cái này ... Dù sao, tôi đã chỉnh sửa bài đăng với một phiên bản có cả AM + PM, vì niềm vui của bạn.
mờ ngày

48
Để bạn biết, câu trả lời này đã được đăng trên microsiervos , một trong những blog quan trọng nhất về công nghệ ở Tây Ban Nha, với hơn 800 nghìn người theo dõi trên Twitter
Luis Mendo

26
@Rory Bạn lấy đầu của bạn, đập nó lên tường mạnh gấp hàng chục lần bạn có thể. Bạn đã sẵn sàng để bắt đầu.
mờ

34
Vì vậy, quá trình thiết kế là: "Ok, tôi cần phải va chạm với nó, và tàu lượn của tôi xuất phát từ vị trí này vào thời điểm này. Chúng ta hãy xem mang nó đến đó bằng hai gương phản xạ. Crap, thứ cần thiết để va chạm chỉ là hai bước thế hệ quá sớm, ở đó. Nếu tôi di chuyển gương phản xạ một chút, hãy xem ... Crap, quá muộn. Ok, chúng ta hãy va chạm với chúng ở một nơi khác. Crap, tôi không có phòng để làm cho tàu lượn của mình đến đó. Ok, thay vào đó hãy thêm hai gương phản xạ vô dụng khác để đưa nó đến đó. Crap, các gương phản xạ va chạm vào dòng tàu lượn khác này ... Crap, chúng ta hãy đi ngủ. "
mờ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.