सरल रेडस्टोन सिम्युलेटर


27

Redstone गेम Minecraft में एक सामग्री है, और इसका उपयोग कई जटिल गर्भ निरोधकों के लिए किया जाता है। इस कार्यक्रम के लिए, आपको केवल तीन वस्तुओं का अनुकरण करना होगा: रेडस्टोन वायर (आर के साथ नोट किया गया), रेडस्टोन टॉर्च (टी के साथ नोट किया गया), और ब्लॉक (बी के साथ नोट किया गया)।

रेडस्टोन कैसे काम करता है, इसके बारे में बुनियादी नियमों की एक सूची इस प्रकार है:

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 के आकार तक दिया जाएगा, जैसे:

TRRR
   B
TBRTRR
R
RRRRRRRRR
        R
   RRRRRR

यह गारंटी दी जाती है कि इनपुट में कोई "घड़ियां" नहीं होंगी, या टॉर्च को चालू करने वाले ब्लॉक को इंगित करते हुए लाल पत्थर से चलाया जाएगा। हर इनपुट में केवल एक रेडस्टोन सर्किट होगा।

आपके प्रोग्राम को प्रत्येक वर्ण को 1 या 0 में बदलना होगा, यह दर्शाता है कि यह आइटम संचालित / उत्सर्जक शक्ति है, और 0 यदि यह शक्तिहीन है / उत्सर्जक शक्ति नहीं है।

इस इनपुट में यह आउटपुट होना चाहिए:

1111
   1
100000
1
111111111
        1
   001111

यह एक कोड-गोल्फ है, इसलिए सबसे छोटा कोड जीतता है, हमेशा की तरह।


1
आप जैसी स्थितियों के लिए क्या आउटपुट की उम्मीद करते हैं "TRR\nB B\nRRT"?
हॉवर्ड

111\n0 1\n000आउटपुट है; यह नियमों के भीतर ध्वनि प्रतीत होता है। मैं यह कहते हुए इनपुट प्रतिबंध लगाऊंगा कि आपके पास ऐसी कोई भी स्थिति नहीं हो सकती है TRR B R RRR, जहां यह बार-बार चमकता हो।
beary605

1
क्या हम मान सकते हैं कि प्रत्येक इनपुट ऐरे में आपके उदाहरण के अनुसार ऊपर से नीचे तक केवल एक पूरा सर्किट चल रहा होगा या क्या हमें एरे में कहीं भी शुरू होने वाले कई अलग-अलग सर्किट के लिए कोड करना होगा?
ग्राहम

@ ग्राहम: प्रत्येक इनपुट के लिए केवल एक रेडस्टोन सर्किट होगा।
beary605

1
खेल Minecraft जानने के बाद, मुझे लगता है कि अपने उदाहरण में लाइन 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 प्रत्येक टाइल के लिए कहता है कि यह पड़ोसियों के साथ कैसे प्रतिक्रिया करता है: टार्च बंद ('t' के बजाय 'T'), जब पास में एक पावर ब्लॉक ('b') हो, तो तार ('d' 's' से मृतकों के लिए) उनके सबसे अधिक संचालित पड़ोसी (हालांकि मृत से बदतर नहीं हो सकते), आदि।

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
मॉर्वन

क्या आपको अपने प्रिंट स्टेटमेंट के बाद स्पेस की आवश्यकता है?
ज़ाचारि

@ZacharyT तुम सही हो। धन्यवाद!
ESultanik

यह पहले से ही कहा गया था, लेकिन f=setकुछ not (a,z)in o
आकर्षण

कुछ इंडेंटेशन बचत के लिए टैब और रिक्त स्थान का उपयोग करें
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 (# 55550) के लिए 1 बाइट धन्यवाद

आपको फ़ाइलों के माध्यम से इनपुट और आउटपुट की आवश्यकता नहीं है। आप स्टडिन और स्टडआउट का उपयोग कर सकते हैं, के साथ input()और print। इसके अलावा, के str(int(bool(j[1:]!=u)))रूप में ही है `int(j[1:]!=u)`
mbomb007

@ mbomb007 खैर, काफी नहीं, मुझे अभी भी जरूरत है str(, लेकिन इसके बारे में अच्छी बात है bool(
क्लेक्लेफ़

`x`(बैकटिक्स का उपयोग करते हुए, यह इसके लिए एक उपनाम है repr) str(x)(छोटे पूर्णांकों के लिए, कम से कम के लिए समान है। यह कुछ वस्तुओं, लोंगो, जनरेटर, आदि के लिए अलग है)। एक और गोल्फ: if g!=0जैसा ही है if g। आप भी कर सकते हैंk=lambda h,l,z:max(...
mbomb007

@ mbomb007 Backticks Py3 के लिए नहीं हैं , और मेरे पास इस पीसी पर 2 नहीं हैं। यदि मैं इसे स्थापित करता हूं या कंप्यूटर स्विच करता हूं, तो मैं इसे जोड़ूंगा, धन्यवाद।
Quelklef

1
क्या आपको यहां जगह की आवश्यकता है? print ''? यह हो सकता है print''?
जकार्ही
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.