Mô phỏng đá đỏ đơn giản


27

Redstone là một vật liệu trong trò chơi Minecraft, và nó được sử dụng cho nhiều bối cảnh phức tạp. Đối với chương trình này, bạn sẽ chỉ cần mô phỏng ba vật phẩm: dây đá đỏ (ghi chú bằng R), đèn pin đá đỏ (ghi chú bằng T) và khối (ghi chú bằng B).

Dưới đây là danh sách các quy tắc cơ bản về cách thức hoạt động của redstone:

A redstone torch sends power to any adjacent redstone wire.
TRRRR
 ^This redstone wire is powered.

Redstone wire can only hold power for 15 blocks.
TRRRRRRRRRRRRRRRR
                ^This last wire is unpowered, because the torch is >15 blocks away.

A block is said to be powered if a powered redstone wire is found adjacent to it.
TRRRB
    ^This block is powered.

If a block next to a redstone torch is powered, then the torch stops emitting power.
T
R
R
R
B <This block is powered.
T <This redstone torch does not emit power because of the block next to it.
R <This redstone is unpowered because the torch is not providing power.
R

Đầu vào sẽ được cung cấp trong các mảng hai chiều có kích thước 64x64, như sau:

TRRR
   B
TBRTRR
R
RRRRRRRRR
        R
   RRRRRR

Nó được đảm bảo rằng đầu vào sẽ không có bất kỳ "đồng hồ" nào, hoặc đá đỏ được cung cấp bởi một ngọn đuốc chỉ vào khối mà ngọn đuốc đang bật. Sẽ chỉ có một mạch đá đỏ trong mỗi đầu vào.

Chương trình của bạn phải thay đổi mỗi ký tự thành 1 hoặc 0, 1 cho biết vật phẩm này được cấp nguồn / phát năng lượng và 0 nếu nó không được cấp nguồn / không phát ra năng lượng.

Đầu vào này nên có đầu ra này:

1111
   1
100000
1
111111111
        1
   001111

Đây là một môn đánh gôn, vì vậy, mã ngắn nhất sẽ thắng.


1
Sản lượng nào bạn mong đợi cho các tình huống như thế "TRR\nB B\nRRT"nào?
Howard

111\n0 1\n000là đầu ra; nó dường như là âm thanh trong các quy tắc. Tôi sẽ đặt một hạn chế đầu vào nói rằng bạn không thể có bất kỳ tình huống nào như TRR B R RRR, nơi nó nhấp nháy liên tục.
beary605

1
Chúng ta có thể giả sử rằng mỗi mảng đầu vào sẽ chỉ chứa một mạch hoàn chỉnh chạy từ trên xuống dưới như trong ví dụ của bạn hay chúng ta phải mã hóa cho nhiều mạch riêng biệt bắt đầu ở bất kỳ đâu trong mảng?
Graham

@Graham: Sẽ chỉ có một mạch đá đỏ cho mỗi đầu vào.
beary605

1
Khi biết trò chơi Minecraft, tôi nghĩ rằng trong ví dụ của bạn đưa ra khối trên dòng 2 không ngăn được ngọn đuốc liền kề cung cấp năng lượng (đá đỏ không thực sự kết nối với khối). Đây có phải là một lỗi hoặc đơn giản hóa có nghĩa là?
tomsmeding

Câu trả lời:


4

Haskell, 400

import Data.Char
import Data.List
f x=[(++[x]).tail,(x:).init]
h(' ':_)=' '
h('T':s)=if elem 'b's then 'T'else 't'
h('t':s)=h$'T':s
h('B':s)=if any(`elem`s)['e'..'s']then 'b'else 'B'
h('b':s)=h$'B':s
h(_:s)=max 'd'$chr$ord(maximum s)-1
o ' '=' '
o c|elem c"dTB"='0'
o _='1'
a=(map.map)o.(!!(64^2+16)).iterate(map(map h.transpose).transpose.(\l->[g l|g<-id:f(map(const ' ')$head l)++map map (f ' ')]))

map(map h.transpose).transpose.(\l->[g l|g<-id:f(map(const ' ')$head l)++map map (f ' ')])thay thế mỗi ô bằng một danh sách của chính nó theo sau bởi bốn hàng xóm của nó, sau đó ánh xạ qua h. h nói với từng ô như thế nào nó phản ứng với hàng xóm: Đèn pin tắt ('T' thay vì 't') khi có một khối năng lượng ('b') ở gần đó, dây ('d' cho người chết qua 's') sao chép không hoàn hảo người hàng xóm quyền lực nhất của họ (mặc dù không thể trở nên tồi tệ hơn người chết), v.v.

iterateLặp lại bước này, thực (!!(64^2+16))hiện một phép lặp trong đó các mạch tuần hoàn được thực hiện hội tụ và tôi hoàn toàn viết nó như thế để đưa ra một ràng buộc trực quan, không hạ cánh ở mức 400.


4

Con trăn, 699

Đây chỉ là một vượt qua nhanh chóng (hết thời gian bây giờ). Nó có thể có thể sử dụng nhiều golf hơn.

import sys
m=[list(x)for x in sys.stdin.read().split('\n')]
e=enumerate
S=set
s=lambda x:S([(r,c)for r,i in e(m)for c,j in e(i)if j==x])
q=S()
t=s('T')
b=s('B')
n=s('R')
def d(o,r,c,i,h,q):
 if i<0:return 0
 o[(r,c)]=1
 for p in[(r+1,c),(r-1,c),(r,c+1),(r,c-1)]:
  if p in q or(p in b and not(r,c)in n):continue
  if(r,c)in b and p in t-q:
   x=S([p])
   q|=x
   o[p]=0
   return 1
  if p in h or not p in o:continue
  h|=S([p])
  if not d(o,p[0],p[1],i-1,h,q):return 1
g=1
while g:
 o=dict(zip(b,[0]*len(b))+zip(n,[0]*len(n))+zip(q,[0]*len(q)))
 g=0
 for x,y in t:
  if not(x,y)in q and d(o,x,y,15,S(),q):g=1
for p in o.keys():m[p[0]][p[1]]=o[p]
print"\n".join(map(lambda x:"".join(map(str,x)),m))

Yep, ví dụ, bạn có thể sử dụng f=setvà tạo một l=lambda x:zip(x,[0]*len(x)). Chà, bạn vẫn còn hơn 700 ký tự. Ngoài ra, bạn để lại một không gian vô dụng tại ... or not (a,z)in o.
Morwenn

Bạn có cần không gian sau tuyên bố in của bạn?
Zacharý

@ZacharyT Bạn nói đúng. Cảm ơn!
ESultanik

Điều này đã được nói, nhưng f=setsẽ cạo một vài ký tự, và bạn có một nhân vật vô dụng khác @not (a,z)in o
Zacharý

Sử dụng các tab VÀ khoảng trắng để tiết kiệm thụt đầu dòng.
mbomb007

4

Python 2, 556 byte

c=' 0';L=len;M=map;q=list;r='B';s='16';t='T';u='0';E=enumerate
b=[q(M(lambda x:x+[u,s][x==t],q(w[:-1])))+[c]*(64-L(w))for w in open('redstone.txt')]
k=lambda h,l,z:max(q(M(lambda x:[int((x or c)[1:]),0][l^((x or c)[0]==h)],z)))
def v(d=0):
 for e,f in E(b):
    for g,G in E(f):z=[e!=0and b[e-1][g],g<L(f)-1and f[g+1],e<L(b)-1and b[e+1][g],g and f[g-1]];j=G;i=j[0]+str([[s,u][k(r,1,z)>0],4,4,k(t,0,z),0,max(1,k(r,0,z))-1][ord(j[0])%7]);b[e][g]=i;d=d|(i!=j)
 return d
while v():0
for f in b:print''.join(M(lambda j:[' ',`int(j[1:]!=u)`][j[0]!=' '],f))+'\n'

Xem nó trong hành động

  • Giả sử mỗi dòng trong đầu vào kết thúc bằng một dòng mới
  • Đầu ra thông qua print()
  • Mỗi dòng đầu ra kết thúc với nhiều khoảng trắng và một dòng mới

  • Đã lưu rất nhiều byte nhờ @ mbomb007 (# 34718)
  • Đã lưu 1 byte nhờ @ZacharyT (# 55550)

Bạn không cần phải có đầu vào và đầu ra thông qua các tập tin. Bạn có thể sử dụng stdin và stdout, với input()print. Ngoài ra, str(int(bool(j[1:]!=u)))là giống như `int(j[1:]!=u)`.
mbomb007

@ mbomb007 Vâng, không hẳn, tôi vẫn cần str(, nhưng điểm hay về bool(.
Quelklef

`x`(sử dụng backticks, đó là bí danh cho repr) giống như str(x)(đối với các số nguyên nhỏ, ít nhất. Nó khác với một số đối tượng nhất định, độ dài, trình tạo, v.v.). Một golf khác: if g!=0giống như if g. Bạn cũng có thể cók=lambda h,l,z:max(...
mbomb007

@ mbomb007 Backticks không dành cho Py3 và tôi không có 2 trên máy tính này. Nếu tôi cài đặt nó hoặc chuyển đổi máy tính, tôi sẽ thêm nó, cảm ơn.
Quelklef

1
Bạn có cần không gian ở đây? print ''? Nó có thể được print''không?
Zacharý
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.