অর্ধ-বিপরীত একটি বাইনারি স্ট্রিং


12

এটা আমার জন্য একটি ফলো-আপ প্রশ্ন হল Puzzling.SE প্রশ্ন : আমি জিজ্ঞাসা করলাম একটি ফাংশন আছে কিনা বুলিয়ান স্ট্রিং বুলিয়ান স্ট্রিং ম্যাপিং, যাতে চ (চ (খ)) = বিপরীত (খ) সমস্ত ইনপুট স্ট্রিং জন্য । ( বিপরীতক্রমে , আমি ফাংশনটি যা বিটের ক্রমকে বিপরীত করে বুঝি))

উপরের লিঙ্কটিতে দুর্দান্ত চ '' র প্রমাণ সহ একটি ইতিবাচক উত্তর রয়েছে তবে আপনি নিজের প্রশ্নের আগে নিজেরাই বিবেচনা করতে চাইতে পারেন।

বাস্তবায়ন যেমন একটি ফাংশন সম্ভব কয়েক বাইট হিসাবে।

  • আপনি হয় STDIN থেকে ইনপুট পড়তে পারেন, বা কোনও ফাংশন যুক্তি নিতে পারেন; এবং হয় STDOUT এ ফলাফল স্ট্রিং লিখুন, বা এটি ফিরে।

  • যে কোনও উপায়ে, আপনি দুটি স্বতন্ত্র বাইট বা আপনার পছন্দের অক্ষর (বলুন 0এবং 1, \x00এবং এবং \x01) এবং সত্যবাদী এবং মিথ্যা মানগুলির অ্যারে / তালিকা সহ কাজ করতে পারেন । যদিও দুটি মান চয়ন করুন এবং সেগুলির সাথে আঁকুন।

  • চ এর একক প্রয়োগের ফলাফলটি অবশ্যই বাইনারি স্ট্রিং হতে পারে: এর মতো নির্বোধ উত্তরগুলি b -> if b starts with 'x' then reverse(b[1:]) else 'x' + b...

  • আপনার ফাংশন মোট হতে হবে ; বিশেষত, ইনপুটটি খালি স্ট্রিং বা এক বিট লম্বা ইত্যাদি হতে পারে the স্ট্রিংয়ের দৈর্ঘ্যের জন্য উপরের কোনও আবদ্ধতা নেই।

  • এটি খাঁটিও হওয়া উচিত : ফাংশন কলগুলির মধ্যে কোনও বৈশ্বিক অবস্থা রাখবেন না; ইনপুট স্ট্রিং সম্পূর্ণ আউটপুট স্ট্রিং নির্ধারণ করতে হবে।


আউটপুট ইনপুট চেয়ে পৃথক দৈর্ঘ্য থাকতে পারে?
লুইস মেন্ডো

নিশ্চিত! (আসলে, অন্যথায়, চ্যালেঞ্জটি সম্ভাব্য অসম্ভব))
লিন

এটির দৈর্ঘ্যের এক বা শূন্যের জন্য কাজ করতে হবে?
ক্যালকুলেটরফলাইন

হ্যাঁ; ফাংশনটি মোট হতে হবে। আমি এই প্রশ্নে স্পষ্ট করে দিয়েছি!
লিন

উত্তর:



7

পাইথন 2, 64 69 বাইট

def f(s):p=(s+s).find(s,1);return[s[~p::-1],s+s[:p]][len(s)/p%2]

Ungolfed:

def f(s):
    p = (s+s).find(s,1)
    n = len(s)/p
    return s[:p][::1|n%-2] * -~(n-1^1)

এটি স্ট্রিংয়ের পিরিয়ড, অর্থাৎ সর্বনিম্ন pযেমন sদৈর্ঘ্যের pপুনরাবৃত্ত nসময়ের একটি স্ট্রিং সন্ধান করে (আমি এসও-তে একটি গোল্ফ পদ্ধতিটি পেয়েছি )। তারপরে যদি nবিজোড় হয় তবে এটি পিরিয়ডের আরও একটি পুনরাবৃত্তি যোগ করে। যদি nসমান হয় তবে এটি পিরিয়ডের একটি পুনরাবৃত্তি সরিয়ে দেয় এবং এর বিপরীত হয়।

1 <-> 2, 3 <-> 4 ইত্যাদির মধ্যে ফাংশন ম্যাপিং কার্যকর করতে সহায়তা করার জন্য @ এসপি 3000 কে ধন্যবাদ


... অবহেলিত কোডটি কখন আপডেট হবে?
ক্যালকুলেটরফ্লাইন

@ ক্যাটসআরএফ্লুফির অগল্ফড কোডটি পরিবর্তন করার কোনও পরিকল্পনা নেই কারণ এটি কেবলমাত্র তুচ্ছ পার্থক্য সহ একই ধারণাটি ব্যবহার করে uses অন্যদিকে ইংরেজী আপ-টু-ডেট।
ফেয়ারসাম

2

পার্ল, 49 47 বাইট

এর জন্য +2 অন্তর্ভুক্ত -lp

@ ফেয়ারসামের খুব সুন্দর অ্যালগরিদমের ভিত্তিতে

STDIN এ ইনপুট দিয়ে চালান, যেমন

perl -lp halfreverse.pl <<< "101001"

halfreverse.pl:

/^(.+?)((\1\1?)*)$/;$_=$3eq$1?reverse$2:$_.$1

ব্যাখ্যা

/^               $/         Match the complete input string
  (.+?)                     Non-greedy match. Try only one digit at the start,
                            if that doesn't work try 2, then 3 etc. The string
                            being tried is remembered in backreference \1
       ((\1\1?)*)           Try to repeat \1 as many times as possible but
                            prefer in groups of 2. Fall back to only 1 at the
                            end of the string if the trailing part has an odd
                            number of \1 (so the total count is even)

   $3eq$1                   So the last match $3 equals the first match $1
         ?                  if and only if the total count is even
          reverse$2         If total count is even drop the first instance of
                   :        \1 and reverse
                    $_.$1   If total count is odd extend $_ by one instance
$_=                         Assign result

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