সবচেয়ে খারাপ কেস ম্যানহাটন বর্জন


20

স্কয়ারের একটি ডাব্লু বাই এইচ গ্রিডের কল্পনা করুন যা টরয়েডলি মোড় করে। আইটেমগুলি গ্রিডের উপরে নিম্নরূপ স্থাপন করা হয়েছে।

প্রথম আইটেমটি যে কোনও স্কোয়ারে স্থাপন করা যেতে পারে, তবে পরবর্তী আইটেমগুলি কোনও পূর্ববর্তী আইটেমের ম্যানহাটনের দূরত্ব আর এর মধ্যে হওয়া উচিত নয় (এটি রেঞ্জ আর এর ভন নিউম্যান পাড়া হিসাবেও পরিচিত )। সাবধানতার সাথে পজিশনগুলি নির্বাচন করা আরও কোনও বৈধ অবস্থানের আগে গ্রিডের উপরে প্রচুর পরিমাণে আইটেম ফিট করতে দেয়। তবে এর পরিবর্তে বিপরীত লক্ষ্যটি বিবেচনা করুন: সর্বনিম্ন আইটেমগুলি কী স্থাপন করা যেতে পারে এবং কোনও বৈধ অবস্থান ছাড়বে না?

এখানে ব্যাসার্ধ 5 বাদ দেওয়ার অঞ্চল:

ব্যাসার্ধ 5 বাদ পড়ার অঞ্চল

এখানে আরও একটি ব্যাসার্ধ 5 টি বাদ দেওয়ার অঞ্চল, এবার কিনারার কাছে তাই মোড়কের আচরণটি প্রকট:

ব্যাসার্ধের ব্যাসার্ধ 5 বাদ দেওয়ার অঞ্চল

ইনপুট

তিনটি পূর্ণসংখ্যা:

  • ডাব্লু : গ্রিডের প্রস্থ (ধনাত্মক পূর্ণসংখ্যার)
  • এইচ : গ্রিডের উচ্চতা (ধনাত্মক পূর্ণসংখ্যা)
  • আর : বর্ধনের ক্ষেত্রের ব্যাসার্ধ (অ-নেতিবাচক পূর্ণসংখ্যা)

আউটপুট

একটি পূর্ণসংখ্যা এন , যা আইটেমের মধ্যে সবচেয়ে কম সংখ্যক যা আরও কোনও বৈধ স্থান নির্ধারণকে আটকাতে পারে।

বিস্তারিত

  • শূন্যের ব্যাসার্ধটি 1 বর্গের একটি বর্ধন অঞ্চল দেয় (যেটি আইটেমটি রেখেছিল)।
  • এন এর ব্যাসার্ধটি জোনটি বাদ দেয় যা এন অर्थোগোনাল পদক্ষেপে পৌঁছানো যায় (প্রান্তগুলি টোরয়েডলি মোড়ানো মনে রাখবেন)।

আপনার কোডটি অবশ্যই আর = 0 এর তুচ্ছ মামলার জন্য কাজ করবে , তবে ডাব্লু = 0 বা এইচ = 0 এর জন্য কাজ করার দরকার নেই ।

আপনার কোড অবশ্যই সেই ক্ষেত্রে মোকাবেলা করতে হবে যেখানে আর > ডাব্লু বা আর > এইচ

সময় সীমা এবং পরীক্ষার কেস

আপনার কোড অবশ্যই পরীক্ষার সমস্ত ক্ষেত্রে মোকাবেলা করতে সক্ষম হতে হবে এবং প্রতিটি পরীক্ষার কেসটি অবশ্যই 5 মিনিটের মধ্যে শেষ করতে হবে। এটি সহজ হওয়া উচিত (উদাহরণস্বরূপ জাভাস্ক্রিপ্ট সমাধান প্রতিটি পরীক্ষার ক্ষেত্রে কয়েক সেকেন্ড সময় নেয়)। সময়সীমাটি মূলত চরম উদ্দীপনা বাহিনীকে বাদ দেওয়া। উদাহরণ পদ্ধতির এখনও মোটামুটি শক্তিশালী শক্তি।

যদি আপনার কোডটি একটি মেশিনে 5 মিনিটের মধ্যে সম্পূর্ণ হয় তবে অন্যটিতে না হয় যা যথেষ্ট পরিমাণে হয়ে যাবে।

ফর্ম ইনপুটগুলিতে পরীক্ষার কেসগুলি : আউটপুট হিসাবেW H R : N

5 4 4 : 1
5 4 3 : 2
5 4 2 : 2
5 4 1 : 5

7 5 5 : 1
7 5 4 : 2
7 5 3 : 2
7 5 2 : 4

8 8 8 : 1
8 8 7 : 2
8 8 6 : 2
8 8 5 : 2
8 8 4 : 2
8 8 3 : 4

 7  6  4 : 2
 7  6  2 : 4
11  7  4 : 3
11  9  4 : 4
13 13  6 : 3
11 11  5 : 3
15 14  7 : 2
16 16  8 : 2

কল্পনা এবং আইডিয়া নিয়ে চারপাশে খেলতে সহায়তা করার জন্য স্নিপেট

উদাহরণ (অবারিত) সমাধান

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


4
অসাধারণ কোড স্নিপেট!
স্ট্রেচ পাগল

@ স্ট্রেচমানিয়াক ধন্যবাদ :) আমি জাভাস্ক্রিপ্ট শেখার চেষ্টা করছি যাতে কোনও প্রতিক্রিয়া স্বাগত হয়
ট্রাইকোপল্যাক্স

1
এটি একটি দুর্দান্ত স্নিপেট। আমি সেই রঙের স্কিমটিও পছন্দ করি। এটি কি প্যালেট থেকে এসেছে?
মাইল মাইল

@ মাইল আপনাকে ধন্যবাদ - রঙগুলি কেবল অনুমান করা হয় এবং তারপরে কিছুটা সূক্ষ্ম সুর করা হয় (তবে খুব বেশি নয় - তারা এখনও 6 এর পরিবর্তে 3 টি বর্ণের রঙ কোড)। স্নিপেট কোডে তৃতীয় ব্লকের লাইনের ব্যবহৃত রঙগুলি আপনি দেখতে পাবেন।
ট্রিকোপল্যাক্স

উত্তর:


5

পাইথন 2, 216 182 বাইট

def f(W,H,R):L={(i%W,i/W)for i in range(W*H)};M={(x,y)for x,y in L if min(x,W-x)+min(y,H-y)>R};g=lambda s:min([1+g(s-{((a+x)%W,(b+y)%H)for x,y in L-M})for a,b in s]or[1]);return g(M)

ইনপুট পছন্দ f(16,16,8)@ ট্রাইকোপ্লাক্সের নমুনার মতো একই অ্যালগরিদম ব্যবহার করে তবে সেট সহ। প্রথমদিকে আমি প্রথম আইটেমটি রাখিনি (0, 0), তবে এটি শেষ কয়েকটি ক্ষেত্রে এটিকে দম বন্ধ করে দিয়েছে।

উপরের সমস্ত ক্ষেত্রে 10 সেকেন্ডের মধ্যে সীমাবদ্ধতার অধীনে সম্পূর্ণ হয়। প্রকৃতপক্ষে, কেসগুলি যথেষ্ট ছোট যে আমার কাছে কম দক্ষ হওয়ার জন্য একটি ছোট্ট ঘর ছিল, যা আমাকে নকল রাজ্যগুলির জন্য যাচাই করা একটি চেক সরানোর অনুমতি দেয়।

(গল্ফিং সহায়তার জন্য @ টিরিচোপ্লেক্সকে ধন্যবাদ)

সম্প্রসারিত:

def f(W,H,R):
  # All cells
  L={(i%W,i/W)for i in range(W*H)}                 

  # Mask: Complement of exclusion zone around (0, 0) 
  M={(x,y)for x,y in L if min(x,W-x)+min(y,H-y)>R}

  # Place recursively
  g=lambda s:min([1+g(s-{((a+x)%W,(b+y)%H)for x,y in L-M})for a,b in s]or[1])
  return g(M)

2

পাইথন 3, 270 262 260 251 246 226

(এসপি 3000 এর জন্য ধন্যবাদ:

  • -~ পরিবর্তে +1 , যা আমাকে শেষ লাইনে পরে একটি জায়গা হারাতে দেয় return
  • চারপাশে অতিমাত্রায় বন্ধনী হারাতে হচ্ছে W*H
  • lambdas ...
  • সবকিছু এক লাইনে রেখেছি
  • পাইথন মডুলো %আরও 20 বাইট সংরক্ষণ করতে নেতিবাচক সংখ্যার জন্য ইতিবাচক ফলাফল দেয়)

পাইথন 3 তে পোড় করা প্রশ্ন থেকে এটি জাভাস্ক্রিপ্ট উদাহরণের উত্তর।

চারপাশে এতগুলি ফাংশন আর্গুমেন্ট পাস করা এড়াতে, আমি গণনাকারী ফাংশনের ভিতরে দুটি সমর্থনকারী ফাংশন সরিয়ে নিয়েছি যাতে তারা এর সুযোগটি ভাগ করে দেয়। ইনডেন্টেশন ব্যয় এড়াতে আমি এই ফাংশনগুলির প্রতিটিকে একটি একক লাইনে ঘনীভূত করেছি।

ব্যাখ্যা

এই মোটামুটি নিষ্ঠুর বলের পদ্ধতির প্রথম আইটেমটি (0, 0) রাখে এবং তারপরে সমস্ত বাদ দেওয়া স্কোয়ার চিহ্নিত করে। এরপরে এটি পুনরাবৃত্তভাবে সমস্ত স্কোয়ার বাদ না দেওয়া অবধি সমস্ত অবশিষ্ট বৈধ স্কোয়ারে একটি আইটেম রাখে এবং প্রয়োজনীয় ন্যূনতম সংখ্যাকে প্রত্যাবর্তন করে।

গল্ফ কোড:

def C(W,H,R):r=range;M=lambda g:min([M(G(g,x,y))for x in r(W)for y in r(H)if g[x+W*y]]or[-1])+1;G=lambda g,x,y:[g[a+W*b]if min((x-a)%W,(a-x)%W)+min((y-b)%H,(b-y)%H)>R else 0for b in r(H)for a in r(W)];return-~M(G([1]*W*H,0,0))

অবহেলিত কোড:

def calculate(W, H, R):
    starting_min = W * H + 1
    cells = [0] * (W * H)
    grid_state = grid_with_item_added(cells, 0, 0, W, H, R)
    return min_from_here(grid_state, starting_min, W, H, R) + 1

def min_from_here(grid_state, starting_min, W, H, R):
    no_cells = True
    min = starting_min
    for x in range(W):
        for y in range(H):
            if grid_state[x + W * y] == 0:
                no_cells = False
                new_grid_state = grid_with_item_added(grid_state, x, y, W, H, R)
                m = min_from_here(new_grid_state, starting_min, W, H, R)
                if m < min:
                    min = m

    if no_cells:
        return 0
    else:
        return min + 1

def grid_with_item_added(grid_state, x, y, W, H, R):
    grid = grid_state[:]
    for a in range(W):
        for b in range(H):
            if manhattan_distance(a, b, x, y, W, H) <= R:
                grid[a + W * b] = 1

    return grid

def manhattan_distance(a, b, c, d, W, H):
    horizontal = min(abs(W + c - a) % W, abs(W + a - c) % W)
    vertical = min(abs(H + d - b) % H, abs(H + b - d) % H)
    return horizontal + vertical


if __name__ == '__main__':
    import sys
    arguments = sys.argv[1:]
    if len(arguments) < 3:
        print('3 arguments required: width, height and radius')
    else:
        print(calculate(int(arguments[0]), int(arguments[1]), int(arguments[2])))

অবহেলিত কোড একটি ফাংশন সংজ্ঞায়িত করে এবং কমান্ড লাইন থেকে এটি কল করার অনুমতি দেওয়ার জন্য কোডও অন্তর্ভুক্ত করে। গল্ফযুক্ত কোডটি কেবলমাত্র ফাংশনটি সংজ্ঞায়িত করে, যা মানক কোড গল্ফ প্রশ্নের জন্য যথেষ্ট

আপনি যদি কমান্ড লাইন থেকে গল্ফড কোডটি পরীক্ষা করতে চান, এখানে কমান্ড লাইন হ্যান্ডলিং অন্তর্ভুক্ত রয়েছে (তবে গল্ফ নয়):

কমান্ড লাইন টেস্টেবল গল্ফ কোড

def C(W,H,R):r=range;M=lambda g:min([M(G(g,x,y))for x in r(W)for y in r(H)if g[x+W*y]]or[-1])+1;G=lambda g,x,y:[g[a+W*b]if min((x-a)%W,(a-x)%W)+min((y-b)%H,(b-y)%H)>R else 0for b in r(H)for a in r(W)];return-~M(G([1]*W*H,0,0))

if __name__ == '__main__':
    import sys
    arguments = sys.argv[1:]
    if len(arguments) < 3:
        print('3 arguments required: width, height and radius')
    else:
        print(C(int(arguments[0]), int(arguments[1]), int(arguments[2])))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.