তীরচিহ্নগুলি সহ পাঠ্য নেভিগেট করুন


11

পটভূমি

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

গতির উদাহরণ

পাঠ্যের একটি সাধারণ নমুনা এটির মতো দেখতে পারে। কার্সারটি এই পাঠ্যের দুটি অক্ষরের মধ্যে বা একটি শেষে সন্নিবেশ করা হবে।

-----
---
------

let's put the cursor here:

X-----
---
------

move down (v):

-----
X---
------

move left (<):

-----X
---
------

v

-----
---X
------

v (notice how the X position of the cursor has been maintained)

-----
---
-----X-

^

-----
---X
------

>  (more line wrapping)

-----
---
X------

<

-----
---X
------

^ (the X-position from earlier is no longer maintained due to the left-right motion)

---X--
---
------

চ্যালেঞ্জ

ASCII পরীক্ষার বেশ কয়েকটি লাইন দেওয়া, প্রারম্ভিক অবস্থান থেকে শেষের দিকে সবচেয়ে সংক্ষিপ্ত পথটি সন্ধান করুন। শুরুর অবস্থানটি প্রতিনিধিত্ব করে ^এবং শেষের অবস্থানটি প্রতিনিধিত্ব করে $এবং সেখানে প্রতিটির মধ্যে কেবল একটি থাকবে। এগুলি পাঠ্যের অংশ হিসাবে বিবেচিত হয় না এবং সেই লাইনের "দৈর্ঘ্য" তে অবদান রাখে না।

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

আপনি একটি প্রোগ্রাম লিখতে পারেন বা নামকরণ ফাংশন। বিজয়ী হ'ল সংক্ষিপ্ত জমা, বাইটগুলি পরিমাপ করা হবে।

উদাহরণ I / O

^Squares
are
fun$ny

vv<v  (which is better than the naive vv>>>)

Squares
^are
funny$

<vv

Alp$habet^
Song

v<^

Mary had a little lamb,
His fleece was white as snow,
And$ everywhere that ^Mary went,
The lamb was sure to go.

^^>>>>v>>>

$^degenerate case

(no output)

"এই পাঠ্যের দুটি অক্ষরের মধ্যে বা কার্সারটি সন্নিবেশ করা হবে" - প্রথম উদাহরণে কার্সারটি শুরুতে
প্রেরণ করা হয়

প্রতি লাইনের দুটি প্রান্ত রয়েছে। "শেষ" এ সম্পাদিত।
PhiNotPi

Vim তীর অনুমতি দেয়। আমার এআইএক্স বাক্সে আমার কাছে সত্যিকারের ভিআই রয়েছে যা এটি না করে (আমি আমার স্টার্টআপ ফাইলটিতে মানচিত্রের বিবৃতি যুক্ত করেছি)। "হাফওয়ে শালীন" ... হ্যাঁ
জেরি যেরেমিয়া

প্রথম উদাহরণের আউটপুটও হতে পারে v<vv, তাই না? বা সেই লাইনের শেষ চরিত্রের পরে কি শেষ হবে?
mbomb007

@ mbomb007 এটি লাইনের শেষ অক্ষরের পরে শেষ হবে।
ফিনোটপিআই

উত্তর:


7

সিজোম, 139 বাইট

ভাল মনে হচ্ছে এমন কিছু আসতে বেশ কয়েক ঘন্টা সময় লেগেছিল। এটি মনে হচ্ছে যে সময়টিকে আক্রমণাত্মকভাবে অপ্টিমাইজ করতে সময় লাগে সিজেএম কোডটি কোডের আকারের ক্ষেত্রে ও (এন) এর চেয়ে বড় কিছু ...

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

Squished:

q_'$-_'^-:T;'^#\'^-'$#W{)2$5Y$5b+{:D[L"_T<W%_N#)_@>N+N#X-Ue>+-"_"W%-U"--2'<t2'>t'++'(')]=~0e>T,e<D3/1$T<N\+W%N#X?:X;}/2$-}g5b{" ^v<>"=}%]W=

সম্প্রসারিত এবং মন্তব্য করা হয়েছে:

q               "Read the input";
_'$-            "Remove the end marker";
_'^-:T;         "Remove the start marker and save the text";
'^#             "With only the end marker removed, locate the start marker";
\'^-'$#         "With only the start marker removed, locate the end marker";
W               "Initialize the path number to -1";
{               "Do...";
  )               "Increment the path number";
  2$              "Initialize the cursor position to that of the start marker";
  5Y$5b+          "Convert the path number to base 5, then add a leading 5
                   (the leading 5 will act to initialize the column memory)";
  {:D             "For each digit in the path digit string:";
    [               "Begin cases:";
      L               "0: Do nothing";
      "_T<W%_N#)_@>N+N#X-Ue>+-"
"REFS: [   1   ][  2  ][ 3 ]45
                       1: [1] Calculate the distance to the end of the previous
                              line (0 if no such line)
                          [2] Calculate the length of the previous line (0 if
                              no such line)
                          [3] Calculate the distance to move backwards in the
                              previous line as the maximum of the length of the
                              previous line minus the column memory and 0
                          [4] Calculate the total distance to move as the sum 
                              of [1] and [3]
                          [5] Subtract [4] from the cursor position";
      _"W%-U"-        "2: Start with a base of the logic of case 1, but with a
                          few operations adjusted.";
      -2'<t2'>t       "   [1] Calculate the distance to the *start* of the
                              *next* line (0 if no such line)
                          [2] Calculate the length of the *next* line (0 if no
                              such line)
                          [3] Calculate the distance to move *forwards* in the
                              *next* line as the *minimum* of the length of the
                              *next line* and *the column memory*
                          [4] Calculate the total distance to move as the sum 
                              of [1] and [3]";
      '++             "   [5] *Add* [4] *to* the cursor position";
      '(              "3: Decrement the cursor position";
      ')              "4: Increment the cursor position";
    ]=~             "Execute the case corresponding to the path digit mod 5";
    0e>T,e<         "Clamp the cursor position to [0, text length]";
    D3/             "Check if the path digit is not 0, 1, or 2...";
    1$T<N\+W%N#     "Calculate the current column";
    X?:X;           "If the above check succeeded, update the column memory";
  }/              "End for each";
  2$-             "Subtract the end marker position from the cursor position";
}g              "... While the above subtraction is nonzero";
5b              "Convert the path number to base 5";
{" ^v<>"=}%     "Map each digit in the path string to its operation symbol";
]W=             "Clean up";

সামগ্রিকভাবে, এটি একটি দুর্দান্ত সোজা সমাধান। এটি কোনও পাথ কাজ না করা অবধি 0 দিয়ে শুরু করে প্রতিটি পুনরাবৃত্তিকে বৃদ্ধি করে এমন একটি পাথ সংখ্যার বেস -5 উপস্থাপনার অঙ্কগুলি "সম্পাদন করে"। অঙ্কগুলি 1- 4উপরে, নীচে, বাম এবং ডানদিকে ক্রিয়াকলাপের মানচিত্র এবং 0কিছুই করে না। সবেমাত্র একটি পথ ব্যবহার করে প্রথম পুনরাবৃত্তিটি 0ডিজেনরেট কেসটিকে ক্যাচ করে। এর মধ্যে থাকা সমস্ত অন্যান্য পাথগুলি 0কখনই নির্বাচিত হয় না কারণ এগুলি কেবল নো-অপ্সের সাথে ইতিমধ্যে পরীক্ষিত পাথগুলির সংস্করণ।

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

কোড পুনরায় ব্যবহার হ'ল একটি অত্যন্ত গুরুত্বপূর্ণ অপ্টিমাইজেশন কৌশল। এর উদাহরণগুলির মধ্যে রয়েছে:

  • এমনভাবে চলার জন্য কোডটি লেখার জন্য যেমন রান কোডে নিজের কোডটি লেখার চেয়ে কম যাওয়ার জন্য কোড উত্পন্ন করা ছোট। এটি কিছু সরানো এবং সরিয়ে / প্রতিস্থাপনের জন্য কোডটি অনুলিপি করে করা হয়।
  • "কলাম মেমরি" আপডেট করা অপারেশনটির যুক্তিতে কোডিং করার পরিবর্তে শর্ত অনুসারে 3 দ্বারা বিভাজক পাথ ডিজিটের ভিত্তিতে করা হয়। এটি 5পাথ স্ট্রিংয়ের শুরুতে একটি ডামি অপারেশন যুক্ত করে কলাম মেমোরিটির সূচনা করার অনুমতি দেয় , যা 0বিজ্ঞপ্তি অ্যারে সূচিকরণের কারণে কোনও অপ-লজিক ব্যবহার করতে ঘটে এবং সেখানে কেবল 5 সংজ্ঞায়িত ক্রিয়াকলাপ হয়।

সামগ্রিকভাবে, কীভাবে এটি প্রকাশিত হয়েছিল তা নিয়ে আমি খুব খুশি। এটি অবশ্যই আমি তারিখের একটি কোড গল্ফ উত্তর রেখেছি সবচেয়ে কাজ (একটি টুইট মধ্যে ফিট করে এমন কিছু জন্য ??)। যদিও রান সময়টি বেশ বেহাল। সিজেএম শুরু করার মতো দ্রুততম ভাষা নয় এবং এই অ্যালগরিদমের ও (মি * 5 এন ) এর মতো কোনও জটিলতা রয়েছে , যেখানে এম ইনপুটটির আকার এবং এন আউটপুটটির আকার। ভাল জিনিস গতি গণনা করা হয় না!


ভাল
লাগল

2

পাইথন 2: 446

Q=input().split('\n');
def g(c):l=[l for l in Q if c in l][0];return Q.index(l),l.index(c)
a,b=g('^');c,d=g('$');Q=map(len,Q);Q[a]-=1;Q[c]-=1
if a==c:d-=b<d;b-=d<b
t=-1
while Q:
 l=[];T=t=t+1;x,y,z=a,b,b
 while T:l+=[T%5]*(T%5>0);T/=5
 for T in l:A=":x+=T+T-3;y=min(Q[x],z)";B="x<len(Q)-1";exec"if "+["","x"+A,B+A,"y:y=z=y-1\nelif x:x-=1;y=z=Q[x]","y<Q[x]:y=z=y+1\nelif "+B+":x+=1;y=z=0"][T]
 if(x,y)==(c,d):print''.join(' ^v<>'[x]for x in l);Q=0

সোজা সমাধান। আমি প্রস্থের প্রথম অনুসন্ধান করছি। tসমস্ত বিভিন্ন পাথ পুনরাবৃত্তি। আমি tবেসে রূপান্তর করি 5, তবে কেবল এন্ট্রিগুলি ব্যবহার করি, যা ননজারো। 1উপরে, 2নীচে, 3বাম এবং 4ডানদিকে আছে।

আমি 3 ভেরিয়েবল কার্সার বর্তমান অবস্থান রাখা x, yএবং z। আপনি যদি উপরে বা নীচে যান এবং লাইনটি খুব ছোট xহয় তবে লাইনটি, yকলামের অবস্থান এবং z'লুকানো' কলামের অবস্থান। প্রচুর আইএফএস স্থির করে, কীভাবে চলার সময় পরিবর্তনশীল পরিবর্তন হয়।

প্রাক প্রসেসিং সত্যিই দীর্ঘ, প্রথম 4 লাইন কেবল এই কাজটি সম্পাদন করে।

দীর্ঘ টেস্টকেসটি সত্যই দীর্ঘ সময় নেয়। অ্যালগরিদমের O (N * 5 ^ N) এর একটি জটিলতা রয়েছে, যেখানে এন সংক্ষিপ্ততম সমাধানের দৈর্ঘ্য।

ব্যবহার: লাইনগুলিকে একক স্ট্রিং (লাইনগুলি পৃথক করে \n) পছন্দ হিসাবে ইনপুট করুন"Alp$habet^\nSong"


1

সিজেম - 274

এখনও কোন উত্তর নেই? ঠিক আছে, এখানে একটি :)

qN/_{0:V;{_'^={[UVV]:B;;}{'$={[UV]:E;}{V):V;}?}?}/U):U;}/"^$"f-:,:A;{:X0=[X0=(_A=X2=_@e<\]X?}:U;{:X0=A,(=X[X0=)_A=X2=_@e<\]?}:D;{:X1=[X~;(_]{X0=[X0=(_A=_]X?}?}:L;{:X1=X0=A=={X0=A,(=X[X0=)0_]?}[X~;)_]?}:R;[[BM]]{_{0=2<E=},_{0=1=o0}{;[{"U^DvL<R>"2/\f{[~@1/~@\+@@~\]}~}/]1}?}g;

এটি http://cjam.aditsu.net/ এ চেষ্টা করুন ... মেরি উদাহরণ বা সেই আকারের কিছু বাদে আপনি সম্ভবত জাভা দোভাষী চাইবেন ।


1
ডব্লিউটিএফ? 274 !!!!!!
অপ্টিমাইজার

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