> <> পানির বাইরে


20

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

> <> এ আন্দোলন

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

>>>^  >>>v
   >>>^  v

এবং এটি একটি অসীম লুপে শেষ হয়ে যাবে (একবারের নীচে অসীমভাবে পার হয়ে গেলে শীর্ষ লাইনে ফিরে ফিরে আসে)।

মাছ সর্বোচ্চ (সারির দৈর্ঘ্য) এবং সারি সংখ্যার সমান দৈর্ঘ্যের গ্রিডে সরানো হয়।

মাছটি কোন পথে চলেছে তা আপনি কীভাবে আবিষ্কার করবেন? এই কমান্ডগুলি গতিপথের দিকনির্দেশক ভেক্টরকে পরিবর্তন করে (উদাহরণস্বরূপ (-1,0)ডান থেকে বামে):

Command | Direction Change
---------------------------
   >    | (1,0) (default)
   <    | (-1,0)
   ^    | (0,1)
   v    | (0,-1)
   /    | (x,y) -> (y,x)
   \    | (x,y) -> (-y,-x)
   |    | (x,y) -> (-x,y)
   _    | (x,y) -> (x,-y)
   #    | (x,y) -> (-x,-y)
   ;    | (0,0)

হিসাবে সুপরিচিত, মাছ শুরু স্থানান্তরণ বাম-থেকে-ডান সঙ্গে দিক ভেক্টর, অর্থাত্ (1,0)। মাছটি প্রথম কমান্ডটি দেখে এবং কমান্ডটি পূর্বনির্ধারিত দিক পরিবর্তনকারীগুলির মধ্যে একটির সাথে মেলে যদি তার দিক পরিবর্তন করে তবে কমান্ডগুলি বিশ্লেষণ শুরু করে।

;প্রোগ্রামটি দেখে এবং প্রোগ্রামটি শেষ হয়ে গেলে মাছগুলি চলাচল বন্ধ করে দেয়।

ইনপুট

ইনপুটটি এসটিডিআইএন এর মাধ্যমে প্রদত্ত একটি বৈধ (উদাহরণস্বরূপ অসীম লুপিং নয়) প্রোগ্রাম হবে। আপনি ইচ্ছা করলে একটি ফাইলও পড়তে পারেন। প্রতিটি প্রোগ্রামের লাইনগুলি একই দৈর্ঘ্যের হবে না

ইনপুটটি স্ট্রিং হিসাবে দেওয়া হয়, নতুন লাইনের সাথে প্রোগ্রামের প্রতিটি লাইন আলাদা হয়।

প্রোগ্রামগুলি লুপ হবে না, যার অর্থ তারা সর্বদা একটি দিয়ে সমাপ্ত হবে ;

আউটপুট

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

যদি ইনপুটটিতে অসম দৈর্ঘ্যের লাইন থাকে এবং মাছটি দীর্ঘতম রেখার দৈর্ঘ্যের চেয়ে কম লাইন ধরে এগিয়ে যায় তবে আপনার আচরণ করা উচিত যেন মাছটি কোনও স্থানের উপর দিয়ে চলেছে (পরীক্ষার কেস দেখুন)।

> <> এর সাথে পরিচিত তারা জানতে পারবেন যে দিক পরিবর্তনকারীরা কেবল এতে চলাচল করার একমাত্র উপায় নয়, তবে সরলতার জন্য ইনপুটটিকে এমন আচরণ করুন যেন তারা আন্দোলনকে প্রভাবিত করার একমাত্র উপায়।

বিধি

  1. স্ট্যান্ডার্ড লুফোলস প্রযোজ্য
  2. আপনি একটি সম্পূর্ণ প্রোগ্রাম বা ফাংশন লিখতে পারেন
  3. এসটিডিআইএন বা একটি ফাইলের মাধ্যমে ইনপুট সরবরাহ করা হয় স্ট্রিং হিসাবে প্রোগ্রামলাইনগুলিকে নিউলাইন দ্বারা পৃথক করা ( \n))
    • আপনি ইনপুটটি ভিন্নভাবে নিতে পারেন, কারণের মধ্যে (আপনার যদি মনে হয় কোনও নির্দিষ্ট ধরণের ইনপুট মনে আছে তবে আমাকে নির্দ্বিধায় জিজ্ঞাসা করুন)। আপনি ফাঁকা জায়গায় ইনপুট প্যাড করতে পারবেন না তাই লাইন দৈর্ঘ্য মেলে।
    • পড়ুন এই নমনীয় ইনপুট সংক্রান্ত মেটা পোস্ট। এটি পোস্টিংয়ের মতো, সাধারণ sensক্যমত কারণের মধ্যে যথাসম্ভব নমনীয় হতে হবে।
  4. আউটপুট হল STDOUT এর মাধ্যমে একক স্ট্রিং বা ফাংশন দ্বারা ফিরে (আপনি যা করতে চান তার উপর নির্ভর করে বিধি 2 দেখুন)

পরীক্ষার মামলা

v     >v
>abcv//;
gfed<^ih

v>abcv<defghi^//>v;



v     >v
>abcv//;
gfed<^

v>abcv<defg  ^//>v;


abcdef;

abcdef;


abcd|;

abcd|dcba;


abcd#;

abcd#dcba;


abcd\;
    _

abcd\_\dcba;


^;
>abcde/
 ^jihg<

^ >abcde/ <ghij^a;


;

;

2
আমরা কি ইনপুটটিকে স্ট্রিংগুলির অ্যারে হিসাবে নিতে পারি?
লুক

2
আমরা কি ধরে নিতে পারি যে প্রথম অক্ষরটি (উপরের বাম বর্ণটি) সেমিকোলন হবে না?
ক্রিটসি লিথোস

1
@ ক্রিতিক্সিলিথোস ভাল প্রশ্ন, আমি বলতে যাচ্ছি আপনি এটি ধরে নিতে পারবেন না। আমি একটি পরীক্ষার কেস যুক্ত করব।
কোল

1
@ লুকুন আপনি ইনপুটটিকে স্ট্রিংগুলির অ্যারে হিসাবে নিতে পারেন যদি ইনপুট ফর্ম্যাটটিতে পরিচালনা করা খুব শক্ত বা অসম্ভব (নতুন লাইনের দ্বারা পৃথক রেখার স্ট্রিং) থাকে। এখনই যুক্ত বিধি 3 দেখুন
কোল

উত্তর:


13

রোদা , 405 393 392 391 371 366 361 236 234 232 230 223 200 বাইট

F f{L=f()|[#_]|sort|tail
c=""x=0
y=0
X=1
Y=0{l=f[y]l.=[" "]*(L-#l)c=l[x]a=X
[c]
C=indexOf(c,`><v^/\|_#`)X=[1,-1,0,0,-Y,Y,-X,X,-X,X][C]Y=[0,0,1,-1,-a,a,Y,-Y,-Y,Y][C]x+=X
x=x%L
y+=Y
y=y%#f}until[c=";"]}

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

আউটপুট চেক!

ব্যাখ্যা (পুরানো)

F f{                          /* Declares a function F with parameter f */
                              /* Takes a 2D array of single-char Strings as f */
L =                           /* L contains the value of the length of the longest line*/
    f()                       /* Push the contents each element of f to the stream; this pushes each line*/
        | [#_]                /* Pull a line and push its length to the stream*/
               |sort|tail     /* Sort it and get the last value (the largest one) */
c=""                          /* c contains the value of the current char that is being processed */
x=0; y=0                      /* x and y contain the position of the fish */
X=1; Y=0                      /* X and Y contain the direction of the fish */
{ ... }while [c != ";"]       /* While c is not `;` do: */
l=f[y]                        /*  l is the line (row) the fish is at */
c=" " if [x >= #l]            /*  If x is more than or equal to the line's length, set c to a space (so that we don't need to pad spaces to the array at the beginning)*/
else c = l[x]                 /*  Else set c to the character a position x of l*/
[c]                           /*  Push c to the output stream; ie prints c without a trailing newline*/
a = X                         /*  a preserves the value of X before analysing c */
C = indexOf(c,`><v^/\|_#`)    /*  Simple enough */
X=[1,-1,0,0,-Y,Y,-X,X,-X,X][C]/*  Map each value of C to their respective X-direction in the array */
                              /*  If c cannot be found in `><v^/\|_#` then it will be given the value of -1, or in other words, the -1th element of an array its last element */
Y=[0,0,1,-1,-a,a,Y,-Y,-Y,Y][C]/*  Do the same thing for Y */
x += X                        /*  Change the x-pos by the X-direction */
x = x%L                       /*  Wrap around the right edge */
y += Y                        /*  Do the same for y */
y=y%#f                        /*  But wrap around the bottom instead */
x+=L if[x<0]                  /*  Wrap around the left */
y+=#f if[y<0]                 /*  Wrap around the top */
}

সম্পাদনাগুলি

  • %X বা y সীমানা পেরিয়ে গেছে কিনা তা পরীক্ষা করে ব্যবহার করে 10 বাইট @ ফের্গুসাককে ধন্যবাদ বাঁচিয়েছে , যা আরও 2 টির পথ প্রশস্ত করেছে!
  • `\`পরিবর্তে ব্যবহৃত হয়"\\"
  • c=""দ্বিতীয় লাইনে সরানো হয়েছে এবং এরপরে এটি অনুসরণ করে নতুন লাইনটি সরানো হয়েছে
  • শুরুতে পরিবর্তে লুপগুলিতে একক-অক্ষর অ্যারেতে লাইনগুলির রূপান্তর স্থানান্তরিত করা (পাইথন উত্তর দ্বারা অনুপ্রাণিত)
  • এর ব্রেস সিনট্যাক্স ব্যবহার করেছেন while(এটি চিহ্নিত করার জন্য @ ফার্গাসকু ধন্যবাদ)
  • a=Xযদি-বিবৃতিগুলির বাইরে চলে যায়
  • দীর্ঘতম লাইনের দৈর্ঘ্য সন্ধান করার জন্য একটি ছোট্ট উপায় খুঁজে পাওয়ার জন্য @ ফার্গাসকুকে ধন্যবাদ জানাই
  • টন বাইট সংরক্ষণ করতে ইফ-স্টেটমেন্টের পরিবর্তে অ্যারে সিনট্যাক্স (পাইথন উত্তরটির মতো) ব্যবহার করা হয়েছে
  • কোডটি সরাল যা স্পেসকে প্যাড করে, পরিবর্তে স্পেসগুলি <>> সাথে সরানো হিসাবে যুক্ত করা হয়
  • একটি বাগ ধন্যবাদ স্থির করে এবং একটি চরিত্র @fergusq ধন্যবাদ ধন্যবাদ
  • 2 টি বাইট সংরক্ষণের জন্য +1শেষে indexOfএবং পুনর্গঠিত কোডটি সরানো হয়েছে
  • চারপাশে জিনিসগুলি সরিয়ে 2 বাইট সংরক্ষণ করা হয়েছে (আবার @fergusq ধন্যবাদ)
  • প্যাডিং স্পেসগুলির পৃথক পদ্ধতি ব্যবহার করে @ ফেরগাসককে 1 বাইট ধন্যবাদ সংরক্ষণ করা হয়েছে
  • until[c=";"]পরিবর্তে ব্যবহার করে 1 বাইট সংরক্ষণ করা হয়েছেwhile[c!=";"]
  • @Fergusq- এর একটি ইঙ্গিতের জন্য ধন্যবাদ, আমি যে লুপগুলি স্পেসগুলি প্যাড করে সরিয়েছি এবং এটি দিয়ে প্রতিস্থাপন করেছি l.=[" "]*L
  • বাম এবং উপরের প্রান্তের চারপাশে প্রোগ্রামটি মোড়ানো প্রান্তে আই-স্টেটমেন্টগুলি সরিয়ে 20 বাইটের বেশি সংরক্ষণ করা হয়েছে

আমি মনে করি x=((x+X)%#l)পরিবর্তে ব্যবহার করে আপনি কয়েকটি বাইট সংরক্ষণ করতে পারেন x+=X। দুর্ভাগ্যক্রমে, (-1)%#lএখনও ফিরে -1
ফার্গুসক ২

@fergusq আপনার পরামর্শটি গল্ফ করেছেন :)
ক্রিটসি লিথোস

আপনার সাথে এটি ব্যবহার করতে পারেন yখুব: y=y%#f
ফার্গুসক

@fergusq এটি যোগ করতে
চলেছিল

আমি এটি সম্পর্কে আরও ভেবেছি, এখানে দুটি আরও গল্ফিং টিপস রয়েছে: keyপরিবর্তে ব্যবহার করুন cmpএবং {...}while[...]পরিবর্তে ব্যবহার করুন while[...]do ... done
ফার্গুসক

10

পাইথন 2, 262 243 237 235 234 233 231 221 219 218 217 বাইট

হিসাবে ইনপুট লাগে ['<line_1>', '<line_2>', ...]

i=input()
q=max(map(len,i))
i=[k+' '*q for k in i]
x=y=k=0
j=1
o=''
while';'not in o:r=[1,-1,-j,-k,0,0];o+=i[y][x];l='><#\\v^/|_'.find(o[-1]);a=(r+[k,-j,j])[l];k=([k,-k,k,j]+r)[~l];j=a;x=(x+j)%q;y=(y-k)%len(i)
print o

অনলাইনে চেষ্টা করে দেখুন!

-১৯ বাইটস @ ম্যাথ_জুনকি-to
বাইটকে ধন্যবাদ @ থিশগুই
-২ বাইটকে max(map(L,i))একটি ভেরিয়েবল থেকে বের করে ধন্যবাদ (কারণ এটি তাত্ত্বিকভাবে দু'বার ব্যবহার করা হয়েছে)।
-1 বাইট বার সংখ্যা কমিয়ে i[y][x]দেখায়।
-1 বাইট ব্যবহার করে '\x00'আমাকে আউটপুটে [1:]অংশটি করতে হবে না -২ বাইটের পরিবর্তে -10 বাইট ব্যবহার করে @ কৃতিক্সিলিথোসকে ধন্যবাদ যে ডানদিকে যতটুকু চাই আমি প্যাড করতে পারি কারণ অতিরিক্ত উপেক্ষা করা হবে (কোনও বাইট পরিবর্তন হবে না ) স্থির বাগটি কারণ আহরণ ভেরিয়েবল লুপ -2 বাইটের বাইরের ছিল কারণ এখন আমি কেবল 2 বার ব্যবহার করি তাই পুনরায় নিয়োগের পরিবর্তে 2 অতিরিক্ত বাইট -2 বাইট লাগবেo[1:]
\0\x00


len
while';'not in owhile o[-1]!=';', এবং এর o=''পরিবর্তে ব্যবহার করা o='\0'। এটি কেবল 2 বাইট সংরক্ষণ করে না তবে অগ্রণী নাল বাইট থেকে মুক্তি পেয়েছে যা প্রযুক্তিগতভাবে কার্যকর ছিল না।

ব্যাখ্যা

i = input()                       # Takes input as an array of strings
q = max(map(len,i))               # Finds the width of the longest line
i = [k + ' ' * q for k in i]      # Makes sure everything is at least that width
x = y = k = 0                     # Set the point to (0, 0). Set the vertical motion to 0
j = 1                             # Set the horizontal motion to 1
o = '\0'                          # Initialize the output to a null byte (this is output as nothing, so it doesn't actually affect output)
while o[-1] != ';':               # While the last character in the output is not ';' (this is why the output needs to be initialized with something, otherwise o[-1] gives an index error)
    r = [1,-1,-j,-k,0,0]          # Some of the vertical and horizontal coordinates correspond in opposite order
    o += i[y][x]                  # Add the current character to the output
    l = '><#\\v^/|_'.find(o[-1])  # Find the index of the current character here (or -1 if it's just a regular character)
    a = (r + [k, -j, j])[l]       # The fancy array contains the horizontal movement for each control character
    k = ([k, -k, k, j] + r)[~l]   # The fancy array contains the vertical movement for each control character. Using ~l to get the right index, because r has the values backwards
    j = a                         # a was a placeholder because otherwise k would not be correct
    x = (x + j) % q               # Adjust the pointer position
    y = (y - k) % len(i)          # Adjust the pointer position
print o                           # Print the output after the loop is finished

আপনি বন্ধ গলফ tryযেহেতু findআয় -1যদি না পাওয়া যায়নি: Tio
গণিত নেশাখোর

@ মাথ_জানকি ওহ ঠিক আছে, ধন্যবাদ!
হাইপারনিউট্রিনো

মাল্টিলাইন অ্যাসাইনমেন্টটি 1 লাইনে পরিবর্তন করে আপনি 3 টি বাইট এবং অন্য 4 টি সংরক্ষণ lenকরতে কোনও ভেরিয়েবলকে বরাদ্দ করতে পারেন । L0x=y=k=0
কায়ার্ড কইনিরিংহিংহিং 14

এই ধন্যবাদ!
হাইপারনিউটারিনো ২

2
@ কোল আমার মিষ্ট গল্ফে, আমি প্রতিটি অ্যারের শেষে জে এবং কে যুক্ত করেছি। এটি তাই নির্দেশনা বজায় থাকে
গণিত জাঙ্কি

5

রুবি, 274 200 187 183

গতিবেগের অ্যারে বাদ দিয়ে আরও কয়েকটি অক্ষর ছাঁটাই d,।

আমি এই জন্য বেশ গর্বিত। এই মজা ছিল! এটি স্ট্রিংগুলির একটি অ্যারে গ্রহণ করে এবং সঠিক স্ট্রিং প্রদান করে।

->a{o,x,y='',-1,0
b,m=1,0
(o+=n=a[y=(y+m)%a.size][x=(x+b)%(a.map &:size).max]||' '
b,m=([1]+[0,-1,0]*2+[1,-m]+[-b,m,b]*2+[-m,-b,-m,b,m])[2*('><^v/\\|_#'.index(n)||9),2])until o[?;]
o}

নীচে মন্তব্য।

->a{
    o,x,y='',-1,0  # o is the output string, x and y are the positions in the array
    b,m=1,0          # b and m are the direction of momentum
    until o[?;] # until o contains a semicolon
        w=(a.map &:size).max # w is the max width of the arrays
        h=a.size    # h is the height of arrays
        x=x+b % w   # increment cursor position
        y=y+m % h
        o+=n=a[y][x]||' ' # add the new char (or " ") to o
        ix=2*('><^v/\\|_#'.index(n)||9) # find the index new char in the string
        b,m=([1]+[0,-1,0]*2+[1,-m]+[-b,m,b]*2+[-m,-b,-m,b,m])[ix,2] # set momentum to its new value
    end
    o # return output string
}

1

পিএইচপি 7, 291 260 বাইট

for($m=max(array_map(strlen,$z=explode("
",$argv[1]))),$y=0,$r=count($z)-$v=1;';'!=$c;[$v,$w]=[[$v,1,-1,0,0,-$w,$w,-$v,$v,-$v][$o=strpos(' ><^v/\|_#',$c)],[$w,0,0,-1,1,-$v,$v,$w,-$w,-$w][$o]],$x+=$m+$v,$x%=$m,$y=0<=($y+=$w)?$r<$y?:$y:$r)echo$c=$z[$y][$x]??' ';

আমি 291 বাইট / অক্ষর গণনা করি।
হাইপারনিউট্রিনো

আপনি সঠিক, আমি স্পষ্টত গণনা করতে ব্যর্থ = পি
চকোচোস

হাহ চিন্তা করবেন না, আমিও তা করেছিলাম।
হাইপারনিউটারিনো

আমি গল্ফকে কিছু জিনিস পেয়েছি, এটি 25% থেকে 218 বাইটে নামিয়ে নিয়েছি। পরীক্ষিত নয়, তবে অবশ্যই দেখার জন্য মূল্যবান
তিতাস

2
আমার গল্ফিংগুলির মধ্যে একটিতে ত্রুটি এবং আরও ছয়টি বাইট গল্ফড: আপডেট করা গল্ফিং তালিকার
তিতাস

1

জাভাস্ক্রিপ্ট, 242 236 235 231 220 বাইট

a=>{n=a.length;m=x=y=p=0;a.map(g=>m=(w=g.length)<m?m:w);q=1,o="";while((t=a[y][x]||" ")!=";")o+=t,h=q,q=[q,1,0,p,-q][(s=">v\\| <^/_#".indexOf(t)+1)%5]*(r=s>5?-1:1),p=[p,0,1,h,p][s%5]*r,x=(x+q+m)%m,y=(y+p+n)%n;return o+t}

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


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