2 डी डंगऑन क्रॉलर


9

आपके कार्यक्रम को एक बहु-पंक्ति वाला स्ट्रिंग लेना है, जैसे:

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

pखिलाड़ी है और #एक ब्लॉक है।

अब इसके तहत टर्मिनल में एक इनपुट लाइन होनी चाहिए:

How do you want to move?

यदि खिलाड़ी के lपास कोई ब्लॉक नहीं होने पर बाएं चलना होता है, तो कोई और, जब कोई ब्लॉक होता है, तो वह नहीं गुजर सकता है और निश्चित रूप से आगे नहीं बढ़ता है, अब टर्मिनल में आउटपुट अपडेट किया जाना है (आदि) और पिछला आउटपुट क्लियर / ओवरराइट किया हुआ):

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

वह lबाईं ओर, rदाईं ओर, uऊपर और dनीचे टाइप कर सकता है ।

इनपुट हमेशा बहुस्तरीय होगा, लेकिन हमेशा सही आयत में रिक्त स्थान के साथ गद्देदार नहीं होगा। इसके अलावा, हैश स्ट्रिंग में कहीं भी हो सकता है, और हमेशा एक दूसरे से जुड़ा नहीं रहेगा। उदाहरण के लिए:

##  ##
#  #
## p
     #

एक वैध कालकोठरी है। (प्रत्येक पंक्ति पर अनुगामी रिक्त स्थान की कमी पर ध्यान दें)

यदि खिलाड़ी स्ट्रिंग के बाहर जाता है, तो उसे प्रदर्शित करने की आवश्यकता नहीं है। लेकिन अगर वह बाद में वापस आता है, तो उसे फिर से प्रदर्शित किया जाना चाहिए।

और स्ट्रिंग "बाहर" की सीमाएं आयत length(longest_line)द्वारा होती number_of_linesहैं, इसलिए भले ही एक पंक्ति सही पर रिक्त स्थान के साथ गद्देदार न हो, उस स्थान को सीमा से बाहर नहीं माना जाता है। पहले के कालकोठरी का उपयोग करके उदाहरण:

##  ##
#  #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
मुझे लगता है कि यह फिर से खुलने वाला है, लेकिन मेरे सुझाव है कि इनपुट शीघ्र (के लिए l, r, u, या d) कुछ भी हो सकता है, न सिर्फ "कैसे आप ले जाना चाहते हैं"? यह वास्तव में गोल्फ के अलावा जवाबों को प्रभावित नहीं करता है।
R

@EasterlyIrk: मैं सहमत नहीं हूँ। क्योंकि इस मामले में, गोल्फरों को यह सोचना होगा कि बाइट्स को बचाने के लिए स्ट्रिंग को कैसे संपीड़ित किया जाए।
LMD

2
@ user7185318 इसे ध्यान में रखें , मूल रूप से प्रति चुनौती 1 समस्या के साथ रहती है। स्ट्रिंग को संपीड़ित करना पूरी तरह से एक अलग समस्या है, जिससे एक कालकोठरी क्रॉलर बन जाती है, और इस तरह शायद उस चुनौती से नहीं निपटना चाहिए।
R

1
क्या यह स्वीकार्य है यदि खिलाड़ी सीमा से बाहर होने पर प्रदर्शित होता है, या क्या उन्हें गायब होने की आवश्यकता है?
एमएच

जवाबों:


1

MATLAB, 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ब्लॉक सीमा त्रुटियों से बाहर पर दुर्घटनाग्रस्त से समारोह को रोकने के लिए कर रहे हैं। मुझे यकीन है कि उनमें से दो ओवरकिल हैं, लेकिन मैं इसे किसी भी तरह से बेहतर नहीं कर सकता।

यह ध्यान देने योग्य है कि MATLAB सरणी को नीचे और दाईं ओर विस्तारित करेगा, लेकिन पहली बार किसी 'अस्पष्टीकृत' क्षेत्र में जाने पर खिलाड़ी गायब हो जाएगा। उदाहरण के लिए, यदि आप कालकोठरी की वर्तमान सीमाओं के बाहर एक स्थान से दाईं ओर जाते हैं, तो आप गायब हो जाएंगे, लेकिन अगले मोड़ MATLAB नए स्तंभ (या पंक्ति, यदि आप नीचे की ओर बढ़ रहे हैं) को शामिल करने के लिए सरणी का विस्तार करेंगे। '#'==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'

अच्छा समाधान, लॉर्ड रेटटे
एलएमडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.