একটি আধা-প্যালিনড্রোম ধাঁধা


23

প্যালিনড্রোম এমন একটি শব্দ যা তার নিজস্ব বিপরীত।

এখন কিছু শব্দ রয়েছে যা প্যালিনড্রোমের মতো দেখতে লাগবে কিন্তু তা নয়। উদাহরণস্বরূপ, শব্দটি বিবেচনা করুন sheesh, sheeshএকটি প্যালিনড্রোম নয় কারণ এর বিপরীত hseehsযা ভিন্ন, তবে যদি আমরা shএকটি একক অক্ষর হিসাবে বিবেচনা করি তবে এটি বিপরীত sheesh। এই জাতীয় শব্দটিকে আমরা একটি আধা-প্যালিনড্রোম বলব।

বিশেষত একটি শব্দ একটি অর্ধ-প্যালিনড্রোম হয় যদি আমরা শব্দটিকে কয়েকটি সংখ্যায় বিভক্ত করতে পারি যেমন খণ্ডগুলির ক্রম যখন বিপরীত হয় তখন মূল শব্দটি তৈরি হয়। ( sheeshসেই অংশগুলি হ'ল sh e e sh) আমাদের প্রয়োজন হবে না শব্দের উভয় অংশের কোনও অংশে অক্ষর থাকবে (অন্যথায় প্রতিটি শব্দ একটি অর্ধ-প্যালিনড্রোম হবে)। উদাহরণস্বরূপ rearএকটি আধা-প্যালিনড্রোম নয় কারণ r ea rএকটি শঙ্ক eaরয়েছে ( ) যা মূল শব্দের উভয় পক্ষের অক্ষর ধারণ করে। আমরা একটি বিজোড় দৈর্ঘ্যের শব্দের মধ্যে কেন্দ্রীয় চরিত্রটিকে শব্দের উভয় পাশে বলে মনে করি, এইভাবে বিজোড় দৈর্ঘ্যের শব্দের জন্য কেন্দ্রের চরিত্রটি সর্বদা এর নিজস্ব অংশে থাকতে হবে।

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

উত্তরগুলি কম বাইটের সাথে ভাল হওয়ার সাথে বাইটে স্কোর করা হবে।

টেস্ট-মামলা

[] -> True
[1] -> True
[2,1,2] -> True
[3,4,2,2,3,4] -> True
[3,5,1,3,5] -> True
[1,2,3,1] -> False
[1,2,3,3,4,1] -> False
[11,44,1,1] -> False
[1,3,2,4,1,2,3] -> False

আরও টেস্টকেস উত্পন্ন করার প্রোগ্রাম।


বোরোফাই উল্লেখ করেছেন যে এগুলি জেনারালাইজড স্মারান্ডে প্যালিনড্রোমের মতো । সুতরাং আপনি যদি আরও কিছু পড়াতে চান তবে এটি শুরু করার এক জায়গা।


2
আপনি কেন স্ট্রিং ব্যবহার করে আধা-প্যালিনড্রোম সংজ্ঞায়িত করেছেন তবে আপনার ইনপুটগুলি পূর্ণসংখ্যার অ্যারে হয়? বিভ্রান্ত হওয়ার পাশাপাশি, এর অর্থ আমরা নিজের প্রোগ্রামটি ব্যবহার করে আমাদের উত্স কোডটি পরীক্ষা করতে পারি না।
ব্র্যাডিসি 15:58

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

@ ব্র্যাডসি স্ট্রিংগুলি বিশেষত অক্ষরের তুলনায় বাইটের ক্ষেত্রে অদ্ভুত প্রান্তের মামলাগুলি প্রবর্তন করে। আমি সংখ্যা নির্বাচন করি কারণ তারা সহজ। আমি ভেবেছিলাম ব্যাখ্যাগুলির উদ্দেশ্যে শব্দগুলি আরও সহজ হবে।
গম উইজার্ড 21

2
এই ধরণের প্যালিনড্রোমগুলি সাহিত্যে জেনারালাইজড স্মারান্ডে প্যালিনড্রোম হিসাবে পরিচিত।
ভয়ঙ্কর

1
@ রোসলুপ হ্যাঁ, "সত্য" প্যালিনড্রোমগুলিও আধা-প্যালিনড্রোমস, কেবলমাত্র প্রতিটি চরিত্র / পূর্ণসংখ্যার সাথে কোনও অতিরিক্ত "ছাঁটাই" না করেই আচরণ করে।
ব্র্যাডিসি

উত্তর:


6

রেটিনা 0.8.2 , 85 69 বাইট

M`^(.+,)*(\d+,)?(?<-1>\1)*$(?(1)^)|M`^(.+,)*(\d+,)?(?<-1>\1)*$(?(1)^)

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

M`

ম্যাচ মোড নির্বাচন করুন। আসলে, রেটিনা একক-লাইন প্রোগ্রামের জন্য ম্যাচ মোডে ডিফল্ট, তবে কোডের দ্বিতীয় অনুলিপি এই অতিরিক্ত অক্ষরের জন্য না থাকলে সর্বদা মিলবে always

^

ম্যাচটি শুরুতে শুরু হওয়া উচিত।

(.+,)*

অক্ষর একটি সংখ্যা ক্যাপচার। প্রতিটি রান অবশ্যই কমাতে শেষ হবে।

(\d+,)?

Ptionচ্ছিকভাবে একটি সংখ্যা এবং কমা দিয়ে রান করুন।

(?<-1>\1)*

Theচ্ছিকভাবে সমস্ত ক্যাপচারগুলি বিপরীত ক্রমে মেলে, একে একে ম্যাচ করার সাথে সাথে পপ করে।

$

ম্যাচটি শেষে শেষ হতে হবে।

(?(1)^)

সমস্ত ক্যাপচার পপড না করা ব্যাকট্র্যাক এটি ম্যাচটি স্ট্রিংয়ের শুরুতে এখনও অবধি ক্যাপচার না থাকলে, এটি অসম্ভব বলে মনে করে কাজ করে।


5

জেলি , 27 23 বাইট

ṖUṁ@Ƒ€ṚẸHḢŒŒHḢŒṖUṁ@Ƒ€ṚẸ

রিটার্নস 1 আধা palindromes জন্য, 0 অন্যথায়।

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

কিভাবে এটা কাজ করে

ṖUṁ@Ƒ€ṚẸHḢŒŒHḢŒṖUṁ@Ƒ€ṚẸ  Main link. Argument: A (array)

          Œ              Invalid token. Everything to its left is ignored.
           ŒH            Halve; divide A into two halves similar lengths. The middle
                         element (if there is one) goes into the first half.
             Ḣ           Head; extract the first half.
              ŒṖ         Generate all partitions of the first half.
                U        Upend; reverse each chunk of each partition.
                         Let's call the result C.

                     Ṛ   Yield R, A reversed.
                   Ƒ€    Fixed each; for each array P in C, call the link to the left
                         with arguments P and R.
                         Return 1 if the result is P, 0 if not.
                 ṁ@          Mold swapped; replace the n integers of C, in reading
                             order, with the first n integers of R.
                     Ẹ   Exists; check if one of the calls returned 1.


4

05 এ বি 1 ই , 59 47 43 41 বাইট

2äøø€.œ`âʒ`RQ}gĀIg_^q2äøø€.œ`âʒ`RQ}gĀIg_^

-12 বাইটস @ এমিগানাকে ধন্যবাদ

এটি অনলাইনে চেষ্টা করুন বা সমস্ত পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা:

2ä               # Split the input into two parts
                 #  i.e. [3,4,2,0,2,3,4] → [[3,4,2,0],[2,3,4]]
  øø             # Zip twice without filler
                 # This will remove the middle item for odd-length inputs
                 #  i.e. [[3,4,2,0],[2,3,4]] → [[3,2],[4,3],[2,4]] → [[3,4,2],[2,3,4]]
    €.œ          #  Then take all possible partitions for each inner list
                 #   i.e. [[3,4,2],[2,3,4]]
                 #    → [[[[3],[4],[2]],[[3],[4,2]],[[3,4],[2]],[[3,4,2]]],
                 #       [[[2],[3],[4]],[[2],[3,4]],[[2,3],[4]],[[2,3,4]]]]
`                # Push both lists of partitions to the stack
 â               # Take the cartesian product (all possible combinations) of the partitions
                 #  i.e. [[[[3],[4],[2]],[[2],[3],[4]]],
                 #        [[[3],[4],[2]],[[2],[3,4]]],
                 #        ...,
                 #        [[[3,4,2]],[[2,3,4]]]]
  ʒ   }          # Filter this list of combinations by:
   `             #  Push both parts to the stack
    RQ           #  Check if the second list reversed, is equal to the first
                 #   i.e. [[3,4],[2]] and [[2],[3,4]] → 1 (truthy)
       gĀ        # After the filter, check if there are any combinations left
                 #  i.e. [[[[3,4],[2]],[[2],[3,4]]]] → 1 (truthy)
         Ig_     # Check if the length of the input was 0 (empty input-list edge-case)
                 #  i.e. [3,4,2,0,2,3,4] → 7 → 0 (falsey)
            ^    # Bitwise-XOR
                 #  i.e. 1 XOR 0 → 1 (truthy)
             q   # Stop the program (and then implicitly output the top of the stack)
2äøø€.œ`âʒ`RQ}gĀIg_^
                 # Everything after the `q` are no-ops to comply to the challenge rules

আপনি øøε.œ} `এর সাথে বিজোড় দৈর্ঘ্যের তালিকাগুলি সহ 6 বাইট সংরক্ষণ করে সমস্যাটি পেতে পারেন । আপনার মনে হয় 30 টি অব্যবহৃত বাইট এতে রেখে গেছে ...
এমিগিনা

@ এমিগনা শেষে চূড়ান্তভাবে নিষিদ্ধ উত্সের প্রয়োজনীয়তা মেনে চলতে হবে
কামিল দ্রাকারী

@ কামিলডাকারী: ঠিক আছে। সেই অংশটি ভুলে গেছি। সুসংবাদটি হ'ল 6-বাইট
সংরক্ষণটি

@ এমিগনা ডাবল-জিপ ট্রিক সহ খুব স্মার্ট। আমি সেই অংশটি নিয়ে খুশি ছিলাম না, তবে এটি আরও অনেক ভাল! বিটিডব্লু, যেহেতু এলিক্সির 2-বাইট কমান্ডগুলির পরিবর্তে এর সাথে নতুন করে লিখতে পারেন ε }। :)
কেভিন ক্রুইজসেন

@ কেভিন ক্রুজসেন: আহা দুর্দান্ত। আমি এটা জানতাম না।
এমিগনা

4

05AB1E , 37 বাইট

মোটামুটি একই কৌশল ব্যবহার করে জোনাথনকে কাজে নিয়ে এসেছেন।

.œʒ€gηOZ;îå}εÂQ}ZĀqĀZ}QÂε}åî;ZOηg€ʒ.œ

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


.œʒ€gηOZ;îå}εÂQ}ZĀqĀZ}QÂε}åî;ZOηg€ʒ.œ

পুরো প্রোগ্রাম। এসটিডিআইএন থেকে একটি তালিকা প্রাপ্ত, আউটপুট 1 বা 0

.œʒ        }

সন্তুষ্ট পার্টিশনগুলি ফিল্টার-রাখুন ...

   €gηOZ;îå

এই শর্ত: প্রতিটি ( €g) এর দৈর্ঘ্য একটি তালিকায় সংরক্ষণ করা হয়, যার উপসর্গ ( η) এর পরে সংক্ষিপ্ত করা হয় ( O), সুতরাং আমাদের দৈর্ঘ্যের তালিকার সংখ্যাসমূহ প্রদান করে। তারপরে, সেই তালিকার সর্বাধিক সিলড অর্ধেকটি স্ট্যাকের উপরে ধাক্কা দেওয়া হয় - তবে এটির উপরে মূল তালিকাটি পাশাপাশি রাখা হয় ( Z;î) এবং যদি এটি åসংশ্লেটিভ পরিমাণে ঘটে ( ) হয় তবে ফাংশনটি সত্যতা ফিরে আসে।

εÂQ}

প্রতিটি জন্য, তুলনা ( Q) একটি সঙ্গে একটি বিপরীত, যা স্ট্যাক আলাদাভাবে push করা হয় Â0 টি এবং এর একটি তালিকা ফেরত দেয় 1 এর।

ZĀq

সর্বোচ্চ। যদি কোনো truthy, তারপর 1 আর 0 । মৃত্যুদণ্ড কার্যকর করুন। এর পরে যা কিছু ঘটে তা সম্পূর্ণ উপেক্ষা করা হয় ignored


3

পাইথন 2 , 275 251 205 বাইট

-২৪ বাইটস @ কেভিন ক্রুজসেনকে ধন্যবাদ

-৪৪ বাইটস @ পোষ্টফেল্টহোস্টহান্টারকে ধন্যবাদ thanks

-2 আরও বাইটস @ কেভিন ক্রুজসেনকে ধন্যবাদ

def s(x):
 l=len(x)
 if l<2:return 1>0
 for i in range(1,l/2+1):
	if x[l-i:]==x[:i]:return s(x[i:l-i])
def s(x):
 l=len(x)
 if l<2:return 1>0
 for i in range(1,l/2+1):
	if x[l-i:]==x[:i]:return s(x[i:l-i])

অর্ধ-প্যালিনড্রোমের জন্য সত্য ফেরৎ দেয় অন্যথায় নয়

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


1
বা স্রেফ 1
জো কিং

কেন (x) দ্বিগুণ সংজ্ঞায়িত?
ডাঃ ওয়াই উইট

কারণ তারা বলে প্যালিনড্রোম হিসাবে গণনা ... তবে একই নাম দিয়ে একটি ফাংশন সংজ্ঞায়িত করা সম্ভব কি ???
রোজলুপি

@ রোসলুপ হ্যাঁ আপনি পারেন দ্বিতীয়টি কেবল প্রথমটিকে ওভাররাইট করে
জো কিং

3

জেলি ,  33  32 বাইট

-1 এরিক দ্য আউটগল্ফারকে
ধন্যবাদ একটি ডানিসকেও একটি বাগ ফিক্স করার জন্য এবং জেলিতে বাস্তবায়নের বিশদটি পরিবর্তন করার জন্য ধন্যবাদ।

ẸƇŒḂƇƊ$ƊĊHṀċÄẈṖŒŒṖẈÄċṀHĊƊ$ƊƇŒḂƇẸ

আধা-প্যালিনড্রোম ফলন করে 1, অন্যরাও ফল দেয় 0

হে(2এন)

অথবা পরীক্ষা-স্যুটটি দেখুন

একমাত্র খণ্ডগুলি হ'ল ŒḂ({3 য় র & 4 } বনাম 29 & তম এবং 30 তম) পার্স করার অনুমতি দেওয়ার জন্য কেবলমাত্র বাইট)।

কিভাবে?

সমস্ত কাজ ডান হাত দ্বারা সঞ্চালিত হয় - "মূল লিঙ্ক":

ŒṖẈÄċṀHĊƊ$ƊƇŒḂƇẸ - Main Link: list
ŒṖ               - all partitions
           Ƈ     - filter keep those for which this is truthy (i.e. non-zero):
          Ɗ      -   last three links as a monad:
  Ẉ              -     length of each
         $       -     last two links as a monad:
   Ä             -       cumulative addition
        Ɗ        -       last three links as a monad:
     Ṁ           -         maximum
      H          -         halve
       Ċ         -         ceiling
    ċ            -     count
              Ƈ  - filter keep those for which this is truthy:
            ŒḂ   -   is palindrome?
               Ẹ - any?




1

সি (জিসিসি) (এক্স 86), 216 বাইট

p(L,a,n)int*a;{return n?(memcmp(a,a+L-n,n*4)|p(L-2*n,a+n,L/2-n))&&p(L,a,n-1):1<L;}
#define p(L,a)p(L,a,L/2)//p(L,a,n)int*a;{return n?(memcmp(a,a+L-n,n*4)|p(L-2*n,a+n,L/2-n))&&p(L,a,n-1):1<L;}
#define p(L,a)p(L,a,L/2)

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

p(L,a,n)aদৈর্ঘ্যের অ্যারেটি Lএকটি আধা-প্যালিনড্রোম হলে 0 প্রদান করে , অন্যথায় 1। দৈর্ঘ্যের সমস্ত উপসর্গ >nইতিমধ্যে চেক করা হয়েছে যে প্রদত্ত , এটি দৈর্ঘ্যের nপ্রত্যয় সঙ্গে দৈর্ঘ্যের উপসর্গ তুলনা করে np(L,a)এন্ট্রি পয়েন্ট।

দুর্ভাগ্যক্রমে, আরও আকর্ষণীয় সমাধান দীর্ঘ:

224 বাইট

(f(L,a,n))//#define p(L,a)(n=L/2,
int*a,n;
{return n?(memcmp(a,a+L-n,n*4)|f(L-2*n,a+n,L/2-n))&&f(L,a,n-1):1<L;}//{return n?(memcmp(a,a+L-n,n*4)|f(L-2*n,a+n,L/2-n))&&f(L,a,n-1):1<L;}
int*a,n;
#define p(L,a)(n=L/2,f(L,a,n))//(

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

Ungolfed:

(f(L,a,n)) //#define p(L,a)(n=L/2,
int*a,n;
{
  return n 
    ? (memcmp(a, a+L-n, n*4) | f(L-2*n, a+n, L/2-n)) &&
      f(L,a,n-1)
    : 1 < L;
} // { ... } 
int*a,n;
#define p(L,a)(n=L/2,f(L,a,n)) //(

1

জাপট , 66 বাইট


@¯X eUsXn}a1 "
ʧV?UÊ<2:ßUéV sVÑ
@¯X eUsXn}a1 "
ʧV?UÊ<2:ßUéV sVÑ

জাপট ইন্টারপ্রেটার

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

ব্যাখ্যা:

@        }a1         Find the first number n > 0 such that...
 ¯X                   the first n elements
     UsXn             and the last n elements
    e                 are the same

"
ʧV?UÊ<2:ßUéV sVÑ    String literal to make it a Semi-palindrome
@¯X eUsXn}a1 "

ʧV?                 If n >= length of input...
    UÊ<2              return true if the length is less than 2
        :            Otherwise...
          UéV         move n elements from the end of the input to the start
              sVÑ     remove the first 2*n elements
         ß            and repeat on the remaining elements

0

পিএইচপি 237 বাইট

function f($a){for($x=2>$c=count($a);++$i<=$c/2;)$x|=($s=array_slice)($a,0,$i)==$s($a,-$i)&f($s($a,$i,-$i));return$x;}#function f($a){for($x=2>$c=count($a);++$i<=$c/2;)$x|=($s=array_slice)($a,0,$i)==$s($a,-$i)&f($s($a,$i,-$i));return$x;}

রিকার্সিভ ফাংশন, প্রত্যাবর্তন true( 1দু'রও কম উপাদান থাকা ইনপুট জন্য) বা মিথ্যাচারের
0জন্য সত্যবাদিতার জন্য। এটি অনলাইনে চেষ্টা করুন (ব্রেকডাউন রয়েছে)

আসল কোড দৈর্ঘ্য 118 বাইট; কোড নকলের মাধ্যমে অর্ধ-প্যালিনড্রোম তৈরি করা হয়েছে।

ভাল পারফরম্যান্স জন্য প্রতিস্থাপন &সঙ্গে &&এবং সন্নিবেশ !$x&&সামনে ++$i


0

স্কালা, 252 বাইট

def^(s:Seq[Int]):Int={val l=s.size;if(l>1)(1 to l/2).map(i=>if(s.take(i)==s.takeRight(i))^(s.slice(i,l-i))else 0).max else 1}//def^(s:Seq[Int]):Int={val l=s.size;if(l>1)(1 to l/2).map(i=>if(s.take(i)==s.takeRight(i))^(s.slice(i,l-i))else 0).max else 1}

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

গীত। স্পষ্টতই, সমাধানের প্রয়োজনটি পূরণের জন্য সমাধানটি 2 গুণ বেশি দীর্ঘ হয় যে উত্স কোডটিও আধা প্যালিনড্রোম।

PPS। কোনও কোড-গল্ফ প্রার্থী নন তবে প্যাটার্ন মিলের সাহায্যে বিশুদ্ধভাবে কার্যকরী সমাধান:

  def f(s:Seq[Int], i:Int=1):Int = {
    (s, i) match {
      case (Nil ,_) => 1
      case (Seq(_), _) => 1
      case (l, _) if l.take(i) == l.takeRight(i) => f(l.slice(i,l.size-i), 1)
      case (l, j) if j < l.size/2 => f(l, i+1)
      case (_, _) => 0
    }
  }

চ্যালেঞ্জটির জন্য আপনার কোডটিও একটি আধা-প্যালিনড্রোম হওয়া দরকার। চ্যালেঞ্জের মধ্যে এটিই সবচেয়ে মজাদার।
গম উইজার্ড ২

@ পোষ্টফেল্টগোস্ট হান্টার, আমি প্রয়োজনীয়তা পূরণের জন্য মন্তব্যে মূল উত্স কোড যুক্ত করেছি। বিটিডাব্লু, সোর্স কোড সেমি প্যালিনড্রোম তৈরি করার মজা কী? আমি যদি ভুল না করি তবে এই থ্রেডের প্রতিটি সমাধান এই প্রয়োজন ছাড়াই দুইগুণ কম হবে। আপনি কি কোনও সমাধানের মতো সচেতন না?
ডাঃ ওয়াই উইট

0

পার্ল 6 , 81 বাইট

($!={/../&&/^(.+)(.*)$0$/&&$1.$!})o&chrs#($!={/../&&/^(.+)(.*)$0$/&&$1.$!})o&chrs

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

/../সত্যের জন্য রেগেক্স এবং মিথ্যাটির /^(.+)(.*)$0$/জন্য রেজেক্স প্রদান করে। নেলহোফের উত্তরের মতো একইভাবে কাজ করে , তবে তালিকাটি আগেই স্ট্রিংয়ে রূপান্তর করে।

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