লেজার মিরর পোর্টাল পার্টি


27

একটি 2 ডি বোর্ড হবে নিম্নলিখিত বস্তু উপস্থিত:

  • ^, >, v, অথবা <: মুখোমুখি বিকিরণকারী একটি লেজার, ডান, নিচে, বা যথাক্রমে ত্যাগ করেন। একের বেশি থাকতে পারে। লেজারগুলি খালি জায়গায় একটি সরলরেখায় ভ্রমণ করবে (ফাঁকা স্থানটি একটি বিন্দুর সাথে উপস্থাপন করা হয় .)। লেজারগুলি ইমিটারগুলির মধ্য দিয়ে যায় না।
  • *: একটি লক্ষ্য। লেজারগুলি লক্ষ্যবস্তু দিয়ে যায় pass একের বেশি থাকতে পারে।

বোর্ড পারে নিম্নলিখিত বস্তু উপস্থিত:

  • @: একটি শক্ত প্রাচীর। লেজারটি এখানে দিয়ে যাবে না।
  • \: একটি বাম দিকে ঝোঁক প্রতিফলক। নিম্নলিখিত টেবিল অনুযায়ী লেজারের দিক পরিবর্তন করে:

    Direction laser is travelling     Direction of laser after hitting reflector
    Up                                Left
    Right                             Down
    Down                              Right
    Left                              Up
    

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

  • /: একটি ডান দিকে ঝুঁকির প্রতিফলক। নিম্নলিখিত টেবিল অনুযায়ী লেজারের দিক পরিবর্তন করে:

    Direction laser is travelling     Direction of laser after hitting reflector
    Up                                Right
    Right                             Up
    Down                              Left
    Left                              Down
    
  • 1, 2, 3... 9: একটি পোর্টাল । নম্বরটি পোর্টালের চ্যানেলকে নির্দেশ করে - একই চ্যানেলের ঠিক দুটি পোর্টাল থাকবে (উদাহরণস্বরূপ, তিনটি হবে না 1)। পোর্টালটি লেজারগুলির অবস্থান একই চ্যানেলের অন্যান্য পোর্টালের অবস্থানে পরিবর্তন করে । এই ক্ষেত্রে:

    >     1     @     1     *
    

    লেজারটি লক্ষ্যবস্তুতে আঘাত করবে কারণ এটি যখন প্রথমটি হিট করে 1, তখন এটি 1অন্য দিকে দ্বিতীয় দিকে টেলিপোর্ট করা হয় । লেজাররা আগের দিকে একই দিকটি ধরে রেখেছে।

    একটি পোর্টাল লেজারটি অন্য কোনও চ্যানেলের পোর্টালে 1টেলিপোর্ট করবে না (যেমন একটি লেজারটিকে একটিতে টেলিপোর্ট করবে না) 9

আপনার প্রোগ্রামটি ইনপুট হিসাবে বোর্ডের একটি 2D প্রতিনিধিত্ব প্রাপ্ত করবে। বোর্ডটি সর্বদা আয়তক্ষেত্রাকার আকারের হবে। আউটপুটটি হওয়া উচিত Trueযদি সমস্ত টার্গেটের লেজারগুলি তাদের মধ্য দিয়ে যায় বা Falseঅন্যথায় হয়।

এখানে কিছু পরীক্ষার মামলা রয়েছে:

  1. ইনপুট

    >....\
    ..*...
    >./../
    ..*...
    

    আউটপুট

    True
    
  2. ইনপুট

    >..........\
    1........../
    2..........1
    3..........2
    4..........3
    5..........4
    6..........5
    7..........6
    8..........7
    9..........8
    *..........9
    

    আউটপুট

    True
    
  3. ইনপুট

    >.@............*
    >..@...........*
    >...@..........*
    >....@.........*
    >.....@........*
    >...*..@........
    >.......@......*
    

    আউটপুট

    False
    
  4. ইনপুট

    ../\.
    >./**
    

    আউটপুট

    False
    
  5. ইনপুট

    /.......*.......\/3.....
    @..............//\.\....
    *.............2\.1\/\...
    \..............///.....<
    .........*...//\\/.....\
    >.............\.1.///.4.
    4.......*/...\2\/3/\/..^
    

    আউটপুট

    True
    
  6. ইনপুট

    vvvvvvvvvvvvvvvvv
    \\\\\\\\\\\\\\\\\
    /////////////////
    \\\\\\\\\\\\\\\\\
    /////////////////
    \\\\\\\\\\\\\\\\\
    /////////////////
    *****************
    

    আউটপুট (ডানদিকে লক্ষ্য লক্ষ করুন)

    False
    

ডান-ঝুঁকির প্রতিফলক (/) বাম (am) থেকে নীচে (↓) একটি লেজার রশ্মির দিক পরিবর্তন করলে কী আরও বোঝা যায় না?
squeamish ossifrage

@ স্ক্যামিশ ওসিফ্রেজ আমি দুঃখিত, আমি আপনার প্রশ্ন বুঝতে পারি না। কোনটি প্রতিফলন বাম পক্ষপাতী প্রতিফলক টেবিল কি আপনি কি মনে করেন এই রুল ভুল?
সোমরস

আমি মনে করি আপনি বাম এবং ডান মিশ্রিত হয়েছেন
squeamish ossifrage

1
লেজারটি গ্রিডের সীমানায় পৌঁছে গেলে কী হবে?
ডেভিডজি

2
@ ডেভিডজি কিছুই নয়, বা এটি যেভাবে এসেছিল তা ফিরিয়ে দেয়। (এ ক্ষেত্রে এগুলি সমতুল্য)। এটি 'চারপাশে মোড়ানো' উদাহরণ হিসাবে 6 থেকে দেখা যায় না
ডেনিস জহিরউদ্দিন

উত্তর:


8

পাইথন, 310 302 287 278 277 260

আমি মনে করি বিদ্যমান পাইথন পোস্টের তুলনায় মূলত পৃথক নয়, তবে এর একটি বা দুটি উল্লেখযোগ্য কৌশল রয়েছে। এটি "নন-টার্মিনেটিং" ইনপুট যেমন পরিচালনা করে 1>1 সম্পাদনা : উফ! emitters ব্লক লেজার

def t(b):
 w=len(b[0])+1;B=list('@'*w+'@'.join(b));i=l=len(B);C="<>^v@"
 while i:
    j=l-i;i-=1;d=C.find(B[j]);c='.'
    while c not in C:
     if'+'>c:B[j]='.'
     if'0'<c<C:j=(B*2).index(c,j+1)%l
     elif'.'<c:d^=2+(c<C)
     j-=[1,-1,w,-w,j][d];c=B[j%l]
 return'*'not in B

t স্ট্রিংগুলির একটি তালিকা (ইনপুট লাইনগুলি) নেয় এবং একটি বুলিয়ান ফলাফল দেয়।

কোডটি গল্ফ করে দেওয়া হচ্ছে একটি দুর্দান্ত জিআইএফ:

এখানে চিত্র বর্ণনা লিখুন

সম্পাদনা : উইল এর Awsome gif সৌজন্যে। ধন্যবাদ উইল!


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

4
@ ভিজুয়েলমেলন: নিয়মগুলি সময়-প্রতিসাম্যযুক্ত দাগগুলি ব্যতীত যেখানে লেজারগুলি জন্মগ্রহণ করে বা মারা যায়, যার অর্থ সবকিছু শেষ করতে হয় (যেহেতু আপনি সর্বদা অনন্যভাবে এটি আবিষ্কার করতে পারেন যেখানে এটি জন্মগ্রহণ করেছিল এবং এটি নির্গমনকারীরা নিজেরাই অংশ হতে পারে না) একটি লুপ)।
মীখা

@ মিচা হিহ, যথাযথ ব্যাখ্যার জন্য ধন্যবাদ, যেমন আমি বলেছিলাম যে আমি স্বজ্ঞাততা নিয়ে চলেছি এবং এ সম্পর্কে খুব বেশি চিন্তা করি না, আমার বাক্সে অন্য একটি সরঞ্জাম রাখার জন্য ধন্যবাদ।
ভিজ্যুমেলন

হ্যাঁ, আমি এটি ভুল পড়েছি।
Ell

হ্যাটস অফ এলে! খুব সুন্দরভাবে সম্পন্ন হয়েছে। আমি মনে করি আপনি .find(d)-1 পাওয়া না গেলে এই সত্যটি ব্যবহার করে আপনি আরও কয়েকটি বাইট শেভ করতে পারেন । আপনি যদি if-1<d:বিবৃতিটি সরিয়ে থাকেন এবং পরিবর্তে লুপটির j+=[-1,1,w,-w,-i][d]শীর্ষে করেন, তবে একটি পাওয়া যায় না -1 সেই অ্যারেতে সর্বশেষ উপাদান যুক্ত jকরবে j, যা 0 করবে , যা আমরা জানি @...?
হবে

7

পার্ল, 647

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

আমি প্রচুর পরীক্ষা করিনি, তবে আমি মনে করি এটি প্রতিটি ক্ষেত্রে পরিচালনা করা উচিত।

গ্রিডটি STDIN এর মাধ্যমে ইনপুট। ইনপুটটিতে কমপক্ষে একটি নতুন লাইন থাকতে হবে (অর্থাত্ একটি নতুন সারি ছাড়াই একটি সারি কাজ করবে না)।

%s=(d,'[|+#$vk%ZX]',u,'[|+#$^W%KX]',r,'[-G+#>k%KX]',l,'[-G+#<W%ZX]');%o=(d,'[-.*G/k\\\\Z',u,'[-.*G/W\\\\K',r,'[|.*$\\\\/kK',l,'[|.*$\\\\/ZW');for$d(d,u,r,l){$o{$d}.='123456789qwertyuio]'}%u=(d,'.|-+*$G#/Wk%\KZX',u,'.|-+*$G#/kW%\ZKX',r,'.-|+*G$#/Wk%\ZKX',l,'.-|+*G$#/kW%\KZX');@q=split//,"qwertyuio";local$/;$_=<STDIN>;for$i(1..9){$m{$i}=$q[$i-1];$m{$m{$i}}=$i;s/$i/$m{$i}/e}/.*?\n/;$l='.'x((length$&)-1);do{$c=0;for$d(d,u,r,l){%p=(d,"(?<=$s{d}$l)$o{d}",u,"$o{u}(?=$l$s{u})",r,"(?<=$s{r})$o{r}",l,"$o{l}(?=$s{l})");%h=split//,$u{$d};$c+=s!$p{$d}!$h{$&}||($v=$&,($o{$d}=~s/$v// && $s{$d}=~s/]/$m{$v}]/),$v)!es}}while($c);print/\*/?"False\n":"True\n"

ব্যাখ্যা: লেজারগুলি এর মধ্য দিয়ে যাওয়ার সাথে সাথে কোডটি পুনরাবৃত্তভাবে গ্রিড স্ট্রিং আপডেট করে। -একটি অনুভূমিক লেজার প্রতিনিধিত্ব |একটি উল্লম্ব লেজার, +অতিক্রম লেজার, Kএকটি \একটি লেজার শীর্ষ, বন্ধ প্রাণচঞ্চল সঙ্গে আয়না kএকটি /একটি লেজার নীচে, বন্ধ প্রাণচঞ্চল সঙ্গে আয়না Zএকটি \একটি লেজার নীচে বন্ধ প্রাণচঞ্চল সঙ্গে আয়না, এবং Wএকটি /আয়না একটি লেজার বন্ধ প্রাণচঞ্চল সঙ্গে শীর্ষ. উভয় পক্ষের লেজার সহ %একটি /আয়না, যখন উভয় পক্ষের লেজারগুলির সাথে Xএকটি \আয়না। (এটি কেস সংবেদনশীল। আমি এমন চিঠিগুলি বেছে নেওয়ার চেষ্টা করেছি যা কিছুটা উপযুক্ত মনে হয় - উদাহরণস্বরূপ, kএবংKকিছুটা সুস্পষ্ট পছন্দ - তবে দুর্ভাগ্যক্রমে প্রভাবটি আসলে তেমন সহায়ক নয়। আমার এই তথ্যটি একটি টেবিলের মধ্যে রাখা উচিত, তবে আমি এখনই ক্লান্ত হয়ে পড়েছি))

একইভাবে পোর্টালগুলি হ্যান্ডলিং করা (যেমন প্রতিটি অঙ্ককে সম্ভাব্য ইনপুট / আউটপুট লেজার পজিশনের উপর ভিত্তি করে অতিরিক্ত অক্ষরের একটি সেট নির্ধারণের জন্য) 144 টি অক্ষর (মূল 9 সহ) প্রয়োজন হবে, সুতরাং পরিবর্তে, যখন কোনও লেজার একটি "ইনপুট" পোর্টালে আঘাত করে, আমি অক্ষরের সেটগুলিতে "আউটপুট" পোর্টাল অক্ষর যুক্ত করি যা সঠিক দিকটিতে একটি লেজার নির্গত করে। (এটির জন্য ইনপুট এবং আউটপুট পোর্টালগুলির মধ্যে পার্থক্য প্রয়োজন; আমি এর qwertyuioজন্য চিঠিগুলি ব্যবহার করেছি))

কিছুটা অন-গল্ফযুক্ত, মুদ্রণ বিবৃতি সহ যাতে আপনি প্রতিস্থাপনাগুলি ঘটতে পারেন (প্রতিটি প্রতিস্থাপন লেজার-অগ্রগতির একটি "গোলাকার" উপস্থাপন করে) এবং মূলটিতে gপতাকাটি যুক্ত করা হয় s///যাতে এটি এত বেশি পুনরাবৃত্তি না নেয়:

# Throughout, d,u,r,l represents lasers going down, up, left, or right
# `sources` are the character classes representing laser "sources" (i.e. any
# character that can, on the next round, cause a laser to enter the space
# immediately adjacent to it in the proper direction)
%sources=(d,'[|+#$vk%ZX]',u,'[|+#$^W%KX]',r,'[-G+#>k%KX]',l,'[-G+#<W%ZX]');
# `open` characters will not block a laser
%open=(d,'[-.*G/k\\\\Z',u,'[-.*G/W\\\\K',r,'[|.*$\\\\/kK',l,'[|.*$\\\\/ZW');
# One of each portal is changed into the corresponding letter in `qwertyuio`.
# At the start, each portal is 'open' and none of them is a source.
for$d(d,u,r,l){$open{$d}.='123456789qwertyuio]'}
# A mapping of 'open' characters to the characters they become when a laser
# goes through them. (This is used like a hash of hashes; see the assignment
# of `%h` below.)
%update=(d,'.|-+*$G#/Wk%\KZX',
    u,'.|-+*$G#/kW%\ZKX',
    r,'.-|+*G$#/Wk%\ZKX',
    l,'.-|+*G$#/kW%\KZX');
@q=split//,"qwertyuio";
local$/;$_=<STDIN>;
for$i(1..9){
    $m{$i}=$q[$i-1];
    $m{$m{$i}}=$i;
    s/$i/$m{$i}/e}
print "After substituting portals:\n";
print;
print "\n";
# Find the number of characters in each line and create a string of `.`'s,
# which will be used to correlate characters above/below one another in the
# grid with each other.
/.*?\n/;
$l='.'x((length$&)-1);
do{
    $changes=0;
    for$d(d,u,r,l){
        # `patterns` is a mapping from each direction to the regex representing
        # an update that must occur (i.e. a place where a laser must progress).
        # Each pattern is either a lookahead or lookbehind plus the necessary
        # "open" character class.
        %patterns=(d,"(?<=$sources{d}$l)$open{d}",
            u,"$open{u}(?=$l$sources{u})",
            r,"(?<=$sources{r})$open{r}",
            l,"$open{l}(?=$sources{l})");
        %h=split//,$update{$d};
        # Match against the pattern for each direction. Note whether any
        # matches were found.
        $changes+=s!$patterns{$d}!
            # If the "open" character for a map is in the `update` map, return
            # the corresponding value. Otherwise, the "open" character is a
            # portal.
            $h{$&} || ($v=$&,
                        # For portals, remove the input portal from the
                        # proper "open" list and add the output portal to
                        # the proper "source" list.
                       ($open{$d}=~s/$v// && $sources{$d}=~s/]/$m{$v}]/),
                       $v)
                    # This whole substitution should allow `.` to match
                    # newlines (see the definition of `$l` above), and the
                    # replacement must be an expression rather than a string
                    # to facilitate the portal logic. The `g` allows multiple
                    # updates per "frame"; it is left out of the golfed code.
                    !egs
    }
    # Print the next "frame".
    print;
    print "\n";
# Continue updating until no "open" spaces are found.
}while($changes);
# Print whether `*` is still present in the input.
print/\*/?"False\n":"True\n"

আমি পাইথনে এই ধরণের পদ্ধতির (রেগেক্সের পরিবর্তে বুল অ্যারে ব্যবহার করে) পরীক্ষা-নিরীক্ষা করেছি তবে এই ছোটটির কাছাকাছি কোথাও যেতে পারিনি। আমি মনে করি এটি সত্যিই চিন্তা-ভাবনা করার উপায়! আমার প্রচেষ্টাগুলি ভুল vid youtube.com/watch?v=a9xAKttWgP4 এবং petercollingridge.co.uk/blog/python-game-of- Life -in-one-line- এর সাহায্যে catpad.net/michael/apl দ্বারা ভুলভাবে প্রভাবিত হয়েছিল
হবে

1
@ উইল থ্যাঙ্কস! আমি স্পষ্টতই বুঝতে পেরেছিলাম যে জেএল-এর সাথে আমার পোর্টালের অভ্যন্তরে লেজারগুলির প্রতিটি সম্ভাব্য সংমিশ্রণের জন্য একটি পৃথক চরিত্র ব্যবহার করা কতটা সম্ভব সম্ভব কাজ করার সময় আমার প্রচেষ্টাগুলি কতটা একই রকম ছিল। আমি মনে করি আমি আরও কয়েকটি চরিত্রের শেভ করতে সক্ষম হতে পারি, তবে ... এটি স্পষ্টতই অনুকূল পন্থা নয়!
কাইল স্ট্র্যান্ড

এছাড়াও, যদি কেউ প্রথম কয়েকটি লাইনে চরিত্রের ক্লাসে ট্রিপল-পলাতক ব্যক্তিকে পরিচালনা করার আরও ভাল উপায় জানে তবে তা সুন্দর হবে ...
কাইল স্ট্র্যান্ড

6

পাইথন 338 351

def t(b):
 L=len;w=L(b[0])+3;b=list("@"*w+"@@".join(b)+"@"*w);w-=1;I=b.index
 for i in range(L(b)):
  c=b[i];d={"^":-w,"<":-1,">":1,"v":w}.get(c)
  if d:
   while c!='@':
    i+=d;c=b[i]
    if c=='*':b[i]='.'
    elif c in '/\\':d={-w:-1,w:1,1:w,-1:-w}[d]*(-1 if c=='/' else 1)
    elif c>'0':i+=I(c)-i or I(c,i+1)-i
 return "*" not in b

আমার আনমিনিফাইড সংস্করণটি বোর্ডে লেজার পাথগুলি প্লট করে যা সুন্দর:

>-+--\
..X..|
>-/--/
..X...

>----------\
1----------/
2----------1
3----------2
4----------3
5----------4
6----------5
7----------6
8----------7
9----------8
X----------9

>-@............*
>--@...........*
>---@..........*
>----@.........*
>-----@........*
>---X--@........
>-------@......*

/-------X+------\/3.....
@........|.....//\+\....
X........|....2\+1\/\...
\--------+----+///+++--<
.........X...//\\/+++--\
>--------+---+\+1+///-4|
4-------X/...\2\/3/\/..^

vvvvvvvvvvvvvvvvv
\\\\\\\\\\\\\\\\\
/////////////////
\\\\\\\\\\\\\\\\\
/////////////////
\\\\\\\\\\\\\\\\\
/////////////////
XXXXXXXXXXXXXXXX*

def debug(board,x,y):
    emit_dir = {
        "^":    ( 0, -1),
        "<":    (-1,  0),
        ">":    ( 1,  0),
        "v":    ( 0,  1),
    }
    class PortalException(Exception): pass
    xdir, ydir = emit_dir[board[y][x]]
    while True:
        # print "step (%d, %d) (%d, %d)" % (x, y, xdir, ydir)
        x += xdir
        y += ydir
        if y < 0 or y >= len(board) or x < 0 or x >= len(board[y]):
            return
        ch = board[y][x]
        if ch == '/':
            xdir, ydir = -ydir, -xdir
        elif ch == '\\':
            xdir, ydir = ydir, xdir
        elif ch in '@^><v':
            return
        elif ch == '*':
            board[y] = board[y][:x] + 'X' + board[y][x+1:]
        elif ch in '.-|':
            ch = ('-' if xdir else '|') if ch == '.' else '+'
            board[y] = board[y][:x] + ch + board[y][x+1:]
        elif ch in '123456789':
            try:
                for r in range(len(board)):
                    for c in range(len(board[r])):
                        if board[r][c] == ch and (r != y or c != x):
                            x, y = c, r
                            raise PortalException()
                raise Exception("could not find portal %s (%d,%d)" % (ch, x, y))
            except PortalException:
                pass

5

সি # - 515 414 400 বাইট

সম্পূর্ণ সি # প্রোগ্রাম, উইলের মতো সুন্দর আউটপুট নেই। প্রতিটি পৃথকভাবে নির্গত প্রতিটিের জন্য লেজারের পথ অনুসরণ করে এবং আমরা কোন কোষে পরিদর্শন করেছি সেগুলির একটি অ্যারে রেখে কাজ করে যাতে আমরা পরীক্ষা করে দেখতে পারি যে আমরা শেষে সমস্ত তারা দেখেছি। সম্পাদনা করুন: 1D তৈরি করে এবং বর্তমানের চরটি সংরক্ষণের জন্য কোনও int এর পরিবর্তে একটি অক্ষর ব্যবহার করে বিপুল সংখ্যক বাইটগুলি স্ট্রাইপ করুন

ডাব্লু0এলএফ আমাকে মনে করিয়ে দিয়েছিল যে আমার কোডের ঠিক মাঝখানে আমার লুপের নীচে ব্যবহার হয়েছিল, তাই আমি বুঝতে পেরেছিলাম যে আমি আরও একবার চেষ্টা করব এবং এটিকে কাজ করে দেব, এবং এখন আমি নিরঙ্কুশতম ন্যূনতম সংখ্যায় কোঁকড়ানো ধনুর্বন্ধনী। আমি লুপের জন্য দ্বিতীয়টির পচে যাওয়া পছন্দ করার ভান করব না, কোডটি এখন মারাত্মকভাবে বিশৃঙ্খলাযুক্ত, তবে এটি কয়েকটি বাইট সংরক্ষণ করেছে। প্রক্রিয়াটিতে আমি পোর্টাল হ্যান্ডলিংটি আবার লিখেছি। আমি একীভূত শর্তসাপেক্ষ অপারেশন না করে নেস্টেড দিয়ে "চাল" সঞ্চালনের জন্য একটি ছোট পদ্ধতিও পেয়েছি।

গল্ফ কোড:

using C=System.Console;class P{static void Main(){var S=C.In.ReadToEnd().Replace("\r","");int W=S.IndexOf('\n')+1,l=S.Length,i=l,d,m,n;var M=new int[l];for(char c;i-->0;)for(d="^<v>".IndexOf(c=S[m=i]);c>14&d>-1;d=(m+=d==2?W:d>0?d-2:-W)>=0&m<l&&"@^<v>".IndexOf(c=S[m])<0?d:-1)for(d=c==47?3-d:c==92?d^1:d,M[n=m]=1;c%49<9&&(m=S.IndexOf(c,m+1))==n|m<0;);for(;l-->0;)W*=S[l]==42?M[l]:1;C.WriteLine(W>0);}}

কম গল্ফ কোড:

using C=System.Console;

class P
{
    static void Main()
    {
        var S=C.In.ReadToEnd().Replace("\r",""); // read the grid, remove pesky carriage returns
        int W=S.IndexOf('\n')+1,l=S.Length,i=l,d,m,n; // find "width"
        var M=new int[l]; // defaults to 0s

        for(char c;i-->0;) // for each cell

            for(d="^<v>".IndexOf(c=S[m=i]); // find initial direction, if any
                c>14&d>-1; // loop only if we have direction
                d=(m+=d==2?W:d>0?d-2:-W) // move (after iteration)
                >=0&m<l&&"@^<v>".IndexOf(c=S[m])<0?d:-1) // terminate if we hit something or go off edge

                for(d=c==47?3-d:c==92?d^1:d, // mirrors
                    M[n=m]=1; // we have seen this spot
                    c%49<9&&(m=S.IndexOf(c,m+1))==n|m<0;); // portals

        for(;l-->0;) // for each cell
            W*=S[l]==42?M[l]:1; // if *, then mul by whether seen

        C.WriteLine(W>0);
    }
}

নতুন পোর্টাল হ্যান্ডলিং কোডটি সত্য যে স্ট্রিং.ইনডেক্সফ ফাংশনটি সুখে ফিরে আসে -1 (অর্থাত্ অক্ষরটি পাওয়া যায় নি) যদি আপনি স্ট্রিংয়ের বাইরে 1 টি অক্ষর দেখা শুরু করতে বলেন (আপনি যদি এর বাইরে আরও কিছু শুরু করতে বলেন তবে একটি ব্যতিক্রম ছোঁড়ে)) এটি আমার কাছে খবর, তবে এই পরিস্থিতিতে এটি অত্যন্ত সুবিধাজনক ছিল।


+1 দুর্দান্ত গল্ফিং! আমি শুধু একটি কৌতুক মনে: আপনি গ্রহণ করতে পারে m+=(d>0?d-2:0)+(d<3?d-1:0)*W;এবং এটা ঠেলা for, এরকম: for(char c;i-->0;m+=(d>0?d-2:0)+(d<3?d-1:0)*W)। এইভাবে, আপনি একটি চর সংরক্ষণ করবেন, কারণ আপনি একটি সেমিকোলন হারাবেন।
ক্রিশ্চিয়ান লুপাস্কু

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