2 ডি অন্ধকার ক্রোলার


9

আপনার প্রোগ্রামটির জন্য একটি বহু-রেখাযুক্ত স্ট্রিং নিতে হবে:

#############
#           #
#     p     #
#           #
#############

pখেলোয়াড় এবং #একটি ব্লক।

এখন টার্মিনালের নীচে একটি ইনপুট লাইন হওয়া উচিত:

How do you want to move?

যদি কোনও খেলোয়াড় টাইপ lনা করে যখন তাকে কোনও ব্লক না থাকে তখন বাম দিকে হাঁটতে হয়, অন্যথায়, যখন কোনও ব্লক থাকে, তখন সে যেতে পারে না এবং অবশ্যই চলতে পারে না, এখন টার্মিনালের আউটপুট আপডেট করতে হবে ( এবং পূর্ববর্তী আউটপুট ক্লিয়ার / ওভাররাইট করা):

#############
#           #
#    p      #
#           #
#############

তিনি lবাম দিকে, rডানদিকে, uউপরে এবং dনীচে টাইপ করতে পারেন ।

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

##  ##
#  #
## p
     #

একটি বৈধ অন্ধকূপ। (প্রতিটি লাইনে পূর্ববর্তী স্থানের অভাব নোট করুন)

যদি প্লেয়ার স্ট্রিংয়ের বাইরে যায় তবে তাকে প্রদর্শিত হবে না। তবে তিনি যদি পরে ফিরে আসেন তবে তাকে অবশ্যই আবার প্রদর্শিত হবে।

এবং "বাইরের" স্ট্রিংয়ের সীমানাটি আয়তক্ষেত্র length(longest_line)দ্বারা number_of_linesসমান্তরাল হয়, সুতরাং এমনকি যদি একটি লাইন ডানদিকে ফাঁকা স্থানের সাথে প্যাড করা না হয় তবে সেই অবস্থানটি সীমানার বাইরে বিবেচিত হয় না। আগের অন্ধকূপ ব্যবহার করে উদাহরণ:

##  ##
#  #p
##  
     #

দ্বিতীয় লাইনে p এখন যেখানে নেই সেখানে স্থান ছিল না, তবে তাতে কিছু আসে যায় না।

শেষ অবধি, আপনার প্রোগ্রাম অবশ্যই চিরকাল লুপ ইনপুট নেবে

পরীক্ষার মামলা

পরীক্ষার কেস 1:

####
# p#
#
####

How do you want to move?
d

####
#  #
# p
####

পরীক্ষার কেস 2:

####
  p#
   #
####

How do you want to move?
l

####
 p #
   #
####

How do you want to move?
d

####
   #
 p #
####

How do you want to move?
l

####
   #
p  #
####

How do you want to move?
l

####
   #
   #
####

How do you want to move?
r

####
   #
p  #
####

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

আপনার আউটপুট হিসাবে ইনপুট জন্য প্রম্পট অনুমোদিত হয় How do you want to move?\n<input>বা How do you want to move?<input>(অর্থাত আপনি একটি ফাঁকা লাইন ইনপুট প্রয়োজন নেই), এবং আপনি অন্ধকূপ চূড়ান্ত লাইন এবং প্রম্পট মধ্যে একটি খালি লাইন প্রয়োজন হবে না। (তবে তারা একই লাইনে থাকতে পারে না)

স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়! এটি কোড-গল্ফ, তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী!


2
যদি ইনপুটটি প্রবেশের পরে কোনও চিঠি হয় তবে তা গ্রহণযোগ্য? এছাড়াও, আমি সেই স্ট্রিংটি মুদ্রণ করার হাত থেকে মুক্তি পাওয়ার পরামর্শ দিচ্ছি যা চ্যালেঞ্জটিতে কোনও কিছু যোগ করবে বলে মনে হচ্ছে না
লুইস মেন্ডো

2
আমি মনে করি এটা পুনরায় openable, কিন্তু আমার পরামর্শ হল যে ইনপুট প্রম্পট (জন্য l, r, u, অথবা d) কিছু হতে পারে, শুধু "কিভাবে আপনি স্থানান্তর করতে চান না"? গল্ফনেস ব্যতীত এটি উত্তরগুলিতে সত্যই প্রভাবিত করে না।
আর

@ ইস্টারলিআইর্ক: আমি রাজি নই। কারণ এই ক্ষেত্রে, গল্ফারদের বাইটগুলি সংরক্ষণ করার জন্য স্ট্রিংটি কীভাবে সংকুচিত করতে হবে তা চিন্তা করতে হবে।
এলএমডি 13

2
@ ব্যবহারকারী7185318 এটিকে মাথায় রাখুন , মূলত প্রতি চ্যালেঞ্জ হিসাবে 1 টি সমস্যা নিয়ে থাকুন। স্ট্রিংকে সংকুচিত করা একটি সম্পূর্ণ পৃথক সমস্যা এবং তারপরে একটি অন্ধকূপের ক্রলার তৈরি করা এবং এটি সম্ভবত সেই চ্যালেঞ্জের মুখোমুখি হওয়া উচিত নয়।
Rɪᴋᴇʀ

1
প্লেয়ার সীমার বাইরে থাকাকালীন প্রদর্শিত হয়, বা তাদের অদৃশ্য হওয়ার দরকার আছে কি তা গ্রহণযোগ্য?
এমডব্লিউ

উত্তর:


1

ম্যাটল্যাব, 268 247 246 বাইট

সম্ভবত প্রতিযোগিতামূলক নয়, তবে এটি মজাদার ছিল। গল্ফ সংস্করণ:

function f(s);d=char(split(s,'\n'));[y,x]=ind2sub(size(d),find(d=='p'));while 1;d
c=uint8(input('How do you want to move?','s'))-100;v=y+~c-(c==17);w=x+(c==14)-(c==8);try;d(y,x)=' ';end;try;if'#'==d(v,w);v=y;w=x;end;d(v,w)='p';end;y=v;x=w;clc;end

পঠনযোগ্য সংস্করণ:

function f(s)
% Split the string on newlines and convert to a padded char array
d = char(split(s,'\n'));

% Get the initial indices of p
[y,x] = ind2sub(size(d),find(d=='p'));

% Loop forever
while 1
    % Implicitly display the dungeon
    d

    % Get the ASCII of the user input, minus 100 (saves a few bytes in
    % the comparisons)
    c=uint8(input('How do you want to move?','s'))-100;

    % Get the new y from the ASCII
    v = y+~c-(c==17);

    % Get the new x from the ASCII
    w = x+(c==14)-(c==8);

    % Clear the player from the dungeon if they are in it
    try
        d(y,x)=' ';
    end

    % Check if new position is a #, and revert to old position if so
    try
        if '#'==d(v,w)
            v=y;w=x;
        end
        d(v,w)='p';
    end
    % Update x and y
    y=v;
    x=w;

    % Clear the screen
    clc;
end

tryব্লক সীমা ত্রুটি আউট এ ক্র্যাশিং থেকে ফাংশন প্রতিরোধ হয়। আমি নিশ্চিত যে এগুলির মধ্যে দু'জনের ওভারকিল হয়েছে তবে আমি এর থেকে ভাল আর গল্ফ করতে পারি না।

এটি লক্ষণীয় যে ম্যাটল্যাব অ্যারেটি নীচে এবং ডানদিকে প্রসারিত করবে তবে প্লেয়ারটি প্রথমবারের মতো 'অনাবিষ্কৃত' এলাকায় যাওয়ার সময় অদৃশ্য হয়ে যাবে। উদাহরণস্বরূপ, আপনি যদি অন্ধকারের বর্তমান সীমানার বাইরে এক স্থান দিয়ে ডান দিকে যান তবে আপনি অদৃশ্য হয়ে যাবেন, তবে পরের বারে ম্যাটল্যাব নতুন কলামটি অন্তর্ভুক্ত করতে অ্যারে প্রসারিত করবে (বা সারি আপনি যদি নীচের দিকে চলে যাচ্ছেন)। '#'==d(y,x)তুলনায় একটি বাইট সংরক্ষণ করে d(y,x)=='#', যেহেতু আপনার মধ্যে ifএবং এর মধ্যে কোনও স্থানের দরকার নেই'#'


চমৎকার উত্তর ! আমি এই সময় আশা কিছু না খুব স্বল্প জয়ী, এখানে সাধারণ ভাষায় খুব একটা সুযোগ থাকা উচিত, কারণ বড় চ্যালেঞ্জ, আরও ভাল হয় জাভা ইত্যাদি :)
LMD

1

কফি-স্ক্রিপ্ট: 580 বাইট

আমি এই বিশেষ অ্যালগরিদম এবং আমার ক্লান্ত মস্তিষ্কের বাইরে যা পারছিলাম তার সমস্ত কিছুই আমি আটকিয়ে ফেলেছি। আমি একটি ছুটির দিন প্রয়োজন.

C=console
e='length'
N=null
f=(S)->
    x=y=X=Y=N
    q=(c,v)->
        X=[x+c,N][+(-1<x+c<w)]
        Y=[y+v,N][+(-1<y+v<h)]
        try L[y+v][x+c]!='#'catch
            1
    r=(s)->
        if (X||Y)
            return
        L[y]=((t=L[y].split '')[x]=s)
        L[y]=t.join ''
    while 1
        L=S.split '\n'
        [h,w]=[L[e],L[0][e]]
        x=[X,x][+(x?)]
        y=[Y,y][+(y?)]
        for k in[0..h*w-1]
            if L[k//h][k%w]=='p'
                x=k%w
                y=k//h
        C.clear()
        C.log S
        r(' ')
        switch prompt("How do you want to move?")
            when'l'
                q(-1,0)&&x--
            when'r'
                q(1,0)&&x++
            when'u'
                q(0,-1)&&y--
            when'd'
                q(0,1)&&y++
        r('p')
        S=L.join '\n'

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