একটি ক্ষুদ্র এক্সপ্লোরার


34

আপনি একজন অন্বেষণকারী, অজানা বিশ্বের মানচিত্র তৈরি করছেন। আপনার জাহাজ বাতাসে বহন করে। কোথায় যায়, কে জানে?

প্রতিদিন, আপনার স্পাইগ্লাসে আপনি উত্তর, দক্ষিণ, পূর্ব এবং পশ্চিমে বৈশিষ্ট্যগুলি দেখতে পান। আপনি সবসময় চারটি বৈশিষ্ট্য দেখতে পাবেন, মূল দিকগুলির সাথে মিল রেখে। আপনার স্পাইগ্লাস এএসসিআইআই প্রতীকগুলি এর মতো রিপোর্ট করে:

~~.*, ~~~~, ~.^^,~#~#

প্রতীকগুলি ক্রমে (উত্তর, দক্ষিণ, পূর্ব, পশ্চিম) রয়েছে)

এগুলি প্রতীকগুলি: ~= সমুদ্র, .= উপকূল, ^= পর্বত, *= গাছ, #= অবৈধ (কোনও পর্যবেক্ষণ নেই, যখনই আপনি বিশ্বের প্রান্ত দেখেন বা কুয়াশার দ্বারা আড়াআড়ি আবদ্ধ হয়) এটি ঘটে। আপনার স্পাইগ্লাসটি প্রতিটি দিকেই এক ইউনিট দেখে।

প্রতি রাতে, আপনি কতটা ভ্রমণ করেছেন তা দেখতে আপনি তারকাদের দিকে তাকান। তারকাদের দিকে তাকিয়ে এমন একটি আসকি প্রতীকটির প্রতিবেদন করা হয়েছে:

n, s, e,w

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

~~.*n~~~~s~~.*s~.**

আপনার কাজটি হ'ল বিশ্বের 2D মানচিত্র আউটপুট করা (যেখানে ?মানচিত্রের অজানা অংশগুলি রয়েছে, উত্তর উপরে আছে, পূর্বটি সঠিক):

?~~~??????
?~~~??????
?~~~.^^.??
?~~.***.~~
~~.*^^*.~~
~~~..~~~~~
~~~~~~~~~~
~~~~~~~~~~

সরলতার খাতিরে ধরে নেওয়া যাক আপনি মানচিত্রের নীচে বাম কোণে শুরু করেছেন। ধরুন সমস্ত মানচিত্র 8x8।

এখানে একটি সরল 3x3 উদাহরণ। ধরে নিন মানচিত্রটি এরকম দেখাচ্ছে:

~.~
~^~
~.~

নিম্নলিখিত ইনপুট সহ: ~#.#n~~^#s

আপনি এই আউটপুট পাবেন:

~??
~^?
~.?

আরও উদাহরণ ইনপুট এবং আউটপুট:

ইনপুট ~#~#n~~~#n~~~#n~~~#n~~~#n~~.#n~~.#n#~~#e#.~~e#.~~e#.~~e#.~~e#~~~e#~~~e#~#~s~~#~s~~#~s~~#~s~~#.s~~#~s~~#~s~##~w~#~~w.#~~w^#~~w.#~~

আউটপুট

~~~~~~~~ 
~....~~~ 
~.????~~ 
~~????~~ 
~~????.~ 
~~????~~ 
~~?.^.~~ 
~~~~~~~~

ইনপুট:

~#~#e~#~~e~#~~e.#~~e^#~~n.~..n~^~.n~.~~n.~~.n.~~*n~.~.n#.~~w#.~~w#.~~s~*..s..*.s*~.~s.~~~s

আউটপুট:

?~~~~~?? 
?....~?? 
?.**.~?? 
?~..~~?? 
?~~~~~?? 
?~~..~?? 
~~~.^.?? 
~~~~~~?? 

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

আউটপুটটি স্থান বিচ্ছিন্ন করা উচিত নয়, এটি আমার পক্ষ থেকে একটি ত্রুটি। "#" "কোনও পর্যবেক্ষণ নেই" উপস্থাপন করে। আপনি যখনই মানচিত্রের সীমানায় থাকবেন সেগুলি এগুলি ঘটে তবে এলোমেলোভাবে ঘটতেও পারে।
ব্যবহারকারী52676

4
চমৎকার। যেমনটি অ্যালেক্স বলেছিলেন, এটি একটি দুর্দান্ত প্রথম চ্যালেঞ্জ। আমি ভবিষ্যতে আপনার কাছ থেকে আরও দেখতে আশা করি! :) (এফওয়াইআই, ভবিষ্যতের চ্যালেঞ্জগুলির বিষয়ে প্রতিক্রিয়া জানাতে স্যান্ডবক্স একটি দুর্দান্ত জায়গা))
এল'েন্ডিয়া স্টারম্যান

1
আমি সন্দেহ করি যে প্রথম উদাহরণটি (যেখানে ইনপুটটি ~#~#n~~~#n~~~#n~~~#n~~~#n~~.#n~~.#n#~~#e#.~~e#.~~e#.~~e#.~~e#~~~e#~~~e#~#~s~~#~s~~#~s~~#~s~~#.s~~#~s~~#~s~##~w~#~~w.#~~w^#~~w) ভুল, এবং আউটপুট ??যেখানে সেখানে বলা উচিত?.
Leaky Nun

3
এটি একটি
magন্দ্রজালিক

উত্তর:


8

এমএটিএল , 68 59 58 বাইট

'?'7XJQtX"'s'jh5e"@2#1)t35>)-1l8t_4$h9M)b'nsew'=8M*sJ+XJ+(

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

মানচিত্রটি স্ট্যাকের নীচে রাখা হয় এবং ধীরে ধীরে ভরাট হয়। এক্সপ্লোরারের বর্তমান অবস্থানটি ক্লিপবোর্ড জেতে সংরক্ষিত আছে।

মানচিত্রটিতে ম্যাট্রিক্স স্থানাঙ্ক ব্যবহার করা হয়েছে, সুতরাং (1,1) উপরের বাম দিকে। এছাড়াও, কলাম-প্রধান লিনিয়ার সূচক ব্যবহার করা হয়। এর অর্থ হ'ল মানচিত্রের প্রতিনিধিত্বকারী 8 × 8 ম্যাট্রিক্সের উপাদানগুলি একক সূচী দিয়ে নীচে অ্যাক্সেস করা হয়েছে:

1  9 17 25 33 41 49 57
2 10 18 26 34 42 50 58
3 11 19 27 35 43 51 59
4 12 20 28 36 44 52 60
5 13 21 29 37 45 53 61
6 14 22 30 38 46 54 62
7 15 23 31 39 47 55 63
8 16 24 32 40 48 56 64

সুতরাং উদাহরণস্বরূপ ম্যাট্রিক্সের উপাদানটি (3,2) হ'ল লিনিয়ার সূচক 11 সহ উপাদানটি উত্তর, দক্ষিণ, পূর্ব এবং পশ্চিমের দিকে যথাক্রমে লিনিয়ার সূচক -1, 1, 8 বা -8 যোগ করার সাথে মিলে যায়। অ্যারে [-1 1 8 -8] দুটি ভিন্ন জিনিস এনকোড করতে পরিবেশন করে:

  • এক্সপ্লোরারের সম্ভাব্য স্থানচ্যুতি।
  • স্পাইগ্লাসের সাহায্যে বৈশিষ্ট্যগুলির আপেক্ষিক অবস্থানগুলি সনাক্ত করা হয়। এই অবস্থানগুলি এক্সপ্লোরারের বর্তমান অবস্থানের সাথে তুলনামূলক।

ইনপুট স্ট্রিংটি 5অক্ষরের অংশগুলিতে সাজানো হয় । যেহেতু প্রথম খণ্ডটি প্রথম অক্ষরটি হারিয়েছে (যা আন্দোলন নির্দেশ করে), তাই প্রাথমিকভাবে sসমস্ত খণ্ডকে একই আকার তৈরি করার জন্য নির্বিচারে অন্তর্ভুক্ত করা হয়। এটির ক্ষতিপূরণ দেওয়ার জন্য, এক্সপ্লোরার 8 নয়, 7 অবস্থানে শুরু হয়, সুতরাং দক্ষিণে প্রাথমিক স্থানচ্যুতি (রৈখিক সূচকে 1 যুক্ত করুন) তাদের 8 অবস্থানে রেখে দেয়।

5 টি অক্ষরের অংশগুলি একটি লুপে প্রক্রিয়া করা হয়। প্রথম অক্ষরটি অবস্থান আপডেট করে এবং বাকি 4, এর চেয়ে আলাদা #হলে ম্যাট্রিক্সের পর্যাপ্ত এন্ট্রিগুলিতে লেখা হয় যা মানচিত্রকে উপস্থাপন করে।

'?'          % push '?'. The map will initially be filled with this
7XJ          % push 7: initial position of the explorer. Copy into clipboard J
Qt           % add 1. Duplicate
X"           % 8x8 matrix containing '?'
'n'jh        % take input string. Prepend 'n'
5e           % reshape into a 5-column matrix
"            % for each column (chunk)
  @          %   push current chunk
  2#1)       %   split chunk into its first char and an array with the other 4
  t35>       %   duplicate. Logical index of chars different than #
  )          %   apply that index to keep characters different than #
  -1l8t_4$h  %   array [-1 1 8 -8]
  9M         %   push logical index again
  )          %   apply that index to keep only relevant relative positions
  b          %   bubble up in stack: move first char of chunk to top
  'nsew'=    %   logical index that tells if that char is 'n', 's', 'e' or 'w'
  8M         %   push array [-1 1 8 -8] again
  *          %   multiply element-wise. Only one of the four results will be nonzero
  s          %   sum of the array. Gives displacement of the explorer
  J+         %   push position of the explorer and add to compute new position
  XJ         %   update position in clipboard J
  +          %   add updated position of explorer to relative positions of features
  (          %   write those fearttures into the indexed entries of the map
             % end for each. Implicitly display

এটা একটা চালাক কৌশল! আমি আপনার প্রোগ্রামটি কয়েকটি মানচিত্রের বিপরীতে পরীক্ষা করব এটি আমার প্রত্যাশা অনুযায়ী কাজ করে কিনা।
ব্যবহারকারী52676

3

সি, 210 208 207 বাইট

এই একটি ইনপুট পড়তে প্রিন্টফ এবং স্ক্যানফ এবং x, y এর পরিবর্তে লিনিয়ারাইজড অ্যারে ব্যবহার করে; সুতরাং আমি অনুভব করি যে এটি মিলিবাইটের চেয়ে যথেষ্ট আলাদা ।

Golfed:

 main(p){char*i,*j,m[80];for(p=73,i=m+p;p--;m[p]=63);for(p=8;scanf("%5s",i)>0;p+=*j=='n'?8:*j=='s'?-8:*j=='e'?1:-1)for(j=i;j-i<4;j++)if(*j^35)m[p+"qajh"[j-i]-'i']=*j;for(p=72;m[p]=0,p-=8;)printf("%s\n",m+p);}

কিছুটা-ungolfed:

main(p){
    char*i,*j,m[80];
    for(p=73,i=m+p;p--;m[p]=63);                   // fill with ?
    for(p=8;scanf("%5s",i)>0;
            p+=*j=='n'?8:*j=='s'?-8:*j=='e'?1:-1)  // read 5-at-a-time
        for(j=i;j-i<4;j++)
            if(*j^35)m[p+"qajh"[j-i]-'i']=*j;      // update map positions
    for(p=72;m[p]=0,p-=8;)printf("%s\n",m+p);      // output line-by-line
}

উপস্থাপনা:

  // board: (vertically reversed when printed)
    0  1  2  3  4  5  6  7
    8  9  10 ...
    16 18 19 ...
    ...
    56 57 58 59 60 61 62 63

  // offsets and offset order, or why "qajh": 
    s2      -8       a
  w4  e3  -1 0+1   h i j
    n1      +8       q   <- offset by +'i'

এছাড়াও, আপনি 8 অবস্থানে শুরু করেন কারণ এটি মুদ্রণ-লুপের বাইরে একটি চর শেভ করে।


2

ফরট্রান, 263 251 247 235 234 216 বাইট

1 ডি সংস্করণ (ডন মুয়েসির অনুরূপ):

#define R read(*,'(a)',advance='no',eor=1)c
#define F(x)R;if(c/='#')a(x+i)=c
program t
character::a(64)='?',c
integer::k(4)=[8,-8,1,-1],i=57
do
F(-8)
F(8)
F(1)
F(-1)
R
i=i+k(index('snew',c))
enddo
1 print'(8a)',a
end

2 ডি সংস্করণ:

#define R read(*,'(a)',advance='no',eor=1)c
#define F(x,y)R;if(c/='#')a(x+m,y+l)=c
#define G(x,y)j=index(x,c);if(j==2)j=-1;y=y+j
program t
character::a(8,8)='?',c
l=8;m=1
do
F(,-1)
F(,1)
F(1,)
F(-1,)
R
G('sn',l)
G('ew',m)
enddo
1 print'(8a)',a
end

বিনামূল্যে ফর্ম এবং প্রাক-প্রক্রিয়াকরণ সক্ষম করতে, ফাইলটির এক্সটেনশন .F90যেমন, প্রয়োজন explorer.F90। এসটিডিআইএন থেকে ইনপুটটি পঠিত:

echo "~#~#e~#~~e~#~~e.#~~e^#~~n.~..n~^~.n~.~~n.~~.n.~~*n~.~.n#.~~w#.~~w#.~~s~*..s..*.s*~.~s.~~~s" | ./a.out 
?~~~~~??
?....~??
?.**.~??
?~..~~??
?~~~~~??
??~..~??
~~~.^.??
~~~~~~??

তাহলে কি ফোর্টরানেরও লিনিয়ার ইনডেক্সিং রয়েছে?
লুইস মেন্ডো

পছন্দ করুন আমি সরাসরি 1D অ্যারেতে পরিচালনা করছি। অক্ষরের অ্যারে প্রিন্ট করার জন্য আমি এই সত্যটি ব্যবহার করছি যে অ্যারেটি স্মৃতিতে স্বচ্ছলভাবে সঞ্চিত আছে।
আলেকজান্ডার ভোগ্ট

2

সি, 265 226 224 বাইট

a[8][8];x;y;i;main(c){for(;c=getchar(),c+1;y+=(c=='n')-(c=='s'),x+=(c=='e')-(c=='w'))for(i=5;--i;c=getchar())i&&c-35&&(a[x+(i==2)-(i==1)][y-(i==3)+(i==4)]=c);for(y=8;y--;putchar(10))for(x=0;x<8;)putchar((i=a[x++][y])?i:63);}

মানচিত্রটি 8x8, আমি এর আগে খেয়াল করিনি। এবং এখানে 265 বাইট সমাধান রয়েছে যা পরিবর্তনশীল মাত্রা সহ মানচিত্রের জন্য কাজ করে:

a[99][99];c;x;X;y;i;k;p;main(Y){for(;c=getchar(),c+1;y+=(c=='n')-(c=='s'),x+=(c=='e')-(c=='w'))for(i=5;--i;c=getchar())i&&c-35&&(a[k=x+(i==2)-(i==1),X=X<k?k:X,k][p=y-(i==3)+(i==4),Y=Y<p?p:Y,p]=c);for(y=Y+1;y--;putchar(10))for(x=0;x<=X;)putchar((i=a[x++][y])?i:63);}

a[8][8]পর্যাপ্ত হওয়া উচিত নয় ?
আলেকজান্ডার ভোগ্ট

@ আলেকজান্ডার ভোগ - ওহ, ঠিক আছে! আপনাকে ধন্যবাদ, এটি আরও দুটি বাইট হ্রাস করে।
mIllIbyte

আমি সত্যিই পছন্দ করি আপনি কীভাবে এক্স এবং y এর ইনক্রিমেন্ট / হ্রাস গণনা করেন। আমাদের সি কোডের সাথে তুলনা করে, স্ট্যাটিক int a[8][8]আপনাকে নিখরচায় মানচিত্রের সূচনা দেয় এবং চরের ব্যবহার m[64]আমাকে মানচিত্র আউটপুট দেওয়ার জন্য দুর্দান্ত ছাড় দেয়। সত্যিই কাছাকাছি গণনা, যদিও
টুকুশি

যদি আপনি বিপরীত হন eএবং wআপনার মানচিত্রের উপস্থাপনায় থাকেন তবে আপনি for(x=8;x--;)putchar((i=a[x][y])?i:63)আউটপুটটিতে দুটি বাইট শেভ করতে পারেন ।
tucuxi

এর c=getchar(),c+1সমতুল্য না getchar(),c++কিছু জড়িত রয়েছে?
জোনাথন ফ্রেচ

2

রুবি, 169 147 বাইট

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

সমস্ত স্ট্রিংকে একটিতে রেখে তার পরে ভাগ করে একটি টন ছাঁটাই।

m=??*64
d=0
x=56
gets.each_char{|c|d<4?(w=x+(d>2?-1:d>1?1:d<1?-8:d<2?8:0)
m[w]=c if c>?$):x+=c>?v?-1:c<?f?1:c>?q?8:-8
d+=1;d%=5}
puts m.scan /.{8}/

Ungolfed:

m = ?? * 64                 # 64 "?" symbols
                            # y axis counts downwards; 0-7 is top row
d = 0                       # Keep track of which direction we're looking
x = 56                      # Position, bottom left corner (0,7)
gets.each_char do |c|       # For each character from first line of STDIN
    if d < 4                # Looking in a direction
        if    d > 2         # d == 3; looking west
            w = x - 1
        elsif d > 1         # d == 2; looking east
            w = x + 1
        elsif d < 1         # d == 0; looking north
            w = x - 8
        else                # d == 1; looking south
            w = x + 8
        end
        m[w] = c if c > ?$  # Only '#' gets rejected by this step
    else                    # Moving in a direction
        if    c > ?v        # c == 'w'
            x -= 1
        elsif c < ?f        # c == 'e'
            x += 1
        elsif c > ?q        # c == 's'
            x += 8
        else                # c == 'n'
            x -= 8
        end
    end
    d = (d + 1) % 5         # Look in the next direction
end
puts m.scan /.{8}/          # Split map into rows of 8

1

লুয়া, 354 বাইট ( এটি অনলাইনে চেষ্টা করুন )

Golfed:

n=(...)r={}y=8x=1q="?"for i=1,8 do r[i]={q,q,q,q,q,q,q,q}end for u in n:gsub("#",q):gmatch(".....")do a,b,c,d,e=u:match("(.)(.)(.)(.)(.)")if a~=q then r[y-1][x]=a end if b~=q then r[y+1][x]=b end if c~=q then r[y][x+1]=c end if d~=q then r[y][x-1]=d end y=y+(("n s"):find(e)or 2)-2x=x+(("w e"):find(e)or 2)-2 end for i=1,8 do print(table.concat(r[i]))end

সামান্য শৃঙ্খলাবদ্ধ:

n = "~#~#e~#~~e~#~~e.#~~e^#~~n.~..n~^~.n~.~~n.~~.n.~~*n~.~.n#.~~w#.~~w#.~~s~*..s..*.s*~.~s.~~~s"

r={} y=8 x=1 q="?"
for i=1,8 do r[i]={q,q,q,q,q,q,q,q} end
for u in n:gsub("#",q):gmatch(".....") do
  a,b,c,d,e=u:match("(.)(.)(.)(.)(.)")
  if a~=q then r[y-1][x]=a end
  if b~=q then r[y+1][x]=b end
  if c~=q then r[y][x+1]=c end
  if d~=q then r[y][x-1]=d end
  y=y+(("n s"):find(e)or 2)-2
  x=x+(("w e"):find(e)or 2)-2
end
for i=1,8 do print(table.concat(r[i])) end

হতে পারে x=x+(("w e"):find(e)or 2)-2 endনা x=x-2+(("w e"):find(e)or 2)end?
জোনাথন ফ্রেচ

1

কোটলিন, 242 বাইট

{val m=Array(8){Array(8){'?'}}
var d=7
var i=0
for(c in it)(mapOf('n' to{d--},'s' to{d++},'w' to{d-=8},'e' to{d+=8},'#' to{i++})[c]?:{m[d%8+listOf(-1,1,0,0)[i%4]][d/8+listOf(0,0,1,-1)[i%4]]=c
i++})()
m.forEach{for(c in it)print(c);println()}}

নতুন লাইনগুলি ইচ্ছুক হলে সেমিকোলনগুলির সাথে প্রতিস্থাপন করা যেতে পারে।

এখানে চেষ্টা করুন

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