আপনি ক্রাশ না করে লুপ করতে পারেন?


14

আমাদের মধ্যে অনেকেই ট্রোন গেমটির সাথে পরিচিত। আপনি গ্রিডে রাখা একটি "লাইট সাইকেল" নিয়ন্ত্রণ করেন। লাইট সাইকেল সর্বদা এগিয়ে যায় (যদিও আপনি দিকটি নিয়ন্ত্রণ করেন) এবং এর পিছনে একটি স্থায়ী পথ ছেড়ে দেয়। আপনি যদি কোনও ট্রেইলে চলে যান তবে আপনি ক্রাশ!

এখানে লক্ষ্যটি নির্ধারণ করা হয় যে প্রদত্ত পথটি একটি বৈধ লুপ কিনা, এটি "ক্র্যাশিং" না করেই তার শুরুতে ফিরে আসে। এটি করার জন্য, আমরা ধরে নিই আমরা পয়েন্টে শুরু করি (0,0)। একটি ইনপুট আকারে দেওয়া হয় N2E1S2W1অঙ্কবাচক দিকনির্দেশ (একটি সিরিজ সঙ্গে, Nহয় north, Eহয় east, ইত্যাদি), প্রতিটি ভ্রমণ দূরত্ব যে দিক অনুসরণ। এই উদাহরণে, আপনি ভ্রমণ করবে

N2 : North 2 to (0,2)
E1 : East 1  to (1,2)
S2 : South 2 to (1,0)
W1 : West 1  to (0,0)

কোনও পাথকে বৈধ হিসাবে বিবেচনা করা হয় যদি এটি (0,0)অন্য কোনও স্থানাঙ্কের একাধিকবার না গিয়ে শেষ হয় (এটি (0,0)ঠিক দু'বার পরিদর্শন করে। একবার একবার শুরুতে এবং একবারে শেষে)। উপরোক্ত উদাহরণের চেয়ে মনে রাখবেন, থেকে পেতে (0,0)করতে (0,2), আমরা অগত্যা যান (0,1)হিসাবে ভাল।

অন্যান্য উদাহরণ:

input        -> output
N1E1S1W1     -> true
N1E1N1E1S2W2 -> true
N1S1E1W1     -> false     // Visits (0,0) 3 times
N4E2S2W4S2E2 -> false     // Visits (0,2) twice
N3E2S3       -> false     // Does not return to (0,0)
N1S1         -> anything  //I don't care how you evaluate this case

আপনার ফলাফল আউটপুট যেকোন ফর্মে থাকতে পারে যতক্ষণ না এটি কোনও সত্যবাদী বা মিথ্যা মানের জন্য একই আউটপুট দেয়।

ইনপুটটি স্ট্রিং হিসাবে বা অক্ষরের একটি তালিকা হিসাবে নেওয়া যেতে পারে, হয় ফর্মে S1N2E3... বা SNNEEE... গ্রিডের আকারের কোনও কঠোর সীমাও নেই, তবে ধরে নিন ইনপুটটি কোনও কিছুর উপচে পড়ছে না। যতক্ষণ না কোডটি মৌলিকভাবে সাধ্য থাকে ততক্ষণ এর মতো কেসগুলি পরিচালনা করা খুব গুরুত্বপূর্ণ নয় N99999999999999

উল্লেখ্য: আপনি মামলা মূল্যায়ন করতে পারে N1S1, E1W1, S1N1, এবং W1E1তবে আপনি চাই। এগুলি প্রযুক্তিগতভাবে বৈধ পাথ, তবে তারা চ্যালেঞ্জের "ট্রোন" স্পিরিটের বিরুদ্ধে go

স্কোরিং

এটি , তাই সংক্ষিপ্ত উত্তরটি জেতে!


N1S1আপনার সংজ্ঞাগুলির সাথে সামঞ্জস্য হওয়ার জন্য সত্য হওয়া উচিত কারণ এটি (0, 0)দ্বিগুণ এবং (0, 1)একবারে পৌঁছে যায় যা আপনার সংজ্ঞা অনুসারে বৈধ।
হাইপারনিউটারিনো

আমি কি Nহিসাবে নিতে পারি 1j, Eহিসাবে 1, Sহিসাবে -1jএবং Wহিসাবে -1?
লিকি নুন

@ ল্যাকইনুন আমি মনে করি আমি এটির সাথে ঠিক আছি, যেহেতু প্রত্যেকেরই কমবেশি এইভাবে কিছু করা উচিত। কেবলমাত্র আপনার উত্তরে তা নির্দিষ্ট করে নিন।
লর্ড ফারকোয়াড

1
@ হাইপারনিউট্রিনো তবে ট্রোন দৃষ্টিকোণ থেকে আপনার লাইট সাইকেল দু'বার (০, ০.০) পেরিয়ে যায়, এমনকি যদি ইনপুট আপনাকে কখনই এ জাতীয় বিন্দুতে রাখে না। এ কারণেই আমি মনে করি যে একটির নমনীয় আউটপুট রয়েছে (যদিও বেশিরভাগ ভাষার পক্ষে এটি সত্যে ফিরে আসা সহজতর হবে)
মান কালি

1
@ সটেনবার্গ (0,0) কোণে নেই, তাই আপনি এর নীচে বা বাম দিকে যেতে পারেন; এমনকি যদি আপনি পাগল বোধ করছেন! এছাড়াও, গ্রিডের আকারের কোনও কঠোর সীমা নেই, তবে কেবল ধরে নিন যে ইনপুটটি কোনও কিছুর উপচে পড়ছে না। যতক্ষণ না কোডটি মৌলিকভাবে সাবলীল, ততক্ষণ যদি তা ইনপুটগুলি হ্যান্ডেল করতে না পারে N99999999999999
সেদিকে আমার খেয়াল নেই

উত্তর:



6

জাভাস্ক্রিপ্ট, 247 200 বাইট

n=s=>{r=s.match(/\w\d+/g)
x=y=z=0
e=""
for(d of r){a=d[0]
b=d.slice(1)
while(b--){
y+=a=="N"
y-=a=="S"
x+=a=="E"
x-=a=="W"
p=[x,y]+";"
if(~e.indexOf(p))if(!x&!y)z++
else return 0
e+=p}}return!x&!y&!z}

nইনপুট স্ট্রিংয়ের একটি ফাংশন যা সত্য এবং মিথ্যা জন্য sপ্রত্যাবর্তন করে10

রেফারেন্স / ব্যাখ্যার জন্য এখানে একটি অবারিত সংস্করণ:

function n(s)
{
    var dir = s.match(/\w\d+/g);
    var x = y = z = 0;
    var been = "";
    for (d of dir)
    {
        var a = d[0];
        var b = 1*d.substring(1);
        while(b-- > 0)
        {
            if (a == "N") y++;
            if (a == "S") y--;
            if (a == "E") x++;
            if (a == "W") x--;
            var pt = [x,y] + ";";
            if (~been.indexOf(pt))
                if (x==0 && y==0)
                    z++;
                else
                    return false;
            been += pt;
        }
    }
    return (x == 0 && y==0 && z == 0);
}

n=s=>{r=s.match(/\w\d+/g)
x=y=z=0
e=""
for(d of r){a=d[0]
b=d.slice(1)
while(b--){
y+=a=="N"
y-=a=="S"
x+=a=="E"
x-=a=="W"
p=[x,y]+";"
if(~e.indexOf(p))if(!x&!y)z++
else return 0
e+=p}}return!x&!y&!z}

console.log(n("N1E1S1W1"))
console.log(n("N1E1N1E1S2W2"))
console.log(n("N1S1E1W1"))
console.log(n("N4E2S2W4S2E2"))
console.log(n("N3E2S3"))



বিষয়টি লক্ষ্য করেনি, ধন্যবাদ
ওয়াফললকন

দেখে মনে containsহচ্ছে জাভাস্ক্রিপ্টের কোনও উপভাষায় এটি কোনও ফাংশন নয়। আপনি উপভাষা নির্দিষ্ট করতে পারেন?
লিকি নুন

আমি পরীক্ষার জন্য ক্রোম কনসোলটি ব্যবহার করছিলাম - এটি পুরোপুরি সেখানে কাজ করে
WaffleCohn

আসলে এটি আমার ক্রোম কনসোলেও কাজ করে ... তবে সম্ভবত আপনি এটিকে আরও সার্বজনীন উত্তরে রূপান্তর করতে বিবেচনা করবেন?
লিকি নুন

5

পাইথন 3 , 236 161 150 বাইট

import re
p=0
a=[]
for i in''.join(s[0]*int(s[1:])for s in re.findall(r".\d+",input())):p+=1j**"NESW".find(i);a+=[p]
print(len({*a})-len(a)==0==a[-1])

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

লিকি নুনকে -75 বাইট ধন্যবাদ
-11 বাইটগুলি লিক নুন বা ধন্যবাদ, যদি আমাদের রান দৈর্ঘ্যের ডিকোডেড জটিল সংখ্যার তালিকা হিসাবে ইনপুট নিতে দেওয়া হয়:

পাইথন 2 , 85 73 বাইট

c=0;k=[]
for i in input():c+=i;k+=[c]
print(k[-1]==0==len(set(k))-len(k))

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

-12 বাইটস মিঃ এক্সকোডারকে ধন্যবাদ জানায় / -9 বাইটস লিকি নুনকে ধন্যবাদ (একটি সম্পাদনায় মার্জড)

এটি আমার পক্ষে খুব দীর্ঘ অনুভূতি


3
যতক্ষণ এটি পাইথ সলিউশন থেকে 10 গুণ কম হয়, এটি খুব বেশি দীর্ঘ নয়।
ফাঁস নুন

@ লেকিউন লল ঠিক আছে: পি
হাইপার নিউট্রিনো


পছন্দ করুন খুব দীর্ঘ দেখুন, যেমনটি আমি বলেছিলাম: পি
হাইপার নিউট্রিনো


3

জেলি , 14 12 বাইট

Œṙ+\µQ⁼ȧṛ/¬$

জেলিতে এটি আমার প্রথম গল্ফ। পরামর্শ স্বাগত জানাই।

ইনপুট [direction, distance]জোড়াগুলির অ্যারে হিসাবে , যেখানে দিকটি একটি জটিল সংখ্যা হিসাবে দেওয়া হয়।

ব্যাখ্যা:

Œṙ+\µÇȧṛ/¬$   Main link. Argument: n     = [[i, 3], [1, 2], [-i, 3]]
Œṙ            Run-length decode          = [i, i, i, 1, 1, -i, -i, -i]
  +\          Cumulative sum             = [i, 2i, 3i, 3i+1, 3i+2, 2i+2, i+2, i]
    µ         Begin a new monadic chain
     Q        Remove duplicates          = [i, 2i, 3i, 3i+1, 3i+2, 2i+2, i+2]
      ⁼       Equal to original?         = 0
           $  Make a monadic link:
        ṛ/      Reduce by right argument   = i
                (Gets the last element)
          ¬     Logical NOT:               = 0
       ȧ      Logical AND the two values = 0

শেষ ক্ষেত্রে ব্যর্থ হওয়া উচিত।
লিকি নুন

0

রেটিনা , 86 বাইট

\d+
$*
1(1*)
$1
+`(.)1
$1$1
.
 $`$&¶
%O`.
+`NS|E(.*)W
$1
M`\w$|(?m)(^.+$)(?s).+^\1$
^0

এটি অনলাইন চেষ্টা করুন! লিঙ্কে পরীক্ষার কেস অন্তর্ভুক্ত রয়েছে। ব্যাখ্যা:

\d+
$*

সংখ্যাগুলিকে অচল করে রূপান্তর করুন।

1(1*)
$1
+`(.)1
$1$1

রান দৈর্ঘ্যের অক্ষরগুলি ডিকোড করুন। N111রূপান্তরিত হওয়া দরকার NNN, সুতরাং প্রতিটি অ্যানারি নম্বর থেকে একজনকে বিয়োগ করা হয় এবং তারপরে প্রতিটি 1 পূর্ববর্তী বর্ণটিকে নকল করে।

.
 $`$&¶

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

%O`.
+`NS|E(.*)W
$1

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

M`\w$|(?m)(^.+$)(?s).+^\1$

দুটি জিনিসের একটির জন্য পরীক্ষা করুন: ক) কোনও স্থানের শেষ পয়েন্টটি শেষ হবে না (অর্থাত লুপটি বন্ধ হয়নি), বা পথে দুটি সদৃশ পয়েন্ট রয়েছে। পথটি বৈধ হলে সমস্ত চেক ব্যর্থ হয় এবং ফলাফল শূন্য হয়।

^0

ফলাফলটি উল্টে দিন।


0

পার্ল, 140

স্ট্রিং ইনপুট দিয়ে কাজ করে। সম্ভবত আমি অ্যারের সাথে সংক্ষিপ্ত করতে পারি, তবে আমি এটি সন্দেহ করি। আরও কোনও গল্ফ সাহায্যের জন্য খুশি :)

sub w{$i=$_[0];%d=(E,[0],S,[1,-1],W,[0,-1]);$i=~s/(.)(.)/($d,$o)=(@{$d{$1}},1,1);for(1..$2){$s[$d]+=$o;$r+=$d{"@s"}++}/eg;!($s[0]+$s[1]+$r)}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.