Basit redstone simülatörü


27

Redstone Minecraft oyununda bir malzemedir ve birçok karmaşık uygulama için kullanılır. Bu program için sadece üç maddeyi simüle etmeniz gerekir: redstone teli (R ile not edilmiş), redstone torcu (T ile not edilmiş) ve blok (B ile not edilmiş).

Redstone'un nasıl çalıştığıyla ilgili temel kuralların bir listesi:

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

Girdi, 64x64 boyutuna kadar iki boyutlu dizilerde verilecek, bunun gibi:

TRRR
   B
TBRTRR
R
RRRRRRRRR
        R
   RRRRRR

Girişin, torcun açık olduğu bloğa işaret eden bir torç tarafından çalıştırılan herhangi bir "saat" veya redstone bulunmayacağı garanti edilir. Her girişte sadece bir redstone devresi olacaktır.

Programınız her bir karakteri 1 veya 0 olarak değiştirmeli, bu öğenin güç verilip verilmediğini ya da gücü kesilmişse ya da gücü kesmiyorsa 0 olsun.

Bu giriş şu çıkışa sahip olmalıdır:

1111
   1
100000
1
111111111
        1
   001111

Bu bir kod golfüdür, yani en kısa kod her zaman olduğu gibi kazanır.


1
Gibi durumlar için ne tür çıktılar bekliyorsunuz "TRR\nB B\nRRT"?
Howard

111\n0 1\n000çıktı; kurallar dahilinde ses gibi görünüyor. TRR B R RRRArka arkaya yanıp söndüğü gibi hiçbir durumda olamayacağınızı söyleyen bir giriş kısıtlaması koyacağım .
beary605

1
Her giriş dizisinin, örneğinizde olduğu gibi yukarıdan aşağıya doğru çalışan yalnızca bir tam devre içereceğini varsayabilir miyiz veya dizinin herhangi bir yerinde başlayan birden fazla ayrı devre kodlamak zorunda mıyız?
Graham

@ Graham: Her giriş için sadece bir redstone devresi olacaktır.
beary605

1
Oyunun Minecraft bilerek, sizin örnekte yok 2. hatta blok verilen düşünüyorum değil (redstone aslında bloğuna bağlamak değildir) güç vermekten komşu meşale durdurun. Bu bir hata mı yoksa bir basitleştirme mi?
toplandı

Yanıtlar:


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 ' ')])her döşemeyi kendi listesini ve ardından dört komşusunu takip eder, ardından h ile eşler. h her karo için komşulara nasıl tepki verdiğini söylüyor: Yakında bir güç bloğu ('b') varken, el fenerleri kapanıyor ('t' yerine 'T'), kablolar ('s' üzerinden ölüler için 'd') kusurlu bir şekilde kopyalanıyor. onların en güçlü komşuları (ölmekten daha kötüsü olamaz) vb.

iterateBu adımı tekrar eder, (!!(64^2+16))asiklik devrelerin yakınsak yapıldığı bir yinelemeyi açığa çıkarır ve tamamen böyle sezgisel bir sınır vermek için 400'e inmek için böyle yazdım.


4

Python, 699

Bu sadece hızlı bir pastadır (şimdilik şimdilik tükendi). Muhtemelen çok daha fazla golf kullanabilir.

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

Mesela, bir tane kullanabilir f=setve oluşturabilirsiniz l=lambda x:zip(x,[0]*len(x)). Hala 700'den fazla karakterin var. Ayrıca, işe yaramaz bir yer bıraktın ... or not (a,z)in o.
Morwenn

Yazılı ifadenizden sonra boşluğa mı ihtiyacınız var?
Zacharý

@ ZacharyT Haklısın. Teşekkürler!
ESultanik

Bu zaten söylendi, ama f=setbirkaç karakter tıraş ederdi, ve başka bir işe yaramaz karaktere not (a,z)in o
sahipsin

Bazı girinti tasarrufu için sekmeleri ve boşlukları kullanın .
mbomb007

4

Python 2,556 bayt

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'

İşlemde görün

  • Girdideki her satırın bir yeni satırla biteceğini varsayar
  • Üzerinden çıkışlar print()
  • Her çıktı satırı, çok sayıda boşluk ve bir satırsonu ile bitiyor

  • @ Mbomb007 (# 34718) sayesinde çok fazla sayıda bayt kaydedildi
  • @ZacharyT sayesinde 1 byte kurtarıldı (# 55550)

Dosyalar aracılığıyla giriş ve çıkış yapmanız gerekmez. Sen ile Standart giriş ve çıkışı, kullanabilir input()ve print. Ayrıca, str(int(bool(j[1:]!=u)))aynıdır `int(j[1:]!=u)`.
mbomb007

@ mbomb007 Pekala, tam olarak değil, hala ihtiyacım olan str(, ama iyi bir nokta bool(.
Quelklef

`x`(backticks kullanarak, bunun bir takma adı repr) aynıdır str(x)(küçük tamsayılar için, en azından. Bazı nesneler, uzunlar, jeneratörler vb. için farklıdır). Başka bir golf: if g!=0aynıdır if g. Ayrıca olabilirk=lambda h,l,z:max(...
mbomb007

@ mbomb007 Backticks Py3 için değil ve bu bilgisayarda 2 yok. Yüklerseniz veya bilgisayarları değiştirirsem, ekleyeceğim, teşekkürler.
Quelklef

1
Buradaki boşluğa ihtiyacınız var mı? print ''? Olabilir mi print''?
Zacharý
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.