একটি গ্রহাণু ক্ষেত্রটি সফলভাবে নেভিগেট করছে


36

ভূমিকা

সকলেই জানেন যে গ্রহাণু ক্ষেত্রটি সফলভাবে নেভিগেশনের সম্ভাবনা প্রায় 3,720 থেকে 1। তবে আপনার সতর্কতা সত্ত্বেও হ্যান সলো এখনও তার ভাগ্য চেষ্টা করতে রাজি।

আপনার কৃত্রিম জীবনের ভয়ে, আপনি জাহাজের অদ্ভুত উপভাষায় কোড পড়ার সিদ্ধান্ত নেন ( পড়ুন: আপনার পছন্দের কোড গল্ফ ভাষা ), একটি গ্রহাণু পরিহারের প্রোগ্রাম যা গ্রহাণু ক্ষেত্রের ASCII গোলকধাঁধায় কোন পাথ গ্রহণ করবে তা সিদ্ধান্ত নেবে।

ইনপুট

মিলেনিয়াম ফ্যালকনের একটি গ্রহাণু ফিল্ড ম্যাপিং প্রোগ্রাম রয়েছে যা এটির মতো ডেটা দেয়:

|   #####           #########  |
| ######  #          ###   #   |
|   # #  #  #  ####   #        |
@              ##    ####       
|#   #   #       ###   ##      |
|##      ##      ####   #  #   |
|####           ##### #   ##   |

শীর্ষ সারিগুলি ফ্যালকনের বামে রয়েছে, নীচের সারিগুলি ফ্যালকনের ডানদিকে এবং কলামগুলি জাহাজের সামনের অংশটি উপস্থাপন করে।

  • প্রতিটিই #একটি বাধা।
  • প্রতিটি স্থান খালি জায়গা যেখানে জাহাজটি উড়ে যেতে পারে।
  • ইনপুটটি সর্বদা 7 টি অক্ষর বেশি। এটি গ্রহাণু ম্যাপিং প্রস্থ সীমা।
  • ইনপুটটি সর্বদা 32 অক্ষর দীর্ঘ হয় (ক্ষেত্রের জন্য 30 টি এবং শুরু এবং শেষ সীমাতে 2)। এটি গ্রহাণু ম্যাপিং গভীরতার সীমা। উল্লম্ব বারগুলি |ম্যাপিংয়ের শুরু এবং শেষ চিহ্নিত করে।
  • @ফ্যালকন। এটি সর্বদা মাঝারি সারিতে (চতুর্থ সারিতে) এবং ইনপুটটিতে প্রথম কলামে থাকে।
  • শেষ কলামের উল্লম্ব বারগুলির মধ্যে স্থানটি স্থানটি জাহাজে পৌঁছানোর জায়গাটি। এটি সর্বদা মাঝারি সারিতে (চতুর্থ সারিতে) এবং ইনপুটটিতে সর্বশেষ কলামে থাকে।

ইনপুটটি মাল্টি-লাইন স্ট্রিং, স্ট্রিংগুলির একটি অ্যারে, STDIN বা কোনও ফাংশন পরামিতি থেকে নেওয়া বা কোনও ফাইল থেকে পড়তে পারে।

সম্ভাব্য কসরত

আপনি টিআইই-ফাইটারদের দ্বারা অনুসরণ করা হয়, তাই আপনাকে অবশ্যই সর্বদা এগিয়ে যেতে হবে। জাহাজটি প্রতিটি পদক্ষেপে তিনটি উপায়ে উড়তে পারে:

  • - অগ্রবর্তী

  • / এগিয়ে এবং বাম দিকে ঘুরুন

  • \ ফরোয়ার্ড করুন এবং ডানদিকে ঘুরুন

উদাহরণস্বরূপ, এগুলি বৈধ পাথ:

@---

  --
 /  \ /
@    -

   -
  / \
 /   \
@     \

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

ফ্যালকন ক্র্যাশ করে যদি একটি পদক্ষেপ জাহাজটিকে এমন কোনও স্থানে নিয়ে যায় যেখানে কোনও বাধা থাকে। উদাহরণস্বরূপ, এই পদক্ষেপগুলি ক্র্যাশগুলির দিকে নিয়ে যায়:

@-#

@
 \
  #

  #
 /
@

মনে রাখবেন এটি কোনও ক্রাশ নয়:

@-#
  \
   -

আউটপুট

আপনাকে অবশ্যই একই গ্রহাণু ক্ষেত্র ASCII আউটপুট করতে হবে, শেষের দিকে বৈধ পথ দিয়ে। ফ্যালকন অবশ্যই প্রারম্ভের জায়গার পরিবর্তে শেষ স্পটে প্রিন্ট করা উচিত।

উদাহরণস্বরূপ, পূর্বে প্রদত্ত ইনপুট উদাহরণের জন্য একটি বৈধ আউটপুট হ'ল:

|   #####           #########  |
| ######  #--------  ###   #   |
|   # #  #/ #  ####\  #        |
 ---------      ##  \ #### ----@
|#   #   #       ### \ ## /    |
|##      ##      #### \ #/ #   |
|####           ##### #-- ##   |

আপনার পথের কেবলমাত্র ফ্যালকন ক্রাশ না করা দরকার। এটি সবচেয়ে সংক্ষিপ্ততম পথ হওয়ার দরকার নেই।

আপনি ধরে নিতে পারেন যে সর্বদা সর্বশেষে অন্তত একটি সম্ভাব্য পথ থাকবে।

গ্রাহকক্ষেত্রটি ঠিক এই পোস্টে যেমন ছাপানো হয় ততক্ষণ আপনি কোনও ফাইল বা অন্য যে কোনও সমতলে আউটপুট করতে পারবেন (যেমন পথের জন্য স্থানাঙ্কের একটি তালিকা আউটপুট বৈধ নয়)।

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

  • একটি সাধারণ গ্রহাণু ক্ষেত্র

    |   #####           #########  |
    | ######  #          ###   #   |
    |   # #  #  #  ####   #        |
    @              ##    ####       
    |#   #   #       ###   ##      |
    |##      ##      ####   #  #   |
    |####           ##### #   ##   |
    

    সম্ভাব্য আউটপুট

    |   #####           #########  |
    | ######  #--------  ###   #   |
    |   # #  #/ #  ####\  #        |
     ---------      ##  \ #### ----@
    |#   #   #       ### \ ## /    |
    |##      ##      #### \ #/ #   |
    |####           ##### #-- ##   |
    
  • হাইপারগ্রেগুলার গ্রহাণু ক্ষেত্র

    |# # # # # # # # # # # # # # # |
    | # # # # # # # # # # # # # # #|
    |# # # # # # # # # # # # # # # |
    @ # # # # # # # # # # # # # #   
    |# # # # # # # # # # # # # # # |
    | # # # # # # # # # # # # # # #|
    |# # # # # # # # # # # # # # # |
    

    সম্ভাব্য আউটপুট

    |# # # # # # # # # # # # # # # |
    | # # # # # # # # # # # # # # #|
    |# # # # # # # # # # # # # # # |
     -# #-# #-# #-# #-# #-# #-# #--@
    |#\#/#\#/#\#/#\#/#\#/#\#/#\#/# |
    | #-# #-# #-# #-# #-# #-# #-# #|
    |# # # # # # # # # # # # # # # |
    
  • ডেথ স্টারের মূল

    |    #    #    #         #     |
    |         #    #    #          |
    |    #    #    #    #    #     |
    @    #    #    #    #    #      
    |    #    #         #    #     |
    |    #    #    #    #    #     |
    |    #         #    #    #     |
    

    সম্ভাব্য আউটপুট

    |    #    #    #   --    #     |
    |  ---    #    #  / #\   -     |
    | /  #\   #    # /  # \ /#\    |
     -   # \  #    #/   #  - # ----@
    |    #  \ # ----    #    #     |
    |    #   \#/   #    #    #     |
    |    #    -    #    #    #     |
    
  • ডেথ স্টার ট্রেঞ্চ

    |##############################|
    |##############################|
    |##############################|
    @                               
    |##############################|
    |##############################|
    |##############################|
    

    আউটপুট

    |##############################|
    |##############################|
    |##############################|
     ------------------------------@
    |##############################|
    |##############################|
    |##############################|
    
  • গ্রহাণু গুহা

    |### ##########################|
    |## # ############### ## ######|
    |# ###  ######## ### ## # #####|
    @ ###### ###### ### ## ###      
    |########  ### ### ## #########|
    |########## # ### ## ##########|
    |###########              #####|
    

    সম্ভাব্য আউটপুট

    |###-##########################|
    |##/#\############### ##-######|
    |#/###--######## ### ##/#\#####|
     -######\###### ### ##/###-----@
    |########--### ### ##/#########|
    |##########\# ### ##/##########|
    |###########--------      #####|
    

স্কোরিং

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


@ ডিজেএমসিমেহেম: প্রযুক্তিগতভাবে প্রথম লাইনটি "ভূমিকা";)
অ্যালেক্স এ।

2
উদাহরণগুলির উপর ভিত্তি করে এটি দেখতে কেমন হবে তা আমি সাজানোর চেষ্টা করি তবে চালগুলির এনকোডিংটি এখনও আমার কাছে কিছুটা বিভ্রান্তিকর। আপনি যদি প্রথম / শেষ পদক্ষেপ ব্যতীত "হাইপারগেইগুলার" উদাহরণটিতে সন্ধান করেন তবে আপনি সর্বদা তির্যক সরান। তবুও এটি -প্রতিটি মোড়ের পথে রয়েছে , এটি একটি "সামনের" পদক্ষেপ হিসাবে সংজ্ঞায়িত হয়েছে। তবে আসল পদক্ষেপগুলি সর্বদা দুটি তির্যক-বাম এবং পরে দুটি তির্যক-ডান থাকে।
রেটো কোরাদি

@ রিটোকোরাদি আমি বুঝতে পারি যে এটি সমস্ত স্পষ্ট নয় তবে মূল ধারণাটি হ'ল সমস্ত পদক্ষেপ আপনাকে একটি চরিত্রের প্রস্থকে ডানদিকে ভ্রমণ করতে বাধ্য করে। পাথটিকে অবিচ্ছিন্নভাবে দেখতে হবে, এ কারণেই ডান এবং বাম দিকে ঘুরার পরে পূর্ববর্তী / পরবর্তী চলনটি পূর্বেরটির উপরে / নীচে এক লাইন।
সময়সীকরণ করুন

@ অ্যাপসিলার উভয়ই বৈধ, যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনার উত্তরটি ভাল হওয়া উচিত
ফ্যাটালাইজ করুন

উত্তর:


11

জাভাস্ক্রিপ্ট (ES6), 186 201

f=([...s])=>(g=(i,l,c=k=" ")=>s[i]!=k&&s[i]!="@"?0:(i-130)?(s[i]=c,([..."/-\\"].some((c,j)=>!((--j&l&&j!=l)||!g(i+33*(l||j)+1,j,c)))||!(s[i]=k))):(s[i]="@",!console.log(s.join(""))))(99)

চলমান স্নিপেট:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><textarea cols="33" rows="7" id="t"></textarea><br><button><b>Solve &gt;&gt;&gt;</b></button><hr><button id="1">Normal</button> <button id="2">Hyperregular</button> <button id="3">Death Star core</button> <button id="4">Death Star trench</button> <button id="5">Asteroid cave</button><script>f=(function($__0){var $__2,$__3,$__4,$__5;s = $__4 = $__0.split("");return (g = (function(i, l) {var c = arguments[2] !== (void 0) ? arguments[2] : k = " ";return s[i] != k && s[i] != "@" ? 0 : (i - 130) ? (s[i] = c, ("/-\\".split("").some((function(c, j) {return !((--j & l && j != l) || !g(i + 33 * (l || j) + 1, j, c));})) || !(s[i] = k))) : (s[i] = "@",$("#t").val(s.join("")));}))(99);});$("button").click(function() {this.id?$("#t").val(inputs[this.id]):f($("#t").val());});inputs = [,`|   #####           #########  |\n| ######  #          ###   #   |\n|   # #  #  #  ####   #        |\n@              ##    ####       \n|#   #   #       ###   ##      |\n|##      ##      ####   #  #   |\n|####           ##### #   ##   |`,`|# # # # # # # # # # # # # # # |\n| # # # # # # # # # # # # # # #|\n|# # # # # # # # # # # # # # # |\n@ # # # # # # # # # # # # # #   \n|# # # # # # # # # # # # # # # |\n| # # # # # # # # # # # # # # #|\n|# # # # # # # # # # # # # # # |`,`|    #    #    #         #     |\n|         #    #    #          |\n|    #    #    #    #    #     |\n@    #    #    #    #    #      \n|    #    #         #    #     |\n|    #    #    #    #    #     |\n|    #         #    #    #     |`,`|##############################|\n|##############################|\n|##############################|\n@                               \n|##############################|\n|##############################|\n|##############################|`,`|### ##########################|\n|## # ############### ## ######|\n|# ###  ######## ### ## # #####|\n@ ###### ###### ### ## ###      \n|########  ### ### ## #########|\n|########## # ### ## ##########|\n|###########              #####|`];$("#t").val(inputs[1]);</script

এই ফাংশনটি নতুন লাইনের সাথে একটি একক স্ট্রিং গ্রহণ করে। ফাংশনটি ...অপারেটরটি ব্যবহার করে স্ট্রিংটিকে একটি অ্যারেতে বিভক্ত করে এবং (x,y)দ্বারা স্থানাঙ্কগুলির জন্য সূচক পায় (33 * y) + x

প্রতিটি স্থানের জন্য বিভিন্ন সম্ভাব্য পদক্ষেপগুলি পরীক্ষা করে ফাংশনটি পুনরাবৃত্তভাবে চালিত হয়। এটি যখন কোনও বাধার মুখোমুখি হয়, তখন এটি মিথ্যা মান দেয়, এবং যখন এটি শেষ লক্ষ্য স্থানে পৌঁছে তখন ফিরে আসে true। (গল্ফড কোডটিতে trueএটি তৈরি করেছে !console.log(...)))

মনে রাখবেন যে এই কোডটি ডান-টার্নের চলাচলগুলির দীর্ঘ রান ব্যবহার করে না, তবে তাদের সরল পদক্ষেপের সাহায্যে বিরামচিহ্ন করে। এটি, এটি নীচে দ্বিতীয় বিকল্পটি করে, প্রথমটি নয়:

\                       \
 \   (<= not this!)      -   (<= yes this!)
  \                       \

এটি আইনী বলে মনে হচ্ছে, যেহেতু -আইনানুগভাবে কোনও ঘুরার আগে বা পরে আসতে পারে, তবে কেন উভয়ই একবারে নয়? এটি শেষের দিকে বিশেষত অদ্ভুত দেখায়, যখন চূড়ান্ত পদক্ষেপটি হয় \তবে প্রদর্শিত হয় @:

|  --#    #    #   ------#  -  |
| /  \    #    #  / #    \ / \ |
|/   #-   #    # /  #    #-   -|
     # \  #    #/   #    #     @
|    #  - # ----    #    #     |
|    #   \#/   #    #    #     |
|    #    -    #    #    #     |

আমার প্রিয় কদর্য গল্ফ হ্যাকটি এখানে ডিফল্ট যুক্তিযুক্ত অপব্যবহার c=k=" "। আর্গুমেন্টগুলি (i,l,c=" ")বলবে " যদি তৃতীয় যুক্তি সরবরাহ না করা হয় তবে এর " "জন্য স্ট্রিংটি ব্যবহার করুন "। তবে এটি করে আমরা বলি "যদি সরবরাহ না করা হয় তবে বৈশ্বিক ভেরিয়েবলে সংরক্ষণ করুন এবং তারপরে সেই মানটিও সংরক্ষণ করুন "। যেহেতু পুনরাবৃত্তি কেবলমাত্র একক যুক্তি দিয়ে শুরু হয়, সর্বদা প্রথম ফাংশন কলে শুরু করা হয়।cfc=k=" "c" "kck

হালকা শৃঙ্খলাবদ্ধ:

// `i` - index in the string we're working on
// `l` - move character for this space (`/`, `\`, or `-`)
search = (i,l,c)=>{

  // not an open space; nip this recursive branch
  if(s[i]!=" "&&s[i]!="@") { return 0; }

  // we made it! the 130th space is (31,3)
  if(i==130) {
      s[i]="@";
      console.log(s.join(""));
      return true;
  }

  // fill in space with move character or a blank
  // (the space is only to blank out the initial `@`)
  s[i] = c || " ";

  // iterate through the 3 options and recursively explore the map
  return ['/','-','\\'].some((c,j)=>{
    --j;
    // if last move was sideways, and this is the opposite move, skip it
    if(l && j && j!=l) { return 0; }

    // recursively call search function on space pointed to by this move or the last move
    return search(i+33*(l||j)+1, j, c);
  })

  // if the `some` call is false (i.e. all options fail for this space)
  // then blank out this space and return false
  || !(s[i]=" ");

}

@ vihan1086 ঠিক আছে, গল্ফ-ইফিংয়ের সময় আমি এই স্পেসগুলি পুরোপুরি মিস করেছি। ডি: এবং একটি অ্যারে থেকে বিভক্ত স্ট্রিং এ স্যুইচ করাও একটি দুর্দান্ত পরিবর্তন। ধন্যবাদ। :) আমি আরও কয়েকটি পরিবর্তন করেছি (বর্তমান চলন-চরিত্রটি ফাংশনের মধ্যে নির্ধারিত পরিবর্তে তৃতীয় যুক্তি তৈরি করে, এবং " "একটি ভেরিয়েবলের মধ্যে সংরক্ষণ করে) যা আমার স্কোরকে আরও নীচে এনেছে।
অ্যাপসিলাররা

7

সি (সম্পূর্ণ প্রোগ্রাম), 249 247 235 বাইট

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

char f[7][33];g(i,j,c){return(i<0|i>6|f[i][j]%32?0:j<31?c%45-2?g(i,j+1,c)||g(i+1,j+1,92)||g(i-1,j+1,47):g(i+c/30-2,j+1,c)||g(i+c/30-2,j+1,45):1)?f[i][j]=j?j-31?c:64:32:0;}main(int p,char**v){read(open(v[1],0),f,231);g(3,0,45);puts(f);}

Ungolfed:

/* the field */
char f[7][33];

/* i - row
 * j - col
 * c - movement
 */
g(i,j,c)
{
    return
            /* if we're in bounds and not on an obstacle */
            (i >= 0 & i<7 & f[i][j] % 32 == 0 ?
                    /* if we haven't reached the end */
                    j < 31 ?
                            /* are we going straight ahead? */
                            c%45-2 ?
                                    /* try to go straight */
                                    g(i,j+1,c)
                                    /* try to turn right */
                                    || g(i+1,j+1,92)
                                    /* try to turn left */
                                    || g(i-1,j+1,47)
                            /* turning */
                            :
                                    /* try to keep turning */
                                    g(i+c/30-2,j+1,c)
                                    /* try to go straight */
                                    || g(i+c/30-2,j+1,45)
                    /* done */
                    :1 /* replace this with c==45 to better represent the last move being a turn */
            /* invalid move, fail */
            :0)
            /* add the correct movement to the field */
            ? f[i][j] = j ? j - 31 ? c : 64 : 32
            /* no path, much sads :( */
            :0;
}

main(int p,char*v[])
{
    /* read input file */
    read(open(v[1],0),f,231);

    /* calculate the path */
    g(3,0,45);

    /* print it out */
    puts(f);
}

আউটপুট:

$ ./a.out test.inp
|   #####           #########  |
| ######  #          ###   #   |
|   # #  #  #  ####   #      --|
 ------------- ##----####   /  @
|#   #   #    \ /### \ ##  /   |
|##      ##    - #### \ # /#   |
|####           ##### #---##   |

$ ./a.out test2.inp
|# # # # #-# # # # # #-# # # # |
| # # # #/#\# # # # #/#\# # # #|
|# # # #/# #\# # # #/# #\# # # |
 -# # #/# # #\# # #/# # #\# #  @
|#\# #/# # # #\# #/# # # #\# #/|
| #\#/# # # # #\#/# # # # #\#/#|
|# #-# # # # # #-# # # # # #-# |

$ ./a.out test3.inp
|    #    #    #   ------#     |
|    -    #    #  / #    \     |
|   /#\   #    # /  #    #\    |
 --- # \  #    #/   #    # \   @
|    #  \ #    /    #    #  \ /|
|    #   \#   /#    #    #   - |
|    #    ---- #    #    #     |

$ ./a.out test4.inp
|##############################|
|##############################|
|##############################|
 ------------------------------@
|##############################|
|##############################|
|##############################|

$ ./a.out test5.inp
|###-##########################|
|##/#\############### ##-######|
|#/###--######## ### ##/#\#####|
 -######\###### ### ##/###-----@
|########--### ### ##/#########|
|##########\# ### ##/##########|
|###########--------      #####|

দেখে মনে হচ্ছে আপনি প্রথম পরীক্ষায় শেষ পয়েন্টটি মিস করেছেন।
রেটো কোরাাদি

@ রিটোকোরাদি এটির -পরে একটি \, তবে এটি \দ্বারা আচ্ছাদিত @। (আমার প্রোগ্রামটি একই কাজ করে))
অ্যাপসিলাররা

1
@ রিটোকোরাদি এর আগের পুনরাবৃত্তিগুলি এই কেসটিকে আরও ভালভাবে পরিচালনা করেছিল। এটি +4 বাইট। আমি লক্ষ্য করেছি যে অ্যাপসিলারদের সমাধান একইভাবে আচরণ করেছে তাই আমি স্থানটি বাঁচাতে পছন্দ করেছিলাম।
কোল ক্যামেরন

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

3

কমন লিস্প, 303 বাইট

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

Golfed / minified

(let((s(open "i"))(n nil)(f(make-string 231)))(read-sequence f s)(labels((r(p s u d)(and(< 0 p 224)(find(aref f p)" @")(setf(aref f p)(cond((= 130 p)#\@)((or(unless d(r(- p 32)#\/ t n))(unless u(r(+ p 34)#\\ n t))(r(+ p(cond(u -32)(d 34)(t 1)))#\- n n))s)((return-from r)))))))(r 99 #\- n n)(princ f)))

একটি ফাইল থেকে ইনপুট রাউন্ডআপ আমি ডিরেক্টরির কাজ। আমি নিশ্চিত যে উন্নতির জন্য এখনও জায়গা আছে।

সরল কোড

(defun run-test (file)
  (let ((stream (open file)) ;;should use with-open-file for autoclose..
        (no nil) ;; alias for brevity
        (field (make-string 231)))
    (read-sequence field stream)
    (labels ((doit (pos sym going-up going-down)
               (and
                 (< 0 pos 224)
                 (find (aref field pos) " @")
                 (setf (aref field pos)
                       (cond
                         ((= 130 pos) #\@)
                         ((or
                            (unless going-down (doit (- pos 32) #\/ t no))
                            (unless going-up (doit (+ pos 34) #\\ no t))
                            (doit (+ pos (cond (going-up -32)
                                               (going-down 34)
                                               (t 1)))
                                  #\- no no))
                          sym)
                         ((return-from doit)))))))
      (doit 99 #\- no no)
      (princ field)
      nil)))

নমুনা আউটপুট

|   #####       --  #########  |
| ######  #    /  \  ###   # - |
|   # #  #  # /####\  #     / \|
--   -       / ##   \####  /   @
|#\ /#\  #  /    ### \ ## /    |
|##-   \ ##/     #### \ #/ #   |
|####   ---     ##### #-- ##   |

|  --#    #    #   --    #-    |
| /  \    #    #  / #\   / \   |
|/   #\   #    # /  # \ /#  \  |
-    # \  #    #/   #  - #   \ @
|    #  \ # ----    #    #    -|
|    #   \#/   #    #    #     |
|    #    -    #    #    #     |

|# #-# # # # # #-# # # # # #-# |
| #/#\# # # # #/#\# # # # #/#\#|
|#/# #\# # # #/# #\# # # #/# #\|
--# # #\# # #/# # #\# # #/# #  @
|# # # #\# #/# # # #\# #/# # # |
| # # # #\#/# # # # #\#/# # # #|
|# # # # #-# # # # # #-# # # # |

2

অ্যাকশনস্ক্রিপ্ট 3, 364 বাইট

আমি এটি দুটি ফাংশন মধ্যে বিভক্ত; একটিকে অ্যারের অ্যারেতে অ্যারে পরিবর্তন করতে হবে, এবং ফ্লাইটের পাথ গণনা করতে একজন পুনরাবৃত্ত হবে।

function m(f){for(var i=0;i<f.length;i++){f[i]=f[i].split("");}n(f,0,3,0);return f;}function n(f,x,y,m){var P=f[y][x],X=x+1,A=y-1,B=y,C=y+1,T=true,F=false,E='-';if (y<0||y>6||P=='#'||P=='|')return F;if (x==31){f[y][x]='@';return T;}if(m<0&&y>0){B=A;C=9;E='/';}else if(m>0&&y<6){A=9;B=C;E='\\';}if (n(f,X,B,0)||n(f,X,A,-1)||n(f,X,C,1)){f[y][x]=E;return T;return F;}

একটি নমুনা গ্রহাণু ক্ষেত্র সংজ্ঞায়িত সহ একটি প্রোগ্রামে অসম্পূর্ণ সংস্করণ:

package
{
    import flash.display.Sprite;

    public class AsteroidNavigator extends Sprite
    {
        var field:Array;
        public function AsteroidNavigator()
        {
            field = [
"|   #####           #########  |",
"| ######  #          ###   #   |",
"|   # #  #  #  ####   #        |",
"@              ##    ####       ",
"|#   #   #       ###   ##      |",
"|##      ##      ####   #  #   |",
"|####           ##### #   ##   |"];
            m(field);
            printField();
        }

        function m(f){
            for(var i=0;i<f.length;i++){
                f[i]=f[i].split("");\
            }
            n(f,0,3,0);
            return f;
        }

        private function n(field,x,y,m) {
            var C = field[y][x];
            if (x > 31 || C == '#' || C == '|') {
                return false;
            }
            if (x == 31 && y == 3) {
                field[y][x] = '@';
                return true;
            }
            if (m == 0) {
                if (n(x+1, y, 0) || ((y>0) && n(x+1, y-1, -1)) || ((y<6) && n(x+1, y+1, 1))) {
                field[y][x] = '-';
                return true;
                }
            } else if ((m<0) && (y>0)) {
                if ((n(x+1, y-1, -1) || n(x+1, y-1, 0))) {
                    field[y][x] = '/';
                    return true;
                }
            } else if ((m>0) && (y<6)) {
                if ((n(x+1, y+1, 1) || n(x+1, y+1, 0))) {
                    field[y][x] = '\\';
                    return true;
                }
            }
            return false;
        }

        private function printField() {
            var sb = "";
            for each (var row:Array in field) {
                sb += row.join("") + "\n";
            }
            trace(sb);
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.