লেজার দিয়ে তাদের ধ্বংস করুন


21

ভূমিকা

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

আপনি আপনার লেজার দিয়ে কোন শত্রুকে আঘাত করতে পারেন এবং কোনটি লুকিয়ে রয়েছে?

সমস্যা

প্রথমত, একটি আখের আকার nএকটি একক লাইনে একটি পূর্ণসংখ্যা দ্বারা দেওয়া হয় । নিম্নলিখিত nরেখাগুলিতে nএকটি স্পেস দ্বারা পৃথক পৃথক প্রতি লাইনে পূর্ণসংখ্যা রয়েছে । প্রতিটি পূর্ণসংখ্যা সেই স্থানে বিল্ডিংয়ের উচ্চতা উপস্থাপন করে। প্রতিটি বিল্ডিং আয়তক্ষেত্রাকার শক্ত, 1 ইউনিট বাই 1 ইউনিট উচ্চতা ইউনিট।

এর পরে, আপনার অবস্থান তিন ফ্লোটিং পয়েন্ট সংখ্যা হিসেবে একটি একক লাইন উপর দেওয়া হয় x, y, z

অবশেষে, mএকক লাইনে কোনও সংখ্যার দ্বারা শত্রুর সংখ্যা দেওয়া হয় । নিম্নলিখিত mলাইনে একটি স্পেস দ্বারা পৃথক করে প্রতি লাইনে তিনটি ভাসমান পয়েন্ট সংখ্যা রয়েছে। এই প্রতিনিধিত্ব x, yএবং zশত্রু এর স্থানাঙ্ক। সমন্বিত সিস্টেমটি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়েছে:

  • x শহর ইনপুট বাম থেকে ডানে পরিমাপ করা হয়
  • y উপর থেকে নীচে পরিমাপ করা হয়
  • z স্থল থেকে পরিমাপ করা হয়

প্রতিটি শত্রুর জন্য, যদি আপনার কাছ থেকে কোনও শত্রুতে একটি অবরুদ্ধ কাঠামো আঁকা যায় তবে একটি ধনাত্মক পূর্ণসংখ্যা আউটপুট । অন্যথায়, একটি নেতিবাচক পূর্ণসংখ্যার আউটপুট । একটি নতুন লাইনের সাথে আউটপুটগুলি আলাদা করুন।

নমুনা ইনপুট

'#' দ্বারা চিহ্নিত মন্তব্যগুলি প্রতিটি লাইন কী করে তা দ্রুত দেখার জন্য আপনাকে উপস্থিত রয়েছে। তারা প্রকৃত ইনপুটটিতে উপস্থিত হবে না।

5              # Size of the map
0 0 0 0 0      # Buildings
0 0 0 0 0      # Buildings
4 4 4 4 4      # Buildings
0 0 0 0 0      # Buildings
0 0 0 0 0      # Buildings
2.5 0.0 4.0    # Your location
3              # Number of enemies
2.5 5.0 0.1    # Enemy location
2.5 5.0 5.0    # Enemy location
0.0 2.7 4.5    # Enemy location

নমুনা আউটপুট

উপরে নমুনা ইনপুট জন্য, আমরা নিম্নলিখিত আউটপুট:

-1
1
1

অনুমিতি

  • 0 << n100
  • 0 << m100
  • 0 <= x<=n
  • 0 <= y<=n
  • 0 <= z<n
  • খেলোয়াড়রা কোনও কোণে, প্রান্তে বা কোনও ভবনের পাশের অংশে অবস্থিত হবে না
  • শত্রুর কাছে আপনার দৃষ্টিভঙ্গি কোনও বিল্ডিংয়ের কোণে, প্রান্তে বা পাশে কখনও স্পর্শকাতর হবে না
  • খেলোয়াড় বাধা নয় is

এটিকে স্যান্ডবক্স থেকে বের করে দেখে আনন্দিত :)
টিমটেক

7
আমি যদি শত্রুকে ধ্বংস করতে না পারি তবে আমি কি তাদের সাথে যোগ দিতে পারি?
জন ডিভোরাক

@ ব্যবহারকারী 80551 দুঃখিত, আমি আপনার সম্পাদনাটি শিরোনামটিতে ফিরিয়ে দিতে হয়েছিল কারণ ভুল বানান উদ্দেশ্যমূলক ছিল। গুগলে খোজুন.
রেইনবোল্ট

@ রুশর ওহ, দুঃখিত,
আইডি কে

4
সম্পর্কিত: youtube.com/watch?v=NKTpWi5itOM
qwr

উত্তর:


5

পার্ল, 301 296 282

সম্পাদনা 2: আসলে, প্রতিযোগিতা বা না, এটি আরও কিছুটা গল্ফ না করার কোনও কারণ নেই। এটি অনলাইনে পরীক্ষা করুন

সম্পাদনা করুন: দু'বার পেরেনথিসিস চলে গেছে, শূন্যহীন পূর্ণসংখ্যার জন্য পরীক্ষা করার জন্য সরল রেজেেক্স x

পাঠযোগ্যতার জন্য নতুন লাইন এবং ইন্ডেন্টেশন সহ:

sub i{<>=~/\S+/g}
@b=map[i],@r=0..<>-1;
print.1<=>(map{
    @a[1,0,2,4,3]=@a;
    @b=map{$i=$_;[map$b[$_][$i],@r]}@r;
    grep$a[3]
        &&($k=(($x=$_)-$a[0])/$a[3])**2<=$k
        &&pop[sort map@{$b[$_]}[$x-!!$x,$x],
                   ($_=$a[1]+$k*$a[4]),$_-/^\d+$/]
           >=$a[2]+$k*$a[5]
    ,@R=@r
}@a=map$_-shift@v,i,@u=@v=@$_),$/for([i])x<>

এটি 5.14স্কেলারের (অ্যারে রেফারেন্স) যুক্তির কারণে প্রয়োজন pop


আপনি কি আপনার সমাধানটি একটু ব্যাখ্যা করতে পারেন? আমি এটি পরীক্ষা করে দেখিনি এবং পার্লকে আমি ধার দিয়েছি না, তাই কিছু মন্তব্য ভাল লাগবে।
ওয়ার্ল্ডসেন্ডার

@ ওয়ার্ল্ডএসেন্ডার, অ্যালগরিদমের রূপরেখা নিম্নরূপ। সরলরেখা PE3-ডি স্পেসে দুটি পয়েন্টকে সংযুক্ত করে, "প্লেয়ার" (এক্স 1ওয়াই 1 জেড 1) এবং "শত্রু" (এক্স 2ওয়াই 2 জেড 2)। (XY)বিমানটিতে এর অভিক্ষেপ কিছুটা গ্রিড-লাইনগুলি যেমন ইন্টিজারগুলি x = constবা y = constযেমন X1 < x < X2বা Y1 < y < Y2(এখানে অনুমান করে যে উদাহরণস্বরূপ X1 < X2, তবে এটি গুরুত্বপূর্ণ নয়) ছেদ করে । x yএই চৌরাস্তাগুলির স্থানাঙ্কগুলি সহজেই পাওয়া যায় এবং অতএব লাইনের zএকটি বিন্দুর PEসমন্বয়ও খুব বেশি।
ব্যবহারকারী 2846289

(অব্যাহত) অন্যদিকে, কোনও x yস্থানাঙ্কের জন্য, আমরা hবিল্ডিংয়ের উচ্চতা জানি (বরং, 4 টি বিল্ডিংয়ের সর্বাধিক উচ্চতা যা ভাগ করে x yদেয়)। h < zউপরে উল্লিখিত সমস্ত "ছেদ পয়েন্ট" এর জন্য (এবং কেবলমাত্র যদি) শত্রু গুলি করা যেতে পারে । বাস্তবায়ন হ'ল কিছু মৌলিক পাটিগণিত, পাশাপাশি গল্ফিংয়ের উদ্দেশ্যে পার্লের সাথে কয়েকটি কৌশল। আমি এক মাস আগে এটি কীভাবে করেছি তার বিশদটি ব্যাখ্যা করতে এখন কিছুটা সময় লাগবে :-)।
ব্যবহারকারী 2846289

আরগ, আমি দেখতে পেয়েছি সর্বশেষ (৫ ম) সংশোধনীতে একটি ত্রুটি রয়েছে: প্রকাশের @aবিন্যাসের অ্যারের উপাদানগুলির সূচকগুলি - দুঃখিত হিসাবে পরিবর্তে grepক্রমে উপস্থিত হওয়া উচিত । 0,3,0,4,1,5,23,0,3,1,4,2,5
ব্যবহারকারী 2846289

ঠিক আছে, কখনও না চেয়ে ভাল দেরি, এবং এই সব শেষ করতে, এখানে সংস্করণ মন্তব্য করা হয়।
ব্যবহারকারী 2846289

3

পাইথন 2.7 - 429 420 308 308 অক্ষর

আমি এই চ্যালেঞ্জটিকে কোড গল্ফ সমস্যার চেয়ে গণিতের সমস্যা হিসাবেই বেশি ভেবেছিলাম, তাই যদি আমি কিছু স্পষ্টত অনুকূলতা মিস করি তবে আমার পক্ষে খুব কঠোর হবেন না। যাইহোক, এখানে কোড:

b=lambda:raw_input().split()
m=map
d=range(input())
h=[m(int,b())for _ in d]
x,y,z=m(float,b())
for e,f,g in[m(float,b())for _ in[1]*input()]:o=lambda x,y,u,v,i,j:i<=x+u/v*(j+1-y)<=i+1<[]>z+(g-z)/v*(j+1-y)<=max(h[i][j:j+2])if v else 0;print 1-2*any(o(x,y,e-x,f-y,j,i)+o(y,x,f-y,e-x,i,j)for j in d for i in d)

এটি প্রান্ত এবং কোণার ক্ষেত্রে (অনিচ্ছাকৃত শাস্তি) জন্য কাজ করা উচিত এবং এটি বেশ শক্ত solid প্রদত্ত উদাহরণের জন্য ওউপুট:

-1
1
1

এবং এখানে একটি "সংক্ষিপ্ত" ব্যাখ্যা:

fast_read = lambda : raw_input().split() # define a helper
# m = map another helper
grid_range = range(input())
houses = [map(int, fast_read()) for _ in grid_range]
# 'map(int,...)' is a shorter version of '[int(a) for a in ...]'
pos_x,pos_y,pos_z = map(float, fast_read()) # read the player position
# the following loops through all enemy coordinates
for ene_x, ene_y, ene_z in [map(float,fast_read()) for _ in[1]*input()]:
    vec_z = ene_z - pos_z
    # is_hit macro uses vector math to detemine whether we hit a specific wall
    # wallhit -> 1
    # no wallhit -> 0
    is_hit = lambda pos_x, pos_y, vec_x, vec_y, co_x, co_y:\
        (co_x <= pos_x + vec_x/vec_y * (co_y + 1 - pos_y) <= co_x + 1 # check if hit_x is good
        < [] > # an effective and
        pos_z + (ene_z - pos_z)/vec_y * (co_y + 1 - pos_y) <= max(houses[co_x][co_y:co_y + 2]) # check if hit_z is good
        if vec_y else 0) # if vec_y is 0 we can't hit the wall parallel to y
    print (.5 - # can hit -> 0.5 - 0 = 0.5, hit -> 0.5 - 1 = -0.5
            any( # if we hit any wall
                # we swap x and y-coordinate because we read them "incorrect"
                is_hit(pos_x, pos_y, ene_x-pos_x, ene_y-pos_y, cur_y, cur_x) # check for hit in x-direction
                + # effective 'or'
                is_hit(pos_y, pos_x, ene_y-pos_y, ene_x-pos_x, cur_x, cur_y) # check for hit in y-direction
                    for cur_y in grid_range # loop y
                for cur_x in grid_range)) # loop x

আমার ধারণা এই ত্রুটিগুলি পূর্ণ। বিটিডব্লিউ আমি বাসা বাঁধতে অক্ষর সংরক্ষণ করেছি (প্রথম স্তরটি একটি স্থান, দ্বিতীয় একটি ট্যাব, তারপরে একটি ট্যাব এবং একটি স্থান ...)। আমি আশা করি এই সমস্ত উত্তর পরে এটি করার উপায় নির্দেশ করতে পারে।


আমি কেবল বুঝতে পেরেছিলাম যে নমুনা ইনপুটটি অবৈধ ছিল কারণ শত্রুদের মধ্যে একটি সরাসরি মাটিতে অবস্থিত, যা প্রযুক্তিগতভাবে শূন্য উচ্চতার বিল্ডিংয়ের শীর্ষে, যা আমি প্রতিশ্রুতি দিয়েছিলাম না। আপনার জমাটি সংশোধন পরীক্ষার কেসটি পাস করে, তবে এটি এতে ব্যর্থ হয় - আদর্শ one.com/8qn3sv । আপনি কি আমার পরীক্ষার কেসটি পরীক্ষা করতে পারবেন? আমি হয়ত কিছু অনুপস্থিত বা আমার সমন্বিত সিস্টেমটি অস্পষ্ট।
রেইনবোল্ট

না, এটি ঠিক যে ভেক্টরটি কোণার মধ্য দিয়ে চলেছে ... এখন আমি জানি আপনি কেন অনুমান 6 এবং 7 :) প্রতিশ্রুতি দিয়েছেন
ওয়ার্ল্ডসেন্ডার

বিটিডব্লু, আমি একটি নেতিবাচক ফ্লোট আউটপুট দিই তবে এটি 2 টি অতিরিক্ত অক্ষরের সাথে স্থির করা যেতে পারে ( print 1-2*...পরিবর্তে print.5-...) সুতরাং এটি যে অনুমান করা যায় তার চেয়ে বড় এটি নয়
ওয়ার্ল্ডসেন্ডার 22:54

আমি যে পরীক্ষাগুলি নিয়ে এসেছি আপনি তা পাস করেছেন। সুন্দর কাজ! আপনার এখনও এগিয়ে যাওয়া উচিত এবং এটিকে অনুমানের সাথে সামঞ্জস্য রাখতে পূর্ণসংখ্যা মুদ্রণ করা উচিত।
রেইনবোল্ট

1
আপনার উত্তরটি গ্রহণ করা যতক্ষণ না কেউ আরও ভাল সমাধান নিয়ে আসে। আমি মনে করি না তারা করবে। খুব কমই যে কেউ পুরানো সমাধানের চ্যালেঞ্জগুলি আবার ঘুরে দেখেন। আপনার আরও গল্ফ করা উচিত! দেখে মনে হচ্ছে আপনি নিজের জিনিস জানেন। :)
রেইনবোল্ট

2

সি - 2468

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
    float x;
    float y;
    float z;
} vec3;

float
dot(vec3 a, vec3 b)
{
    return a.x * b.x + a.y * b.y + a.z * b.z;
}

vec3
scale(float s, vec3 a)
{
    vec3 r;
    r.x = s * a.x;
    r.y = s * a.y;
    r.z = s * a.z;
    return r;
}

vec3
add(vec3 a, vec3 b)
{
    vec3 r;
    r.x = a.x + b.x;
    r.y = a.y + b.y;
    r.z = a.z + b.z;
    return r;
}

int
intersect(vec3 a, vec3 b, vec3 *normals, vec3 *points, int nnormals)
{
    vec3 ab = add(b, scale(-1, a));
    float tfirst = 0;
    float tlast = 1;
    int i;
    for(i = 0; i < nnormals; i++)
    {
        float d = dot(normals[i], points[i]);
        float denom = dot(normals[i], ab);
        float dist = d - dot(normals[i], a);
        float t = dist / denom;
        if(denom > 0 && t > tfirst)
        {
            tfirst = t;
        }
        else if(denom < 0 && t < tlast)
        {
            tlast = t;
        }
    }
    return tfirst < tlast ? 1 : 0;
}

const vec3 N = {0,-1,0};
const vec3 S = {0,1,0};
const vec3 W = {-1,0,0};
const vec3 E = {1,0,0};
const vec3 D = {0,0,-1};

int
main(void)
{
    vec3 normals[5];
    vec3 player;
    vec3 *targets;
    int i;
    int j;
    vec3 *buildings;
    vec3 *b;
    int nbuildings = 0;
    int n;
    int m;
    char line[300];
    normals[0] = N;
    normals[1] = S;
    normals[2] = W;
    normals[3] = E;
    normals[4] = D;
    fgets(line, 300, stdin);
    n = atoi(line);
    /*5 sides for each building*/
    buildings = calloc(n * n * 5, sizeof(*buildings));
    b = buildings;
    for(i = 0; i < n; i++)
    {
        char *z;
        fgets(line, 300, stdin);
        for(j = 0; j < n && (z = strtok(j ? NULL : line, " \n")) != NULL; j++)
        {
            vec3 bottom;
            vec3 top;
            if(z[0] == '0') continue;
            nbuildings++;
            bottom.x = j;
            bottom.y = i;
            bottom.z = 0;
            top.x = j + 1;
            top.y = i + 1;
            top.z = atoi(z);
            b[0] = top;
            b[1] = bottom;
            b[2] = top;
            b[3] = bottom;
            b[4] = top;
            b += 5;
        }
    }
    fgets(line, 300, stdin);
    player.x = atof(strtok(line, " "));
    player.y = atof(strtok(NULL, " "));
    player.z = atof(strtok(NULL, " \n"));
    fgets(line, 300, stdin);
    m = atoi(line);
    targets = calloc(m, sizeof(*targets));
    for(i = 0; i < m; i++)
    {
        int hit = 1;
        fgets(line, 300, stdin);
        targets[i].x = atof(strtok(line, " "));
        targets[i].y = atof(strtok(NULL, " "));
        targets[i].z = atof(strtok(NULL, " \n"));
        for(j = 0; j < nbuildings; j++)
        {
            b = &buildings[j * 5];
            if(intersect(player, targets[i], normals, b, 5) == 1)
            {
                hit = 0;
                break;
            }
        }
        printf("%d\n", hit ? 1 : -1);
    }
    free(buildings);
    free(targets);
    return 0;
}

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