간단한 레드 스톤 시뮬레이터


27

레드 스톤은 게임 마인 크래프트의 재료이며 많은 복잡한 장치에 사용됩니다. 이 프로그램에서는 레드 스톤 와이어 (R로 표시), 레드 스톤 토치 (T로 표시) 및 블록 (B로 표시)의 세 가지 항목 만 시뮬레이션하면됩니다.

다음은 레드 스톤 작동 방식에 대한 기본 규칙 목록입니다.

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

입력은 다음과 같이 최대 64x64 크기의 2 차원 배열로 제공됩니다.

TRRR
   B
TBRTRR
R
RRRRRRRRR
        R
   RRRRRR

입력에 "시계"가 없거나 토치가 켜져있는 블록을 가리키는 토치로 전원이 공급되는 레드 스톤이 없도록 보장합니다. 모든 입력에 하나의 레드 스톤 회로 만 있습니다.

프로그램은 각 문자를 1 또는 0으로 변경해야합니다. 1은이 항목이 전원 공급 / 방출 전원인지 표시하고 1이 전원이 공급되지 않거나 전원이 공급되지 않는 경우 0을 나타냅니다.

이 입력에는 다음 출력이 있어야합니다.

1111
   1
100000
1
111111111
        1
   001111

이것은 코드 골프이므로 항상 가장 짧은 코드가 승리합니다.


1
다음과 같은 상황에서 어떤 결과가 예상 "TRR\nB B\nRRT"됩니까?
Howard

111\n0 1\n000출력입니다. 규칙 내에서 건전한 것 같습니다. TRR B R RRR반복적으로 깜박이는와 같은 상황을 가질 수 없다는 입력 제한을 두겠습니다 .
beary605

1
각 입력 배열에 예제와 같이 위에서 아래로 실행되는 완전한 회로가 하나만 있다고 가정하거나 배열의 어느 곳에서나 시작하는 여러 개의 개별 회로를 코딩해야합니까?
Graham

@Graham : 각 입력마다 하나의 레드 스톤 회로 만 있습니다.
beary605

1
게임 마인 크래프트 알고, 당신의 예에서와 라인 2 블록 주어진 생각 하지 (레드 스톤이 실제로 블록에 연결되지 않습니다) 전원을 제공에서 인접한 횃불을 중지합니다. 이 오류 또는 의미 단순화입니까?
tomsmeding

답변:


4

하스켈, 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 ' ')])각 타일을 자체 목록과 네 개의 이웃으로 대체 한 다음 h를 통해 매핑합니다. h는 각 타일에 대해 이웃과의 반응 방식을 말합니다. 전원 블록 ( 'b')이 근처에있을 때 횃불이 꺼집니다 ( 'b'), 전선 ( 'd'를 통해 죽은 경우 'd')이 불완전하게 복사됩니다. 그들의 가장 강력한 이웃 (죽은 것보다 더 나빠질 수는 없지만) 등

iterate이 단계를 (!!(64^2+16))반복하고 비순환 회로가 수렴되는 반복을 제거하고 400에 착륙하지 않고 직관적 인 경계를주기 위해 완전히 썼습니다.


4

파이썬, 699

이것은 빠른 패스입니다 (현재는 시간이 다되었습니다). 아마 훨씬 더 많은 골프를 사용할 수 있습니다.

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))

예를 들어을 사용 f=set하고 만들 수 있습니다 l=lambda x:zip(x,[0]*len(x)). 글쎄, 당신은 여전히 ​​700 자 이상입니다. 또한에 쓸모없는 공간을 남겼습니다 ... or not (a,z)in o.
Morwenn

인쇄 명세서 뒤에 공백이 필요합니까?
Zacharý

@ZacharyT 당신이 맞아요. 감사!
ESultanik

이것은 이미 말했지만 f=set, 몇 문자를 면도하고, 당신은 또 다른 쓸모없는 문자 @not (a,z)in o
Zacharý

들여 쓰기를 줄이려면 탭과 공백 을 사용하십시오 .
mbomb007

4

파이썬 2, 556 바이트

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'

실제로보기

  • 입력의 각 줄을 줄 바꿈으로 가정합니다
  • 통해 출력 print()
  • 각 출력 줄은 많은 공백과 줄 바꿈으로 끝납니다.

  • @ mbomb007 (# 34718) 덕분에 많은 바이트를 절약했습니다.
  • @ZacharyT 덕분에 1 바이트를 절약했습니다 (# 55550)

파일을 통한 입력 및 출력이 필요하지 않습니다. 당신과 함께 표준 입력과 표준 출력을 사용할 수있다 input()print. 또한와 str(int(bool(j[1:]!=u)))동일합니다 `int(j[1:]!=u)`.
mbomb007

@ mbomb007 글쎄, 아직은 str(아니지만에 대한 좋은 지적이 필요하다 bool(.
Quelklef

`x`(백틱을 사용하면의 별칭입니다 repr)과 같습니다 str(x)(적어도 작은 정수의 경우, 특정 객체, long, 생성기 등에서는 다릅니다). 다른 골프 : if g!=0와 동일합니다 if g. 당신은 또한 수 있습니다k=lambda h,l,z:max(...
mbomb007

@ mbomb007 Backticks는 Py3 용이 아니며이 PC에는 2가 없습니다. 설치하거나 컴퓨터를 전환하면 추가 할 것입니다. 감사합니다.
Quelklef

1
여기 공간이 필요합니까? print ''? 그럴 수 print''있습니까?
Zacharý
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.