সাধারণ রেডস্টোন সিমুলেটর


27

রেডস্টোন গেম মাইনক্রাফ্টের একটি উপাদান এবং এটি অনেক জটিল সংকোচনের জন্য ব্যবহৃত হয়। এই প্রোগ্রামটির জন্য, আপনাকে কেবল তিনটি আইটেমের অনুকরণ করতে হবে: রেডস্টোন ওয়্যার (আর দিয়ে উল্লিখিত), রেডস্টোন টর্চ (টি দিয়ে উল্লিখিত) এবং ব্লক (বি দিয়ে উল্লিখিত)।

রেডস্টোন কীভাবে কাজ করে সে সম্পর্কে এখানে মৌলিক নিয়মের একটি তালিকা রয়েছে:

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, 1 রূপে চিহ্নিত করতে হবে যা নির্দেশ করে যে এই আইটেমটি চালিত / নির্গমন শক্তি এবং একটি 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
গেমটি মাইনক্রাফ্টটি জেনে আমি মনে করি যে আপনার উদাহরণে লাইন ২ এ দেওয়া ব্লকটি সংলগ্ন মশালাকে শক্তি দেওয়া থেকে বিরত রাখে না (রেডস্টোন আসলে ব্লকের সাথে সংযুক্ত হয় না)। এটি কি একটি ত্রুটি বা বোঝানো সরলকরণ?
টেমসডিং

উত্তর:


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 ' ')])প্রতিটি টাইল প্রতিস্থাপন করে তার চারটি প্রতিবেশী তার নিজের একটি তালিকা দ্বারা, তারপরে এইচ এর মাধ্যমে মানচিত্র করে। এইচটি প্রতিটি টাইলের জন্য কীভাবে প্রতিবেশীদের প্রতি প্রতিক্রিয়া জানায়: টর্চগুলি বন্ধ হয়ে যায় ('টি' এর পরিবর্তে 'টি') যখন কাছাকাছি কোনও পাওয়ার ব্লক ('বি') থাকে, তারগুলি ('ডি' এর মাধ্যমে মৃত ব্যক্তির জন্য 'ডি') অসম্পূর্ণভাবে অনুলিপি করে তাদের সর্বাধিক শক্তিযুক্ত প্রতিবেশী (যদিও মৃতের চেয়ে ক্যান্সার করা খারাপ) ইত্যাদি etc.

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
মরওভেন

আপনার মুদ্রণ বিবৃতি পরে স্থান প্রয়োজন?
জাকারি

@ জাচারি আপনি ঠিক বলেছেন ধন্যবাদ!
সুলতানিক

এটি ইতিমধ্যে বলা হয়েছিল, তবে 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) এর জন্য প্রচুর বাইট সংরক্ষণ করা হয়েছে
  • @ জাচারিটি (# 55550) কে 1 বাইট সংরক্ষণ করা হয়েছে

আপনার ফাইলের মাধ্যমে ইনপুট এবং আউটপুট দেওয়ার দরকার নেই। আপনার সাথে stdin এবং stdout- এ ব্যবহার করতে পারে input()এবং print। এছাড়াও, str(int(bool(j[1:]!=u)))হিসাবে একই `int(j[1:]!=u)`
mbomb007

@ mbomb007 ঠিক আছে, আমার এখনও দরকার নেই str(, তবে এটি সম্পর্কে ভাল কথা bool(
কোয়েলক্লেফ

`x`(ব্যাকটিক্স ব্যবহার করে এটির জন্য একটি উপনাম repr) সমান str(x)(ছোট ছোট পূর্ণসংখ্যার জন্য, কমপক্ষে certain এটি নির্দিষ্ট বস্তু, লং, জেনারেটর ইত্যাদির জন্য পৃথক)। আর একটি গল্ফ: if g!=0একই if gk=lambda h,l,z:max(...
আপনারও

@ mbomb007 ব্যাকটিকগুলি পাই 3 এর জন্য নয় এবং আমার এই পিসিতে 2 টি নেই। আমি যদি এটি ইনস্টল করি বা কম্পিউটারগুলি স্যুইচ করি তবে আমি এটি যুক্ত করব, ধন্যবাদ।
কোয়েলক্লেফ

1
তোমার কি এখানে জায়গা দরকার? print ''? এটা হতে পারে print''?
জাকারি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.