এলিসের অর্ডিনাল ফর্ম্যাটিং


9

ভূমিকা

অ্যালিস মার্টিন ইন্ডারের একটি 2-ডি ভাষা যার দুটি পৃথক এক্সিকিউশন মোড, কার্ডিনাল এবং অর্ডিনাল । নির্দেশ পয়েন্টারটি যখন একটি আয়না দিয়ে যায় (হয় /বা হয় \), এটি একটি মোড থেকে অন্য মোডে স্যুইচ করে।

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

কেবলমাত্র অর্ডিনাল মোডে পরিচালিত সাধারণ প্রোগ্রামগুলি নীচের উদাহরণের মতো বেশ কমপ্যাক্ট স্টাইলে লেখা যেতে পারে:

/fbd/
@aec\

এখানে আইপি প্রথম সেল পূর্ব যাওয়া থেকে অঙ্কবাচক মোডে আরম্ভ করা হয়, প্রথম আয়না মাধ্যমে প্রেরণ করা এবং আড়াআড়ি চলন্ত শুরু প্রাণচঞ্চল, কমান্ড নির্বাহ a, bএবং c। তখনই উত্তর-পূর্ব আয়না যা এটি অন্যান্য আয়না প্রতি দক্ষিণ যান এবং তারপর, পশ্চিম দিকে ফিরে প্রাণচঞ্চল কমান্ড সম্মুখীন শুরু তোলে encounters d, e, f, এবং পরিশেষে @, প্রোগ্রাম বন্ধ পারে।

এই ধরণের কাঠামোটি বেশ কমপ্যাক্ট, তবে এটি রচনা এবং রক্ষণাবেক্ষণ করা সহজ নয় (একটি একক কমান্ড যুক্ত করা আমাদের বেশিরভাগ কোড পুনরায় অর্ডার করতে বাধ্য করতে পারে!), তাই আমি চাই আপনি বিন্যাসে আমাকে সাহায্য করুন।

কাজটি

কমান্ডের অনুক্রম দেওয়া, যেখানে প্রতিটি কমান্ড একটি একক মুদ্রণযোগ্য ASCII অক্ষর, সেগুলিকে দুটি লাইনে পুনরায় অর্ডার করুন যাতে ক্রমের প্রথমার্ধটি দ্বিতীয় লাইনের প্রথম অক্ষর থেকে শুরু করে পড়তে পারে এবং তারপরে সর্বদা ডানদিকে তির্যকভাবে সরানো যায়, যখন দ্বিতীয়ার্ধটি বাকী অক্ষরগুলি ডান থেকে বামে নিয়ে পড়া যায়। আয়না এবং সমাপ্তির প্রতীক সম্পর্কে চিন্তা করবেন না, আমি সেগুলি নিজেই যুক্ত করব।

সুতরাং, উদাহরণস্বরূপ, প্রদত্ত ইনপুট abcdefআপনার আউটপুট করা উচিত

fbd
aec

যদি ইনপুটটি বিজোড় দৈর্ঘ্যের হয় তবে আপনার যে কোনও জায়গায় একক স্থান (যা এলিসের একটি নূপ) যুক্ত করা উচিত, যতক্ষণ না কমান্ডগুলির ক্রমটি একই রকম থাকে। আপনি একটি অক্ষর দ্বারা দৈর্ঘ্য পৃথক দুটি লাইন আউটপুট চয়ন করতে পারেন, এই ক্ষেত্রে সংক্ষিপ্ত এক একটি শেষে একক স্থান হিসাবে বিবেচিত হয়।

বিধি

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

  • আপনি যে কোনও ডিফল্ট ইনপুট / আউটপুট পদ্ধতির মাধ্যমে ইনপুট / আউটপুট দিতে পারেন
  • ইনপুট মুদ্রণযোগ্য ASCII অক্ষরের একক লাইন নিয়ে গঠিত
  • আউটপুটে একটি একক পেছনের নতুন লাইন অনুমোদিত
  • অ্যালিস প্রোগ্রাম হিসাবে চালিত হওয়ার সময় আপনার প্রোগ্রামের কিছু আউটপুটগুলির একটি সম্পূর্ণ সঠিক আচরণ নাও হতে পারে (উদাঃ যদি প্যাডিং স্পেসটি কোনও স্ট্রিংয়ের ভিতরে sertedোকানো হয়)) এই পরিস্থিতিতে আপনার নিজেকে উদ্বেগের দরকার নেই
  • স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ

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

--Input
abcdef
--Output
fbd
aec

--Input
123
--Output
 2
13
OR
31
 2
OR
3
12
OR
32
1

--Input
O
--Output
O

OR

O

--Input
"Hello, World!"o
--Output
oH!lloo 
""edlr,W

--Input
i.szR.szno
--Output
o.zz.
inssR

--Input
"  ^^} .~[}.~~[}{~~{}[^^^^.""!}"r.h~;a*y'~i.*So
--Output
o *^i}'.*[;.h~r}}~"{.[^
"S .^~ y~a}~~.["{!~"}^^^
(Odd length, your solution may be different)

উত্তর:


1

জেলি , 15 বাইট

œs2U2¦ṚZUJḤ$¦ZY

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

উদ্ধৃত ইনপুট নেয়।

ব্যাখ্যা:

œs2U2¦ṚZUJḤ$¦ZY Main link, monadic
œs2             Split into 2 chunks of similar lengths, last might be shorter
   U2¦          Reverse the 2nd chunk
      Ṛ         Swap the chunks
       Z        Transpose into chunks of length 2
        UJḤ$¦   Reverse the chunks at even indices (1-indexed)
             Z  Transpose into 2 chunks again
              Y Join by a newline

12

অ্যালিস , 28 বাইট

/mY. zm~wZ.k;
\I;'!*?RR.OY@/

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

যদি ইনপুট দৈর্ঘ্যটি বিজোড় হয়, এটি লিনিয়ারাইজড প্রোগ্রামের শেষে প্যাডিং স্পেসটি রাখে, যা আউটপুটটির প্রথম চরিত্র হিসাবে শেষ হয়।

লিও কিছুদিন আগে অ্যালিসে একটি অর্ডিনাল ফর্ম্যাটর লিখেছিল । বিজোড় দৈর্ঘ্যের ইনপুটগুলির জন্য সমর্থন যোগ করার পরে এবং এই চ্যালেঞ্জের জন্য প্রয়োজনীয় নয় এমন কিছু সামগ্রী অপসারণের পরে, আমরা 28 বাইটে শেষ করেছি । আমি কিছুটা ভিন্ন পদ্ধতির চেষ্টা করতে চেয়েছিলাম, যা এই উত্তর। দুর্ভাগ্যক্রমে, এটি কেবল ২৮ বাইট বেঁধে শেষ হয়েছিল, তবে কমপক্ষে এইভাবে আমি নিজের সমাধান পোস্ট করতে পারি এবং লিওকে তার মূল অ্যালগরিদম পোস্ট করতে পারি।

অর্ধেকের সাথে একটি স্ট্রিং বিভক্ত করতে এটি লিওর সত্যই চতুর ধারণাটি ব্যবহার করে ..Y;m;.!z?~

ব্যাখ্যা

আসুন ধরে নেওয়া যাক যে ইনপুটটির আরও দৈর্ঘ্য রয়েছে (কারণ আমরা এটি স্থান না দিয়ে কেবল প্যাড করব)। আমরা 0123456789কোড হিসাবে ব্যবহার করি কিনা তা দেখতে প্যাটার্নটি কিছুটা সহজ । প্রয়োজনীয় আউটপুট হবে:

91735
08264

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

সুতরাং মূল ধারণাটি হ'ল:

  • বিজোড় এবং এমনকি পজিশনে পৃথক করুন ইনপুট।
  • যদি প্রয়োজন হয় একটি স্থান সঙ্গে বিজোড় অবস্থান প্যাড।
  • বিজোড় অবস্থানগুলি উল্টো করুন।
  • তারপরে দু'বার: বর্তমান স্ট্রিংটি অর্ধেক করুন, দ্বিতীয়ার্ধকে বিপরীত করুন, উভয় অংশকেই ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকা করুন line

কোড হিসাবে, এটি অনেকটা দেখতে এই ধরণের চ্যালেঞ্জের মধ্যে আমরা কী ধরণের লেআউট তৈরি করছি তার মতো দেখতে তবে এটি সম্পূর্ণ আলাদা: আইপি /কোডের শেষে হিট হলে এটি দক্ষিণে নয়, পূর্বদিকে প্রতিফলিত হয় । তারপরে, কার্ডিনাল মোডে থাকাকালীন, আইপিটি প্রথম কলামটির চারপাশে মোড়ানো হবে। \সেখানে পুনরায় প্রবেশ পূরণবাচক মোড, যাতে কোড দ্বিতীয়ার্ধে ডান দিক থেকে ফিরে যেতে হয় না এখানে বাম, কিন্তু থেকে বাম ডান হিসাবে ভাল। রিটার্ন ঠিকানা স্ট্যাকের সাথে কাজ করার সময় এটি উপকারী, কারণ এটি আইপির দিকনির্দেশ সম্পর্কে তথ্য সঞ্চয় করে না। এটি আমাদের কয়েকটি বাইট সংরক্ষণ করতে দেয় কারণ আইপি উভয় wএবং একই দিকে একই (অনুভূমিক) দিকে চলে যাবে k

লিনিয়ারাইজড কোডটি হ'ল:

IY' *mRw..Y;m;.!z?~RZOk@

এর মাধ্যমে চলুন:

I       Read one line of input.
Y       Unzip. Separates the string into even and odd positions.
' *     Append a space to the odd half.
m       Truncate: discards characters from the longer of the two
        strings until they're the same length. So if the input
        length was even, appending a space will make the odd half
        longer and this discards the space again. Otherwise, the
        space just padded the odd half to the same length as the
        even half and this does nothing.
R       Reverse the odd half.
w       Push the current IP address to the return address stack.
        The purpose of this is to run the following section
        exactly twice.

          This first part splits the current line in half, based
          on an idea of Leo's:
  ..        Make two copies of the current half.
  Y         Unzip one of the copies. The actual strings are irrelevant
            but the important part is that the first string's length
            will be exactly half the original string's length (rounded up).
  ;         Discard the potentially shorter half.
  m         Truncate on the original string and its even half. This shortens
            the original string to the first half of its characters.
  ;         Discard the even half, because we only needed its length.
  .!        Store a copy of the first half on the tape.
  z         Drop. Use the first half to discard it from the original string.
            This gives us the the second (potentially shorter half).
  ?         Retrieve the first half from the tape.
  ~         Swap it so that the second half is on top.
          The string has now been split in half.
  R       Reverse the second half.
  Z       Zip. Interleave the two halves.
  O       Print the result with a trailing linefeed.

k       Pop an address from the return address stack and jump back there.
        The second time we reach this, the return address stack is empty,
        and this does nothing.
@       Terminate the program.

1
আপনি যে নতুন লেআউটটি নিয়ে এসেছেন তার জন্য আমাকে আরও একটি চ্যালেঞ্জ পোস্ট করতে হবে! : ডি খুব সুন্দর, আমি মনে করি আমি যখন রিটার্ন স্ট্যাকটি ব্যবহার না করি তখনও আমি এটি ব্যবহার শুরু করব, কোডের দুটি অংশকে বাম থেকে ডানদিকে পড়া সহজ
লিও

4

জেলি , 23 22 বাইট

লিও -1 বাইট ধন্যবাদ (নীচে-বাম প্যাডিং হতে পারে)

LḂ⁶ẋ;µṚ,µm2œs2U0¦ż/µ€Y

ফলাফল মুদ্রণের একটি পূর্ণ প্রোগ্রাম

এটি অনলাইন চেষ্টা করুন! অথবা একটি পরীক্ষা স্যুট দেখুন

কিভাবে?

LḂ⁶ẋ;µṚ,µm2œs2U0¦ż/µ€Y - Main link: list of characters
L                      - length
 Ḃ                     - modulo 2
  ⁶                    - literal space character
   ẋ                   - repeat
    ;@                 - concatenate (swap @rguments) (appends a space if the input's length is odd)
      µ                - monadic chain separation, call that s
       Ṛ               - reverse s
        ,              - pair with s
         µ         µ€  - for €ach:
          m2           -   modulo 2 slice (take every other character)
            œs2        -   split into two "equal" chunks (first half longer if odd)
               U0¦     -   upend index 0 (reverse the second chunk)
                   /   -   reduce by:
                  ż    -     zip
                     Y - join with newlines (well just the one in this case)
                       - implicit print (mushes the sublists together)

1

জাভাস্ক্রিপ্ট (ES6), 104 বাইট

f=
s=>s.replace(/./g,(c,i)=>a[1&~i][i+i>l?l-i:i]=c,a=[[` `],[]],l=s.length-1|1)&&a.map(a=>a.join``).join`
`
<input oninput=o.textContent=f(this.value)><pre id=o>

নির্বাহের পথকে অনুকরণ করে এবং কমান্ডগুলি যেমন যায় তেমন পূরণ করে Works


একটি দুর্দান্ত ধারণা বলে মনে হচ্ছে তবে আপনি যে অ্যালগরিদমটি ব্যবহার করেছেন তা বোঝার জন্য জাভাস্ক্রিপ্ট সম্পর্কে আমি যথেষ্ট পরিমাণে জানি না ... আপনি কি কিছু ব্যাখ্যা যোগ করতে পারেন?
লিও

@ লিও আমি আরও কতটা ব্যাখ্যা করতে পারি তা নিশ্চিত নই। আপনি জানেন যে, কমান্ডগুলি বাম থেকে ডানে এবং পিছনে আবার বাম দিকে একটি জিগ-জাগ লাইন অনুসরণ করে। 1&~i, উলম্ব Zig-zag অর্জন যখন i+i>l?l-i:iঅর্ধেক আয়না অর্জন করা হয়ে। সমস্ত কমান্ডগুলি কাঙ্ক্ষিত এক্সিকিউশন পজিশনে প্রবেশ করার পরে অ্যারেটি একসাথে সংগ্রহ করা হয়ে কাঙ্ক্ষিত ফলাফল তৈরি করতে পারে।
নিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.