এএসসিআইআই-আর্ট জেম্বো আক্রমণের সিমুলেশন


13

একটি জম্বি আক্রমণ অনুকরণ করতে, গ্রিড দিয়ে শুরু করুন #এবং মানচিত্রটি উপস্থাপন করুন:

##   ##
###   #
## ##  
  # ###
#  ####
  • # জমি প্রতিনিধিত্ব করে।
  • জল প্রতিনিধিত্ব করে।

জোম্বিগুলি মানচিত্রের একটি বিন্দুতে শুরু হয় ...

##   ##
###   #
## %#  
  # ###
#  ####

... এবং ছড়িয়ে। %জম্বি দ্বারা সংক্রামিত ভূমি বোঝায়।

তবে জম্বিরা সাঁতার কাটতে পারে না । কোনও রাজকর্তা দাবাতে যেভাবে চলাচল করে সেগুলিও তারা ভূমি জুড়ে যেতে পারে - যে কোনও তির্যক বা অরথোগোনাল দিকের এক বর্গ:

!!!
!%!
!!!

সিমুলেশন শেষে কিছু জমিটি জম্বিগুলিতে সংক্রামিত হবে:

%%   ##
%%%   #
%% %%  
  % %%%
#  %%%%

আপনার কাজটি হ'ল জম্বি আক্রমণের অনুকরণ করা। একটি প্রোগ্রাম (বা ফাংশন) লিখুন যা গ্রিডের প্রাথমিক অবস্থার প্রতিনিধিত্ব করে একটি স্ট্রিং এবং প্রাথমিক জম্বিটির স্থানাঙ্ককে উপস্থাপন করে এমন দুটি সংখ্যা লিখুন। প্রোগ্রামটির আক্রমণের চূড়ান্ত অবস্থা আউটপুট করা (বা প্রত্যাবর্তন) করা উচিত।

বিশেষ উল্লেখ

  • আপনার প্রোগ্রামটি optionচ্ছিক ট্রেলিং নিউলাইনটি মুদ্রণ করতে পারে।
  • আপনি ধরে নিতে পারেন ইনপুটটি সঠিক formatচ্ছিকভাবে নতুন লাইনের সাথে সঠিক ফর্ম্যাটে (স্পেস দিয়ে প্যাডযুক্ত) হবে।
  • আপনি ধরে নিতে পারেন প্রাথমিক জম্বিটি জমিতে শুরু হবে এবং অবিলম্বে মারা যাবে না।
  • এটি , তাই সংক্ষিপ্ত উত্তরটি (বাইটে) জেতে।
  • -100% বোনাস যদি আপনার কোড স্বেচ্ছাসেবী টুরিং মেশিনগুলির জন্য হ্যালটিং সমস্যা সমাধান করতে পারে ।
  • আপনার প্রোগ্রামে 50 টি পর্যন্ত চর বিস্তৃত পরিচালনা করা উচিত।

কি বিরাম সমস্যা ?
মুকুল কুমার

3
@MukulKumar en.wikipedia.org/wiki/Halting_problem । এটা একটা রসিকতা. হ্যালটিং সমস্যা সমাধান করা অসম্ভব।
ফলের এসোসোলিং ফল

1
আপনি কখনই জানেন না: পি
মুকুল কুমার


1
না, গুরুত্ব সহকারে, আমি থামানো সমস্যার সমাধানের জন্য বোনাসটি -200% এ নিয়েছি। উত্তর এটি প্রাপ্য হবে। :)
রুডলফ জেলিন

উত্তর:


1

এপিএল (ডায়ালগ) , 44 বাইট

{{c'%'[⌊⌿'%#'∊¨⍵(c4⊃⍵)]}∘,⌺3 3⍣≡'%'@(⊂⍺)⊢⍵}

এটি অনলাইন চেষ্টা করুন!

অনুমান ⎕IO←0

বাম আর্গুমেন্ট: 0-এর ইনডেক্সেড সারি r%, 0-এর সূচকযুক্ত কলাম c%: r c
ডান আর্গুমেন্ট: চরিত্রের ম্যাট্রিক্স


5

কোটলিন, 283 218 বাইট

নামহীন ল্যাম্বদা (নেস্টেড ফাংশন সহ, হি)।

Golfed

{i:String,x:Int,y:Int->val m=i.lines().map{it.toCharArray()};fun v(x:Int,y:Int){try{if(m[y][x]=='#'){m[y][x]='%';for(c in-1..1)for(d in-1..1)if(!(c==0&&d==0))v(x+c,y+d)}}catch(e:Exception){}};v(x, y);m.map(::println)}

Ungolfed

fun zombies(input: String, startX: Int, startY: Int) {
    val m = input.lines().map(String::toCharArray)      // build game map
    fun invade(x: Int, y: Int) {                        // nested functions, woo!
        try {
            if (m[y][x] == '#') {                       // if land
                m[y][x] = '%'                           // mark as invaded
                for (dx in -1..1) {                      // generate neighbour tiles
                    for (dy in -1..1) {
                        if (!(dx == 0 && dy == 0)) {
                            invade(x + dx, y + dy)        // attempt to invade neighbours
                        }
                    }
                }
            }
        } catch(e: Exception) {}                        // catches ArrayIndexOutOfBounds
    }

    invade(startX, startY)                              // start the invasion
    m.map(::println)                                    // print final state
}

পুনরাবৃত্তাকারী সমাধানে স্যুইচ করে বেশ কয়েকটি বাইট সংরক্ষণ করা হয়েছে।


3
"মজাদার
জম্বিগুলি

4

জাভাস্ক্রিপ্ট (ES6), 144 বাইট

(s,x,y,l=s.search`\n`,g=s=>s==(s=s.replace(eval(`/(#|%)(.?[^]{${l-1}}.?)?(?!\\1)[#%]/`),`%$2%`))?s:g(s))=>g(s.slice(0,x+=y*l)+`%`+s.slice(x+1))

যেখানে \nআক্ষরিক নিউলাইন চরিত্রের প্রতিনিধিত্ব করে। 0-সূচকযুক্ত স্থানাঙ্ক নেয়।


2

বেফুঞ্জ, 324 323 বাইট

&00p&10p20p~$v<p02+g02*!g02:+1$$$$<
 #<%>\"P"/8+p>1+:::~:0`!#v_:85+`!#^_2%\2%3*1+*\2/:"P"%\"P"/8+g+\2/:"P"
:+**73"="+g00*g02g010$$$$<v
02:\-<v/"P"\%"P":/2::_|#:$<:+1+g02\+g02:\-1+g02:\+1:\-1:\+1-g
\:20g^>g:30p\2%3*1+/4%1->#^_::2%6*2+30g+\2/:"P"%\"P"/p:20g-1-
0<v2\g+8/"P"\%"P":/2::<\_@#`0:-g
2^>%3*1+/4%1g,1+:20g%#^_1+55+,\

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

বেফুঞ্জে এটি প্রয়োগ করা কিছুটা জটিল ছিল কারণ আমরা "মেমরি" এর 80x25 টি অক্ষরের মধ্যে সীমাবদ্ধ যা এটিকে উত্স কোডের সাথে ভাগ করে নিতে হবে। ওই অঞ্চলে একটি 50x50 মানচিত্র লাগানোর কৌশলটি ছিল বাইট প্রতি দুটি মানচিত্রের স্থানে 2D মানচিত্রটি 1D অ্যারে সমতল করা। এই 1D অ্যারেটি আবার 2D অ্যারেতে আবৃত হয় যাতে এটি বেফঞ্জ খেলার মাঠের 80 টি অক্ষরের প্রস্থে ফিট করতে পারে।

সংক্রমণের অ্যালগরিদমটি প্রাথমিক স্থানাঙ্কগুলিকে 1D অ্যারেতে অফসেটে রূপান্তর করে শুরু হয় যা এটি স্ট্যাকের দিকে ঠেলে দেয়। প্রধান লুপটি স্ট্যাক থেকে একটি মান নেয় এবং সেই অফসেটের জন্য মানচিত্রের সন্ধান করে। যদি এটি অবিচ্ছিন্ন জমি হয় তবে এটি সংক্রামিত হিসাবে চিহ্নিত হয়ে যায় এবং আটটি নতুন অফসেটগুলি স্ট্যাকের উপরে চাপ দেওয়া হয় (বর্তমান অবস্থানের চারপাশে জমিটি উপস্থাপন করে)। স্ট্যাকটি খালি না হওয়া পর্যন্ত এই প্রক্রিয়াটি চলতে থাকে।

পরিসীমা মানগুলির বাইরে যাচাই করা এড়াতে, মানচিত্রটি সমস্ত প্রান্তের চারপাশে একটি বর্ণের জলের সীমানা দিয়ে সংরক্ষণ করা হয়।


1

পিপ , 59 বাইট

{(ac+b+b*Ya@?n):'%L2*#aa:RVaR.`#(.?.?.{`.y-1.`})?%`'%.@>_a}

একটি ফাংশন যা বহুবিধ স্ট্রিং নেয়, প্রাথমিক জম্বিটির সারি (0-সূচকযুক্ত) এবং প্রাথমিক জম্বিটির কলাম (0-সূচীকৃত)। এটি অনলাইন চেষ্টা করুন!

কিভাবে?

যেহেতু পিপে সাইক্লিকাল ইনডেক্সিং রয়েছে (সাধারণত একটি ভাল জিনিস তবে এই সমস্যার জন্য খারাপ কারণ আমরা মানচিত্রের প্রান্তগুলি মোড়তে চাই না), আমি একটি রেজেক্স-রিপ্লেসমেন্ট সলিউশনের জন্য গিয়েছিলাম।

Ya@?nপ্রথম নতুনরেখার সূচক (যেমন গ্রিডের প্রস্থ) সন্ধান করে এবং এটিকে ইয়ঙ্ক করে y

(ac+b+b*Ya@?n):'%সর্বোপরি, নির্ণয় করার পর (width + 1) * row + col, অর্থাত্ c+b+b*yযে সূচিতে, এবং সেট চরিত্র %

L2*#aলুপস 2*len(a)বার, যা আমাদের পুরোপুরি প্রচারের জন্য বন্যা পূরণের জন্য পর্যাপ্ত পুনরাবৃত্তি দেয় এবং পুনরাবৃত্তি গণনাটি সমান (এটি গুরুত্বপূর্ণ) নিশ্চিত করে।

.`#(.?.?.{`.y-1.`})?%`একটি Regex একটি মেলায় নির্মান #একটি দ্বারা অনুসরণ %, হয় 0, প্রস্থ -1, প্রস্থ আছে বা মাঝে প্রস্থ +1 টি অক্ষর। ( .শুরুতে তোলে. রেগেক্স ম্যাচ নিউলাইনগুলিতে তৈরি করে)) এই রেজেক্সটি নিম্নলিখিত যে কোনও কনফিগারেশনের সাথে মেলে:

#  
 % 

 # 
 % 

  #
 % 

#% 

aR ... '%.@>_অক্ষর দিয়ে এই Regex এর মিল প্রতিস্থাপন %করার prepended .সব কিন্তু প্রথম অক্ষর @>ম্যাচ_ ; সংক্ষেপে, এর #সাথে প্রতিস্থাপন %

a:RV ...এটির বিপরীত হয় এবং এটিকে আবার নিয়োগ করে a। আমরা বিপরীত কারণ রেগেক্স শুধুমাত্র আগে মেলে# % স্ট্রিংয়ের , পরে নয়; তবে যখন স্ট্রিংটি বিপরীত হয়, তার পরে আগে হয়ে যায় এবং আমরা এটি পরবর্তী পুনরাবৃত্তির সাথে মেলাতে পারি। এই কারণেই পুনরাবৃত্তির সংখ্যাটি সমান হতে হবে।

লুপটি সম্পূর্ণ হওয়ার পরে, আমরা কেবলমাত্র এর পরিবর্তিত মানটি ফিরিয়ে দেব a


0

টিএসকিউএল, 267 বাইট

Golfed:

USE master
DECLARE @ varchar(max)=
'##   ##
###   #
## %#  
  # ###
#  ####'

WHILE @@rowcount>0WITH C as(SELECT x+1i,substring(@,x+1,1)v,x/z r,x%z c
FROM spt_values CROSS APPLY(SELECT number x,charindex(char(10),@)z)z
WHERE type='P'and x<len(@))SELECT @=stuff(@,d.i,1,'%')FROM C,C D
WHERE'#%'=d.v+c.v and abs(c.r-d.r)<2and abs(c.c-d.c)<2PRINT @

Ungolfed:

USE master-- the script needs to be executed on the default master database
DECLARE @ varchar(max)=
'##   ##
###   #
## %#  
  # ###
#  ####'

WHILE @@rowcount>0
WITH C as
(
  SELECT x+1i,substring(@,x+1,1)v,x/z r,x%z c
  FROM
    spt_values
  CROSS APPLY(SELECT number x,charindex(char(10),@)z)z
  WHERE type='P'and x<len(@)
)
SELECT @=stuff(@,d.i,1,'%')FROM C,C D
WHERE'#%'=d.v+c.v and abs(c.r-d.r)<2and abs(c.c-d.c)<2

PRINT @

চেষ্টা কর


0

পিএইচপি, 209 189 188 183 বাইট

গল্ফযোগ্য হতে পারে

for($w=strpos($s=($a=$argv)[1],10),$s[$a[2]*++$w+$a[3]]="%";$t<$s;)for($t=$s,$i=0;""<$c=$s[$i++];)if($c>"$")for($y=-2;++$y<2;)for($x=3;$x--;)$s[$p=$i+$y*$w-$x]>"!"?$s[$p]="%":0;echo$s;

সাথে চালাও php -r '<code>' '<grid>' <y> <x>


0

জে, 152 বাইট

খুব গল্ফড নয়, আমি নিশ্চিত যে শেষ কয়েকটি নিয়ন্ত্রণ কাঠামো অপসারণ করার একটি উপায় আছে।

f=:4 :0
c=.(' '"_)`({~&<y)@.((*./y<$x)*.*./y>:0 0)x if.c='#' do.x=.'%'(<y)}x[i=.0 while.i<9 do.i=.>:i[x=.x f y+i<:@(|~,<.@%)3 end.end.x
)
g=:>@cutLF@[f]

একটি বন্যা ভরাট অ্যালগরিদম কার্যকর করে। এফ প্রয়োগ করার আগে ফাংশন জি একটি অক্ষর অ্যারে ইনপুট ফর্ম্যাট করে।

নোট করুন যে স্থানাঙ্কগুলি কিছুটা অদ্ভুত:

0, 0

উপরের বাম কোণে। প্রথম সমন্বয় বাড়ানো:

1, 0

অবস্থানটি y দিক দিয়ে নীচে নিয়ে যায়।

এটি ছাড়া অন্য স্থানাঙ্কগুলি স্বাভাবিক।

উদাহরণ:

    land =: 0 : 0    NB. Define a multi-line string
##   ##
###   #
## ##  
  # ###
#  ####
)

    ] l =. >@cutLF land    NB. Cut 'land' on new lines, and form into an array. Assign to 'l'
##   ##
###   #
## ##  
  # ###
#  ####
    NB. Looks the same, but it isn't.

    '%' (<2 3)} l    NB. 'Infect' the land at 2, 3
##   ##
###   #
## %#  
  # ###
#  ####

    l f 2 3    NB. Flood fill on l (already formatted), starting at 2 3
%%   ##
%%%   #
%% %%  
  % %%%
#  %%%%

    land g 2 3    NB. Flood fill on land, formats for us.
%%   ##
%%%   #
%% %%  
  % %%%
#  %%%%
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.