কনট্যুর ধরে তীরগুলি সরান Move


28

স্যান্ডবক্সভুক্ত

একই ঘড়ির কাঁটার বিপরীতে বা ঘড়ির কাঁটার বিপরীত দিকের (প্রতিটি কনট্যুরের নিজস্ব দিক রয়েছে) এবং ধনাত্মক সংখ্যায় তীরের সাথে ধারাবাহিকভাবে স্থিত হয়ে তীরগুলি সহ বন্ধ নন-ওভারল্যাপিং 2 ডি কনট্যুরস (কমপক্ষে একটি স্থান দ্বারা বিভক্ত এমনকি পৃথক করা) দেওয়া হয়েছে n, একটি তীর সরান nসংশ্লিষ্ট দিকের সারসংক্ষেপগুলি বরাবর পদক্ষেপগুলি। > v < ^ডান, নীচে, বাম এবং উপরে দিকের জন্য তীরগুলি যথাক্রমে প্রতিনিধিত্ব করে । অন্যান্য অক্ষরগুলি -(অনুভূমিক), |(উল্লম্ব) এবং +(কোণে) রয়েছে। যখন একটি তীর একটি কোণে থাকে, এটি তার বর্তমান দিকটি ধরে রাখে এবং মোড় নেওয়ার পরেই এটি পরিবর্তন করে।

যে কোনও দুটি কোণের মধ্যে সর্বদা একটি সরল বিভাগ (বা একটি স্থান) থাকবে ( +-+অনুভূমিকের মতো এবং উল্লম্বের মতো) - অন্য কথায় তীক্ষ্ণ Uবাঁকগুলি নিষিদ্ধ। কোণগুলির মধ্যে বিভাগগুলি উল্লম্ব বা অনুভূমিক এবং কোনও কোণে বাঁক সর্বদা 90 ডিগ্রি থাকে।

ইনপুট:

  • ধনাত্মক পূর্ণসংখ্যা - n- পদক্ষেপের সংখ্যা
  • সংক্ষিপ্তসারগুলির একটি ASCII উপস্থাপনা - এটি কোনও মাল্টলাইন স্ট্রিং, স্ট্রিংগুলির তালিকা, অক্ষরের একটি তালিকা এবং এগুলি হতে পারে।

আউটপুট:

সমস্ত তীরগুলির সাথে একই সমতুল্য nপ্রতিটি কনট্যুরের সামগ্রিক দিকের পদক্ষেপগুলিতে স্থানান্তরিত করে ।

পরীক্ষার কেস:

1।

ইনপুট:

n = 1

 +----->->            
 |       |            
 |       v---+        
 |           |        
 +---<-------+      

আউটপুট:

 +------>+
 |       v
 |       +>--+
 |           |
 +--<--------+

2।

ইনপুট:

n = 2

 +-----+ +---+        
 |     | |   |        
 +-->--+ |   v  
         |   | 
 +--->---+   |        
 |           |         
 +------<<---+       

আউটপুট:

 +-----+ +---+
 |     | |   |
 +---->+ |   |
         |   | 
 +----->-+   v
 |           |     
 +----<<-----+        

3।

ইনপুট:

n = 3

 +---+   +---+   +-------+      
 |   |   |   v   |       |      
 ^   |   |   |   +-<-+   |      
 |   |   ^   |       |   v      
 |   +---+   +-->----+   |      
 |                       |      
 |   +-------+   +---+   |      
 |   |       |   v   |   |      
 +---+       +---+   +---+      

আউটপুট:

 +>--+   ^---+   +-------+
 |   |   |   |   ^       |
 |   |   |   |   +---+   |
 |   |   |   |       |   |
 |   +---+   v----->-+   |
 |                       |
 |   +-------+   +---+   v 
 |   |       |   |   |   |
 +---+       +-<-+   +---+  

4।

ইনপুট:

n = 1

+--+ 
|  |
|  +---+
|      |     
+----+ |
     | |
     +-+ 

আউটপুট:

+--+ 
|  |
|  +---+
|      |     
+----+ |
     | |
     +-+ 

5।

ইনপুট

n = 4

^>>>>
^   v
^   v>>>>
^       v           
<<<<<<<<v

আউটপুট:

^>>>>
^   v
^   v>>>>
^       v           
<<<<<<<<v

6।

ইনপুট:

n = 1

^->
^ v
<<v

আউটপুট:

^>+
^ v
<<v

উপরের কাজটি সমাধান করে একটি ফাংশন বা একটি প্রোগ্রাম লিখুন। প্রতিটি ভাষায় বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়লাভ করে। গল্ফিং ভাষা দ্বারা নিরুত্সাহিত করবেন না। অ্যালগরিদম এবং কোড ব্যাখ্যা অত্যন্ত প্রশংসা করা হয়।


দুটি রূপটি কি তাদের কোণগুলিকে তির্যকটিতে স্পর্শ করতে পারে, বা কোনও কনট্যুর নিজেই এর মতো স্পর্শ করতে পারে?
xnor

4
"বদ্ধ অ-ওভারল্যাপিং 2 ডি কনট্যুরের একটি সেট দেওয়া ... একই ঘড়ির কাঁটার দিকে বা ঘড়ির কাঁটার দিকের ধারাবাহিকভাবে তীরগুলি ধারাবাহিকভাবেমুখী করা" আমার কাছে মনে হয় যেন প্রতিটি কনট্যুর একই দিক দিয়ে থাকে, তবে পরীক্ষার ক্ষেত্রে এটি মনে হয় তীরগুলি কেবল একটি কনট্যুরের মধ্যে সামঞ্জস্যপূর্ণ থাকে।
xnor

3
@ এক্সনর আপনার মন্তব্যের জন্য ধন্যবাদ! - না, রূপকগুলিকে একে অন্যকে / নিজেকে তির্যক স্পর্শ করার অনুমতি নেই। - প্রতিটি কনট্যুরের নিজস্ব ডিরেক্টরি রয়েছে। আমি বর্ণনাটি আপডেট করব।
গ্যালেন ইভানভ

2
দেয়ালগুলির মধ্যে কোনও স্থান নেই এমন ইনপুট কি সম্ভব? যেমন: অনলাইনে চেষ্টা করে দেখুন! । আমি জানি আপনি "কমপক্ষে একটি স্পেস দ্বারা পৃথক" বলেছেন তবে আমি অস্পষ্ট ছিলাম যদি এটি কেবল স্বতন্ত্র লুপগুলিতে প্রয়োগ করা হয় বা এটি যদি একটি একক লুপেও প্রয়োগ হয়।
জোনাহ

1
@ জোনাঃ না, এটি সম্ভব নয়:There will always be a straight segment (or a space) between any two corners (like +-+ for the horizontal and similar for the vertical) - in other words the sharp U turns are forbidden.
গ্যালেন ইভানভ

উত্তর:


14

জাভাস্ক্রিপ্ট (ES6),  210 ... 182  180 বাইট

(m)(n)m

m=>g=n=>n?g(n-1,m=m.map((r,y)=>r.map((c,x)=>(i=0,h=$=>~$?(m[Y=y+($-2)%2]||0)[X=x+~-$%2]>h?"-|+"[n+=`;m[${Y}][${X}]=S[${$}]`,i?2:$&1]:h($^++i):c)((S="<^>v").indexOf(c)))),eval(n)):m

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

কিভাবে?

উত্সটির বিন্যাসিত সংস্করণ দেখতে আপনি এই লিঙ্কটি অনুসরণ করতে পারেন।

লেফাফা

gn1n=0

আপডেট পদ্ধতি

আমরা প্রতিটি তীরটি নিরাপদে একবারে স্থানান্তর করতে পারি না কারণ আমরা আপডেট হওয়া তীরগুলি নিয়ে আপডেট না হওয়া তীরগুলি ওভাররাইটিংয়ের ঝুঁকিটি চালাব। পরিবর্তে, আমরা প্রথমে সমস্ত তীরগুলি মুছে ফেলি এবং তাদের নতুন অবস্থানগুলি গণনা করি। আমরা দ্বিতীয় বার নতুন পদ প্রয়োগ করি apply

n

n

"1;m[0][7]=S[2];m[1][8]=S[3];m[2][9]=S[2];m[4][3]=S[0]"

n

নতুন পদগুলি কেবলমাত্র দ্বারা প্রয়োগ করা হয় eval(n)

দিকনির্দেশ

d$

10+23

dxdy

 d | dx = (d - 1) % 2 | dy = (d - 2) % 2
---+------------------+------------------
 0 |        -1        |         0
 1 |         0        |        -1
 2 |        +1        |         0
 3 |         0        |        +1

কোণে

hddxor1dxor3

+-|d

h$h"$""$""$"

অ্যানিমেটেড সংস্করণ


ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ!
গ্যালেন ইভানভ

8

কে (এনএনজি / কে) , 183 161 157 বাইট

{A:"^>v<";D,:-D:(-1 0;!2);s:(#x;#*x);c:~^x;r:" -+|"c*+/'3'0,c,0;$[#p:+s\&~^t:A?,/x;;:r];q:q@'*'&'~^x ./:/:q:+p+/:D@4!(t^0N)+/:0 1 3;s#@[,/r;s/+q;:;A@D?q-p]}/

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

{ }/যখন কোন ইন্ট বাম আর্গ এন দিয়ে ডাকা হয়, { }এটি ডান আর্গের জন্য n সময়ে ফাংশনটি প্রয়োগ করবে

A:"^>v<" তীর

D,:-D:(-1 0;!2) ,Y, 4 টি মূল দিকের দিকের জন্য ∆x

s:(#x;#*x) ইনপুট আকার: উচ্চতা, প্রস্থ

c:~^x গণনা - বুলিয়ান ম্যাট্রিক্স যেখানে শূন্যস্থান নেই তা দেখায়

r:" -+|"c*+/'3'0,c,0একটি কাউন্টারের সাথে অক্ষরের ম্যাট্রিক্সটি পুনরায় তৈরি করুন তবে তীর ছাড়াই, প্রতিটি কক্ষের জন্য স্ব + উচ্চ + নিম্ন গণনা করে cএবং 1-> -, 2-> +, 3-> প্রতিস্থাপন করুন|

t:A?,/xতীরের ধরণ: 0 1 2 3 এর জন্য ^>v<, অন্যান্য সমস্ত ঘর 0N(নাল) হিসাবে উপস্থাপিত হয়

p:+s\&~^t তীরগুলির স্থানাঙ্ক

$[#p ;;:r] যদি কোনও তীর না থাকে তবে ফিরে আসুন r

q:+p+/:D@4!(t^0N)+/:0 1 3 প্রতিটি তীরের জন্য সমস্ত 3 নতুন নতুন অবস্থান - এটি যদি এগিয়ে যেতে থাকে, যদি এটি বাম দিকে ঘুরে থাকে এবং যদি এটি ডানদিকে ফিরে আসে

q:q@'*'&'~^x ./:/:q প্রতিটি তীর জন্য প্রথম বিকল্পটি নির্বাচন করুন যা কাউন্টারের উপর অবতরণ করে

@[,/r;s/+q;:;A@D?q-p]সমতল করুন rএবং এটিতে তাদের নতুন অবস্থানে এবং তাদের নতুন দিকনির্দেশ সহ তীরগুলি রাখুন

s# মূল আকারে পুনরায় আকার দিন


2
তুমি অনেক দ্রুত! আমি আশা করি আপনি গল্ফ শেষ করে কোডটি ব্যাখ্যা করবেন।
গ্যালেন ইভানভ

ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ!
গ্যালেন ইভানভ

4

কাঠকয়লা , 105 বাইট

W¬ΦυΣκ⊞υS≔⊟υη≔⪫υ⸿θ≔⟦⟧υ≔>^<vζPθFθ¿№ζι«⊞υ⟦⌕ζιⅉⅈ⟧§+|-↨EKV›κ ²»ιFυ«J⊟ι⊟ι≔⊟ιιFIη«≔⊟Φ⁴∧﹪⁻⊖ι⊕λ⁴›§KV⁻⁵λ ιM✳⊗ι»§ζι

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। একটি জটিল ইনপুট ফর্ম্যাট প্রয়োজন এড়াতে ব্যবহৃত 22 বাইট অন্তর্ভুক্ত। ব্যাখ্যা:

W¬ΦυΣκ⊞υS≔⊟υη≔⪫υ⸿θ≔⟦⟧υ

সুবিধামত আকার এবং পদক্ষেপের সংখ্যা ইনপুট করুন।

≔>^<vζ

দিকের অক্ষরগুলি বেশ কয়েকবার ব্যবহৃত হয় তাই স্ট্রিংটি এখানে ক্যাশে করা হয়েছে। এই স্ট্রিংয়ের একটি দিকের অক্ষরের সূচকটি তার দিক হিসাবে পরিচিত।

Pθ

কার্সারটি সরানো ছাড়াই মূল রূপগুলি মুদ্রণ করুন।

Fθ

কনট্যুরের অক্ষরের উপর লুপ করুন।

¿№ζι«

যদি বর্তমান অক্ষরগুলি একটি দিকের চরিত্র হয় ...

⊞υ⟦⌕ζιⅉⅈ⟧

... তারপরে একটি তালিকায় দিক এবং অবস্থান সংরক্ষণ করুন ...

§+|-↨EKV›κ ²

... এবং যথাযথ লাইন চরিত্রের সাথে চরিত্রটি প্রতিস্থাপন করুন।

»ι

অন্যথায় অক্ষর আউটপুট এবং পরবর্তী অক্ষরে যান।

Fυ«

সংরক্ষিত পজিশনের উপর লুপ করুন।

J⊟ι⊟ι

সংরক্ষিত অবস্থানে ঝাঁপুন।

≔⊟ιι

সংরক্ষিত দিকটি বের করুন।

FIη«

পদক্ষেপের উপযুক্ত সংখ্যার উপর লুপ করুন।

≔⊟Φ⁴∧﹪⁻⊖ι⊕λ⁴›§KV⁻⁵λ ι

পরবর্তী পদক্ষেপের দিকটি সন্ধান করুন যা কোনও দিক যা বিপরীত বা খালি নয়।

M✳⊗ι

সেদিকে পদক্ষেপ নিন। ( Moveকমান্ডের জন্য কাঠকয়লা দিক সূচকগুলি আমার দিকের দ্বিগুণ।

»§ζι

উপযুক্ত দিকের অক্ষর মুদ্রণ করুন।


ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ!
গ্যালেন ইভানভ

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