লুপস এবং লুপস এবং লুপস


16

চ্যালেঞ্জ

একটি ফাংশন তৈরি করুন, যখন ASCII আর্টের ইনপুট দেওয়া হবে (শেষ পর্যন্ত লুপ হতে পারে এমন কোনও পথ নির্দেশ করে) লুপটির দৈর্ঘ্য (যদি সেখানে একটি থাকে) এবং একটি "লুপ" এর দৈর্ঘ্যকে আউটপুট দেয়? নীচে ফর্ম।


ইনপুট

আপনার ইনপুট অবশ্যই একটি ফাংশনে পাস করতে হবে। নীচে একটি সাধারণ ইনপুট উদাহরণ is

# --> # --> #
      ^     |
      |     |
      |     v
      # <-- #

আপনি উপরের ব্লকগুলি এর মতো দেখতে পারেন

"লেজ" একটি আইটেম, লুপটি দীর্ঘ দীর্ঘ হয়।

আরও কঠিন একটি:

            # --> # --> #
            ^           |
            |           |
            |           v
      # --> # <-- #     # --> #
      ^           ^           |
      |           |           |
      |           |           v
# --> #           # <-- # <-- #

আউটপুট

আপনাকে অবশ্যই STDOUT বা আপনার ভাষার নিকটতম বিকল্পের মাধ্যমে আউটপুট দিতে হবে।

আপনার দুটি আউটপুট পূর্ণসংখ্যার লেজের দৈর্ঘ্য এবং লুপের দৈর্ঘ্য হওয়া উচিত। এই আউটপুট দুটি ফর্ম হতে পারে।

  1. একটি স্পেস-সীমাবদ্ধ স্ট্রিং: "2 10"
  2. পূর্ণসংখ্যার একটি অ্যারে: [2, 10]

বিধি

  • প্রতিটি ব্লক, বা #, কেবল নিজের থেকে একক পথ দূরে থাকবে ।

  • প্রতিটি তীর দুটি লাইনের বিভাগ এবং এক মাথা।

  • প্রারম্ভিক ব্লকটি সর্বদা বামতম কলামে থাকবে।

  • ইনপুট কখনই কেবল একটি লুপ হবে না।


উদাহরণ

# --> # --> # --> #
^     ^           |
|     |           |
|     |           v
#     # <-- # <-- #

এটির একটি লেজের দৈর্ঘ্য 2 এবং একটি লুপ দৈর্ঘ্য 6 থাকে নীচে, লেজ এবং লুপ পৃথক করা হয়।

লেজ

# -->
^
|
|
#

লুপ

# --> # --> #
^           |
|           |
|           v
# <-- # <-- #

সঠিক ফলাফলগুলি হ'ল [2, 6]এবং "2 6"

যদি ইনপুটটি কেবল একটি লেজ হয় তবে লুপের দৈর্ঘ্য শূন্য।

# --> # --> # --> #
                  |
                  |
                  v
        <-- # <-- #

উপরের ইনপুটটির সঠিক ফলাফলগুলি হ'ল [6, 0]এবং"6 0"


@ orlp আমার মনে হয় আপনি ইনপুট এবং আউটপুটকে বিভ্রান্ত করছেন।
সানচিইস

1
ইনপুটটিতে কি অতিরিক্ত সংযোগ বিচ্ছিন্ন পথ থাকতে পারে?
xnor

আমি মনে করি ইন্ট্রো গুলিয়ে ফেলছে। এটি আমাকে ভাবায় যে সমস্যাটি প্রোগ্রাম বিশ্লেষণ সম্পর্কে হবে, যেখানে এটি ASCII শিল্পের পথ অনুসন্ধান সম্পর্কে।
xnor

আমি পরিচিতি সরিয়েছি এটি কিছুটা বিভ্রান্তিকর / বিভ্রান্তিকর ছিল। @ xnor
জ্যাচ গেটস 21

উত্তর:


11

জাভাস্ক্রিপ্ট (ES6), 221 229

পরামিতি হিসাবে ইনপুট সহ একটি ফাংশন, পপআপ উইন্ডো (সতর্কতা) এর মাধ্যমে স্ট্রিং হিসাবে আউটপুট।

বারবার ইনপুট স্ক্যান করুন:
প্রতিটি পদক্ষেপে

  • লেজ এর শেষ অপসারণ
  • বাকি '#' গণনা করুন

যখন সরানোর জন্য আরও বেশি লেজ নেই, এখন পর্যন্ত ধাপগুলির সংখ্যাটি লেজের আকার এবং অবশিষ্ট '# এর সংখ্যাটি লুপের আকার।

ব্যাকটিক্সের সমস্ত নিউলাইনগুলি উল্লেখযোগ্য এবং গণনাযোগ্য counted

ফায়ারফক্সের সাথে নীচে স্নিপেট চালানোর পরীক্ষা করুন (ক্রোম নয়, এটি সমর্থন করে না বলে) ... )

F=s=>{s=`


${s}


`.split`
`.map(r=>[...r]);for(t=0,f=1;f;)s.map((r,y)=>r.map((c,x)=>c=='#'&&((r[x+2]+r[x-2]+s[y-1][x]+s[y+1][x]).match`[v<>^]`?++l:t+=(f=r[x-4]=r[x+4]=s[y-3][x]=s[y+3][x]=r[x]=1))),f=l=0);alert(t+' '+l)}

// Less golfed
U=s=>{
  s=`\n\n\n${s}\n\n\n`.split`\n`.map(r=>[...r])
  t=0
  do {
    f=l=0
    s.forEach((r,y) => {
      r.forEach((c,x) => {
        if (c == '#')
        {
          if (!(r[x+2] == '<' || r[x-2] == '>' || s[y-1][x] == 'v' || s[y+1][x] == '^'))
            t+=(f=r[x-4]=r[x+4]=s[y-3][x]=s[y+3][x]=r[x]=1)
          else
            ++l
        }
      })
    })
  } while(f)
  alert(t+' '+l)
}  

//Test

// Redefine console.log
alert=(...x)=>O.innerHTML+=x+'\n'

test=[`
# --> # --> #
      ^     |
      |     |
      |     v
      # <-- #`
,`
            # --> # --> #
            ^           |
            |           |
            |           v
      # --> # <-- #     # --> #
      ^           ^           |
      |           |           |
      |           |           v
# --> #           # <-- # <-- #`
,`
# --> # --> # --> #
^     ^           |
|     |           |
|     |           v
#     # <-- # <-- #`      
]

test.forEach(t=>(alert(t),F(t)))
<pre id=O></pre>


... স্প্রেড অপারেটর ঠিক আছে? আপনি এটির নামকরণ করতে পারেন কারণ এটি অন্যান্য ভাষায় (গ্রোভির মতো) অন্যান্য বাক্য গঠন (*: গ্রোভির জন্য তালিকা) দ্বারা বিদ্যমান। যাই হোক সুন্দর সমাধান!
হারুন

1
+1 আমি ভাবছিলাম 'এটি করার একটি দুর্দান্ত উপায় থাকতে হবে', এই সমাধানটি নিয়ে এসেছিল, কেবল এই উত্তরে স্ক্রোল করার জন্য।
সানচিইস

8

রুবি, 287 278 বাইট

->i{n={}
g=->x{n[x]||=[0,p]}
t=y=0
i.lines{|l|x=0
l.chars{|c|x+=1
'><'[c]&&(r=c.ord-61;s,d=[y,x-4*r],[y,x+2*r])
'^v'[c]&&(r=c<?_?1:-1;s,d=[y+r*3,x],[y-r,x])
s&&(g[s][1]=g[d])[0]+=1}
y+=1}
c,*_,s=n.values.sort_by{|v|v[0]}
l=n.size
s[0]>1?((t+=1;c=c[1])while c!=s):t=l-=1
[t,l-t]}

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

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

অবশেষে:

  • 2 টি আগত সংযোগের সাথে কোনও নোড না থাকলে (যার অর্থ লুপ নেই), লেজের জন্য 0 এবং লুপের জন্য বিদ্যমান নোডের সংখ্যা ফিরে আসুন।
  • অন্যথায়, নোড থেকে 0 আগত সংযোগগুলি দিয়ে শুরু করুন (শুরু করুন) পরবর্তী -> ...-> এর মাধ্যমে 2 আগত সংযোগ (লুপ স্টার্ট) সহ নোড না আসা পর্যন্ত। উপযুক্ত গণনা ফেরত দিন Return

কোডটির পঠনযোগ্য সংস্করণটি এখানে উপলভ্য ।


2

রুবি, 276

->s{a=k=w=s.index(r='
')*2+2
s=r*w+s+r*w
(s.size).times{|i|s[i,2]=='
#'&&(s[3+j=i+1]+s[j+w]+s[j-w]).strip.size<2&&(a=[j]
d=0
loop{("|-|-"[d])+?#=~/#{s[k=j+[-w,3,w,-3][d]]}/?(a.include?(k)&&break;a<<(j=k);d-=1):d=(d+1)%4}
)}
u=a.size
v=a.index(k)
t=(u-v)/4*2
print u/2-t," ",t}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.