হরর মুভি অনুসন্ধান পার্টি Party


21

প্লট : জিমি নিখোঁজ; আমাদের তাকে খুঁজে বের করতে হবে। আমাদের বিচ্ছেদ হওয়া উচিত।

প্লট টুইস্ট : জিমি ইতিমধ্যে মারা গেছে।

তবে, আমাদের castালাই এটি জানেন না, সুতরাং তাদের যে কোনও উপায়ে পুরো অঞ্চলটি অনুসন্ধান করা দরকার। এখানে একটি এন কলাম রয়েছে x এম সারি (1 <= এম, এন <= 256) ঘরগুলির গ্রিড, হয় প্রারম্ভিক পয়েন্টের জন্য "এস" হিসাবে চিহ্নিত, "" " খোলা জায়গার জন্য, বা "#" বাধার জন্য এই মানচিত্র

এখানে 0 <= পি <= 26 কস্টার , 0 <= কি <= 26 অতিরিক্ত এবং 1 তারা রয়েছে । সকলেই প্রাথমিকভাবে এস চিহ্নিত চিহ্নিত কক্ষে রয়েছেন

নিয়ম

প্রতিটি ব্যক্তির নীচে দেখানো দর্শন ব্যাসার্ধ আছে:

 ...
.....
..@..
.....
 ...

তারাটিকে "@" দ্বারা চিহ্নিত করা হয়, মূলধনী অক্ষরের দ্বারা কস্টারগুলি "এ" দিয়ে শুরু হয় এবং ছোট হাতের অক্ষর দ্বারা অতিরিক্তগুলি "এ" দিয়ে শুরু করা হয়। প্রাথমিকভাবে, প্রারম্ভিক বিন্দুর চারপাশে দর্শনীয় ব্যাসার্ধটি ইতিমধ্যে অনুসন্ধান হিসাবে চিহ্নিত করা হয়েছে। এটি যদি মানচিত্রের পুরো উন্মুক্ত স্থান গঠন করে, খেলাটি শেষ হয়। প্রতিটি বার, নিম্নলিখিত ক্রমে :

  1. প্রতিটি ব্যক্তি একই সাথে একটি রাজা সরানো (হয় স্থির দাঁড়িয়ে, বা 8 প্রতিবেশী কোষের একটিতে স্থানান্তরিত) করে।
  2. প্রতিটি ব্যক্তির চারপাশে দর্শনীয় ব্যাসার্ধের সমস্ত কক্ষ অনুসন্ধান করা হিসাবে গণনা করা হয়।
  3. একজন কোস্টার যদি অন্য কাউকে দেখতে না পান তবে তিনি মারা যান। অতিরিক্ত যদি কোনও দামি, তারা বা কমপক্ষে 2 জন অতিরিক্ত দেখতে না পায় তবে সে মারা যায়। এগুলি একই সাথে ঘটে - অর্থাৎ, একক পালনে মৃত্যুর কোনও চেইন প্রতিক্রিয়া হতে পারে না; উপরের শর্তগুলি পরীক্ষা করা হয়, এবং যে মারা যেতে পারে সে প্রত্যেকে একবারে মারা যায়।
  4. যদি মানচিত্রে সমস্ত খোলা জায়গা অনুসন্ধান করা হয় তবে অনুসন্ধান শেষ হয়েছে।

নোট

একাধিক ব্যক্তি যে কোনও সময়ে একই স্কোয়ারে থাকতে পারে এবং এই লোকেরা একে অপরকে দেখতে পারে।

বাধা কখনও দৃষ্টিতে বাধা দেয় না, কেবল চলাফেরা করে; লোকেরা একে অপরকে দেখতে পাবে, এর ... লাভা?

মানচিত্রের খোলা জায়গাগুলি কিং পদক্ষেপ দ্বারা সংযুক্ত হওয়ার গ্যারান্টিযুক্ত।

প্রাথমিক "এস "টিকে কোনও বাধা না দিয়ে উন্মুক্ত স্থান হিসাবে বিবেচনা করা হয়।

যে কোনও রাজা খোলা জায়গাতে অবতরণ করে তা বৈধ। উদাহরণস্বরূপ, নিম্নলিখিত পদক্ষেপ আইনী:

....      ....
.@#. ---> ..#.
.#..      .#@.
....      ....

ইনপুট

ইনপুটটি ফর্ম্যাটে থাকবে

N M p q
[N cols x M rows grid with characters ".", "#", and "S"]

নমুনা ইনপুট:

6 5 0 0
......
......
..S...
......
......

এবং

9 9 1 1
S.......#
.......##
......##.
..#####..
...##....
...##....
...#.....
....#..#.
.........

পি এবং কিউ যথাক্রমে কস্টার এবং অতিরিক্তগুলির সংখ্যা।

আউটপুট

প্রতিটি আবর্তনের জন্য আউটপুটটি হওয়া উচিত, নির্দেশিত নির্দেশাবলী সহ প্রতিটি চলনের জন্য চালানো উচিত

789
456
123

পদক্ষেপের ক্রমটি বিবেচনা করে না, কারণ এগুলি সমস্ত একই সাথে কার্যকর করা হয়েছিল। কোনও ব্যক্তির পদক্ষেপের তালিকা না দেওয়া ভাল, এবং তাকে দিকনির্দেশনা 5 এর সমান 5. চলনগুলি নিম্নলিখিত বিন্যাসে তালিকাবদ্ধ করা উচিত:

@9 A2 a2 B7.

"।" একটি পালা জন্য আপনার পদক্ষেপের শেষ নির্দেশ করে।

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

6 5 0 0
......
......
..S...
......
......

নিম্নলিখিতটি বৈধ আউটপুট:

@4.
@6.
@6.
@6.
4 0 0

একটি চূড়ান্ত নোট: তারা মারা যাবে না এবং মানচিত্রে উন্মুক্ত স্থানটি সংযুক্ত হওয়ার গ্যারান্টিযুক্ত, সুতরাং অনুসন্ধান সর্বদা শেষ পর্যন্ত সফল হবে।

স্কোরিং

আপনার স্কোরটি বেঞ্চমার্ক পরীক্ষার সেটগুলিতে নেওয়া মোট মোট সংখ্যা ; আপনার উত্তর সহ আপনার নিজের পরীক্ষার কেস জমা দিতে স্বাগতম welcome বেঞ্চমার্ক সেটের উপরে থাকা লাইভ কস্টারের সংখ্যার যোগফল টাই-ব্রেকার হিসাবে ব্যবহৃত হবে, এবং এখনও যদি একটি টাই থাকে, তবে জীবিত অতিরিক্তগুলির সংখ্যার যোগফল ব্যবহৃত হবে।

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

বর্তমানে, 5 টি মানচিত্র https://github.com/Tudwell/HorrorMovieSearchParty/ এ অনলাইনে রয়েছে । যে কোনও উত্তর জমা দেওয়ার পরেও একটি পরীক্ষার মামলা জমা দিতে পারে, যা আমি যে কোনও কারণে প্রত্যাখ্যান করার অধিকার সংরক্ষণ করি (যদি আমি কোনও কারণে আপনার মানচিত্রটি প্রত্যাখ্যান করি তবে আপনি অন্যটি জমা দিতে পারেন)। এগুলি আমার বিবেচনার ভিত্তিতে পরীক্ষার সেটে যুক্ত করা হবে।

পাইথন (২.7.৫-এ পরীক্ষিত) কন্ট্রোলার গিথুবকে নিয়ন্ত্রণে রাখা হয়েছে । সেখানে একটি দ্বিতীয় নিয়ামক, কন্ট্রোলার_ডিস্প.পি , সন্ধানের সময় গ্রাফিকাল আউটপুট দেখায় (পাইগেম লাইব্রেরির প্রয়োজন হয়) ব্যতীত অভিন্ন।

গ্রাফিকাল কন্ট্রোলার আউটপুট

ব্যবহার :

python controller.py <map file> <your execution line>

অর্থাৎ,

python controller.py map1.txt python solver.py map1.txt

নিয়ামকের ফর্মটির আউটপুট (আপনার প্রোগ্রামের স্টিডিনে ) রয়েছে

Turn 1
@:2,3 A:2,3 B:2,3.
##...##
#ooo..#
ooooo..
ooooo..
ooooo..
#ooo...
##.....
###....
----------------------------------------

এটি এখন টার্ন নম্বর (1 স্থান পরিবর্তন করার আগে আপনি চলে যাওয়ার আগে), একটি '.'- সমস্ত অভিনেতা এবং তাদের x, y স্থানাঙ্কের সমাপ্ত তালিকা (উপরের বাম অক্ষরটি (0,0)), পুরো উপস্থাপনা বোর্ড, এবং 40'-এর একটি লাইন। এরপরে এটি ফর্মটির ইনপুটটির জন্য (আপনার প্রোগ্রামের স্টাডআউট থেকে ) অপেক্ষা করে

@9 A2 B7.

এটি উপরে বর্ণিত আউটপুট ফর্ম্যাট। নিয়ন্ত্রক খোলা জায়গার জন্য একটি 'ও' আউটপুট দেয় যা অনুসন্ধান করা হয়েছে '' খোলা জায়গার জন্য যা অনুসন্ধান করা হয়নি এবং '#' বাধার জন্য। এটির মধ্যে কেবলমাত্র জীবিত লোককে তার লোকদের তালিকায় এবং তাদের স্থানাঙ্কগুলিতে অন্তর্ভুক্ত করে এবং গেমের সমস্ত নিয়ম ট্র্যাক করে। অবৈধ পদক্ষেপের চেষ্টা করা হলে নিয়ন্ত্রণকারীটি প্রস্থান করবে। যদি প্রদত্ত পালাটির চালগুলি অনুসন্ধান শেষ করে, আউটপুট উপরের মতো নয়; পরিবর্তে এটি ফর্ম হয়

Finished in 4 turns
4 1 0

"4 1 0" এখানে 4 টি মোট টার্ন, 1 টি লিভিং কস্টার এবং 0 লিভিং অতিরিক্ত ব্যবহার করে। আপনার নিয়ামক ব্যবহার করার দরকার নেই; এটি ব্যবহার করতে নির্দ্বিধায় বা নিজের প্রবেশের জন্য এটি সংশোধন করুন। আপনি যদি এটি ব্যবহার করার সিদ্ধান্ত নিয়ে থাকেন এবং সমস্যার মুখোমুখি হন তবে আমাকে জানান।

কন্ট্রোলারটি লেখার জন্য আমাকে সাহায্য করার জন্য @ গিথুবাফাগোসাইটকে ধন্যবাদ।

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


7
দ্বিতীয় লাইনটি বিলোপকারীদের ট্যাগের মধ্যে হওয়া উচিত!
অ্যাভেরোয়েস

উত্তর:


8

রুবি, সুরক্ষা প্রথম + বিএফএস + এলোমেলোতা, স্কোর ≤ 1458

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

এই সমাধানের কিছু বৈশিষ্ট্য এবং ত্রুটি:

  • কেউ কখনও মারা যায় না। শুরুতে আমি সমস্ত অভিনেতাদের গ্রুপ করি যে সবাই নিরাপদে থাকে। এই গোষ্ঠীর প্রত্যেকটির চরিত্রগুলি একত্রিত হয়ে চলে। সবাইকে বাঁচিয়ে রাখার পক্ষে এটি ভাল তবে অনুকূল দক্ষ নয়।
  • গোষ্ঠীগুলির প্রত্যেকটি প্রস্থ-প্রথম অনুসন্ধানের মাধ্যমে মানচিত্রে নিকটস্থ অপরিবর্তিত স্থান অনুসন্ধান করে এবং অনুসন্ধানের সেই শাখার প্রথম পদক্ষেপ নেয়। একাধিক অনুকূল চলনের মধ্যে যদি টাই থাকে তবে একটি এলোমেলোভাবে বাছাই করা হয়। এটি নিশ্চিত করার জন্য যে সমস্ত গোষ্ঠী সর্বদা একই দিকে না যায়।
  • এই প্রোগ্রামটি ফিল্ড-অফ দ্য ভিউ সম্পর্কে জানে না। এটি প্রকৃতপক্ষে প্রতিটি অনাবৃত কক্ষে যাওয়ার চেষ্টা করে। এটিকে বিবেচনায় নেওয়া পারফরম্যান্সকে যথেষ্ট পরিমাণে বাড়িয়ে তুলতে পারে, তার পর থেকে আপনি প্রতিটি পদক্ষেপের মান কতটা কোষে উদ্ভাসিত করবেন তা আবিষ্কার করতে পারেন।
  • প্রোগ্রামটি পালাগুলির মধ্যে তথ্যের উপর নজর রাখে না (অভিনেতা গোষ্ঠীগুলি ব্যতীত)। এটি বৃহত্তর পরীক্ষার ক্ষেত্রে এটি যথেষ্ট ধীর করে তোলে। map5.txtসম্পূর্ণ হতে 1 এবং 13 মিনিটের মধ্যে সময় নেয়।

কিছু ফলাফল

Map     Min turns    Max turns
map1        46           86
map2        49          104
map3       332          417
map4       485          693
map5       546          887

এখন কোডটি এখানে:

start = Time.now

map_file = ARGV.shift
w=h=p=q=0
File::open(map_file, 'r') do |file|
    w,h,p,q = file.gets.split.map(&:to_i)
end

costars = p > 0 ? (1..p).map {|i| (i+64).chr} : []
extras = q > 0 ? (1..q).map {|i| (i+96).chr} : []
groups = []

costars.zip(extras).each do |costar, extra|
    break unless extra
    groups << (costar + extra)
    costars.delete(costar)
    extras.delete(extra)
end

costars.each_slice(2) {|c1, c2| groups << (c1 + (c2 || '@'))} unless costars.empty?
extras.each_slice(3) {|c1, c2, c3| groups << (c1 + (c2 || '') + (c3 || '@'))} unless extras.empty?
groups << '@' unless groups.join['@']

#$stderr.puts groups.inspect


directions = {
    1 => [-1, 1],
    2 => [ 0, 1],
    3 => [ 1, 1],
    4 => [-1, 0],
    5 => [ 0, 0],
    6 => [ 1, 0],
    7 => [-1,-1],
    8 => [ 0,-1],
    9 => [ 1,-1]
}

loop do
    break unless gets # slurp turn number
    coords = {}
    input = gets
    input.chop.chop.split.each{|s| actor, c = s.split(':'); coords[actor] = c.split(',').map(&:to_i)}
    #$stderr.puts input
    #$stderr.puts coords.inspect
    map = []
    h.times { map << gets.chomp }

    gets # slurp separator
    moves = groups.map do |group|
        x, y = coords[group[0]]
        distances = {[x,y] => 0}
        first_moves = {[x,y] => nil}
        nearest_goal = Float::INFINITY
        best_move = []
        active = [[x,y]]
        while !active.empty?
            coord = active.shift
            dist = distances[coord]
            first_move = first_moves[coord]
            next if dist >= nearest_goal
            [1,2,3,4,6,7,8,9].each do |move|
                dx, dy = directions[move]
                x, y = coord
                x += dx
                y += dy
                next if x < 0 || x >= w || y < 0 || y >= h || map[y][x] == '#'
                new_coord = [x,y]
                if !distances[new_coord]
                    distances[new_coord] = dist + 1
                    first_moves[new_coord] = first_move || move
                    active << new_coord if map[y][x] == 'o'
                end

                if dist < distances[new_coord]
                    distances[new_coord] = dist + 1
                    first_moves[new_coord] = first_move || move
                end

                if map[y][x] == '.'
                    if dist + 1 < nearest_goal
                        nearest_goal = dist + 1
                        best_move = [first_moves[new_coord]]
                    elsif dist + 1 == nearest_goal
                        best_move << first_moves[new_coord]
                    end
                end
            end
        end

        #if group['@']
        #    distances.each{|k,v|x,y=k;map[y][x]=(v%36).to_s(36)}
        #    $stderr.puts map
        #end

        dir = best_move.sample
        group.chars.map {|actor| actor + dir.to_s}
    end * ' '
    #$stderr.puts moves
    puts moves
    $stdout.flush
end

#$stderr.puts(Time.now - start)

সেখানে বেশ কয়েকটি মন্তব্য আউট ডিবাগ আউটপুট রয়েছে। বিশেষত if group['@']ব্লকটি বেশ আকর্ষণীয় কারণ এটি বিএফএসের তথ্যের ভিজ্যুয়ালাইজেশন প্রিন্ট করে।

সম্পাদনা: উল্লেখযোগ্য গতির উন্নতি, বিএফএস বন্ধ করে যদি আরও ভাল পদক্ষেপ ইতিমধ্যে পাওয়া যায় (যা প্রথমে বিএফএস ব্যবহারের বিন্দু ছিল)।


আপনার প্রবেশে সবসময় মানচিত্রের ফাইলে অ্যাক্সেস থাকবে আশা করা কি নিরাপদ?
স্পার

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