লেবেল মারা শেষ


16

কোনও ASCII আর্ট "রাস্তা" এর একটি ইনপুট দেওয়া হয়েছে, সমস্ত মৃত প্রান্তযুক্ত লেবেলযুক্ত রাস্তাটিকে আউটপুট দেয়।

এটি একটি রাস্তা:

########.....######..#..###
#......#######....#..#..#.#
#.##......#...#####..#..###
#..#####..#....#..#######.#
#......#...#####.....##...#
#..###.#...#...###...#..###
##########.#..#..##..#.##.#
..#......#.######.#..#.#.#.
..#......#.#..#.#.#..#.#.#.
..######.###..##..#########

চিঠিটি লেবেলযুক্ত এটি মরা প্রান্তযুক্ত রাস্তা X:

########.....######..X..###
#......#######....#..X..#.#
#.XX......X...X####..X..###
#..XXXXX..X....#..#######.#
#......X...#####.....##...#
#..###.X...#...###...#..###
##########.#..X..##..#.##.X
..X......#.#XXXXX.#..#.#.X.
..X......#.#..X.X.#..#.#.X.
..XXXXXX.###..XX..######XXX

একটি মৃত প্রান্তটিকে এমন কোনও রোড টাইল হিসাবে সংজ্ঞায়িত করা হয় যা n অন্যান্য রাস্তার টাইলস সীমানা করে , কমপক্ষে কমপক্ষে n-1 এই নিয়ম দ্বারা ইতিমধ্যে মৃত প্রান্ত হিসাবে বিবেচিত হয় । "সীমানা" চারটি মূল দিকের দিকে রয়েছে, সুতরাং সীমানাযুক্ত টাইলগুলি তির্যকভাবে গণনা করা হবে না।

এই নিয়মটি বারবার প্রয়োগ করা হয়, যেহেতু সদ্য নির্মিত মৃত প্রান্তগুলি তারা নিজেরাই আরও মৃত প্রান্ত তৈরি করতে পারে । এছাড়াও মনে রাখবেন যে কোনও রোড টাইল যা কেবলমাত্র অন্য একটি রোড টাইলের সীমানায় নিয়ম প্রয়োগ করার পরে প্রথমবার একটি মৃত প্রান্ত হিসাবে বিবেচিত হয়।

ইনপুট এবং আউটপুট হয় একক স্ট্রিং (যে কোনও অক্ষর দ্বারা পৃথক করা লাইনগুলি নয় #বা .) বা অ্যারে / তালিকা / ইত্যাদি হতে পারে। যদি আপনার ভাষা এটি সমর্থন করে তবে আপনি প্রতিটি লাইনকে একটি কার্যকারিতা যুক্তিযুক্ত হিসাবে ইনপুটও নিতে পারেন।

আপনি ইনপুট সম্পর্কে নিম্নলিখিতটি ধরে নিতে পারেন:

  • সর্বদা কমপক্ষে একটি "লুপ" থাকবে - এটি #অক্ষরের একটি দল যা অনন্তভাবে অনুসরণ করা যেতে পারে। (অন্যথায় প্রতিটি টাইলই একটি মৃতপ্রান্তে পরিণত হবে))

  • এর থেকে বোঝা যায় যে ইনপুটটি সর্বদা 2 × 2 বা বড় হবে, যেহেতু ক্ষুদ্রতম লুপটি হ'ল:

    ##
    ##
    

    (যা ঘটনাক্রমে কোনও পরিবর্তন ছাড়াই আউটপুট হওয়া উচিত))

  • সমস্ত #অক্ষর সংযুক্ত করা হবে। এটি হ'ল, যদি আপনি কোনওটির উপর বন্যা পূরণ #করতে চান তবে সেগুলি সমস্ত ক্ষতিগ্রস্থ হবে।

যেহেতু এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জিতবে।

উপরের উদাহরণ এবং ক্ষুদ্র 2 × 2 গ্রিড পরীক্ষার কেস হিসাবে ব্যবহার করা যেতে পারে (এই চ্যালেঞ্জটি কভার করার জন্য খুব বেশি প্রান্তের কেস নেই)।

উত্তর:


8

সিজেম, 61 বাইট

q_N/{{0f+zW%}4*3ew:z3few::z{e__4=_@1>2%'#e=*"#"='X@?}f%}@,*N*

এখানে চেষ্টা করুন

ব্যাখ্যা

Outline:

    q_N/               Read input lines
        {   }@,*       Perform some operation as many times as there are bytes
                N*     Join lines

Operation:

    {0f+zW%}4*         Box the maze with zeroes
    3ew:z3few::z       Mystical 4D array neighborhood magic.
                       (Think: a 2D array of little 3x3 neighborhood arrays.)

    {                        }f%    For each neighborhood, make a new char:
     e_                                 Flatten the neighborhood
       _4=_                             Get the center tile, C
           @1>2%                        Get the surrounding tiles
                '#e=                    Count surrounding roads, n
                    *                   Repeat char C n times
                     "#"=               Is it "#"? (i.e., C = '# and n = 1)
                         'X@?           Then this becomes an 'X, else keep C.

(মার্টিন দুটি বাইট সংরক্ষণ করেছেন, ধন্যবাদ!)


এটি আমি দেখেছি দীর্ঘতম সিজাম উত্তরগুলির মধ্যে একটি। =)
ডিজেএমসিএমহেম

2
@ ডিজেএমসিগোথাম উম্মম ...
মার্টিন এন্ডার

হয় '#এবং "#"CJam বিভিন্ন?
ETH প্রোডাকশনগুলি

হ্যাঁ, তারা। "#"সমান ['#]
লিন

5

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

r=>[...r].map(_=>r=r.replace(g=/#/g,(_,i)=>(r[i+1]+r[i-1]+r[i+l]+r[i-l]).match(g)[1]||"X"),l=~r.search`
`)&&r

1 বাইট সংরক্ষিত হয়েছে @ এডসি 65 এর জন্য ধন্যবাদ !

ব্যাখ্যা

সমস্যার খুব সহজ পদ্ধতির। প্রতিটির জন্য অনুসন্ধান করে #এবং #এর চারপাশে যদি 2 টিরও কম থাকে , তবে এটি একটি দ্বারা প্রতিস্থাপন করে X। সমস্ত মৃত-প্রান্তগুলি Xএস দ্বারা প্রতিস্থাপন করা না হওয়া পর্যন্ত এই প্রক্রিয়াটি বহুবার পুনরাবৃত্তি করে ।

var solution =

r=>
  [...r].map(_=>                    // repeat r.length times to guarantee completeness
    r=r.replace(g=/#/g,(_,i)=>      // search for each # at index i, update r once done
      (r[i+1]+r[i-1]+r[i+l]+r[i-l]) // create a string of each character adjacent to i
      .match(g)                     // get an array of all # matches in the string
        [1]                         // if element 1 is set, return # (the match is a #)
        ||"X"                       // else if element 1 is undefined, return X
    ),
    l=~r.search`
`                                   // l = line length
  )
  &&r                               // return the updated r
<textarea id="input" rows="10" cols="40">########.....######..#..###
#......#######....#..#..#.#
#.##......#...#####..#..###
#..#####..#....#..#######.#
#......#...#####.....##...#
#..###.#...#...###...#..###
##########.#..#..##..#.##.#
..#......#.######.#..#.#.#.
..#......#.#..#.#.#..#.#.#.
..######.###..##..#########</textarea><br>
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>


1
এই কৌশলটির জন্য আমি সর্বদা ব্যবহার করি। আপনি একইভাবে l এবং -l উভয়ই ব্যবহার করেন, আপনি l=~r.searchপরিবর্তে গণনা করতে পারেন l=1+r.search। (মাত্র 1 বাইট সংরক্ষিত)
edc65

@ edc65 চালাক ধন্যবাদ!
ব্যবহারকারী 81655

0

পাইথন (3.5) 362 331 329 314 বাইট

অ্যালিসাকে ধন্যবাদ তিনি আমাকে ~ 33 বাইট জিততে সহায়তা করে

d='.'
r=range
def f(s):
 t=[list(d+i+d)for i in s.split()]
 c=len(t[0])
 u=[[d]*c]
 t=u+t+u
 l=len(t)
 g=lambda h,x:t[h][x]=='#'
 for k in r(l*c):
  for h in r(1,l):
   for x in r(1,c):
    if g(h,x) and g(h+1,x)+g(h-1,x)+g(h,x+1)+g(h,x-1)<2:
     t[h][x]='X'
 print('\n'.join([''.join(i[1:-1])for i in t][1:-1]))

ব্যাখ্যা

d='.'
r=range

ফাংশন সংজ্ঞা

def f(s):

'এর একটি সীমানা যুক্ত করুন।' বোর্ডের ডান এবং বাম দিকে

 t=[list(d+i+d)for i in s.split()]
 c=len(t[0])
 u=[[d]*c]

'এর একটি সীমানা যুক্ত করুন।' উপরে এবং নীচে

 t=u+t+u
 l=len(t)

'#' পরীক্ষার জন্য ল্যাম্বদা ফাংশন

 g=lambda h,x:t[h][x]=='#'

ইনপুট দৈর্ঘ্যের লুপটি নিশ্চিত হয়ে নিন যে আমরা মৃত প্রান্তগুলি ভুলে যাব না

 for k in r(l*c):

কলাম এবং লাইনে লুপ

  for h in r(1,l):
   for x in r(1,c):

আমাদের চারপাশে এবং অবস্থানে থাকলে '#' পরীক্ষা করুন

    if g(h,x) and g(h+1,x)+g(h-1,x)+g(h,x+1)+g(h,x-1)<2:

'X' দ্বারা '#' প্রতিস্থাপন করুন

     t[h][x]='X'

'' দিয়ে পূর্ণ সীমানা ক্রপ করুন। এবং স্ট্রিং যোগ দিন

 print('\n'.join([''.join(i[1:-1])for i in t][1:-1]))

ব্যবহার

f("########.....######..#..###\n#......#######....#..#..#.#\n#.##......#...#####..#..###\n#..#####..#....#..#######.#\n#......#...#####.....##...#\n#..###.#...#...###...#..###\n##########.#..#..##..#.##.#\n..#......#.######.#..#.#.#.\n..#......#.#..#.#.#..#.#.#.\n..######.###..##..#########")

########.....######..X..###
#......#######....#..X..#.#
#.XX......X...X####..X..###
#..XXXXX..X....#..#######.#
#......X...#####.....##...#
#..###.X...#...###...#..###
##########.#..X..##..#.##.X
..X......#.#XXXXX.#..#.#.X.
..X......#.#..X.X.#..#.#.X.
..XXXXXX.###..XX..######XXX

1) split()পরিবর্তে ব্যবহার করুন splitlines()। 2) t=['.'*(c+2)]+['.'+i+'.'for i in s]+['.'*(c+2)]সংক্ষিপ্ত। এবং এটি আরও সংক্ষিপ্ত করা যেতে পারে: d='.';t=[d*c]+t+[d*c];t=[d+i+d for i in t]3) আপনার সমস্ত তালিকা (জিপ (....)) দরকার নেই, ব্যবহার করুনprint('\n'.join([''.join(i[1:-1])for i in t])
অ্যালিসা

@ অ্যালিসা আপনার সহায়তার জন্য ধন্যবাদ আমি আপনার টিপসটি পয়েন্ট 1) এবং 3 এর জন্য ব্যবহার করি) তবে ২) আমি সমস্ত বন্ধনী সরাতে পারছি না, আমাদের চরের তালিকার একটি তালিকা প্রয়োজন, স্ট্রিংয়ের একটি তালিকা নয় কারণ 'str' object does not support item assignment। তালিকার তালিকাটি আমাকে টি [এইচ] [এক্স] = 'এক্স' ব্যবহারের অনুমতি দেয়
এরওয়ান

দুঃখিত, আমি স্ট্রিং অপরিবর্তনীয়তা সম্পর্কে জিনিস মিস করেছি। আপনি যদি এই ধ্রুবক স্থানান্তর করতে পারেন ( r, gএবং dআপনার ফাংশন আউট) (আপনি কিছু সারণি সংরক্ষণ)। হতে পারে কিছু বিভক্ত হয়ে খেলার () সাহায্য করতে পারে t=[d+list(i)+d for i in s.split()]:, তারপরে দৈর্ঘ্য গণনা করুন, তারপরে শুরুতে বিন্দু-রেখা যুক্ত করুন এবং তারপরে এই বর্ধিত দৈর্ঘ্যের সাথে কাজ করতে আপনার চক্রকে পরিবর্তন করুন। এটি কোডটি ছোট করে দেবে কিনা তা নিশ্চিত নয় তবে এটি হতে পারে
অ্যালিসা

@ আলিসা আমি এই ফাংশনটির বাইরে যেতে পারছি না কারণ এটি ব্যবহার করে আমি আপনার অন্যান্য মন্তব্য পরীক্ষা করব
এরওয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.