পাহাড়ের রাজা - দমকলকর্মীরা


27

এটি প্রিরির একটি শুকনো গ্রীষ্ম। এলাকার চার কৃষক বুঝতে পারে যে তারা তাদের প্রতিবেশীদের ফসল পুড়িয়ে মজাদার বাজারে কোণঠাসা করতে পারে। তবে এটি করার জন্য তাদের কৌশল দরকার; এই যে আপনি ভিতরে আসা।

আপনার কাজ হ'ল কৃষকদের কী জ্বলতে হবে তা জানানোর জন্য একটি বট লিখে। লক্ষ্যটি bণহীন জমির বৃহত্তম অঞ্চল দিয়ে খেলা শেষ করা। প্লেয়িং ফিল্ডটি একটি 32x32 গ্রিড। প্রতিটি ঘর নিম্নলিখিতগুলির মধ্যে একটি হতে পারে:

. - Ground

@ - A bot

# - Ash

W - Wet ground

1,2,3,4,5, or 6 - Fire

আগুন প্রতিটি ঘুরে 1 দ্বারা তীব্রতায় বৃদ্ধি পায়। এটি 3 বা তার বেশি হয়ে গেলে এটি তার পাশের (অনুভূমিকভাবে বা উলম্বভাবে) কোষগুলিকে আগুন লাগিয়ে দেবে। আগুন 6 হিট করার পরে, এটি ছাইতে পরিণত হয়।

প্রতিটি ঘুরে, বটগুলি নিম্নলিখিতটি STDIN হিসাবে গ্রহণ করে: বট শুরুর এক্স, বট প্রারম্ভিক y, বট বর্তমান এক্স অবস্থান, বট বর্তমান y অবস্থান এবং বোর্ড, নিউলাইন দ্বারা পৃথক। একটি উদাহরণ:

8
22
6
24
................................
................................
................................
.....................1..........
....................1#1.........
...................1#363........
....................16@1........
.....................31.........
................................
.........1.1....................
........15#62...................
........15@2....................
.........32.....................
................................
................................
................................
................................
................................
................................
................................
................................
................................
....4.1.........................
.....1#3........................
.....@3.........................
.....W..........................
................................
................................
................................
................................
................................
................................

(এই উদাহরণস্বরূপ আপনি নীচের বামে বট হন)।

নিম্নলিখিতটি উপস্থাপন করে আপনাকে charactersচ্ছিক নিউলাইন সহ তিনটি অক্ষর আউটপুট করতে হবে:

সরান - একটি L, R, U, D, or S (stay)

ক্রিয়া - একটি B (burn), P (pour water) or X (do nothing)

দিকনির্দেশ - এর মধ্যে একটি L, R, U, D or S- আপনি কোন কক্ষে ক্রিয়াটি পরিচালনা করেন তা নিয়ন্ত্রণ করে

আগুন বটগুলিকে প্রভাবিত করে না।

টার্ন অর্ডার নিম্নরূপ: সমস্ত বট সরানো; সমস্ত বট ক্রিয়া সম্পাদন করে; তারপরে পরিবেশগত নিয়ম ঘটে। যদি আপনি মাটিতে জল pourালেন তবে এটি Wএক বারের জন্য ভেজা হবে ( )। ভেজা মাটিতে আগুন ছড়িয়ে পড়বে না। যদি আপনি ভেজা মাটিতে জল pourালেন তবে এটি ভিজা হতে থাকবে। যদি আপনি আগুনে জল pourালেন তবে এটি নিয়মিত মাটিতে ফিরে যায়। আপনি ছাইয়ের জন্য কিছুই করতে পারবেন না।

রাউন্ডগুলি একবারে 4 টি বট দিয়ে চালানো হয়। রাউন্ডটি 50 টি টার্নের পরে শেষ হয়, বা যখন কোনও বট আনবার্টেড গ্রাউন্ডের বাইরে চলে যায়, যেটি প্রথমে আসে। আপনার স্কটটি 9x9 বর্গক্ষেত্রের ভিত্তিতে যেখানে আপনার বট শুরু হয়েছিল সেখানে স্থল বা ভেজা গ্রাউন্ড সেলগুলির সংখ্যা হিসাবে গণনা করা হয়।

এখানে একটি উদাহরণ বট; এটি এলোমেলোভাবে তিনটি অক্ষর বাছাই করে এবং সাধারণত তার নিজস্ব ক্ষেত্রগুলি জ্বালিয়ে শেষ করে।

RandomBurner:

#!/usr/bin/env python
import random
print random.choice('LRUDS')+random.choice('BPX')+random.choice('LRUDS')

নিয়মাবলী:

  • আপনার নিজের ফোল্ডারের বাইরে কোনও ফাইল সিস্টেম অ্যাক্সেস নেই।
  • যদি আপনি বাঁকগুলির মধ্যে ধ্রুবক ডেটা সংরক্ষণ করতে চান তবে আপনি ফাইলগুলিতে লিখতে পারেন তবে প্রতি বট প্রতি সর্বাধিক 1 কেবি পর্যন্ত
  • আপনি অন্য কারও বোট ওভাররাইট নাও করতে পারেন
  • যদি আপনি কোনও অবৈধ পদক্ষেপ আউটপুট করেন তবে আপনার বট স্থির হয়ে থাকবে। যদি আপনি একটি অবৈধ ক্রিয়া আউটপুট করেন তবে আপনার বট কিছুই করবে না।
  • একটি সাধারণ ভাষা যা একটি ওএসএক্স বা লিনাক্স বাক্সে চালিত হতে পারে সেগুলি আটকে দিন।

কন্ট্রোলার কোডটি এখানে পাওয়া যাবে।

প্রাথমিক ফলাফল:

Average of 15 rounds:
---------------------
81 Farmer
56 CautiousBot
42 GetOff
41 Visigoth
40 DontBurnMeBro
37 FireFighter
35 Pyro
11 Protector

আপডেট : যুক্ত কৃষক, সাবধানবাট, গেটঅফ, ফায়ার ফাইটার এবং পাইরো।


1
বোর্ড প্রান্তে প্রায় মোড়ানো না, তাই না?
জাগারব

1
ঠিক। আপনি যদি প্রান্তটি পেরিয়ে যাওয়ার চেষ্টা করেন তবে আপনি কেবল স্থির হন।
স্কাইলার

4
আমি একটি বিস্তারিত বুঝতে পারি না। কোন জমি আমার এবং আপনার কি?
কেইন

3
আপনার জমিটি 9x9 ব্লক অঞ্চলের যেখানে আপনি শুরু করেছিলেন সেদিকে কেন্দ্র করে। সমস্ত বটগুলি একে অপরের থেকে কমপক্ষে 8 টি ব্লকটি শুরু করে, তাই কোনও ওভারল্যাপ নেই।
স্কাইলার 18

2
এটি সরবরাহ করা হয়নি। আপনি যদি এটি কোনওভাবে রেকর্ড করতে চান তবে এটি একটি বিকল্প। এটি লুকানোর জন্য আগুনে বসে থাকা একটি বৈধ কৌশল।
স্কাইলার

উত্তর:


5

ভানড্ল

ভিজিগোথ তার শত্রুদের মাটিতে পুড়িয়ে দেওয়ার চেষ্টা করে। অন্য কেউ এর জমিতে নামার আগে এটি এটি করার আশাবাদী।

চালান: python visigoth.py

#!/usr/bin/python

''' Charge the enemy and burn them to the ground. '''

import sys

data = sys.stdin.readlines()

startx, starty, x, y = [int(i) for i in data[0:4]]
field = [list(i) for i in data[4:]]

otherbots = []
for i in range(32):
    for j in range(32):
        if field[i][j]=='@': #bot
            if i!=y and j!=x:
                otherbots.append([j,i])

min_bot = otherbots[0]
for bot in otherbots:
    if abs(bot[0]-x)+abs(bot[1]-y) < abs(min_bot[0]-x)+abs(min_bot[1]-y):
        min_bot = bot

dx = min_bot[0]-x
dy = min_bot[1]-y

if abs(dy)>abs(dx):
    if dy>0:
        move = 'U'
    else:
        move = 'D'
else:
    if dx>0:
        move = 'R'
    elif dx<0:
        move = 'L'
    else:
        move = 'S'

if max(abs(x-startx), abs(y-starty))>4:
    if 0<x<31 and 0<y<31:
        dirs = {'U':(-1,0), 'D':(1,0), 'L':(0,-1), 'R':(0,1)}
        for i in dirs:
            if field[dirs[i][0]][dirs[i][1]] in ('.', 'W'):
                action = 'B'+i
                break
        else:
            # No free land nearby, go out in a blaze of glory
            action = 'BS'
    else:
        action = 'BS'
else:
    # Don't set own field on fire
    action = 'XS'

print move+action

এটি আমার প্রথম প্রবেশ, গঠনমূলক সমালোচনা প্রশংসিত!


"আগুন বটগুলিকে প্রভাবিত করে না"
কনর ও'ব্রায়েন

ভিসিগথ মনে হয় খুব কমই জ্বলছে।
স্কাইলার

ওহ, কেবলমাত্র আমার লক্ষ্য করা minউচিত যেখানে আমার উচিত ছিল max। আমি এটা ঠিক করেছি.
তাইকসো

@ সিও'বাʀɪᴇɴ আসলে শত্রুদের বটগুলি পোড়াতে চাইছে না, কেবল ধরে নিই যে তারা নিজের ঘাঁটির কাছেই থাকবে। এটি নিজের বিরুদ্ধে খুব দুর্বল হবে।
তাইকসো

আচ্ছা বুঝলাম. এটি আরও অর্থবোধ করে।
কনার ও'ব্রায়েন

4

জাভা, রক্ষক

ছাইয়ের বেড়া দিয়ে তার মাঠকে ঘিরে চেষ্টা করছে।

সম্পাদনা: কিছুটা যুক্তিযুক্ত উন্নত। সম্ভবত কোনও পার্থক্য তৈরি করবে না।

import java.awt.Point;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

/**
 * Created 10/6/15
 *
 * @author TheNumberOne
 */
public class Protecter {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Point start = new Point(in.nextInt(), in.nextInt());
        Point current = new Point(in.nextInt(), in.nextInt());
        in.nextLine();
        String output = "";
        char[][] board = new char[32][];
        for (int i = 0; i < 32; i++){
            board[i] = in.nextLine().toCharArray();
        }
        List<Point> danger = new ArrayList<>();
        List<Point> close = new ArrayList<>();
        List<Point> closeDanger = new ArrayList<>();
        List<Point> fence = new ArrayList<>();
        for (int i = 0; i < 32; i++){
            for (int j = 0; j < 32; j++){
                Point p = new Point(i, j);
                char c = board[j][i];
                if (Math.abs(p.x - start.x) < 10 && Math.abs(p.y - start.y) < 10){
                    if ((c + "").matches("\\d")){
                        danger.add(p);
                    }
                }
                if (distance(current, p) == 1){
                    close.add(p);
                }
                if ((Math.abs(p.x - start.x) == 10 || Math.abs(p.y - start.y) == 10) && !(c + "").matches("#|\\d|@")){
                    fence.add(p);
                }
            }
        }
        closeDanger = new ArrayList<>(danger);
        closeDanger.retainAll(close);
        danger.sort(Comparator.comparingInt(a -> distance(current, a) / (board[a.y][a.x] - '0')));
        if (danger.size() > 0){
            output += moveTo(current, danger.get(0));
        } else {
            fence.sort(Comparator.comparingInt(a -> distance(current, a)));
            if (fence.size() == 0){
                output += "S";
            } else {
                output += moveTo(current, fence.get(0));
            }
        }
        closeDanger.sort(Comparator.comparingInt(a -> board[a.y][a.x] - '0'));
        if (closeDanger.size() > 0){
            output += "P";
            output += moveTo(current, closeDanger.get(0));
        } else {
            if (danger.size() == 0) {
                List<Point> closeFence = new ArrayList<>(fence);
                closeFence.retainAll(close);
                if (closeFence.size() > 0) {
                    output += "B";
                    output += moveTo(current, closeFence.get(0));
                } else {
                    if (!fence.contains(current)){
                        output += "PS";
                    } else {
                        output += "BS";
                    }
                }
            } else {
                if (!fence.contains(current)){
                    output += "PS";
                } else {
                    output += "BS";
                }
            }
        }
        System.out.println(output);
    }

    private static String moveTo(Point from, Point to) {
        if (from.x > to.x){
            return "L";
        }
        if (from.x < to.x){
            return "R";
        }
        if (from.y > to.y){
            return "U";
        }
        if (from.y < to.y){
            return "D";
        }
        return "S";
    }

    private static int distance(Point p1, Point p2){
        return Math.abs(p1.x - p2.x) + Math.abs(p2.y - p1.y);
    }

}

নামের একটি ফাইলে রাখুন Protector.java

সংকলন: এর সাথে javac Protector.java
চালান:java Protector


এটি সংকলিত করার জন্য প্রথমে প্রোটেক্টর.জভা নামকরণ করতে হয়েছিল। কিন্তু যখন আমি এটি চালানোর, এটি একটি java.lang.ArrayIndexOutOfBoundsException লাইন 29 ছোঁড়ার
Skyler

@ স্কাইলার এটি ঠিক করেছেন :)
TheNumberOne

ধন্যবাদ, আমি এটি ফলাফলগুলিতে যুক্ত করেছি। সুরক্ষক সর্বদা তার শুরু হওয়া আগুন জ্বালানোর ব্যবস্থা করে না।
Skyler


@ ফ্যাটালাইজ আমাকে জঙ্গলে / মরুভূমিতে আগুনে ধরা পড়লে আমাকে শিখিয়ে দেওয়া হয়েছিল :)
TheNumberOne

2

গেটঅফ, পাইথন

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

#!/usr/bin/env python

import sys

fire = ['1','2','3','4','5','6']

move = ''
ad = ''

data = sys.stdin.readlines()

startx, starty, x, y = [int(i) for i in data[0:4]]
board = [list(i) for i in data[4:]]

top = starty-4
bottom = starty+5
right = startx+5
left = startx-4

bots = []
for i in range(32):
    for j in range(32):
        if board[i][j]=='@':
            if i != y and j != x:
                bots.append([j,i])

fires = []
for i in range(32):
    for j in range(32):
        if board[i][j] in fire: #fire
            fires.append([j,i])

for bot in bots:
    if left < bot[0] < right and top < bot[1] < bottom: # if there's a bot in the field
        if bot[0] > x:
            move = 'R'
        elif bot[0] < x:
            move = 'L'
        elif bot[1] > y:
            move = 'D'
        elif bot[1] < y:
            move = 'U'
        else:
            move = 'S'
    else:
        nearest_fire = []
        for f in fires:
            if left < f[0] < right and top < f[1] < bottom:
                if nearest_fire == []:
                    nearest_fire = f
                elif (f[0]-x)+(f[1]-y) < (nearest_fire[0]-x)+(nearest_fire[1]-y):
                    nearest_fire = f
        if nearest_fire == []:
            move = 'S'
        else:
            if nearest_fire[0] > x:
                move = 'R'
            elif nearest_fire[0] < x:
                move = 'L'
            elif nearest_fire[1] > y:
                move = 'D'
            elif nearest_fire[1] < y:
                move = 'U'
            else:
                move = 'S'

if board[x-1][y] in fire: # position immediately to the left
    ad = 'L'
elif board[x+1][y] in fire: # position immediately to the right
    ad = 'R'
elif board[x][y-1] in fire: # position immediately up
    ad = 'U'
elif board[x][y+1] in fire: # position immediately down
    ad = 'D'
else:
    ad = 'S'

print(move+'P'+ad)

কি a < b < cপাইথন সিনট্যাক্স কাজ করে? আমি ভেবেছিলাম যা মূল্যায়ন করে (a < b) < c, যা হয় হয় 1 < cবা হয় 0 < c। আমি ভুল হলে আমাকে সংশোধন করুন। (বট লুপের প্রথম শর্তসাপেক্ষে পাওয়া গেছে))
কনর ও'ব্রায়েন

এটি সর্বদা আমার জন্য কাজ করেছে তবে আমি নিশ্চিত নই যে এটি
অজগরটির

@ সিও'বিʀɪᴇɴ বিশ্বাস করে যে এটি আমার মেশিনে 1<3>2মূল্যায়ন Trueকরে (যদি এটি তাদের দলবদ্ধ করা হয় তবে এটি মিথ্যা ফিরে আসবে: 1>2এবং 1<1সম্ভাবনাগুলিও রয়েছে)।
কোলে

কুল ধন্যবাদ আমি জাভাস্ক্রিপ্ট-ভাবনা মোডে ছিলাম। এটি কেবল repl.it এ চেষ্টা করে দেখুন it পাইথন সুন্দর হওয়ার আরও কারণ।
কনর

2

কৃষক, জাভা

কৃষক কেবল তার ফসলের যত্ন করে। সম্ভাব্য আগুন এবং আক্রমণকারীদের জন্য তিনি ক্রমাগত তার ক্ষেত্রটি দেখেন।

import java.awt.Point;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class Farmer {

    public static void main(String[] args) {
        //row == y
        //col == x
        Scanner in = new Scanner(System.in);
        Point start = new Point(in.nextInt(), in.nextInt());
        Point current = new Point(in.nextInt(), in.nextInt());
        in.nextLine();
        char[][] board = new char[32][];
        for (int row = 0; row < 32; row++){
            board[row] = in.nextLine().toCharArray();
        }
        final List<Point> firesInField = new ArrayList<>();
        final List<Point> enemiesInField = new ArrayList<>();
        for (int row = 0; row < 32; row++) {
            for (int col = 0; col < 32; col++) {
                Point p = new Point(col, row);
                if (!isInField(start, p))
                    continue;
                char c = board[row][col];
                if (isFire(c)) {
                    firesInField.add(p);
                } else if (c == '@' && col != current.x && row != current.y) {
                    enemiesInField.add(p);
                } 
            }
        }
        List<Point> destinations = firesInField.size() > 0 ? firesInField : enemiesInField;

        if (destinations.size() > 0) {
            //take short paths to eliminate more fires
            destinations.sort(Comparator
                    .comparingInt((Point p) -> distance(p, current))
                    .thenComparingInt(p -> -1 * (board[p.y][p.x] - '0')));
            Point dest = destinations.get(0);
            print(moveTo(current, dest), "P", moveTo(current, dest));
        }

        //TODO start fires if an enemy has more intact ground

        //walk back to center
        print(moveTo(current, start), "P", moveTo(current, start));
    }

    private static void print(String move, String action, String actionMove) {
        System.out.println(move + action + actionMove);
        System.exit(0);
    }

    private static boolean isInField(Point centerOfField, Point toTest) {
        //add one extra, to prevent fires that are very near
        return distance(centerOfField, toTest) <= 10 && Math.abs(centerOfField.x - toTest.x) <= 5 && Math.abs(centerOfField.y - toTest.y) <= 5;
    }

    private static boolean isFire(char c) {
        return c == '1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6';
    }

    private static String moveTo(Point from, Point to) {
        if (from.x > to.x){
            from.x--;
            return "L";
        }
        if (from.x < to.x){
            from.x++;
            return "R";
        }
        if (from.y > to.y){
            from.y--;
            return "U";
        }
        if (from.y < to.y){
            from.y++;
            return "D";
        }
        return "S";
    }

    private static int distance(Point p1, Point p2){
        return Math.abs(p1.x - p2.x) + Math.abs(p2.y - p1.y);
    }
}

1
এর পরিবর্তে isFireআপনি সামান্য উন্নতি করতে পারেন Character.isDigit
জে আতকিন

2

পাইরো, অজগর

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

import sys
import random
inpu          = sys.stdin.readlines()
ox,oy,x,y     = [int(i) for i in inpu[0:4]]
board         = [list(i) for i in inpu[4:]]
adjacentcells = [[[board[y+b][x+c],b,c] for b in range(-1,2)] for c in range(-1,2)]
action        = ""
infield=max(abs(ox-x),abs(oy-y))<=9
# let's find out what Pyro will do!
if not infield: # Pyro won't burn what's in his field.
    for row in adjacentcells:
        for entry in row:
            cell,a,b=entry
            if(a!=b):   # Can't act on these cells.
                if cell==".":   # burn it!!!!!!
                    action = "B"
                    if(a==0):
                        direction = {-1:"L",1:"R"}[b]
                    else:
                        direction = {-1:"D",1:"U"}[a]
            if action: break;
        if action: break;
    # Pyro doesn't care where he goes, so long as
    # Pyro's not in the field of Pyro.
    move = random.choice("LRUDS")
else:   # Thought Pyro hates water, Pyro must protect SOMETHING.
    action    = "P"
    direction = "S"
    # get the direction towards the center
    # Pyro will move away from ox and oy to
    # towards the center, if in the field.
    # Pyro will do this by first going right/left,
    # then going up/down. (This behaviour is
    # removed when he leaves his field.)
    cx = cy = 16
    while max(abs(cx-x),abs(cy-y))<=9:
        cx = random.randint(0,31)
        cy = random.randint(0,31)
    if(cx-x>0): #is to the left of the center
        move = "R"
    elif(cx-x<0): #is to the right of the cenetr
        move = "L"
    elif(cy-y>0): # is above center
        move = "D"
    elif(cy-y<0): # is below center
        move = "U"
    else:   # is at center (something went wrong!)
        move   = "S"
        action = "B"
if not move:
    move = "S"
if not action:
    action = "B"
if not direction:
    direction = "S"
print(move+action+direction)


""" Here, have a face!
MMMMMMMMMMMMMMMMMMMMMMMdyo/:-.````.:+sdMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMNs/....----...``````.omMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMh/``..-://+//:-..````````/mMMMMMMMMMMM
MMMMMMMMMMMMMMMm:````..-:////:--..``````````sMMMMMMMMMM
MMMMMMMMMMMMMMs```````....--....`````````````/NMMMMMMMM
MMMMMMMMMMMMM/````````````````````````````````:NMMMMMMM
MMMMMMMMMMMM/```......``````````````````.......+mMMMMMM
MMMMMMMMMMMo.:::::::::::-````````````.-:::::::::/+yNMMM
MMMMMMMMMNs:-..-------::::.`````````://:-------..-:/hMM
MMMMMMMMm+:..---:::::---:::.```````::::---:::::--.`-/sM
MMMMMMMN+:`.---:::/:/:---:::``````.:::.--:::/:/:--.`:/h
MMMMMMMh:-`---://o+///:---::.`````-::---://oo///:--..:+
MMMMMMMs:..--:/+/sss+//:-.::.`````-::.-://+osyo//:-.-::
MMMMMMMs:----///+sosso/:--::``````.::.-://+oosso+:-.::/
MMMMMMMd:::-:/++/osyso+/--::```````::-://+/osyso+/--::s
MMMMMMMMs:/::::+ooos+o+/:::.```````.::::/+ooos/o+/:/:+N
MMMMMMMMMs://:+osooo+o+/::.``.....``.:/:/osoos+o+//:+mM
MMMMMMMMMM--:/++ysyoo+/:-...........`.-:/+ssso++/:-yNMM
MMMMMMMMMMs``.-:://::-..`.....---....``..--::::-.`.MMMM
MNNMddhyys+-.```````````...--:::::-...````````````+MMMM
////.-:///:-..``````````.:///++o/o+/:/.```````````yMMMM
---.`.-:::--..`````````..+//+ooo+++///.```````````mMMMM
/.--``..--...``````````..--:/+oo+/:--..``````````.MMMMM
s --.```...````````````...--/+++++/-...````````.`/MMMMM
d .--```````````````````...-::::::-...````````.-/+MMMMM
M.`--`  ````````````````....------....````````.-/.dMMMM
M+ .-.  `````````````````.:::::::::::.`````````.-sMMMMM
Mm``--`  ``````````````-://///////////:-````````/MMMMMM
MM: --.  ````````````.://::--......-::///-``````yMMMMMM
MMd`.-.  ``````````.:/::-..-:::::::.``-::::.````NMMMMMM
MMM+.--`  `````````:::-.-::-.......-::-`--::```+MMMMMMM
MMMN---`  ````````.--..:-.```````````..-`.--.``dMMMMMMM
MMMMd--.` `````..`.-.`-````````````````.-`...`/MMMMMMMM
MMMMMNh+ss/oydNMd``.`.`````````````````````.`.NMMMMMMMM
MMMMMMMMMMMMMMMMMd.``.```````````````````````dMMMMMMMMM
MMMMMMMMMMMMMMMMMMm:```````````````````````-dMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMy.```````````````````.oNMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMNs-```````````````:sNMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMmy+:-.````.:+ymMMMMMMMMMMMMMMMM
"""

2
আপনার বিবরণ এবং মন্তব্যে পাইরো লিঙ্গ সম্পর্কে যথেষ্ট অস্পষ্টতা নেই।
কোল

@ কোল ওহ ডার্ন আমি সেই দৌরাত্মের কথা ভুলে গেছি। আমি কিছুটা অস্পষ্টতার সাথে সম্পাদনা করব, অবশ্যই;)
কনর ও'ব্রায়েন

দৌড়ায় না, কারণ লাইন 21
স্কাইলার

5 নং লাইনে ব্রেক ('ডেটা' সংজ্ঞায়িত করা হয়নি)
স্কাইলার

@ স্কিলার আবার স্থির হয়েছে। আমি খুবই দুঃখিত. আমি আমার অজগর দোভাষী ছাড়া এটি করেছি।
কনর ওব্রায়েন

2

DontBurnMeBro

আর একটি পাইথন এন্ট্রি। গ্যারান্টিযুক্ত প্রথম মারা যাওয়া হবে না (আমার মনে হয়)।

#!/usr/bin/python

print "SPS"

4
বৈশিষ্ট ঢালাও জল উপর ভিত্তি করে তৈরি Pনা W
এলোমেলো

ওফ, ধন্যবাদ
তাইকসো

1

ফায়ার ফাইটার, জাভা

সমস্ত আগুন যুদ্ধ ।

import java.awt.Point;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

/**
 * Created 10/7/15
 *
 * @author TheNumberOne
 */
public class FireFighter {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Point start = new Point(in.nextInt(), in.nextInt());
        Point current = new Point(in.nextInt(), in.nextInt());
        in.nextLine();
        String output = "";
        char[][] board = new char[32][];
        for (int i = 0; i < 32; i++) {
            board[i] = in.nextLine().toCharArray();
        }

        List<Point> danger = new ArrayList<>();
        List<Point> close = new ArrayList<>();
        List<Point> closeDanger;
        for (int i = 0; i < 32; i++){
            for (int j = 0; j < 32; j++){
                Point p = new Point(i, j);
                char c = board[j][i];
                if ((c + "").matches("\\d")){
                    danger.add(p);
                }
                if (distance(current, p) == 1){
                    close.add(p);
                }
            }
        }
        closeDanger = new ArrayList<>(danger);
        closeDanger.retainAll(close);

        Comparator<Point> comparator = Comparator.comparingInt((Point a) -> board[a.y][a.x]).reversed();

        danger.sort(comparator);
        danger.sort(Comparator.comparingInt(a -> distance(start, a)));
        if (danger.size() > 0){
            output += moveTo(current, danger.get(0));
        } else {
            output += moveTo(current, start);
        }
        closeDanger.sort(comparator);
        if (closeDanger.size() > 0){
            output += "P" + moveTo(current, closeDanger.get(0));
        } else {
            output += "PS";
        }
        System.out.println(output);
    }

    private static String moveTo(Point from, Point to) {
        if (from.x > to.x){
            return "L";
        }
        if (from.x < to.x){
            return "R";
        }
        if (from.y > to.y){
            return "U";
        }
        if (from.y < to.y){
            return "D";
        }
        return "S";
    }

    private static int distance(Point p1, Point p2){
        return Math.abs(p1.x - p2.x) + Math.abs(p2.y - p1.y);
    }

}

0

কিপার, পাইথন 2

import sys

Out = ["S", "P", "S"]

StX = int(sys.stdin.readline()) - 1
StY = int(sys.stdin.readline()) - 1
NowX = int(sys.stdin.readline()) - 1
NowY = int(sys.stdin.readline()) - 1
Map = []
for i in range(32):
    Map.append(sys.stdin.readline())

Pos = [NowX, NowY]
Area = [[StX, StY]]
for x in range(StX-4, StX+4):
    for y in range(StY-4, StY+4):
        Area.append([x, y])

Fires = []
for y in range(32):
    for x in range(32):
        if Map[y][x] in "123456":
            Fires.append([x, y])

Danger = []
for Tile in Area:
    if Map[Tile[1]][Tile[0]] in "123456":
        Danger.append(Tile)

Distance = {}
i = -1
for Fire in Danger:
    i += 1
    Distance[(Pos[0] - Fire[0], Pos[1] - Fire[1])] = i

i = min(Distance)
Closest = Danger[Distance[i]]

if Closest[0] > Pos[0]:
    Out[0] = Out[2] = "R"
    Pos[0] += 1
if Closest[0] < Pos[0]:
    Out[0] = Out[2] = "L"
    Pos[0] -= 1
if Closest[0] == Pos[0]:
    if Closest[1] > Pos[1]:
        Out[0] = Out[2] = "D"
        Pos[1] += 1
    if Closest[1] < Pos[1]:
        Out[0] = Out[2] = "U"
        Pos[1] -= 1

if Closest[0] + 1 == Pos[0] and Closest[1] == Pos[1]:
    Out[2] = "L"
if Closest[0] - 1 == Pos[0] and Closest[1] == Pos[1]:
    Out[2] = "R"
if Closest[1] + 1 == Pos[1] and Closest[0] == Pos[0]:
    Out[2] = "U"
if Closest[1] - 1 == Pos[1] and Closest[0] == Pos[0]:
    Out[2] = "D"
if Closest[0] == Pos[0] and Closest[1] == Pos[1]:
    Out[2] = "S"


print "".join(Out)

সরল করা যায়, তবে আমি ক্লান্ত।

রক্ষক তার ক্ষেত্রটিকে ক্ষতি থেকে রক্ষা করার চেষ্টা করে। যদি কোনও আগুন উপস্থিত হয় তবে তা তাড়াতাড়ি তা করে দেয় এবং এটি যতটা সম্ভব দ্রুত ফেলে দেয়।

আমি আগত আগুনের জন্য থাকার ব্যবস্থাও যুক্ত করতে পারি।


36 লাইন: ValueError: min() arg is an empty sequence- কিছুতে এখনও আগুন না থাকলে এটি ত্রুটি ছুড়ে দেয়।
স্কাইলার

@ স্কিলার আমি কিছুটা ঠিক করব, দুঃখিত।
The_Basset_Hound

0

সতর্কবাট, নোড.জেএস (ইএস 5)

এই বটটি বাইরে গিয়ে অন্য বটের জমিতে আগুন দেওয়ার চেষ্টা করে। এমনকি এটি লুকানোর জন্য 3 টি টিকিটের জন্য আগুনের উপরে বসে থাকে! তবে, কেউ কখনই খুব বেশি সতর্ক হতে পারে না, তাই এটি সর্বদা নিশ্চিত করে তোলে যে তার নিজের জমিতে কোনও অগ্নিকাণ্ড দেওয়ার জন্য এটি যথেষ্ট কাছাকাছি।

নোট:

  • state.jsonঅন্যান্য বটসের প্রাথমিক অবস্থান সম্পর্কে তথ্য সঞ্চয় করতে এবং শুরু হওয়া আগুনটি কতক্ষণ লুকিয়ে রাখতে হয় তা নির্ধারণ করতে ব্যবহৃত একটি ওয়ার্ল্ড ফাইলকে তার কার্যকরী ডিরেক্টরিতে সঞ্চিত বলা হয়। রাউন্ডটি শেষ হয়ে গেলে অবশ্যই এটি মুছতে হবে (উদাহরণস্বরূপ, যখন কোনও বট জিতেছে) অন্যথায় বোটটি পরের রাউন্ডে বিভ্রান্ত হবে। (এটি নিয়ম ভঙ্গ করে কিনা আমাকে জানান))
  • splitমডিউল প্রয়োজন ।
#!/usr/bin/env node

// imports
var fs       = require("fs");
var splitmod = require("split");

// variables
var startX, startY, currentX, currentY, board = [], state = {};
var DEBUG = false;

// utility functions
function debug(){
    if(DEBUG) console.log.apply(console, arguments);
}

// calculates manhattan distance which is also the number of turns it will take to get somewhere
function manhattan(x1, y1, x2, y2){
    return Math.abs(x2 - x1) + Math.abs(y2 - y1);
}

// calculates chebyshev distance (mostly used for determining if a bot is within someone's plot)
function chebyshev(x1, y1, x2, y2){
    return Math.max(Math.abs(x2 - x1), Math.abs(y2 - y1));
}

// gets the board character at x, y
function get(x, y){
    return board[y][x];
}

function readState(){
    try {
        state = JSON.parse(fs.readFileSync('state.json').toString());
        debug("Opened state file");
    } catch(e){
        // it must be the first turn
        createState();
    }
}

function writeState(){
    fs.writeFileSync('state.json', JSON.stringify(state));
    debug("Wrote state file");
}

// finds out where all the other bots are
function getBotPositions(){
    var positions = [];
    for(var x = 0; x < 32; x++){
        for(var y = 0; y < 32; y++){
            if(get(x, y) == '@' && x != currentX && y != currentY){
                positions.push({x: x, y: y});
            }
        }
    }
    return positions;
}

function createState(){
    debug("Creating state");
    // take a loot at where other bots are to record their land locations
    var botLands = getBotPositions();
    state['botLands'] = botLands;

    state['turn'] = 0; // which turn is it?
    state['lastFireTurn'] = -999; // which turn was the last one where this bot set a fire?
}


// finds whether a plot of land (defined by its center) has fire on it
function isLandBurning(x, y){
    for(var dx = -4; dx < 5; dx++){
        for(var dy = -4; dy < 5; dy++){
            if(get(x + dx, y + dy).match(/[1-6]/) != null) return true;
        }
    }
    return false;
}

// finds the fire with the highest number (and therefore the one to put out first)
function findFire(x, y){
    var highestNum = 0;
    var fire = {x: x, y: y};
    for(var dx = -4; dx < 5; dx++){
        for(var dy = -4; dy < 5; dy++){
            if(get(x + dx, y + dy).match(/[1-6]/) != null){
                var num = parseInt(get(x + dx, y + dy));
                if(num > highestNum){
                    highestNum = num;
                    fire = {x: x + dx, y: y + dy};
                }
            }
        }
    }
    return fire;
}

// figures out where to go to get somewhere
function getDirection(x1, y1, x2, y2){
    var direction = 'S';
    var cycx = Math.abs(y2 - y1) / Math.abs(x2 - x1);

    if(cycx < 1){
        if(x2 > x1) direction = 'R';
        if(x2 < x1) direction = 'L';
    } else {
        if(y2 > y1) direction = 'D';
        if(y2 < y1) direction = 'U';
    }

    debug("Getting direction", x1, y1, x2, y2, "result", direction);

    return direction;
}

// read input
var dataCycle = 0;
process.stdin.pipe(splitmod()).on('data', function(line){
    switch(dataCycle){
    case 0:
        startX = parseInt(line);
        break;
    case 1:
        startY = parseInt(line);
        break;
    case 2:
        currentX = parseInt(line);
        break;
    case 3:
        currentY = parseInt(line);
        break;
    default:
        board.push(line);
    }

    dataCycle++;
}).on('end', function(){
    // main bot code
    readState();
    state['turn']++;
    debug("It is turn", state['turn']);

    // get bot positions
    var botPositions = getBotPositions();

    var action = {type:'X', direction:'S'};
    var move   = 'S';

    var isMyLandBurning = isLandBurning(startX, startY);
    if(isMyLandBurning){ // hurry over there ASAP!
        debug("Bot land is burning!");
        var pos = findFire(startX, startY);
        debug("Fire found at", pos);
        move = getDirection(currentX, currentY, pos.x, pos.y);
        // simulate the move and figure out if/where to dump the water
        var newX = currentX + (move == 'R') - (move == 'L');
        var newY = currentY + (move == 'D') - (move == 'U');
        if(chebyshev(newX, newY, pos.x, pos.y) < 5){
            // on its own land, start dropping water like a madman
            debug("Dropping water");
            action.type = 'P';

            // if it can put out the target fire, then do that
            if(manhattan(newX, newY, pos.x, pos.y) == 1) action.direction = getDirection(newX, newY, pos.x, pos.y);
            // it's not in range of the target fire, so use the time to put out other fires
            // if it's moving on top of a fire, put that out
            else if(get(newX, newY).match(/[1-6]/) != null) action.direction = 'S';
            // if there's a fire around it then put that out
            else if(get(newX + 1, newY).match(/[1-6]/) != null) action.direction = 'R';
            else if(get(newX - 1, newY).match(/[1-6]/) != null) action.direction = 'L';
            else if(get(newX, newY + 1).match(/[1-6]/) != null) action.direction = 'D';
            else if(get(newX, newY - 1).match(/[1-6]/) != null) action.direction = 'U';
            else action.direction = 'S';
        }
    } else {
        // are there any bots that could start a fire when this bot is 6+ tiles away?
        var headBack = false;
        for(var i = 0; i < botPositions.length; i++){
            var otherBot = botPositions[i];
            var dist = manhattan(otherBot.x, otherBot.y, startX, startY) - 4;
            var myDist = manhattan(currentX, currentY, startX, startY);
            if(dist + 6 < myDist){
                headBack = true;
                break;
            }
        }
        if(headBack){ // they're probably up to no good
            debug("Bots are dangerously close, heading back");
            move = getDirection(currentX, currentY, startX, startY);
        } else if(state['turn'] - state['lastFireTurn'] < 3) { // no bots near own plot, time to consider other options
            debug("Hiding fire");
            // sneakily hide the fire if one was set :)
        } else { // last option is to go find land to burn
            debug("Finding land to burn");
            var closestX = 999, closestY = 999;
            for(var i = 0; i < state.botLands.length; i++){
                var otherLand = state.botLands[i];
                if(!isLandBurning(otherLand.x, otherLand.y) && chebyshev(currentX, currentY, otherLand.x, otherLand.y) > 4){ // find someone to burn
                    // use [-3, 3] here because on the first turn, the bots could have moved before this bot had a chance to see them
                    // meaning that the [-3, 3] region is the only one that is guaranteed to be on their land
                    for(var dx = -3; dx < 4; dx++){
                        for(var dy = -3; dy < 4; dy++){
                            var type = get(otherLand.x + dx, otherLand.y + dy);
                            var distThere = manhattan(currentX, currentY, otherLand.x + dx, otherLand.y + dy);
                            var distShortest = manhattan(currentX, currentY, closestX, closestY);
                            // find normal land, or wet land that will dry by the time the bot gets to it
                            if((type == '.' || type == '@' || (type == 'W' && distThere > 1)) && distThere < distShortest){
                                closestX = otherLand.x + dx;
                                closestY = otherLand.y + dy;
                            }
                        }
                    }
                }
            }
            if(closestX != 999 && closestY != 999){ // land found; go there
                debug("Target acquired", closestX, closestY);
                debug("Burning land");
                move = getDirection(currentX, currentY, closestX, closestY);
                if(move == 'S'){ // is it on the land? If so, then burn it
                    action.type = 'B';
                    action.direction = 'S';
                    state['lastFireTurn'] = state['turn']; // record when the fire was set
                }
            } else { // everyone else's land already has a fire
                debug("Default action");
                // default to heading back; one can never be too safe!
                move = getDirection(currentX, currentY, startX, startY);
            }
        }
    }

    // save the state file
    writeState();
    // output the action
    console.log(move + action.type + action.direction);
});

এটা তোলে লাইন 340 এ একটি ত্রুটি ছোঁড়া: Error: Cannot find module 'split'। আমি নোড.জেএস v0.10.30 ব্যবহার করছি।
স্কাইলার

cd botdir npm install splitকোনও কারণে নোড এটি আমার জন্য বিশ্বব্যাপী ইনস্টল করা পছন্দ করে না তবে আপনিও এটি চেষ্টা করে দেখতে পারেন
ড্যাঙ্কমেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.