Mô phỏng mô hình Game-of-Life-ish 1D


12

Câu hỏi này chỉ thiên về đánh giá mã và tôi cho rằng bạn có thể thích nó thích nghi như một thách thức về tiền mã hóa:

Bạn được cung cấp một danh sách không trống của các ngôi nhà x được biểu diễn dưới dạng booleans. Mỗi ngày, các ngôi nhà cạnh tranh với những người liền kề. 1 đại diện cho một ngôi nhà "đang hoạt động" và 0 đại diện cho một ngôi nhà "không hoạt động". Nếu những người hàng xóm ở cả hai phía của một ngôi nhà nhất định đều hoạt động hoặc cả hai không hoạt động, thì ngôi nhà đó sẽ không hoạt động vào ngày hôm sau. Nếu không thì nó trở nên hoạt động.

def get_state_as_pos(thelist, pos):
    if thelist[pos-1] == thelist[pos+1]:
        return 0
    else:
        return 1

Ví dụ: nếu chúng ta có một nhóm hàng xóm [0, 1, 0] thì ngôi nhà ở [1] sẽ trở thành 0 vì cả ngôi nhà bên trái và bên phải đều không hoạt động. Các ô ở cả hai đầu cũng kiểm tra phía đối diện, vì vậy các lân cận ở chỉ số 0 nằm ở chỉ mục length-1và indexn1 và ngược lại. Ngay cả sau khi cập nhật ô, bạn phải xem xét trạng thái trước của nó khi cập nhật các ô khác để thông tin trạng thái của từng ô được cập nhật đồng thời.

Hàm này lấy mảng các trạng thái và một số bước và sẽ xuất trạng thái của các ngôi nhà sau số bước đã cho.

    input: states = [1, 0, 0, 0, 0, 1, 0, 0], steps = 1
   output should be [0, 1, 0, 0, 1, 0, 1, 1]

    input: states = [1, 1, 1, 0, 1, 1, 1, 1], steps = 2
intermediate state= [0, 0, 1, 0, 1, 0, 0, 0]
   output should be [0, 1, 0, 0, 0, 1, 0, 0]


    input: states = [1], steps=1
    output: states= [0]

Lấy danh sách và các bước theo cách bạn thích và xuất danh sách kết quả thông qua I / O mặc định . Sơ hở tiêu chuẩn bị cấm. Đây là codegolf, câu trả lời ngắn nhất trong byte thắng!


8
+1 cho Automata di động. Đây không phải là Quy tắc 90 sao?
Đánh giá cao hoạt động

2
Không nên là trường hợp thử nghiệm đầu tiên dẫn đến [0, 1, 0, 0, 1, 0, 1, 1]?
TFeld

4
@jaaq Tôi đang đề cập đến Quy tắc tự động tế bào cơ bản (về sự biến đổi giữa từng bước hoặc các thế hệ) # 90. Nhập "Quy tắc 90" trong Wolfram | Alpha.
Đánh giá cao hoạt động

12
xuất danh sách kết quả qua STDOUT : rất khuyến khích chỉ dựa vào các phương thức I / O mặc định của chúng tôi .
Arnauld

5
@jaaq Không có nhiều sự trùng hợp ngẫu nhiên vì có Quy tắc # cho mỗi Tự động hóa tế bào 1D tiêu chuẩn. Điều này là do 3 bit có 8 trạng thái có thể (hàng xóm bên trái, bản thân, hàng xóm bên phải) và nếu bạn nói với mỗi trạng thái đó, một ngôi nhà nhất định sẽ bật hoặc tắt đó là 8 giá trị đúng / sai xảy ra để ánh xạ hoàn hảo đến một byte. Do đó, Quy tắc số 0-255 có thể được sử dụng làm tốc ký để mô tả bất kỳ quy tắc nào bằng cách lấy biểu thức nhị phân làm trạng thái bật / tắt nhà kết quả trong mỗi 8 tình huống dựa trên vị trí trong byte. Một số quy tắc được coi là đáng chú ý, chẳng hạn như 90, do đó, được công nhận :)
Lunin

Câu trả lời:


8

05AB1E , 14 13 10 9 6 byte

Dựa trên giải pháp Japt của Shaggy

F©Á®À^

Hãy thử trực tuyến!

F                  # repeat n times:
 ©Á                #  the list, rotated right
   ®À              #  the list, rotated left
     ^             #  xor (vectorizes)

Giải pháp 9 byte thông minh không cần thiết:

F¥DO.øü+É

Hãy thử trực tuyến!

F                  # repeat n times:
                   #  (examples given for the initial state [0, 1, 1, 0, 1])
 ¥                 #  deltas of the list ([1, 0, -1, 1])
  D                #  duplicate
   O               #  sum (1)
    .ø             #  surround ([1, 1, 0, -1, 1, 1])
      ü+           #  pairwise addition ([2, 1, -1, 0, 2])
        É          #  modulo 2 ([0, 1, 1, 0, 0])




2

Japt -mh , 11 10 9 byte

I / O của các trạng thái dưới dạng mảng 2D đơn.

VÇí^Zé2)é

Thử nó

VÇí^Zé2)é     :Implicit input of integer U=steps & array V=[states]
VÇ            :Modify the last element Z in V
  í           :Interleave with
    Zé2       :  Z rotated right twice and
   ^          :  Reduce each pair by XOR
       )      :End interleave
        é     :Rotate right once
              :Repeat U times and implicitly output V

2

Võng mạc , 51 byte

1A`
"$+"{`(.).*(.)
$2$&$1
(.)(?=.(\1|(.)))?
$#2*$#3

Hãy thử trực tuyến! Lấy số bước trên dòng đầu tiên và một chuỗi 0s và 1s trên dòng thứ hai. Giải trình:

1A`

Xóa số bước từ đầu vào.

"$+"{

Lặp lại số lần đó.

`(.).*(.)
$2$&$1

Sao chép các chữ số kết thúc vào các đầu khác để mô phỏng gói.

(.)(?=.(\1|(.)))?
$#2*$#3

Thực hiện thao tác XOR.


2

APL (Dyalog Extended) , 12 byte SBCS

Chương trình đầy đủ. Nhắc stdin cho mảng trạng thái và sau đó cho số bước. In ra thiết bị xuất chuẩn.

1(⌽≠⌽⍢⌽)⍣⎕⊢⎕

Hãy thử trực tuyến!

được đánh giá đầu vào từ bàn điều khiển (mảng trạng thái)

 trên đó, áp dụng đào

1(... )⍣⎕ hàm sau ngầm, số đầu vào của lần, mỗi lần với 1như là đối số bên trái:

⌽⍢⌽ xoay đối số bên phải 1 bước trái trong khi đảo ngược (nghĩa là xoay một bước phải)

⌽≠ XOR với đối số xoay 1 bước còn lại




1

Bình thường , 24 byte

AQVH=Gmxhded.:+eG+GhG3;G

Hãy thử trực tuyến!

AQ                        # G, H = Q[0], Q[1] # Q = input in the form [[states],steps]
  VH                      # for i in range(H):
    =G                    # G = 
      m                   #     map(lambda d:                              )
       xhded              #                   d[0] ^ d[-1],
            .:       3    #         substrings(                 , length=3)
              +eG+GhG     #                     G[-1] + G + G[0]
                      ;   # (end for loop)
                       G  # print G

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.