কোড গল্ফ: লেজারস


152

চ্যালেঞ্জ

অক্ষরের দ্বারা সংক্ষিপ্ততম কোডটি কোনও বোর্ডের 2D উপস্থাপনা ইনপুট করতে এবং ইনপুট অনুসারে 'সত্য' বা 'মিথ্যা' আউটপুট হিসাবে গণনা করে ।

বোর্ডটি 4 ধরণের টাইল দিয়ে তৈরি:

 # - A solid wall
 x - The target the laser has to hit
 / or \ - Mirrors pointing to a direction (depends on laser direction)
 v, ^, > or < - The laser pointing to a direction (down, up, right and left respectively)

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

লেজার রশ্মি শট করে এবং এটির নির্দেশ থেকে তার উত্স থেকে যাত্রা করে। যদি কোনও লেজার রশ্মি দেয়ালে আঘাত করে তবে এটি বন্ধ হয়ে যায়। যদি একটি লেজার রশ্মি একটি আয়নাতে আঘাত করে তবে এটি আয়নার দিকে নির্দেশিত দিকে 90 ডিগ্রি বাউন্স করে। আয়না দুটি পক্ষের, যার অর্থ উভয় পক্ষই 'প্রতিফলনশীল' এবং একটি রশ্মিকে দুটি উপায়ে বাউন্স করতে পারে। যদি কোনও লেজার রশ্মি ^v><নিজেই লেজারটিকে আঘাত করে তবে এটি প্রাচীর হিসাবে বিবেচিত হবে (লেজার বিম বিমারটি ধ্বংস করে এবং তাই এটি কখনই লক্ষ্যকে আঘাত করবে না)।

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

ইনপুট:
    ##########
    # / \ #
    # #
    # \ এক্স#
    #> / #
    ########## 
আউটপুট:
    সত্য

ইনপুট:
    ##########
    # ভিএক্স #
    # / #
    # / #
    # \ #
    ##########
আউটপুট:    
    মিথ্যা

ইনপুট:
    #############
    # # #
    #> # #
    # # #
    # # এক্স #
    # # #
    #############
আউটপুট:
    মিথ্যা

ইনপুট:
    ##########
    # / \ / \ / \ #
    # \\ // \\\ #
    # // \ / \ / \\ #
    # \ / \ / \ / এক্স ^ #
    ##########
আউটপুট:
    সত্য

কোড গণনা ইনপুট / আউটপুট (অর্থাত্ সম্পূর্ণ প্রোগ্রাম) অন্তর্ভুক্ত।


84
আইএমএ চার্জিন 'মাহ লেজার!
ইলফুর ওয়েজ

37
এটা দুর্দান্ত
GManNickG


49
@ গেমফ্রাক: সত্যিই এটি পুরানো হয়ে উঠছে ।
আর্টিলিয়াস

24
আসলেই কি '^' তার মাথার উপর একটি ফ্রেইকিন 'লেজারযুক্ত হাঙ্গর?
নাথান ফেজার

উত্তর:


78

পার্ল, 166 160 টি অক্ষর

পার্ল, 251 248 246 222 214 208 203 201 193 190 180 176 173 170 166 -> 160 অক্ষর।

এই প্রতিযোগিতাটি শেষ হয়ে গেলে সমাধানটিতে 166 টি স্ট্রোক হয়েছিল, কিন্তু এ। রেক্স আরও 6 টি চরিত্রের শেভ করার কয়েকটি উপায় খুঁজে পেয়েছেন:

s!.!$t{$s++}=$&!ge,$s=$r+=99for<>;%d='>.^1<2v3'=~/./g;($r)=grep$d|=$d{$t{$_}},%t;
{$_=$t{$r+=(1,-99,-1,99)[$d^=3*/\\/+m</>]};/[\/\\ ]/&&redo}die/x/?true:false,$/

প্রথম লাইনটি ইনপুটটি লোড করে %t, বোর্ডের একটি টেবিল যেখানে $t{99*i+j}সারি i , কলাম জে অক্ষর ধারণ করে । তারপর,

%d=split//,'>.^1<2v3' ; ($r)=grep{$d|=$d{$t{$_}}}%t

এটি %tএমন কোনও চরিত্রের সাথে মেলে এমন > ^ <বা তার জন্য উপাদানগুলির সন্ধান করে vএবং একই সাথে $d0 এবং 3 এর মধ্যে একটি মান সেট করে যা লেজার বিমের প্রাথমিক দিক নির্দেশ করে।

মূল লুপে প্রতিটি পুনরাবৃত্তির শুরুতে, বিমটি $dবর্তমানে একটি আয়নাতে থাকলে আমরা আপডেট করি । 3 দ্বারা XOR'ing আয়নাটির সঠিক আচরণ \দেয় এবং 1 দ্বারা XOR'ing আয়নাটির জন্য সঠিক আচরণ দেয় /

$d^=3*/\\/+m</>

এর পরে, বর্তমান অবস্থানটি $rবর্তমান দিকের সাথে মিল রেখে আপডেট করা হয়।

$r+=(1,-99,-1,99)[$d] ; $_ = $t{$r}

$_ম্যাচ অপারেটরদের সুবিধার্থে ব্যবহার করার জন্য আমরা বর্তমান অবস্থানে চরিত্রটি বরাদ্দ করি ।

/[\/\\ ]/ && redo

আমরা যদি ফাঁকা জায়গা বা মিরর চরিত্রে থাকি তবে চালিয়ে যান। অন্যথায় আমরা trueটার্গেটে থাকলে ( $_ =~ /x/) এবং falseঅন্যথায় আমরা শেষ করব

সীমাবদ্ধতা: 99 টিরও বেশি কলামের সমস্যা নিয়ে কাজ করতে পারে না। আরও 3 টি অক্ষর ব্যয় করে এই সীমাবদ্ধতা সরানো যেতে পারে,


ঠিক আছে, 323 টি অক্ষর পেয়েছি। = ডি
স্টারগার

5
আমি তিনটি চর ব্যয় করে এটি খুব শক্তিশালী করতে 99 থেকে 1E5 পরিবর্তন করতে পারি।
ভিড়

2
আপনার সেরা সমাধানটি পোস্টের শীর্ষে আরও লক্ষণীয় হবে।
স্ট্র্যাজার

13
তবে বোর্ডটি ঘোরানোর জন্য নিয়মিত এক্সপ্রেশন ব্যবহার করছেন? যে অসুস্থ ছিল। এটি একটি স্বয়ংক্রিয় 20 স্ট্রোক বোনাসের মতো like
ভিড়

1
@ মোব্রুল: ছয়টি স্ট্রোক সংরক্ষণ করুন: প্রথম লাইনটিকে পুনরায় ক্রম করুন s!.!$t{$s++}=$&!ge,$s=$r+=99for<>;, %d=split//,.." to % d = পরিবর্তন করুন ... = ~ /./ জি গ্রেপ , and change {..}% টু থেকেgrep..,%t
এ। রেক্স

75

পার্ল, 177 অক্ষর

প্রথম লাইনব্রেকটি সরানো যেতে পারে; অন্য দুটি বাধ্যতামূলক।

$/=%d=split//,' >/^\v';$_=<>;$s='#';{
y/v<^/>v</?do{my$o;$o.=" 
"while s/.$/$o.=$&,""/meg;y'/\\'\/'for$o,$s;$_=$o}:/>x/?die"true
":/>#/?die"false
":s/>(.)/$s$d{$1}/?$s=$1:1;redo}

ব্যাখ্যা:

$/ = %d = (' ' => '>', '/' => '^', '\\' => 'v');

যদি একটি ডান-মুভিং মরীচি কোনও {খালি জায়গায়, উপরের কোণে আয়নাতে, নিম্ন-কোণযুক্ত আয়নাতে চলে runs তবে এটি একটি {ডান-মুভিং বিম, আপ-মুভিং বিম, ডাউন-মুভিং বিম হয়ে যায়} $/পথ ধরেই সূচনা করুন - ভাগ্যক্রমে "6" একটি বৈধ ইনপুট চর নয়।

$_ = <>;

বোর্ড পড়ুন $_

$s="#";

$sএখন যে মরীচিটি বসে আছে তার প্রতীক এটি। যেহেতু লেজার ইমিটারটি প্রাচীরের মতো আচরণ করা উচিত তাই এটি দিয়ে প্রাচীর হিসাবে সেট করুন।

if (tr/v<^/>v</) {
  my $o;
  $o .= "\n" while s/.$/$o .= $&, ""/meg;
  tr,/\\,\\/, for $o, $s;
  $_ = $o;
}

লেজার রশ্মিটি যদি ডান ব্যতীত অন্য কোনও দিকে নির্দেশ করে থাকে তবে এর প্রতীকটি ঘোরান এবং তারপরে পুরো বোর্ডটি ঘোরান (আয়নাগুলির জন্য চিহ্নগুলিও ঘোরান)। এটি একটি 90 ডিগ্রী বাম ঘূর্ণন, s///eসাইড এবং কলামগুলি স্থানান্তর করার সময় সারিগুলি উল্টিয়ে কার্যকরভাবে সম্পন্ন হয়েছিল, পার্শ্ব প্রতিক্রিয়াগুলি দিয়ে সামান্য ভ্রান্তিতে । গল্ফড কোডে, টিআর ফর্মটিতে লেখা হয়েছে y'''যা আমাকে একটি ব্যাকস্ল্যাশিং ব্যাকস্ল্যাশিং এড়িয়ে যেতে দেয়।

die "true\n" if />x/; die "false\n" if />#/;

আমরা লক্ষ্য বা কোনও দেয়ালে আঘাত করলে সঠিক বার্তা দিয়ে শেষ করুন।

$s = $1 if s/>(.)/$s$d{$1}/;

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

redo;

অবসান হওয়া পর্যন্ত পুনরাবৃত্তি করুন। {...;redo}দুটি চরিত্রের চেয়ে কম for(;;){...}এবং তিনটির চেয়ে কম while(1){...}


4
বোর্ড ঘোরান ... ক্রেজি। রেজিপ্স্প ... ক্রেজিয়ার O_o
strager

39
তুমি ... তুমি দানব!
LiraNuna

4
লিরানাউনা: আমি এটিকে প্রশংসা হিসাবে বেছে নেওয়ার সিদ্ধান্ত নিয়েছি।
hobbs

21
গল্ফ শেষ। আপনি কীভাবে নিয়মিত অভিব্যক্তি দিয়ে 2 ডি বোর্ড ঘোরানোর পক্ষে মারতে পারেন ?!
কনরাড রুডলফ

13
Wtf? পার্ল প্রোগ্রামার উইজার্ড হয়।
জোহানেস স্কাউব - লাইটব

39

C89 (209 টি অক্ষর)

#define M(a,b)*p==*#a?m=b,*p=1,q=p:
*q,G[999],*p=G;w;main(m){for(;(*++p=getchar())>0;)M(<,-1)M
(>,1)M(^,-w)M(v,w)!w&*p<11?w=p-G:0;for(;q+=m,m=*q&4?(*q&1?
-1:1)*(m/w?m/w:m*w):*q&9?!puts(*q&1?"false":"true"):m;);}

ব্যাখ্যা

আপনি যদি সি না বুঝতে পারেন তবে এই একজাতীয়তাটি অনুসরণ করা সম্ভবত মুশকিল Just

#define M(a,b)*p==*#a?m=b,*p=1,q=p:

এই ছোট ম্যাক্রোটি পরীক্ষা করে যে বর্তমান অক্ষর ( *p) aঅক্ষর আকারে ( *#a) যা আছে তার সমান কিনা । যদি তারা সমান হয় তবে মুভমেন্ট ভেক্টরটিকে b( m=b) এ সেট করুন , এই অক্ষরটি প্রাচীর ( *p=1) হিসাবে চিহ্নিত করুন এবং বর্তমান অবস্থানে ( q=p) প্রারম্ভিক বিন্দুটি সেট করুন । এই ম্যাক্রোর মধ্যে "অন্য" অংশ অন্তর্ভুক্ত রয়েছে।

*q,G[999],*p=G;
w;

কিছু ভেরিয়েবল ঘোষণা করুন। * qআলোর বর্তমান অবস্থান। * G1 ডি অ্যারে হিসাবে গেম বোর্ড। * pপপুলেশন করার সময় বর্তমান পড়ার অবস্থান G। * wবোর্ডের প্রস্থ।

main(m){

স্পষ্টতই mainmআন্দোলন ভেক্টর সংরক্ষণ করে একটি পরিবর্তনশীল। (এটি mainএকটি অপ্টিমাইজেশন হিসাবে একটি পরামিতি ।)

    for(;(*++p=getchar())>0;)

Gব্যবহার করে পপুলেট করে সমস্ত চরিত্রের মধ্য দিয়ে লুপ করুন pG[0]অপ্টিমাইজেশন হিসাবে এড়িয়ে যান ( pএর তৃতীয় অংশে আবার কোনও চরিত্রের লেখার অপচয় করতে হবে না for)।

        M(<,-1)
        M(>,1)
        M(^,-w)
        M(v,w)

সম্ভব হলে লেজারটি সংজ্ঞায়িত করতে পূর্ব বর্ণিত ম্যাক্রোটি ব্যবহার করুন। -1এবং 1যথাক্রমে বাম এবং ডান সাথে মিলিত হয় -wএবং wউপর এবং নীচে।

        !w&*p<11
            ?w=p-G
            :0;

যদি বর্তমান অক্ষরটি একটি শেষ-লাইন চিহ্নিতকারী হয় (এএসসিআইআই 10), প্রস্থটি ইতিমধ্যে সেট না করা থাকলে সেট করুন। এড়িয়ে যাওয়া G[0]আমাদের w=p-Gপরিবর্তে লিখতে দেয় w=p-G+1। এছাড়াও, এটি এর ?:চেইন থেকে শেষ করে M

    for(;
        q+=m,

আন্দোলন ভেক্টর দ্বারা আলো সরান।

        m=
        *q&4
            ?(*q&1?-1:1)*(
                m/w?m/w:m*w
            )

চলন ভেক্টর প্রতিফলিত করুন।

            :*q&9
                ?!puts(*q&1?"false":"true")
                :m
        ;

যদি এটি দেয়াল হয় বা x, উপযুক্ত বার্তাটি ছেড়ে দিন ( m=0লুপটি শেষ করে)। অন্যথায়, কিছুই করবেন না (নোপ; m=m)

    );
}

8
ইসস! আমার অ্যাপার্টমেন্ট কমপ্লেক্সে যখন ফায়ার অ্যালার্ম বাজে তখন আমি সি সলিউশনে কাজ করছিলাম। এখন আমি মারলাম। যদিও ভাল সমাধান।
rlbond

আপনার অদলবদল এবং অদলবদল / অবহেলা পদক্ষেপগুলির জন্য একটি অস্থায়ী পরিবর্তনশীল ব্যবহার করার পদ্ধতিগুলি আপনাকে কয়েকটি অক্ষর সংরক্ষণ করবে।
আর্টিলিয়াস

@ আর্টেলিয়াস, হ্যাঁ, আমি বুঝতে পেরেছি এবং অন্যান্য কয়েকটি জিনিস things ধন্যবাদ।
স্ট্র্যাজার

1
টিসিসি প্রকৃতপক্ষে এই টাইপযুক্ত ঘোষণা এবং ত্রুটিগুলি সম্পর্কে পছন্দ করে না g.c:3: declaration expected:(
মার্ক রুশাকফ ২off

2
putsএর ঘোষণা মুছে ফেলা সাহায্য করেছে, তবে এটি 170 এর আওতায় আনার পক্ষে যথেষ্ট নয়। 209 বেশ ভাল, যদিও আমি মনে করি আমি এটি ছেড়ে দেব। বন্ধুরা আপনার সাহায্যের জন্য ধন্যবাদ আমি সত্যিই এটার প্রশংসা করছি. =] (এই পার্ল
ডাইনিগুলি ডিট্রন

36

আমি বাজি ধরব যে লোকেদের জন্য এটি একটি দীর্ঘ সময়ের জন্য অপেক্ষা করা ছিল। (আপনার অর্থ কী, চ্যালেঞ্জটি শেষ হয়েছে এবং কেউই আর কোনও চিন্তা করে না?)

দেখুন ... আমি এখানে একটি সমাধান উপস্থাপন করছি

Befunge-93!

এটি পুরোপুরি 973 চ্যাটারে ওজনের হয় (বা 688 যদি আপনি শ্বেত স্পেস উপেক্ষা করার জন্য যথেষ্ট দানশীল হন যা কেবলমাত্র ফর্ম্যাটিংয়ের জন্য ব্যবহৃত হয় এবং প্রকৃত কোডে কিছুই করে না)।

সতর্কীকরণ : আমি আমার নিজের Befunge-93 অনুবাদক পার্ল একটি সংক্ষিপ্ত সময় আগে লিখেছেন, এবং দুর্ভাগ্যবশত এই সব আমি সত্যিই যা দিয়ে এটি পরীক্ষা করতে সময় ছিল করেছি। আমি সাধারণভাবে এর নির্ভুলতার জন্য যথাযথভাবে আত্মবিশ্বাসী, তবে <>ইওএফ সম্পর্কিত এটির একটি বিশিষ্ট সীমাবদ্ধতা থাকতে পারে: পার্লের অপারেটর যেহেতু ফাইলের শেষে অপরিবর্তিত রয়েছে, তাই এটি সংখ্যার প্রসঙ্গে 0 হিসাবে প্রসেস করা হয়। সি-ভিত্তিক বাস্তবায়নের জন্য যেখানে ইওএফটির আলাদা মান রয়েছে (-1 বলুন), এই কোডটি কাজ করবে না।

003pv   >~v>  #v_"a"43g-!#v_23g03p33v>v
>39#<*v   ::   >:52*-!v   >"rorrE",vg2*
######1   >^vp31+1g31$_03g13gp vv,,<15,
    a#3     >0v       vp30+1g30<>,,#3^@
######p $     0vg34"a"<   >       >vp
^<v>  > ^   p3<>-#v_:05g-!|>:15g-!| $
 >     v^     <   <   <   >^v-g52:< $ 
  v _  >52*"eslaf",,vv|-g53:_      v   
  : ^-"#">#:< #@,,,,<<>:43p0 v0 p34< 
  >">"-!vgv<  ^0p33g31p32-1g3<       
 ^     <#g1|-g34_v#-g34_v#-g34"><v^"<<<<
    v!<^<33>13g1v>03g1-v>03g1+03p$v  $$
>^  _#-v 1>g1-1v>+13pv >03p       v  pp
^_:"^"^#|^g30 <3#   $<           $<>^33
 ^!-"<":<>"v"v^># p#$<>            $^44
^      >#^#_ :" "-#v_ ^   >         ^gg
v  g34$<   ^!<v"/":< >$3p$^>05g43p$ ^55
 >,@   |!-"\"  :_$43g:">"-!|>      ^$32
 *v"x":<      >-^    ^4g52<>:"^" -#v_^
 5>-!#v_"ror"vv$p34g51:<>#|  !-"<":<#|
 ^2,,, ,,"er"<>v      #^^#<>05g43p$$^>^
      >52*"eurt",,,,,@>15g4 3p$$$$  ^#
>:"v"\:"<"\: "^"   -!#^_-!#^_-!      ^
               >                       ^

ব্যাখ্যা

আপনি যদি বেফঞ্জ সিনট্যাক্স এবং ক্রিয়াকলাপের সাথে পরিচিত না হন তবে এখানে পরীক্ষা করুন

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

অন্য জায়গাটি উপরের-বামের কাছাকাছি:

######
    a#
######

এই ক্ষেত্রে, আমি উপরের অংশটি হাইলাইট করেছি যেখানে আমি বেশ কয়েকটি স্থানাঙ্ক সঞ্চয় করি। মাঝের সারির প্রথম কলামটি সেখানে আমি বর্তমান "কার্সার অবস্থানের" জন্য x- স্থানাঙ্ক সঞ্চয় করি; দ্বিতীয় কলামটি যেখানে আমি y- স্থানাঙ্ক সঞ্চয় করি; পরবর্তী দুটি কলাম লেজার বিমের উত্সটি খুঁজে পাওয়া গেলে x- এবং y- স্থানাঙ্কের জন্য সংরক্ষণ করা হয়; এবং চূড়ান্ত কলামটি (এতে 'a' অক্ষর সহ) অবশেষে বর্তমান রশ্মি নির্দেশটি ধারণ করতে ওভাররাইট করা হয়, যা অবশ্যই बीমের পথ চিহ্নিত হওয়ার সাথে সাথে পরিবর্তিত হয়।

প্রোগ্রামটি প্রাথমিক কার্সার অবস্থান হিসাবে (0,27) স্থাপন করে শুরু হয়। তারপরে ইনপুট একবারে একটি অক্ষর পড়ে এবং কার্সার অবস্থানে রাখা হয়; নিউলাইনগুলি কেবল y- স্থানাঙ্ককে বাড়িয়ে তোলে এবং এক্স-কো-অর্ডিনেটকে 0 আসনে ফিরে আসার মতোই 0-এ ফিরে যায়। অবশেষে দোভাষী দ্বারা অপরিবর্তিত পাঠ করা হয় এবং 0 টি অক্ষরের মান ইনপুটটির শেষের সিগন্যাল এবং লেজার পুনরাবৃত্তির ধাপগুলিতে এগিয়ে যেতে ব্যবহৃত হয়। যখন লেজারের অক্ষরটি [<> ^ v] পঠিত হয় তখন এটিকে মেমোরি সংগ্রহস্থলে ('a' অক্ষরের উপরে) অনুলিপি করা হয় এবং এর স্থানাঙ্কগুলি ঠিক বাম দিকে কলামগুলিতে অনুলিপি করা হয়।

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

এরপরে, মরীচিটির অবস্থানটি কার্সার অবস্থানগুলিতে আবার অনুলিপি করা হয়, এবং নিম্নলিখিত পুনরাবৃত্তিটি সম্পাদন করা হয়:

  • বর্তমান বিমের দিকনির্দেশ এবং যথাযথভাবে কার্সার স্থানাঙ্ক বা বর্ধন বা হ্রাস পরীক্ষা করুন। (আমি প্রথম পদক্ষেপের সাথে সাথে লেজার বিমের কোণাগুলি মোকাবেলা করতে এড়াতে প্রথমে এটি করি))
  • সেই জায়গায় চরিত্রটি পড়ুন।
  • চরিত্রটি যদি "#" হয় তবে স্ট্যাক, প্রিন্ট এবং শেষের দিকে নতুন লাইন এবং "মিথ্যা" রাখুন।
  • এটি সমস্ত মরীচিযুক্ত অক্ষরের সাথে তুলনা করুন [<> ^ v]; যদি কোনও মিল থাকে তবে "মিথ্যা \ n" মুদ্রণ করুন এবং শেষও করুন।
  • চরিত্রটি যদি কোনও স্থান হয় তবে স্ট্যাকটি খালি করুন এবং চালিয়ে যান।
  • চরিত্রটি যদি ফরোয়ার্ড স্ল্যাশ হয় তবে স্ট্যাকের উপরে মরীচিটির দিকনির্দেশটি পান এবং প্রতিটি দিকনির্দেশের অক্ষরের সাথে এটির তুলনা করুন। যখন একটিটি পাওয়া যায়, নতুন দিকটি একই জায়গায় কোডে সঞ্চিত হয় এবং লুপটি পুনরাবৃত্তি করে।
  • চরিত্রটি যদি ব্যাকস্ল্যাশ হয় তবে মূলত উপরের মতো একই জিনিস করুন (ব্যাকস্ল্যাশের জন্য সঠিক ম্যাপিং ব্যতীত)।
  • চরিত্রটি যদি 'এক্স' হয় তবে আমরা লক্ষ্যটিকে আঘাত করেছি। "সত্য \ n" মুদ্রণ করুন এবং প্রস্থান করুন।
  • চরিত্র যদি এগুলির কোনও না হয় তবে "ত্রুটি \ n" মুদ্রণ করুন এবং প্রস্থান করুন।

যদি এর জন্য পর্যাপ্ত চাহিদা থাকে তবে আমি কোডটিতে ঠিক কীটি সম্পন্ন করা হয়েছে ঠিক তা নির্দেশ করার চেষ্টা করব।


14
+1 - কেবলমাত্র এটি নোটপ্যাডে খোলা একটি EXE হিসাবে ভুল ব্যাখ্যা করা যেতে পারে।
কাইল রোজেন্ডো

1
উম ... পবিত্র ****। আমি বেফুঞ্জের সাথে গোলযোগ করেছি, এবং এটি সত্যই, সত্যিই চিত্তাকর্ষক।
অলমো

অস্পষ্ট ভাষায় কোড গল্ফ ... যেমন চিনাবাদাম মাখন এবং কেয়েন!
ওয়াবেরি

29

এফ #, 36 টি লাইন, খুব পঠনযোগ্য

ঠিক আছে, এখানে একটি উত্তর পেতে:

let ReadInput() =
    let mutable line = System.Console.ReadLine()
    let X = line.Length 
    let mutable lines = []
    while line <> null do
        lines <- Seq.to_list line :: lines
        line <- System.Console.ReadLine()
    lines <- List.rev lines
    X, lines.Length, lines

let X,Y,a = ReadInput()
let mutable p = 0,0,'v'
for y in 0..Y-1 do
    for x in 0..X-1 do 
        printf "%c" a.[y].[x]
        match a.[y].[x] with 
        |'v'|'^'|'<'|'>' -> p <- x,y,a.[y].[x]
        |_ -> ()
    printfn ""

let NEXT = dict [ '>', (1,0,'^','v')
                  'v', (0,1,'<','>')
                  '<', (-1,0,'v','^')
                  '^', (0,-1,'>','<') ]
let next(x,y,d) =
    let dx, dy, s, b = NEXT.[d]
    x+dx,y+dy,(match a.[y+dy].[x+dx] with
               | '/' -> s
               | '\\'-> b
               | '#'|'v'|'^'|'>'|'<' -> printfn "false"; exit 0
               | 'x' -> printfn "true"; exit 0
               | ' ' -> d)

while true do
    p <- next p    

নমুনা:

##########
#   / \  #
#        #
#   \   x#
# >   /  #
##########
true

##########
#   v x  #
# /      #
#       /#
#   \    #
##########
false

#############
#     #     #
# >   #     #
#     #     #
#     #   x #
#     #     #
#############
false

##########
#/\/\/\  #
#\\//\\\ #
#//\/\/\\#
#\/\/\/x^#
##########
true

##########
#   / \  #
#        #
#/    \ x#
#\>   /  #
##########
false

##########
#  /    \#
# / \    #
#/    \ x#
#\^/\ /  #
##########
false

54
আমি আসলে এটি পড়তে পারি! অলৌকিক!
জেফ আতউড

17
জাভা / সি # কোড গল্ফ অক্ষর নয় লাইন দ্বারা গণনা করা হয়। এটাই প্রতিবন্ধকতা।
নাথান ফেজার

3
@ স্ট্রাগারটি 3 বছরের মধ্যে হতাশাজনক নয় যখন আপনি কোড বজায় রাখার জন্য নিযুক্ত হন এবং মূল বিকাশকারী দীর্ঘকাল ধরে চলে গেছে।
নাথান ফেজার

এটি ভিজ্যুয়াল স্টুডিও 2010 এফ # ব্যবহার করে ব্যর্থ হয়েছে।
রাসেল

2
হ্যাঁ, এখন_তালিকাতে তালিকা_তে পরিবর্তন করুন। অসম্পূর্ণ ম্যাচের সতর্কতা ঠিক আছে; এটি কোড গল্ফ, তাই আমি কোডের মতো করিনি: | _ -> ব্যর্থতা "অসম্ভব"
ব্রায়ান

29

গল্ফস্ক্রিপ্ট - 83 টি অক্ষর (আমার এবং স্ট্র্যাজারের ম্যাসআপ)

নতুন লাইনটি মোড়ানোর জন্য এখানে কেবল

:|'v^><'.{|?}%{)}?:$@=?{.[10|?).~)1-1]=$+
:$|=' \/x'?\[.\2^.1^'true''false']=.4/!}do

গল্ফস্ক্রিপ্ট - 107 অক্ষর

নতুন লাইনটি এখানে স্পষ্টতার জন্য

10\:@?):&4:$;{0'>^<v'$(:$=@?:*>}do;
{[1 0&--1&]$=*+:*;[{$}{3$^}{1$^}{"true "}{"false"}]@*=' \/x'?=~5\:$>}do$

কিভাবে এটা কাজ করে.

প্রথম লাইন প্রাথমিক অবস্থান এবং দিকনির্দেশ কাজ করে।
যখনই লেজার একটি আয়নাটিকে আঘাত করে তখন মোড় নেওয়ার মধ্য দিয়ে দ্বিতীয় লাইন ধাপ।


18

রুবিতে 353 চর:

এখন 314 277 চর!

ঠিক আছে, রুবিতে 256 টি অক্ষর এবং এখন আমার কাজ শেষ। থামার জন্য দুর্দান্ত গোল নম্বর। :)

247 অক্ষর। আমি থামতে পারি না।

223 203 201 রুবিতে চর

d=x=y=-1;b=readlines.each{|l|d<0&&(d="^>v<".index l[x]if x=l.index(/[>^v<]/)
y+=1)};loop{c=b[y+=[-1,0,1,0][d]][x+=[0,1,0,-1][d]]
c==47?d=[1,0,3,2][d]:c==92?d=3-d:c==35?(p !1;exit):c<?x?0:(p !!1;exit)}

সাদা স্থান সহ:

d = x = y = -1
b = readlines.each { |l|
  d < 0 && (d = "^>v<".index l[x] if x = l.index(/[>^v<]/); y += 1)
}

loop {
  c = b[y += [-1, 0, 1, 0][d]][x += [0, 1, 0, -1][d]]

  c == 47 ? d = [1, 0, 3, 2][d] :
  c == 92 ? d = 3 - d :
  c == 35 ? (p !1; exit) :
  c < ?x ? 0 : (p !!1; exit)
}

কিছুটা রিফ্যাক্টর:

board = readlines

direction = x = y = -1
board.each do |line|
  if direction < 0
    x = line.index(/[>^v<]/)
    if x
      direction = "^>v<".index line[x]
    end
    y += 1
  end
end

loop do
  x += [0, 1, 0, -1][direction]
  y += [-1, 0, 1, 0][direction]

  ch = board[y][x].chr
  case ch
  when "/"
    direction = [1, 0, 3, 2][direction]
  when "\\"
    direction = 3 - direction
  when "x"
    puts "true"
    exit
  when "#"
    puts "false"
    exit
  end
end

কিন্তু ... আপনি নাম পরিবর্তন করতে পারেন chথেকে C2 অক্ষর সংরক্ষণ করতে বা অন্য কোন 1 গৃহস্থালির কাজ চিঠি!
LiraNuna

ঠিক আছে, ঠিক আছে ... আমি আসলে বুঝতে পেরেছিলাম যে পুরো পরিবর্তনশীলটি অপ্রয়োজনীয় কারণ আমি কেবল একবার এটি ব্যবহার করি। এটি এবং আরও কয়েকটি উন্নতি এটিকে 247 টি করে নামিয়ে আনে।
জেরেমি রুটেন

1
না i++(পরিবর্তে i+=1)?
LiraNuna

6
নাঃ। আপনি ++ i করতে পারেন তবে এটি এটি ইতিপূর্বে ইতিবাচক হিসাবে ইতিবাচক করে তোলে।
ডিজিটালরোস

আমি সংকুচিত সংস্করণটি পছন্দ করি: #; পি
সানজেএ

17

পাইথন

294 277 253 240 232 টি নতুন অক্ষর সহ:

(4 এবং 5 লাইনের প্রথম অক্ষরটি একটি ট্যাব, ফাঁকা স্থান নয়)

l='>v<^';x={'/':'^<v>','\\':'v>^<',' ':l};b=[1];r=p=0
while b[-1]:
 b+=[raw_input()];r+=1
 for g in l:
    c=b[r].find(g)
    if-1<c:p=c+1j*r;d=g
while' '<d:z=l.find(d);p+=1j**z;c=b[int(p.imag)][int(p.real)];d=x.get(c,' '*4)[z]
print'#'<c

আমি পাইথনকে ভুলে গিয়েছিলাম এমনকি এমনকি optionচ্ছিক সেমিকোলনও ছিল।

কিভাবে এটা কাজ করে

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

l='>v<^';লেজার প্রতীক একটি তালিকা। অর্ডারটি বেছে নেওয়া হয়েছে যাতে একটি লেজারের দিকনির্দেশের অক্ষরের সূচকটি বর্গক্ষেত্রের পাওয়ার সাথে মিলিত হয় (-1)

x={'/':'^<v>','\\':'v>^<',' ':l};রশ্মি যখন বিভিন্ন টাইল ছেড়ে দেয় তখন কীভাবে দিক পরিবর্তন হয় তা নির্ধারণ করে একটি রূপান্তর সারণী। টাইলটি মূল এবং নতুন দিকনির্দেশগুলি মান new

b=[1];বোর্ড ধরে। প্রথম উপাদানটি 1 হয় (সত্য হিসাবে মূল্যায়ন করে) যাতে লুপটি অন্তত একবার চালিত হয়।

r=p=0 rইনপুটটির বর্তমান সারি সংখ্যা p, এটি লেজার বিমের বর্তমান অবস্থান।

while b[-1]: যখন কাঁচা_ ইনপুট একটি খালি স্ট্রিং দেয় তখন বোর্ডের ডেটা লোড করা বন্ধ করুন

b+=[raw_input()];r+=1 বোর্ডে ইনপুট পরবর্তী লাইন যুক্ত করুন এবং সারি কাউন্টার বৃদ্ধি করুন

for g in l: ঘুরে প্রতিটি লেজার দিক অনুমান করুন

c=b[r].find(g) কলামটি লেজারের স্থানে সেট করুন বা -1 এটি লাইনে না থাকলে (বা অন্য দিকে নির্দেশ করছে)

if-1<c:p=c+1j*r;d=gযদি আমরা একটি লেজার খুঁজে পাই তবে তার বর্তমান অবস্থান pএবং দিকনির্দেশ সেট করুন ddএর অন্যতম চরিত্রl

বোর্ডটি লোড করার পরে b, বর্তমান অবস্থান pএবং দিকটি dলেজার উত্স অনুসারে সেট করা হয়েছে।

while' '<d: দিকের প্রতীকগুলির তুলনায় জায়গার কম ASCII মান রয়েছে, তাই আমরা এটিকে স্টপ ফ্ল্যাগ হিসাবে ব্যবহার করি।

z=l.find(d);lস্ট্রিংয়ে বর্তমান দিকের চরটির সূচক । টেবিলটি zব্যবহার করে নতুন রশ্মির দিক নির্ধারণ xএবং অবস্থান বৃদ্ধির জন্য উভয়ই পরে ব্যবহার করা হবে ।

p+=1j**z;i এর শক্তি ব্যবহার করে পজিশন বৃদ্ধি করুন। উদাহরণস্বরূপ, l.find('<')==2-> i ^ 2 = -1, যা বাম এক কলামে চলে যাবে।

c=b[int(p.imag)][int(p.real)]; বর্তমান অবস্থানে চরটি পড়ুন

d=x.get(c,' '*4)[z]রূপান্তর সারণীতে মরীচিটির জন্য নতুন দিকটি সন্ধান করুন। যদি বর্তমান চরটি টেবিলটিতে বিদ্যমান না থাকে তবে dস্থানটিতে সেট করুন।

print'#'<c আমরা লক্ষ্য ব্যতীত অন্য কোনও কিছু বন্ধ করে দিলে মিথ্যা প্রিন্ট করুন।



16

এই হল ছিল সি # 3 ব্রায়ান এর সমাধান সরাসরি বন্দর, বিয়োগ কনসোল কথাবার্তাও। এটি চ্যালেঞ্জের কোনও প্রবেশ নয়, কারণ এটি একটি সম্পূর্ণ প্রোগ্রাম নয়, আমি কেবল ভাবছিলাম যে তিনি ব্যবহার করেছেন এমন কিছু # # কনস্ট্রাক্টস কীভাবে সি # তে প্রতিনিধিত্ব করতে পারে।

bool Run(string input) {
    var a = input.Split(new[] {Environment.NewLine}, StringSplitOptions.None);
    var p = a.SelectMany((line, y) => line.Select((d, x) => new {x, y, d}))
             .First(x => new[] {'v', '^', '<', '>'}.Contains(x.d));
    var NEXT = new[] {
            new {d = '>', dx = 1, dy = 0, s = '^', b = 'v'},
            new {d = 'v', dx = 0, dy = 1, s = '<', b = '>'},
            new {d = '<', dx = -1, dy = 0, s = 'v', b = '^'},
            new {d = '^', dx = 0, dy = -1, s = '>', b = '<'}
        }.ToDictionary(x => x.d);
    while (true) {
        var n = NEXT[p.d];
        int x = p.x + n.dx,
            y = p.y + n.dy;
        var d = a[y][x];
        switch (d) {
            case '/':  d = n.s; break;
            case '\\': d = n.b; break;
            case ' ':  d = p.d; break;
            default: return d == 'x';
        }
        p = new {x, y, d};
    }
}

সম্পাদনা করুন: কিছু পরীক্ষা-নিরীক্ষার পরে, নিম্নলিখিত পরিবর্তে ভার্বোজ অনুসন্ধান কোড:

int X = a[0].Length, Y = a.Length;
var p = new {x = 0, y = 0, d = 'v'};
for (var y = 0; y < Y; y++) {
    for (var x = 0; x < X; x++) {
        var d = a[y][x];
        switch (d) {
            case 'v': case '^': case '<': case '>':
                p = new {x, y, d}; break;
        }
    }
}

অবজেক্টস কোডটিতে আরও অনেকগুলি কমপ্যাক্ট লিনকুইতে প্রতিস্থাপন করা হয়েছে:

var p = a.SelectMany((line, y) => line.Select((d, x) => new {x, y, d}))
         .First(x => new[] {'v', '^', '<', '>'}.Contains(x.d));

8
ঈশ্বর. কীভাবে শক্তিশালী লিনাক এবং সি # হয়ে গেছে তা প্রদর্শনের জন্য কত দুর্দান্ত উদাহরণ। 1+ এর জন্য আমি একটি বিশাল সি # ফ্যান। x)
এমিসওয়াল্ট

16

এফ #, 255 টি অক্ষর (এবং এখনও পাঠযোগ্য!):

ঠিক আছে, একটি রাতের বিশ্রামের পরে, আমি এটি অনেক উন্নতি করেছি:

let a=System.Console.In.ReadToEnd()
let w,c=a.IndexOf"\n"+1,a.IndexOfAny[|'^';'<';'>';'v'|]
let rec n(c,d)=
 let e,s=[|-w,2;-1,3;1,0;w,1|].[d]
 n(c+e,match a.[c+e]with|'/'->s|'\\'->3-s|' '->d|c->printfn"%A"(c='x');exit 0)
n(c,"^<>v".IndexOf a.[c])

আসুন এটি লাইন লাইন মাধ্যমে কথা বলি।

প্রথমে সমস্ত ইনপুটটিকে একটি বৃহত-মাত্রিক অ্যারেতে স্লર્প করুন (2 ডি অ্যারে কোড গল্ফের জন্য খারাপ হতে পারে; কেবল একটি 1 ডি অ্যারে ব্যবহার করুন এবং একটি লাইন উপরে / নীচে সরে যাওয়ার জন্য সূচীতে এক লাইনের প্রস্থকে যোগ / বিয়োগ করুন)।

এরপরে আমরা 'ডাব্লু' গণনা করব, একটি ইনপুট লাইনের প্রস্থ এবং 'সি', শুরুর অবস্থানটি আমাদের অ্যারেতে ইনডেক্স করে।

এখন 'নেক্সট' ফাংশন 'এন' সংজ্ঞায়িত করি, যা বর্তমান অবস্থান 'সি' এবং একটি দিক 'ডি' নেয় যা উপরের, বাম, ডান, নীচে 0,1,2,3 এর জন্য নেয়।

সূচি-অ্যাপসিলন 'ই' এবং কী-নতুন-দিকনির্দেশনা-যদি-আমরা-হিট-এ-স্ল্যাশ 'এর' একটি টেবিল দ্বারা গণনা করা হয়। উদাহরণস্বরূপ, যদি বর্তমান দিক 'ডি' 0 হয় (আপ) হয়, তবে সারণির প্রথম উপাদানটি "-w, 2" বলে যার অর্থ আমরা ডাব্লু দ্বারা সূচককে হ্রাস করেছি এবং যদি আমরা একটি স্ল্যাশ মারি তবে নতুন দিকটি 2 (ডান)।

এখন আমরা পরবর্তী ফাংশন 'এন' (1) এর সাথে পরবর্তী সূচী ("সি + ই" - বর্তমান প্লাস এপসিলন) এর সাথে পুনরাবৃত্তি করি, এবং (2) নতুন দিকটি, যা আমরা অ্যারেতে রয়েছে তা দেখার জন্য এগিয়ে দেখছি যে পরের ঘর। যদি লুকোয়ার চরটি স্ল্যাশ হয় তবে নতুন দিকটি 'গুলি'। যদি এটি ব্যাকস্ল্যাশ হয় তবে নতুন দিকটি 3-এস (আমাদের এনকোডিং 0123 পছন্দটি এই কাজ করে)। যদি এটি কোনও স্থান হয় তবে আমরা কেবল 'ডি' একই দিকে চলি। এবং যদি এটি অন্য কোনও চরিত্র 'সি' হয় তবে গেমটি শেষ হবে, 'সত্য' মুদ্রণটি যদি চরটি 'এক্স' এবং অন্যথায় মিথ্যা ছিল।

জিনিসগুলি বন্ধ করার জন্য, আমরা প্রাথমিক অবস্থান 'সি' এবং সূচনা দিক (যা 0123-এ দিকের প্রাথমিক এনকোডিংটি করে) এর সাথে रिकर्सিভ ফাংশনটিকে 'এন' বলি।

আমি মনে করি আমি সম্ভবত এটি থেকে আরও কয়েকটি চরিত্র শেভ করতে পারি তবে আমি এটির মতো খুশি (এবং 255 একটি দুর্দান্ত সংখ্যা)।


11

18203 টি অক্ষরের মধ্যে ওজন একটি পাইথন সমাধান যা করতে পারে:

  • 'ঘরের' বাইরে আয়না সহ্য করুন
  • 2 ডি সীমাবদ্ধতার ভিত্তিতে কোনও 'ঘর' না থাকলে ট্রাজেক্টোরি গণনা করুন (কক্ষটি "রুমে থাকতে হবে তবে রুমের অস্তিত্ব আছে কিনা তা নয়) সম্পর্কে অনেক কিছু বলেছে"
  • ত্রুটি ফিরে রিপোর্ট

এটি এখনও কিছুটা পরিপাটি করা দরকার এবং আমি জানি না 2D পদার্থবিজ্ঞান যদি আদেশ করে যে মরীচিটি নিজেকে পেরিয়ে যায় না ...

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
The shortest code by character count to input a 2D representation of a board, 
and output 'true' or 'false' according to the input.

The board is made out of 4 types of tiles:

# - A solid wall
x - The target the laser has to hit
/ or \ - Mirrors pointing to a direction (depends on laser direction)
v, ^, > or < - The laser pointing to a direction (down, up, right and left
respectively)

There is only one laser and only one target. Walls must form a solid rectangle 
of any size, where the laser and target are placed inside. Walls inside the
'room' are possible.

Laser ray shots and travels from it's origin to the direction it's pointing. If
a laser ray hits the wall, it stops. If a laser ray hits a mirror, it is bounces
90 degrees to the direction the mirror points to. Mirrors are two sided, meaning
both sides are 'reflective' and may bounce a ray in two ways. If a laser ray
hits the laser (^v><) itself, it is treated as a wall (laser beam destroys the
beamer and so it'll never hit the target).
"""



SOLID_WALL, TARGET, MIRROR_NE_SW, MIRROR_NW_SE, LASER_DOWN, LASER_UP, \
LASER_RIGHT, LASER_LEFT = range(8)

MIRRORS = (MIRROR_NE_SW, MIRROR_NW_SE)

LASERS = (LASER_DOWN, LASER_UP, LASER_RIGHT, LASER_LEFT)

DOWN, UP, RIGHT, LEFT = range(4)

LASER_DIRECTIONS = {
    LASER_DOWN : DOWN,
    LASER_UP   : UP,
    LASER_RIGHT: RIGHT,
    LASER_LEFT : LEFT
}

ROW, COLUMN = range(2)

RELATIVE_POSITIONS = {
    DOWN : (ROW,     1),
    UP   : (ROW,    -1),
    RIGHT: (COLUMN,  1),
    LEFT : (COLUMN, -1)
}

TILES = {"#" : SOLID_WALL,
         "x" : TARGET,
         "/" : MIRROR_NE_SW,
         "\\": MIRROR_NW_SE,
         "v" : LASER_DOWN,
         "^" : LASER_UP,
         ">" : LASER_RIGHT,
         "<" : LASER_LEFT}

REFLECTIONS = {MIRROR_NE_SW: {DOWN : LEFT,
                              UP   : RIGHT,
                              RIGHT: UP,
                              LEFT : DOWN},
               MIRROR_NW_SE: {DOWN : RIGHT,
                              UP   : LEFT,
                              RIGHT: DOWN,
                              LEFT : UP}}



def does_laser_hit_target(tiles):
    """
        Follows a lasers trajectory around a grid of tiles determining if it
        will reach the target.

        Keyword arguments:
        tiles --- row/column based version of a board containing symbolic
                  versions of the tiles (walls, laser, target, etc)
    """

    #Obtain the position of the laser
    laser_pos = get_laser_pos(tiles)

    #Retrieve the laser's tile
    laser = get_tile(tiles, laser_pos)

    #Create an editable starting point for the beam
    beam_pos = list(laser_pos)

    #Create an editable direction for the beam
    beam_dir = LASER_DIRECTIONS[laser]

    #Cache the number of rows
    number_of_rows = len(tiles)

    #Keep on looping until an ultimate conclusion
    while True:

        #Discover the axis and offset the beam is travelling to
        axis, offset = RELATIVE_POSITIONS[beam_dir]

        #Modify the beam's position
        beam_pos[axis] += offset

        #Allow for a wrap around in this 2D scenario
        try:

            #Get the beam's new tile
            tile = get_tile(tiles, beam_pos)

        #Perform wrapping
        except IndexError:

            #Obtain the row position
            row_pos = beam_pos[ROW]

            #Handle vertical wrapping
            if axis == ROW:

                #Handle going off the top
                if row_pos == -1:

                    #Move beam to the bottom
                    beam_pos[ROW] = number_of_rows - 1

                #Handle going off the bottom
                elif row_pos == number_of_rows:

                    #Move beam to the top
                    beam_pos[ROW] = 0

            #Handle horizontal wrapping
            elif axis == COLUMN:

                #Obtain the row
                row = tiles[row_pos]

                #Calculate the number of columns
                number_of_cols = len(row)

                #Obtain the column position
                col_pos = beam_pos[COLUMN]

                #Handle going off the left hand side
                if col_pos == -1:

                    #Move beam to the right hand side
                    beam_pos[COLUMN] = number_of_cols - 1

                #Handle going off the right hand side
                elif col_pos == number_of_cols:

                    #Move beam to the left hand side
                    beam_pos[COLUMN] = 0

            #Get the beam's new tile
            tile = get_tile(tiles, beam_pos)

        #Handle hitting a wall or the laser
        if tile in LASERS \
        or tile == SOLID_WALL:
            return False

        #Handle hitting the target
        if tile == TARGET:
            return True

        #Handle hitting a mirror
        if tile in MIRRORS:
            beam_dir = reflect(tile, beam_dir)

def get_laser_pos(tiles):
    """
        Returns the current laser position or an exception.

        Keyword arguments:
        tiles --- row/column based version of a board containing symbolic
                  versions of the tiles (walls, laser, target, etc)
    """

    #Calculate the number of rows
    number_of_rows = len(tiles)

    #Loop through each row by index
    for row_pos in range(number_of_rows):

        #Obtain the current row
        row = tiles[row_pos]

        #Calculate the number of columns
        number_of_cols = len(row)

        #Loop through each column by index
        for col_pos in range(number_of_cols):

            #Obtain the current column
            tile = row[col_pos]

            #Handle finding a laser
            if tile in LASERS:

                #Return the laser's position
                return row_pos, col_pos

def get_tile(tiles, pos):
    """
        Retrieves a tile at the position specified.

        Keyword arguments:
        pos --- a row/column position of the tile
        tiles --- row/column based version of a board containing symbolic
                  versions of the tiles (walls, laser, target, etc)
    """

    #Obtain the row position
    row_pos = pos[ROW]

    #Obtain the column position
    col_pos = pos[COLUMN]

    #Obtain the row
    row = tiles[row_pos]

    #Obtain the tile
    tile = row[col_pos]

    #Return the tile
    return tile

def get_wall_pos(tiles, reverse=False):
    """
        Keyword arguments:
        tiles --- row/column based version of a board containing symbolic
                  versions of the tiles (walls, laser, target, etc)
        reverse --- whether to search in reverse order or not (defaults to no)
    """

    number_of_rows = len(tiles)

    row_iter = range(number_of_rows)

    if reverse:
        row_iter = reversed(row_iter)

    for row_pos in row_iter:
        row = tiles[row_pos]

        number_of_cols = len(row)

        col_iter = range(number_of_cols)

        if reverse:
            col_iter = reversed(col_iter)

        for col_pos in col_iter:
            tile = row[col_pos]

            if tile == SOLID_WALL:
                pos = row_pos, col_pos

                if reverse:
                    offset = -1
                else:
                    offset = 1

                for axis in ROW, COLUMN:
                    next_pos = list(pos)

                    next_pos[axis] += offset

                    try:
                        next_tile = get_tile(tiles, next_pos)
                    except IndexError:
                        next_tile = None

                    if next_tile != SOLID_WALL:
                        raise WallOutsideRoomError(row_pos, col_pos)

                return pos

def identify_tile(tile):
    """
        Returns a symbolic value for every identified tile or None.

        Keyword arguments:
        tile --- the tile to identify
    """

    #Safely lookup the tile
    try:

        #Return known tiles
        return TILES[tile]

    #Handle unknown tiles
    except KeyError:

        #Return a default value
        return

def main():
    """
        Takes a board from STDIN and either returns a result to STDOUT or an
        error to STDERR.

        Called when this file is run on the command line.
    """

    #As this function is the only one to use this module, and it can only be
    #called once in this configuration, it makes sense to only import it here.
    import sys

    #Reads the board from standard input.
    board = sys.stdin.read()

    #Safely handles outside input
    try:

        #Calculates the result of shooting the laser
        result = shoot_laser(board)

    #Handles multiple item errors
    except (MultipleLaserError, MultipleTargetError) as error:

        #Display the error
        sys.stderr.write("%s\n" % str(error))

        #Loop through all the duplicated item symbols
        for symbol in error.symbols:

            #Highlight each symbol in green
            board = board.replace(symbol, "\033[01;31m%s\033[m" % symbol)

        #Display the board
        sys.stderr.write("%s\n" % board)

        #Exit with an error signal
        sys.exit(1)

    #Handles item missing errors
    except (NoLaserError, NoTargetError) as error:

        #Display the error
        sys.stderr.write("%s\n" % str(error))

        #Display the board
        sys.stderr.write("%s\n" % board)

        #Exit with an error signal
        sys.exit(1)

    #Handles errors caused by symbols
    except (OutsideRoomError, WallNotRectangleError) as error:

        #Displays the error
        sys.stderr.write("%s\n" % str(error))

        lines = board.split("\n")

        line = lines[error.row_pos]

        before = line[:error.col_pos]

        after = line[error.col_pos + 1:]

        symbol = line[error.col_pos]

        line = "%s\033[01;31m%s\033[m%s" % (before, symbol, after)

        lines[error.row_pos] = line

        board = "\n".join(lines)

        #Display the board
        sys.stderr.write("%s\n" % board)

        #Exit with an error signal
        sys.exit(1)

    #Handles errors caused by non-solid walls
    except WallNotSolidError as error:

        #Displays the error
        sys.stderr.write("%s\n" % str(error))

        lines = board.split("\n")

        line = lines[error.row_pos]

        before = line[:error.col_pos]

        after = line[error.col_pos + 1:]

        symbol = line[error.col_pos]

        line = "%s\033[01;5;31m#\033[m%s" % (before, after)

        lines[error.row_pos] = line

        board = "\n".join(lines)

        #Display the board
        sys.stderr.write("%s\n" % board)

        #Exit with an error signal
        sys.exit(1)

    #If a result was returned
    else:

        #Converts the result into a string
        result_str = str(result)

        #Makes the string lowercase
        lower_result = result_str.lower()

        #Returns the result
        sys.stdout.write("%s\n" % lower_result)

def parse_board(board):
    """
        Interprets the raw board syntax and returns a grid of tiles.

        Keyword arguments:
        board --- the board containing the tiles (walls, laser, target, etc)
    """

    #Create a container for all the lines
    tiles = list()

    #Loop through all the lines of the board
    for line in board.split("\n"):

        #Identify all the tiles on the line 
        row = [identify_tile(tile) for tile in line]

        #Add the row to the container
        tiles.append(row)

    #Return the container
    return tiles

def reflect(mirror, direction):
    """
        Returns an updated laser direction after it has been reflected on a
        mirror.

        Keyword arguments:
        mirror --- the mirror to reflect the laser from
        direction --- the direction the laser is travelling in
    """

    try:
        direction_lookup = REFLECTIONS[mirror]
    except KeyError:
        raise TypeError("%s is not a mirror.", mirror)

    try:
        return direction_lookup[direction]
    except KeyError:
        raise TypeError("%s is not a direction.", direction)

def shoot_laser(board):
    """
        Shoots the boards laser and returns whether it will hit the target.

        Keyword arguments:
        board --- the board containing the tiles (walls, laser, target, etc)
    """

    tiles = parse_board(board)

    validate_board(tiles)

    return does_laser_hit_target(tiles)

def validate_board(tiles):
    """
        Checks an board to see if it is valid and raises an exception if not.

        Keyword arguments:
        tiles --- row/column based version of a board containing symbolic
                  versions of the tiles (walls, laser, target, etc)
    """

    found_laser = False
    found_target = False

    try:
        n_wall, w_wall = get_wall_pos(tiles)
        s_wall, e_wall = get_wall_pos(tiles, reverse=True)
    except TypeError:
        n_wall = e_wall = s_wall = w_wall = None

    number_of_rows = len(tiles)

    for row_pos in range(number_of_rows):
        row = tiles[row_pos]

        number_of_cols = len(row)

        for col_pos in range(number_of_cols):

            tile = row[col_pos]

            if ((row_pos in (n_wall, s_wall) and
                 col_pos in range(w_wall, e_wall))
                or
                (col_pos in (e_wall, w_wall) and
                 row_pos in range(n_wall, s_wall))):
                if tile != SOLID_WALL:
                    raise WallNotSolidError(row_pos, col_pos)
            elif (n_wall != None and
                  (row_pos < n_wall or
                   col_pos > e_wall or
                   row_pos > s_wall or
                   col_pos < w_wall)):

                if tile in LASERS:
                    raise LaserOutsideRoomError(row_pos, col_pos)
                elif tile == TARGET:
                    raise TargetOutsideRoomError(row_pos, col_pos)
                elif tile == SOLID_WALL:
                    if not (row_pos >= n_wall and
                            col_pos <= e_wall and
                            row_pos <= s_wall and
                            col_pos >= w_wall):
                        raise WallOutsideRoomError(row_pos, col_pos)
            else:
                if tile in LASERS:
                    if not found_laser:
                        found_laser = True
                    else:
                        raise MultipleLaserError(row_pos, col_pos)
                elif tile == TARGET:
                    if not found_target:
                        found_target = True
                    else:
                        raise MultipleTargetError(row_pos, col_pos)

    if not found_laser:
        raise NoLaserError(tiles)

    if not found_target:
        raise NoTargetError(tiles)



class LasersError(Exception):
    """Parent Error Class for all errors raised."""

    pass

class NoLaserError(LasersError):
    """Indicates that there are no lasers on the board."""

    symbols = "^v><"

    def __str__ (self):
        return "No laser (%s) to fire." % ", ".join(self.symbols)

class NoTargetError(LasersError):
    """Indicates that there are no targets on the board."""

    symbols = "x"

    def __str__ (self):
        return "No target (%s) to hit." % ", ".join(self.symbols)

class MultipleLaserError(LasersError):
    """Indicates that there is more than one laser on the board."""

    symbols = "^v><"

    def __str__ (self):
        return "Too many lasers (%s) to fire, only one is allowed." % \
               ", ".join(self.symbols)

class MultipleTargetError(LasersError):
    """Indicates that there is more than one target on the board."""

    symbols = "x"

    def __str__ (self):
        return "Too many targets (%s) to hit, only one is allowed." % \
               ", ".join(self.symbols)

class WallNotSolidError(LasersError):
    """Indicates that the perimeter wall is not solid."""

    __slots__ = ("__row_pos", "__col_pos", "n_wall", "s_wall", "e_wall",
                 "w_wall")

    def __init__(self, row_pos, col_pos):
        self.__row_pos = row_pos
        self.__col_pos = col_pos

    def __str__ (self):
        return "Walls must form a solid rectangle."

    def __get_row_pos(self):
        return self.__row_pos

    def __get_col_pos(self):
        return self.__col_pos

    row_pos = property(__get_row_pos)
    col_pos = property(__get_col_pos)

class WallNotRectangleError(LasersError):
    """Indicates that the perimeter wall is not a rectangle."""

    __slots__ = ("__row_pos", "__col_pos")

    def __init__(self, row_pos, col_pos):
        self.__row_pos = row_pos
        self.__col_pos = col_pos

    def __str__ (self):
        return "Walls must form a rectangle."

    def __get_row_pos(self):
        return self.__row_pos

    def __get_col_pos(self):
        return self.__col_pos

    row_pos = property(__get_row_pos)
    col_pos = property(__get_col_pos)

class OutsideRoomError(LasersError):
    """Indicates an item is outside of the perimeter wall."""

    __slots__ = ("__row_pos", "__col_pos", "__name")

    def __init__(self, row_pos, col_pos, name):
        self.__row_pos = row_pos
        self.__col_pos = col_pos
        self.__name = name

    def __str__ (self):
        return "A %s was found outside of a 'room'." % self.__name

    def __get_row_pos(self):
        return self.__row_pos

    def __get_col_pos(self):
        return self.__col_pos

    row_pos = property(__get_row_pos)
    col_pos = property(__get_col_pos)

class LaserOutsideRoomError(OutsideRoomError):
    """Indicates the laser is outside of the perimeter wall."""

    def __init__ (self, row_pos, col_pos):
        OutsideRoomError.__init__(self, row_pos, col_pos, "laser")

class TargetOutsideRoomError(OutsideRoomError):
    """Indicates the target is outside of the perimeter wall."""

    def __init__ (self, row_pos, col_pos):
        OutsideRoomError.__init__(self, row_pos, col_pos, "target")

class WallOutsideRoomError(OutsideRoomError):
    """Indicates that there is a wall outside of the perimeter wall."""

    def __init__ (self, row_pos, col_pos):
        OutsideRoomError.__init__(self, row_pos, col_pos, "wall")



if __name__ == "__main__":
    main()

রঙ ত্রুটি প্রতিবেদন দেখানোর জন্য একটি বাশ স্ক্রিপ্ট:

#!/bin/bash

declare -a TESTS

test() {
    echo -e "\033[1m$1\033[0m"
    tput sgr0
    echo "$2" | ./lasers.py
    echo
}

test \
"no laser" \
"    ##########
    #     x  #
    # /      #
    #       /#
    #   \\    #
    ##########"

test \
"multiple lasers" \
"    ##########
    #   v x  #
    # /      #
    #       /#
    #   \\  ^ #
    ##########"

test \
"no target" \
"    ##########
    #   v    #
    # /      #
    #       /#
    #   \\    #
    ##########"

test \
"multiple targets" \
"    ##########
    #   v x  #
    # /      #
    #       /#
    #   \\  x #
    ##########"

test \
"wall not solid" \
"    ##### ####
    #   v x  #
    # /      #
    #       /#
    #   \\    #
    ##########"

test \
"laser_outside_room" \
"    ##########
 >  #     x  #
    # /      #
    #       /#
    #   \\    #
    ##########"

test \
"laser before room" \
" >  ##########
    #     x  #
    # /      #
    #       /#
    #   \\    #
    ##########"

test \
"laser row before room" \
"   >
    ##########
    #     x  #
    # /      #
    #       /#
    #   \\    #
    ##########"

test \
"laser after room" \
"    ##########
    #     x  #
    # /      #
    #       /#
    #   \\    #
    ##########  >"

test \
"laser row after room" \
"    ##########
    #     x  #
    # /      #
    #       /#
    #   \\    #
    ##########
  > "

test \
"target outside room" \
"    ##########
 x  #   v    #
    # /      #
    #       /#
    #   \\    #
    ##########"

test \
"target before room" \
" x  ##########
    #   v    #
    # /      #
    #       /#
    #   \\    #
    ##########"

test \
"target row before room" \
"   x
    ##########
    #   v    #
    # /      #
    #       /#
    #   \\    #
    ##########"

test \
"target after room" \
"    ##########
    #   v    #
    # /      #
    #       /#
    #   \\    #
    ##########   x"

test \
"target row after room" \
"    ##########
    #   v    #
    # /      #
    #       /#
    #   \\    #
    ##########
  x "

test \
"wall outside room" \
"    ##########
 #  #   v    #
    # /      #
    #       /#
    #   \\  x #
    ##########"

test \
"wall before room" \
" #  ##########
    #   v    #
    # /      #
    #       /#
    #   \\  x #
    ##########"

test \
"wall row before room" \
"    #
    ##########
    #   v    #
    # /      #
    #       /#
    #   \\  x #
    ##########"

test \
"wall after room" \
"    ##########
    #   v    #
    # /      #
    #       /#
    #   \\  x #
    ########## #"

test \
"wall row after room" \
"    ##########
    #   v    #
    # /      #
    #       /#
    #   \\  x #
    ##########
  #"

test \
"mirror outside room positive" \
"    ##########
 /  #   / \\  #
    #        #
    #   \\   x#
    # >   /  #
    ########## "

test \
"mirrors outside room negative" \
"    ##########
 \\  #   v x  #
    # /      #
    #       /#
    #   \\    #
    ##########"

test \
"mirror before room positive" \
" \\  ##########
    #   / \\  #
    #        #
    #   \\   x#
    # >   /  #
    ########## "

test \
"mirrors before room negative" \
" /  ##########
    #   v x  #
    # /      #
    #       /#
    #   \\    #
    ##########"

test \
"mirror row before room positive" \
"     \\
    ##########
    #   / \\  #
    #        #
    #   \\   x#
    # >   /  #
    ########## "

test \
"mirrors row before room negative" \
"     \\
    ##########
    #   v x  #
    # /      #
    #       /#
    #   \\    #
    ##########"

test \
"mirror after row positive" \
"    ##########
    #   / \\  #
    #        #
    #   \\   x#
    # >   /  #
    ########## /  "

test \
"mirrors after row negative" \
"    ##########
    #   v x  #
    # /      #
    #       /#
    #   \\    #
    ##########   /  "

test \
"mirror row after row positive" \
"    ##########
    #   / \\  #
    #        #
    #   \\   x#
    # >   /  #
    ########## 
 /  "

test \
"mirrors row after row negative" \
"    ##########
    #   v x  #
    # /      #
    #       /#
    #   \\    #
    ########## 
 /  "

test \
"laser hitting laser" \
"    ##########
    #   v   \\#
    #        #
    #        #
    #x  \\   /#
    ##########"

test \
"mirrors positive" \
"    ##########
    #   / \\  #
    #        #
    #   \\   x#
    # >   /  #
    ########## "

test \
"mirrors negative" \
"    ##########
    #   v x  #
    # /      #
    #       /#
    #   \\    #
    ##########"

test \
"wall collision" \
"    #############
    #     #     #
    # >   #     #
    #     #     #
    #     #   x #
    #     #     #
    #############"

test \
"extreme example" \
"    ##########
    #/\\/\\/\\  #
    #\\\\//\\\\\\ #
    #//\\/\\/\\\\#
    #\\/\\/\\/x^#
    ##########"

test \
"brian example 1" \
"##########
#   / \\  #
#        #
#/    \\ x#
#\\>   /  #
##########"

test \
"brian example 2" \
"##########
#  /    \\#
# / \\    #
#/    \\ x#
#\\^/\\ /  #
##########"

উন্নয়নে ব্যবহৃত ইউনিটসেটস:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import unittest

from lasers import *

class TestTileRecognition(unittest.TestCase):
    def test_solid_wall(self):
        self.assertEqual(SOLID_WALL, identify_tile("#"))

    def test_target(self):
        self.assertEqual(TARGET, identify_tile("x"))

    def test_mirror_ne_sw(self):
        self.assertEqual(MIRROR_NE_SW, identify_tile("/"))

    def test_mirror_nw_se(self):
        self.assertEqual(MIRROR_NW_SE, identify_tile("\\"))

    def test_laser_down(self):
        self.assertEqual(LASER_DOWN, identify_tile("v"))

    def test_laser_up(self):
        self.assertEqual(LASER_UP, identify_tile("^"))

    def test_laser_right(self):
        self.assertEqual(LASER_RIGHT, identify_tile(">"))

    def test_laser_left(self):
        self.assertEqual(LASER_LEFT, identify_tile("<"))

    def test_other(self):
        self.assertEqual(None, identify_tile(" "))

class TestReflection(unittest.TestCase):
    def setUp(self):
        self.DIRECTION = LEFT
        self.NOT_DIRECTIO

6
লেজার পদার্থবিজ্ঞান হ'ল বিম নিজেই অতিক্রম করতে পারে। উপরের মন্তব্যটি একটি গুরুত্বপূর্ণ সাংস্কৃতিক রেফারেন্স।
ডিএমকেকে --- প্রাক্তন মডারেটর বিড়ালছানা

5
কচ্ছপ এবং কোড গল্ফের হেয়ার পন্থা। স্পষ্টতই অনেকগুলি অক্ষর (বর্তমান বিজয়ীর চেয়ে 91x বেশি) দিয়ে কিছু সরবরাহ করুন তবে অনুমানের প্রতিটি বর্ণের দিকে মনোযোগ দিন। ধীর এবং অবিচলিত সাধারণত যদিও কম চুক্তির কাজ পাই।
মেটালশার্ক

আপনার ইউনিটস্টেটের কিছু অংশ অনুপস্থিত বলে মনে হচ্ছে। এটি "স্ব। NOT_DIRECTIO" এ কাটা হয়েছে
বায়োজিইক

@ বায়োগিক - পোস্টের দৈর্ঘ্যের সীমাটি হিট করুন;)। বেস স্টাইল পরীক্ষা ছাড়াও রঙ হাইলাইট করা বন্ধ করে দেয়।
ধাতবক্ষ

11

রুবি, 176 টি অক্ষর

x=!0;y=0;e="^v<>#x";b=readlines;b.map{|l|(x||=l=~/[v^<>]/)||y+=1};c=e.index(b[y][x])
loop{c<2&&y+=c*2-1;c>1&&x+=2*c-5;e.index(n=b[y][x])&&(p n==?x;exit);c^='  \/'.index(n)||0}

আমি একটি সাধারণ স্টেট মেশিন ব্যবহার করেছি (বেশিরভাগ পোস্টারের মতো), অভিনব কিছু নয়। আমি ভাবতে পারি এমন প্রতিটি কৌশল ব্যবহার করে আমি এটিকে ঝকঝকে করে রেখেছিলাম। দিক পরিবর্তন করতে ব্যবহৃত বিটওয়াইস এক্সওআর (চলকটিতে পূর্ণসংখ্যারূপে সঞ্চিত c) আমার পূর্ববর্তী সংস্করণগুলির শর্তাবলীর চেয়ে বড় উন্নতি ছিল।

আমার সন্দেহ রয়েছে যে কোডটি বৃদ্ধি করে xএবং yআরও সংক্ষিপ্ত করা যায়। কোডটির বিভাগটি এখানে বাড়ানো হয়েছে:

c<2&&y+=c*2-1;c>1&&x+=(c-2)*2-1

সম্পাদনা করুন : আমি উপরেরটি কিছুটা ছোট করতে সক্ষম হয়েছি:

c<2&&y+=c*2-1;c>1&&x+=2*c-5

লেজারের বর্তমান দিকটি cনিম্নরূপে সংরক্ষণ করা হয়েছে:

0 => আপ
1 => নিচে
2 => বাম
3 => ঠিক আছে

কোডটি বৃদ্ধি xএবং yসঠিক পরিমাণের (0, 1, বা -1) দ্বারা এই বাস্তবতার উপর নির্ভর করে । আমি প্রতিটি সংখ্যায় কোন সংখ্যার মানচিত্রকে পুনরায় সাজানোর চেষ্টা করেছি, এমন একটি ব্যবস্থা খুঁজছিলাম যা আমাকে মানগুলি বাড়ানোর জন্য কিছুটা দিকনির্দেশিত হেরফের করতে দেয়, কারণ আমার মনে হয় যে এটি পাটিগণিত সংস্করণের চেয়ে কম হবে feeling


9

সি # 3.0

259 অক্ষর

bool S(char[]m){var w=Array.FindIndex(m,x=>x<11)+1;var s=Array.FindIndex(m,x=>x>50&x!=92&x<119);var t=m[s];var d=t<61?-1:t<63?1:t<95?-w:w;var u=0;while(0<1){s+=d;u=m[s];if(u>119)return 0<1;if(u==47|u==92)d+=d>0?-w-1:w+1;else if(u!=32)return 0>1;d=u>47?-d:d;}}

সামান্য আরও পঠনযোগ্য:

bool Simulate(char[] m)
{
    var w = Array.FindIndex(m, x => x < 11) + 1;
    var s = Array.FindIndex(m, x => x > 50 & x != 92 & x < 119);
    var t = m[s];
    var d = t < 61 ? -1 : t < 63 ? 1 : t < 95 ? -w : w;
    var u = 0;
    while (0 < 1)
    {
        s += d;
        u = m[s];
        if (u > 119)
            return 0 < 1;
        if (u == 47 | u == 92)
            d += d > 0 ? -w - 1 : w + 1;
        else if (u != 32)
            return 0 > 1;
        d = u > 47 ? -d : d;
    }
}

চরগুলির প্রধান বর্জ্য মানচিত্রের প্রস্থ এবং লেজার উত্সের অবস্থান অনুসন্ধানে মনে হচ্ছে। এটি কীভাবে সংক্ষিপ্ত করবেন?


এই সংক্ষিপ্তটি সম্পর্কে আমি নিশ্চিত নই তবে এটি লেজারটি সন্ধান এবং প্রস্থ খুঁজে পাওয়া আমার শট: এল = তালিকা <স্ট্রিং> ব্যবহার করে; পি = সিস্টেম.ড্রেইং.পয়েন্ট ব্যবহার করে; এল = তালিকা <স্ট্রিং> ব্যবহার করে; এল আর = নতুন এল () {"ভি", "<", ">", "^"}; পি পি = নতুন পি (); আর.ফোরএচ (এ => {ইনট সি = 0; ভি.ফোরএচ (এস => {সি ++ ; যদি (s.IndexOf (a)! = - 1) {pX = s.IndexOf (a); pY = c;}});}); int l = v [0]। দৈর্ঘ্য; v হ'ল একটি তালিকা <স্ট্রিং>
টেবিলযুক্ত

আরও ভাল: এল = তালিকা <স্ট্রিং> ব্যবহার করছে; এল l = নতুন এল (4) v "ভি", "<", ">", "^"}; ভের পয়েন্ট = নতুন {x = 0, y = 0}; int সি = 0; এল.এফআরএচ (a => {এম .ফরএচ (এস => {) (এস। ইন্ডেক্সঅফ (ক)! = - 1) {পয়েন্ট = নতুন {এক্স = এস.আইডেক্সঅফ (এ), y = সি};}}); সি ++;}); ইন্টি ডাব্লু = মি [0]। দৈর্ঘ্য;
আরসিআইএক্স

4
সমস্যাগুলি কোনও ফাংশন নয়, একটি সম্পূর্ণ প্রোগ্রামের জন্য জিজ্ঞাসা করে।
স্ট্রেজার

কীভাবে while(1)
এসএসপোক

9

সি + এএসসিআইআই, 197 টি অক্ষর:

G[999],*p=G,w,z,t,*b;main(){for(;(*p++=t=getchar()^32)>=0;w=w|t-42?w:p-G)z=t^86?t^126?t^28?t^30?z:55:68:56:75,b=z?b:p;for(;t=z^55?z^68?z^56?z^75?0:w:-w:-1:1;z^=*b)b+=t;puts(*b^88?"false":"true");}

এই সি দ্রবণটি একটি এএসসিআইআই চরিত্রের সেটটি ধরেছে, যা আমাদের এক্সওর মিরর কৌশলটি ব্যবহার করার অনুমতি দেয়। এটি অবিশ্বাস্যরকমও ভঙ্গুর - উদাহরণস্বরূপ, সমস্ত ইনপুট লাইন একই দৈর্ঘ্য হতে হবে।

এটি 200 টি চরিত্রের চিহ্নের নীচে ভেঙে যায় - তবে এটি ডাং করে, এখনও এই পার্ল সমাধানগুলিকে পরাস্ত করেনি!


= হে! +1 টি! আমাকে মারধর করার জন্য গ্রেটস। =]
স্ট্রেগার

2
এখানে বেশিরভাগ ভাল সমাধান "সমস্ত পংক্তির সমান দৈর্ঘ্য" ধারণাটি তৈরি করে। গল্ফ এবং যুদ্ধে সমস্ত ফর্সা।
hobbs

যদি এটির প্রয়োজন হয় তবে লাইনগুলি একই দৈর্ঘ্য নয়, আমি এটির জন্য একটি পরীক্ষার কেস যুক্ত করব। তবে আমি স্পষ্টভাবে বলেছি এটি ইচ্ছাকৃত ছিল :)
লিরানাউনা


9

পাইথন - 152

"এল" নামক একটি ফাইল থেকে ইনপুট পড়ে

A=open("L").read()
W=A.find('\n')+1
D=P=-1
while P<0:D+=1;P=A.find(">^<v"[D])
while D<4:P+=[1,-W,-1,W][D];D=[D,D^3,D^1,4,5][' \/x'.find(A[P])]
print D<5

স্টিডিন থেকে পড়তে এটির সাথে প্রথম লাইনটি প্রতিস্থাপন করুন

import os;A=os.read(0,1e9)

আপনার যদি ছোট হাতের প্রয়োজন হয় তবে সত্য / মিথ্যাতে শেষ লাইনটি পরিবর্তন করুন

print`D<5`.lower()

পরিবর্তন Trueহতে trueএবং কত পরিবর্তন Falseহয় false? ;-)
জনতা

"মুদ্রণ D<5" কে "মুদ্রণ ডি <5" তে পরিবর্তন করে আপনি 1 টি অক্ষর মুছে ফেলতে পারেন নি ? নাকি আমি এখানে কিছু মিস করছি?
পোনকডুডল

@ ওয়াল্লাকোলু, নিশ্চিত করতে পারেন এটি কেবল ছোট ছোট / সত্যের জন্য প্রয়োজন
জন লা রুই

7

জাভাস্ক্রিপ্ট - 265 অক্ষর

আপডেট IV - প্রতিক্রিয়াগুলি হ'ল এটি সর্বশেষ রাউন্ড হবে, একটি ডু-ওয়েল লুপটিতে স্যুইচ করে এবং আন্দোলনের সমীকরণটি পুনরায় লিখে আরও কয়েকটি অক্ষর সংরক্ষণ করতে পরিচালিত managed

আপডেট তৃতীয় - ম্যাথ.এবস () অপসারণ এবং বৈশ্বিক নাম স্থানটিতে ভেরিয়েবলগুলি রাখার ক্ষেত্রে স্ট্রারের পরামর্শের জন্য ধন্যবাদ, যা কিছু পরিবর্তনশীল অ্যাসাইনমেন্টের পুনর্বিন্যাসের সাথে মিলিয়ে কোডটি ২২২ টি অক্ষরে নামিয়েছে।

আপডেট দ্বিতীয় - কোডটি আরও কিছু আপডেট! -1-এর ব্যবহার অপসারণ করার পাশাপাশি দীর্ঘ ক্রিয়াকলাপের জন্য ভেরিয়েবলগুলির আরও কিছু ভাল ব্যবহার remove

হালনাগাদ - এর মাধ্যমে এবং সূচিপত্রের ফাংশনটির জন্য একটি রেফারেন্স তৈরি করে এবং কিছু পরিবর্তন করার পরে (ধন্যবাদ লীরানুনা!) এবং প্রয়োজনীয় না হওয়া বন্ধনীগুলি সরিয়ে ফেলুন।

কোড গল্ফটি করা আমার এই প্রথমবার যাতে আমি নিশ্চিত না যে এটি কতটা ভাল হতে পারে, কোনও ফিড ব্যাক প্রশংসা করা হয়।

সম্পূর্ণভাবে সংক্ষিপ্ত সংস্করণ:

a;b;c;d;e;function f(g){a=function(a){return g.indexOf(a)};b=a("\n")+1;a=g[c=e=a("v")>0?e:e=a("^")>0?e:e=a("<")>0?e:a(">")];d=a=="<"?-1:a==">"?1:a=="^"?-b:b;do{e=d==-1|d==1;a=g[c+=d=a=="\\"?e?b*d:d>0?1:-1:a=="/"?e?-b*d:d>0?1:-1:d];e=a=="x"}while(a!="#"^e);return e}

মন্তব্য সহ আসল সংস্করণ:

character; length; loc; movement; temp;
function checkMaze(maze) {
        // Use a shorter indexOf function
        character = function(string) { return maze.indexOf(string); }
        // Get the length of the maze
        length = character("\n") + 1;
        // Get the location of the laser in the string
        character = maze[loc = temp = character("v") > 0 ? temp :
                               temp = character("^") > 0 ? temp :
                               temp = character("<") > 0 ? temp : character(">")];
        // Get the intial direction that we should travel
        movement = character == "<" ? -1 :
                   character == ">" ? 1 :
                   character == "^" ? -length : length;
        // Move along until we reach the end
        do {
            // Get the current character
            temp = movement == -1 | movement == 1;
            character = maze[loc += movement = character == "\\" ? temp ? length * movement : movement > 0 ? 1 : -1 :
                                               character == "/" ? temp ? -length * movement : movement > 0 ? 1 : -1 : movement];                                   
            // Have we hit a target?
            temp = character == "x";
            // Have we hit a wall?
        } while (character != "#" ^ temp);
        // temp will be false if we hit the target
        return temp;
    }

এর সাথে পরীক্ষার জন্য ওয়েব পৃষ্ঠা:

<html>
  <head>
    <title>Code Golf - Lasers</title>
    <script type="text/javascript">
    a;b;c;d;e;function f(g){a=function(a){return g.indexOf(a)};b=a("\n")+1;a=g[c=e=a("v")>0?e:e=a("^")>0?e:e=a("<")>0?e:a(">")];d=a=="<"?-1:a==">"?1:a=="^"?-b:b;do{e=d==-1|d==1;a=g[c+=d=a=="\\"?e?b*d:d>0?1:-1:a=="/"?e?-b*d:d>0?1:-1:d];e=a=="x"}while(a!="#"^e);return e}
    </script>
  </head>
  <body>
    <textarea id="maze" rows="10" cols="10"></textarea>
    <button id="checkMaze" onclick="alert(f(document.getElementById('maze').value))">Maze</button>
  </body>
</html>

এটি কীভাবে ইনপুট নেয়? আমি এটি পরীক্ষা করে যাচাই করতে চাই। এছাড়াও, আপনি যদি a.indexOf
LiraNuna

প্রতিস্থাপন index != -1সঙ্গে index > 0দয়া করে! (আশা কেউ রাখে উপরে বাম প্রান্তে তাই Lazer 0ফিরে আসবে না। =]) আপনি শৃঙ্খল পারেন varবিবৃতি বা পুরাপুরি তাদের পরিত্রাণ পেতে (গ্লোবাল নামস্থানে ভেরিয়েবল নির্বাণ)। আমি মনে করি এর Math.abs(m)==1সাথে প্রতিস্থাপন করা যায় m==-1|m==1। পারি movement = ...; location += movementঅপ্টিমাইজ করা location += movement =?
স্টারগার

@ স্ট্র্যাজার- আপনার মন্তব্যটি স্রেফ দেখেছি, দেখে মনে হচ্ছে আপনি কোডটি আপডেট করার সময় আপনি এটি পোস্ট করেছিলেন, 300 টি অক্ষর পর্যন্ত নিচে। আমি ম্যাথ.এবস () কে বাদ দিয়ে কী করতে পারি তা আমি দেখতে পাব।
rjzii

function(a){return g.indexOf(a)}function(a)g.indexOf(a)সাম্প্রতিক জাভাস্ক্রিপ্ট সংস্করণগুলির সাথে প্রতিস্থাপন করা যেতে পারে ।
ব্যবহারকারী1686

6

আয়নার ঘর

চ্যালেঞ্জটিতে আসল প্রবেশ নয়, তবে আমি এই ধারণার উপর ভিত্তি করে একটি গেম লিখেছি (খুব বেশি পিছনে নেই)।

এটি স্কালায় লিখিত আছে, মুক্ত উত্স এবং এখানে উপলভ্য :

এটি আরও কিছুটা করে; রঙ এবং বিভিন্ন ধরণের আয়না এবং ডিভাইসগুলির সাথে সম্পর্কিত, তবে সংস্করণ 0.00001 এই চ্যালেঞ্জটি যা বলে ঠিক তাই করেছিল exactly যদিও আমি সেই সংস্করণটি হারিয়েছি এবং এটি কোনওভাবেই চরিত্র গণনার জন্য অনুকূলিত হয়নি।


স্ক্যালাল ইনস্টল না করে উইন্ডোজের অধীনে কাজ করে এমন একটি সংকলিত সংস্করণ আপলোড করা কি আপনার পক্ষে সম্ভব?
মিলান

স্কালা লাইব্রেরি সহ একটি সংস্করণ রয়েছে। ডাউনলোডগুলির তালিকা দেখুন। তবে যাইহোক, আপনি যদি এখনই স্কাল ইনস্টল করেছেন, আমি আপনাকে খুশি করে খুশি হলাম :)
এইচআরজে

6

সি (কেএন্ডআর) স্ট্রারারের আরও পরামর্শের পরে 339 টি প্রয়োজনীয় অক্ষর।

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

বাস্তবায়ন বাকীটি খুব সোজা এগিয়ে রয়েছে এবং আমার আগের, সামনের দিকে এগিয়ে যাওয়ার প্রচেষ্টা থেকে কম-বেশি নেওয়া হয়।

সঙ্কুচিত:

#define R return
#define C case
#define Z x,y
int c,i,j,m[99][99],Z;s(d,e,Z){for(;;)switch(m[x+=d][y+=e]){C'^':R 1==e;
C'>':R-1==d;C'v':R-1==e;C'<':R 1==d;C'#':C'x':R 0;C 92:e=-e;d=-d;C'/':c=d;
d=-e;e=-c;}}main(){while((c=getchar())>0)c==10?i=0,j++:(c==120?x=i,y=j:
i,m[i++][j]=c);puts(s(1,0,Z)|s(0,1,Z)|s(-1,0,Z)|s(0,-1,Z)?"true":"false");}

Uncompressed (পর):

#define R return
#define C case
#define Z x,y
int c,i,j,m[99][99],Z;
s(d,e,Z)
{
  for(;;)
    switch(m[x+=d][y+=e]){
    C'^': 
      R 1==e;
    C'>': 
      R-1==d;
    C'v': 
      R-1==e;
    C'<': 
      R 1==d;
    C'#':
    C'x':
      R 0;
    C 92:
      e=-e;
      d=-d;
    C'/':
      c=d;
      d=-e;
      e=-c;
    }
}
main(){
  while((c=getchar())>0)
    c==10?i=0,j++:
      (c==120?x=i,y=j:i,m[i++][j]=c);
  puts(s(1,0,Z)|s(0,1,Z)|s(-1,0,Z)|s(0,-1,Z)?"true":"false");
}

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

আমি বরং আশা করছি যে কেউ এই কাজটি সম্পাদন করার জন্য আরও সূক্ষ্ম উপায় প্রদর্শন করবে। এতে কোনও ভুল নেই, তবে এটি গভীর যাদু নয়।


=0গ্লোবালগুলিতে কোনও প্রয়োজন নেই কারণ সেগুলি ডিফল্টরূপে 0 থেকে শুরু করা হয়। দশমিকের সমতুল্য চরিত্রের ধ্রুবকগুলি প্রতিস্থাপন করুন। ইওএফ (এবং ) এর বিরুদ্ধে চেক করার >0পরিবর্তে ব্যবহার করুন । আমি সম্ভবত এর কোডগুলি কিছুটা দূরে রাখতে পারি । অতিরিক্ত জন্য কোন প্রয়োজন নেই এ যেমন একটি newline যাহাই হউক না কেন প্রিন্ট আবশ্যক। তুলনায় খাটো । আশাকরি এটা সাহায্য করবে. =]!=EOF\0#definecaseif\nputsputsfor(;;)while(1)
স্ট্রাগার

@ স্ট্রেজার: ধন্যবাদ আমি সবসময় এই পুনরাবৃত্তির সাথেই আসি, কারণ আমি সেভাবে ভাবি না ...
ডেমকে --- --- প্রাক্তন মডারেটর বিড়ালছানা

2
"There is no input validation"- কিছু থাকা উচিত নয়। গল্ফারদের এটিকে সহজ করার জন্য, অন্যথায় নির্দিষ্ট না করা থাকলে ইনপুট সর্বদা 'পরিষ্কার' বলে ধরে নেওয়া হয়।
LiraNuna

@ ডিএমকেহে, চিন্তা করবেন না, আমাদের কোড গল্ফ পেশাদাররা পুনরাবৃত্তভাবেও কাজ করে। তবে, আমরা সাধারণত শুরু থেকেই কিছু কৌশল ব্যবহার করি (আমি উল্লিখিত অর্ধেকের মতো) তবে এটি অভিজ্ঞতা নিয়ে আসে। =]
স্ট্রাগার

আমি ভুল গণনা না করা
অবধি

6

রুবি - 146 চর

A=$<.read
W=A.index('
')+1
until
q=A.index(">^<v"[d=d ?d+1:0])
end
while d<4
d=[d,d^3,d^1,4,5][(' \/x'.index(A[q+=[1,-W,-1,W][d]])or 4)]
end
p 5>d

5

পোস্টস্ক্রিপ্ট , 359 বাইট

প্রথম প্রচেষ্টা, উন্নতির জন্য প্রচুর জায়গা ...

/a[{(%stdin)(r)file 99 string readline not{exit}if}loop]def a{{[(^)(>)(<)(v)]{2
copy search{stop}if pop pop}forall}forall}stopped/r count 7 sub def pop
length/c exch def[(>)0(^)1(<)2(v)3>>exch get/d exch def{/r r[0 -1 0 1]d get
add def/c c[1 0 -1 0]d get add def[32 0 47 1 92 3>>a r get c get .knownget
not{exit}if/d exch d xor def}loop a r get c get 120 eq =

4

হাস্কেল, 395 391 383 361 339 টি অক্ষর (অনুকূলিত)

এখনও কিছু চালাকের চেয়ে জেনেরিক স্টেট মেশিন ব্যবহার করে:

k="<>^v"
o(Just x)=x
s y(h:t)=case b of{[]->s(y+1)t;(c:_)->(c,length a,y)}where(a,b)=break(flip elem k)h
r a = f$s 0 a where f(c,x,y)=case i(a!!v!!u)"x /\\"["true",g k,g"v^><",g"^v<>"]of{Just r->r;_->"false"}where{i x y=lookup x.zip y;j=o.i c k;u=j[x-1,x+1,x,x];v=j[y,y,y-1,y+1];g t=f(j t,u,v)}
main=do{z<-getContents;putStrLn$r$lines z}

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

k="<>^v"    -- "key" for direction
o(Just x)=x -- "only" handle successful search
s y(h:t)=case b of  -- find "start" state
  []->s(y+1)t
  (c:_)->(c,length a,y)
 where (a,b)=break(flip elem k)h
r a = f$s 0 a where -- "run" the state machine (iterate with f)
 f(c,x,y)=case i(a!!v!!u)"x /\\"["true",g k,g"v^><",g"^v<>"] of
   Just r->r
   _->"false"
  where
   i x y=lookup x.zip y -- "index" with x using y as key
   j=o.i c k -- use c as index k as key; assume success
   u=j[x-1,x+1,x,x] -- new x coord
   v=j[y,y,y-1,y+1] -- new y coord
   g t=f(j t,u,v) -- recurse; use t for new direction
main=do
 z<-getContents
 putStrLn$r$lines z

3

আমি কোড রিউজে বিশ্বাস করি, আমি আপনার কোডের একটি এপিআই হিসাবে ব্যবহার করব :) use

  বোর্ড.নিউ.এলডেট (ইনপুট) রাখে

32 টি অক্ষর \ o / ... ওহুহূ


6
এটি একটি ডবল বগি!
জেফ আতউড

3
আপনাকে এর সাথে মারতে হবে: পি বোর্ড.নিউ.এলডিপেট ইনপুট ২ characters টি অক্ষর \ o /
আলেসান্দ্রা পেরেরিরা

3

সি ++: 388 টি অক্ষর

#include<iostream>
#include<string>
#include<deque>
#include<cstring>
#define w v[y][x]
using namespace std;size_t y,x,*z[]={&y,&x};int main(){string p="^v<>",s;deque<string>v;
while(getline(cin,s))v.push_back(s);while(x=v[++y].find_first_of(p),!(x+1));int 
i=p.find(w),d=i%2*2-1,r=i/2;do while(*z[r]+=d,w=='/'?d=-d,0:w==' ');while(r=!r,
!strchr("#x<^v>",w));cout<<(w=='x'?"true":"false");}

( 318 শিরোনাম ব্যতীত)


কিভাবে এটা কাজ করে:

প্রথমে সমস্ত লাইন পড়ে নেওয়া হয়, তারপরে, লেজারটি পাওয়া যায়। নিম্নলিখিতটি 0যতক্ষণ না কোনও লেজার তীর পাওয়া যায় ততক্ষণ মূল্যায়ন করবে এবং একই সময় xঅনুভূমিক অবস্থানে নির্ধারিত হবে ।

x=v[++y].find_first_of(p),!(x+1)

তারপরে আমরা কোন দিকটি খুঁজে পেয়েছি এবং এটি সঞ্চয় করে দেখছি i। এমনকি মানগুলি iশীর্ষ / বাম ("হ্রাস") এবং বিজোড় মানগুলি নীচে / ডান ("বৃদ্ধি") হয়। এই ধারণা অনুসারে, d("দিকনির্দেশ") এবং r("অভিযোজন") সেট করা আছে। আমরা বিন্যাসের zসাথে পয়েন্টার অ্যারে সূচক করি এবং আমরা যে পূর্ণসংখ্যার সাথে পাই তা দিকনির্দেশ যোগ করি। স্ল্যাশকে আঘাত করলেই দিক পরিবর্তন হয়, যখন আমরা কোনও ব্যাক-স্ল্যাশ আঘাত করি তখন তা একই থাকে। অবশ্যই, যখন আমরা একটি আয়না আঘাত করি, তখন আমরা সর্বদা ওরিয়েন্টেশন ( r = !r) পরিবর্তন করি ।


আপনি আমাকে নিজের সি ++ সলিউশন করতে বাধ্য করছেন। =]
স্টারগার

2
@ স্ট্রেজার, যদিও এটি বিরক্তিকর হয়ে উঠছে। আসুন এমন একটি সমাধান করি যা সংকলনের সময়
xD-

আমি যুক্ত করছি যেহেতু আমি ব্যাখ্যা এটি যুক্ত করব :)
জোহানেস স্কাউব - লিটব

2

গ্রোভি @ 279 অনুগামী

m=/[<>^v]/
i={'><v^'.indexOf(it)}
n=['<':{y--},'>':{y++},'^':{x--},'v':{x++}]
a=['x':{1},'\\':{'v^><'[i(d)]},'/':{'^v<>'[i(d)]},'#':{},' ':{d}]
b=[]
System.in.eachLine {b<<it.inject([]) {r,c->if(c==~m){x=b.size;y=r.size;d=c};r<<c}}
while(d==~m){n[d]();d=a[b[x][y]]()}
println !!d

2

সি শার্প

1020 টি অক্ষর।
1088 টি অক্ষর (কনসোল থেকে ইনপুট যুক্ত)।
925 টি অক্ষর (রিফ্যাক্টর ভেরিয়েবল)।
875 টি অক্ষর (অপ্রয়োজনীয় অভিধান আরম্ভকারী সরানো; বাইনারি ও অপারেটরগুলিতে পরিবর্তিত হয়েছে)

পোস্ট করার আগে অন্য কারও দিকে নজর না দেওয়ার জন্য একটি পয়েন্ট তৈরি করেছেন। আমি নিশ্চিত এটি কিছুটা লিনকুইড হতে পারে। এবং পঠনযোগ্য সংস্করণে পুরো ফাইন্ডলেজার পদ্ধতিটি আমার কাছে অত্যন্ত ভয়ঙ্কর বলে মনে হচ্ছে। তবে, এটি কাজ করে এবং দেরি হয়ে গেছে :)

নোট করুন পাঠযোগ্য শ্রেণিতে একটি অতিরিক্ত পদ্ধতি রয়েছে যা লেজারের চারপাশে চলার সাথে সাথে বর্তমান অ্যারেনাকে মুদ্রণ করে।

class L{static void Main(){
A=new Dictionary<Point,string>();
var l=Console.ReadLine();int y=0;
while(l!=""){var a=l.ToCharArray();
for(int x=0;x<a.Count();x++)
A.Add(new Point(x,y),l[x].ToString());
y++;l=Console.ReadLine();}new L();}
static Dictionary<Point,string>A;Point P,O,N,S,W,E;
public L(){N=S=W=E=new Point(0,-1);S.Offset(0,2);
W.Offset(-1,1);E.Offset(1,1);D();
Console.WriteLine(F());}bool F(){
var l=A[P];int m=O.X,n=O.Y,o=P.X,p=P.Y;
bool x=o==m,y=p==n,a=x&p<n,b=x&p>n,c=y&o>m,d=y&o<m;
if(l=="\\"){if(a)T(W);if(b)T(E);if(c)T(S);
if(d)T(N);if(F())return true;}
if(l=="/"){if(a)T(E);if(b)T(W);if(c)T(N);
if(d)T(S);if(F())return true;}return l=="x";}
void T(Point p){O=P;do P.Offset(p);
while(!("\\,/,#,x".Split(',')).Contains(A[P]));}
void D(){P=A.Where(x=>("^,v,>,<".Split(',')).
Contains(x.Value)).First().Key;var c=A[P];
if(c=="^")T(N);if(c=="v")T(S);if(c=="<")T(W);
if(c==">")T(E);}}

পঠনযোগ্য সংস্করণ (চূড়ান্ত গল্ফ সংস্করণ নয়, তবে একই ভিত্তি):

class Laser
{
    private Dictionary<Point, string> Arena;
    private readonly List<string> LaserChars;
    private readonly List<string> OtherChars;

    private Point Position;
    private Point OldPosition;
    private readonly Point North;
    private readonly Point South;
    private readonly Point West;
    private readonly Point East;

    public Laser( List<string> arena )
    {
        SplitArena( arena );
        LaserChars = new List<string> { "^", "v", ">", "<" };
        OtherChars = new List<string> { "\\", "/", "#", "x" };
        North = new Point( 0, -1 );
        South = new Point( 0, 1 );
        West = new Point( -1, 0 );
        East = new Point( 1, 0 );
        FindLaser();
        Console.WriteLine( FindTarget() );
    }

    private void SplitArena( List<string> arena )
    {
        Arena = new Dictionary<Point, string>();
        int y = 0;
        foreach( string str in arena )
        {
            var line = str.ToCharArray();
            for( int x = 0; x < line.Count(); x++ )
            {
                Arena.Add( new Point( x, y ), line[x].ToString() );
            }
            y++;
        }
    }

    private void DrawArena()
    {
        Console.Clear();
        var d = new Dictionary<Point, string>( Arena );

        d[Position] = "*";
        foreach( KeyValuePair<Point, string> p in d )
        {
            if( p.Key.X == 0 )
                Console.WriteLine();

            Console.Write( p.Value );
        }
        System.Threading.Thread.Sleep( 400 );
    }

    private bool FindTarget()
    {
        DrawArena();

        string chr = Arena[Position];

        switch( chr )
        {
            case "\\":
                if( ( Position.X == Position.X ) && ( Position.Y < OldPosition.Y ) )
                {
                    OffSet( West );
                }
                else if( ( Position.X == Position.X ) && ( Position.Y > OldPosition.Y ) )
                {
                    OffSet( East );
                }
                else if( ( Position.Y == Position.Y ) && ( Position.X > OldPosition.X ) )
                {
                    OffSet( South );
                }
                else
                {
                    OffSet( North );
                }
                if( FindTarget() )
                {
                    return true;
                }
                break;
            case "/":
                if( ( Position.X == Position.X ) && ( Position.Y < OldPosition.Y ) )
                {
                    OffSet( East );
                }
                else if( ( Position.X == Position.X ) && ( Position.Y > OldPosition.Y ) )
                {
                    OffSet( West );
                }
                else if( ( Position.Y == Position.Y ) && ( Position.X > OldPosition.X ) )
                {
                    OffSet( North );
                }
                else
                {
                    OffSet( South );
                }
                if( FindTarget() )
                {
                    return true;
                }
                break;
            case "x":
                return true;
            case "#":
                return false;
        }
        return false;
    }

    private void OffSet( Point p )
    {
        OldPosition = Position;
        do
        {
            Position.Offset( p );
        } while( !OtherChars.Contains( Arena[Position] ) );
    }

    private void FindLaser()
    {
        Position = Arena.Where( x => LaserChars.Contains( x.Value ) ).First().Key;

        switch( Arena[Position] )
        {
            case "^":
                OffSet( North );
                break;
            case "v":
                OffSet( South );
                break;
            case "<":
                OffSet( West );
                break;
            case ">":
                OffSet( East );
                break;
        }
    }
}

2
প্রোগ্রামটির ইনপুট নেওয়া উচিত। স্ট্যান্ডিন থেকে সর্বাধিক
LiraNuna

0

219 পার্ল
আমার Perl সংস্করণ 392 : (i মরীচি লেজার আঘাত ক্ষেত্রে পরিচালনা করতে ছিল) দীর্ঘ 342 টি অক্ষর
আপডেট আমার স্মরণ করার জন্য, ধন্যবাদ হবস tr//, এটি এখন 250 টি অক্ষর আছে:
আপডেট , অপসারণ mমধ্যে m//, দুই পরিবর্তন whileলুপ আনা কয়েকটি সঞ্চয়; এখানে এখন কেবলমাত্র একটি স্থান দরকার।
( L:it;goto Lসমান দৈর্ঘ্য do{it;redo}):

@b=map{($y,$x,$s)=($a,$-[0],$&)if/[<>^v]/;$a++;[split//]}<>;L:$_=$s;$x++if/>/;
$x--if/</;$y++if/v/;$y--if/\^/;$_=$b[$y][$x];die"true\n"if/x/;die"false\n"if
/[<>^v#]/;$s=~tr/<>^v/^v<>/if/\\/;$s=~tr/<>^v/v^></if/\//;goto L

আমি কিছু চাঁচা করেছি, তবে দেরিতে হলেও এটি সবেমাত্র এর সাথে কিছু প্রতিযোগিতা করে।
এটি কিছুটা আরও ভাল দেখাচ্ছে:

#!/usr/bin/perl
@b = map {
    ($y, $x, $s) = ($a, $-[0], $&) if /[<>^v]/;
    $a++;
    [split//]
} <>;
L:
    $_ = $s;
    $x++ if />/;
    $x-- if /</;
    $y++ if /v/;
    $y-- if /\^/;
    $_ = $b[$y][$x];
    die "true\n"  if /x/;
    die "false\n" if /[<>^v#]/;
    $s =~ tr/<>^v/^v<>/ if /\\/;
    $s =~ tr/<>^v/v^></ if /\//;
goto L

আচ্ছা ... সত্যই এটি স্ব স্ব ব্যাখ্যাযোগ্য হওয়া উচিত যদি আপনি বুঝতে পারেন যে এটি @bপ্রতিটি লাইনের অক্ষরের অ্যারে অ্যারে, এবং সাধারণ রেজিএক্সএক্স এবং trবিবৃতিগুলি পড়তে পারে ।


টিপ: আপনি নিজের আয়না কোডটি ছোট করতে পারেন। $_=$s;tr/^v<>/<>^v/এবং $_=$s;tr/v^<>/<>^v/যথাক্রমে এছাড়াও, আপনি প্রয়োজন হবে না mযে m//
hobbs

দুঃখিত, দ্বিতীয়টি তৈরি করুন$_=$s;tr/v^></<>^v/;
ob

আপনার কাছে এখনও বেশ কয়েকটি রয়েছে if m/.../যা if/.../দুটি চরিত্রের একটি পপ সংরক্ষণ করতে পারে ।
hobbs

আপনি দুটি অক্ষর সংরক্ষণ করার y///পরিবর্তে ব্যবহার করতে পারেন tr///
প্ল্যাটিনাম আজুর

0

এফ # - 454 (বা আশেপাশে)

গেমটি দেরি করে ফেলুন, তবে আমার 2 ডি চেষ্টা পোস্ট করা প্রতিহত করতে পারে না।

আপডেট কিছুটা সংশোধিত হয়েছে। ট্রান্সমিটার হিট হলে এখন সঠিকভাবে থামে। সূচিপত্র ব্রায়ান এর সূচী সূচী সূচকের জন্য (লজ্জা যে লাইনটি তাই ভার্বোস)। কনডোল থেকে ফিরে আসার জন্য কীভাবে ReadToEnd পেতে হবে আমি বাস্তবে কাজ করতে পারি নি, তাই আমি সেই বিটটিকে আস্থার উপর নিয়ে যাচ্ছি ...

আমি এই উত্তরটি নিয়ে সন্তুষ্ট, যদিও এটি যথেষ্ট সংক্ষিপ্ত, এটি এখনও যথেষ্ট পাঠযোগ্য read

let s=System.Console.In.ReadToEnd()       //(Not sure how to get this to work!)
let w=s.IndexOf('\n')+1                   //width
let h=(s.Length+1)/w                      //height
//wodge into a 2d array
let a=Microsoft.FSharp.Collections.Array2D.init h (w-1)(fun y x -> s.[y*w+x])
let p=s.IndexOfAny[|'^';'<';'>';'v'|]     //get start pos
let (dx,dy)=                              //get initial direction
 match "^<>v".IndexOf(s.[p]) with
 |0->(0,-1)
 |1->(-1,0)
 |2->(1,0)
 |_->(0,1)
let mutable(x,y)=(p%w,p/w)                //translate into x,y coords
let rec f(dx,dy)=
 x<-x+dx;y<-y+dy                          //mutate coords on each call
 match a.[y,x] with
 |' '->f(dx,dy)                           //keep going same direction
 |'/'->f(-dy,-dx)                         //switch dx/dy and change sign
 |'\\'->f(dy,dx)                          //switch dx/dy and keep sign
 |'x'->"true"
 |_->"false"
System.Console.Write(f(dx,dy))

তারা সাজসজ্জা হয়। আমার অন্যান্য চ্যালেঞ্জগুলি পরীক্ষা করুন, এটি কেবল একটি ফর্ম্যাট করার জিনিস।
লীরাণুনা

@ লীরানা, ঠিক যেমনটি দেখা যাচ্ছে, এই পুনরাবৃত্তি কেবল তাদের যাইহোক খায় :)
বেনজল

1-ডি বাস্তবায়নের সাথে তুলনা করতে ভাল লাগবে। বাম এবং ডানদের জন্য কেবল 1 যোগ / বিয়োগ করুন এবং উপরে এবং নীচে ডাব্লু / বিয়োগ করুন। আমি আশা করছিলাম আপনি বেশ কয়েকটি অক্ষর সংরক্ষণ করবেন
জন লা রুই

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