লিন্ডন শব্দটি পরীক্ষা করুন


22

একজন লিন্ডন শব্দ একটি স্ট্রিং যে কঠোরভাবে হয় lexicographically ছোট তার আবর্তনশীল ঘুর্ণন তুলনায়। একটি বাইনারি স্ট্রিং দেওয়া, এটি যতটা সম্ভব কম কয়েকটি বাইটে লিন্ডন শব্দ কিনা তা নির্ধারণ করুন।

উদাহরণস্বরূপ, 001011একটি লিন্ডন শব্দ। নীচে তালিকাভুক্ত এর আবর্তনগুলি প্রথম প্রতীকটি শেষ পর্যন্ত বারবার দ্বারা প্রাপ্ত হয়।

001011
010110
101100
011001
110010
100101

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

তবে 001001লিন্ডনের কোনও শব্দ নয় কারণ এর ঘূর্ণনগুলির একটি তার নিজের মতোই, যা এটি অভিধানের প্রথম দিকের জন্য সংযুক্ত করে।

একটি সম্পর্কিত সমস্যা।

ইনপুট: একটি খালি খালি বাইনারি স্ট্রিং বা অঙ্কগুলির তালিকা 0এবং 1। আপনি সংখ্যা ব্যবহার করতে পারবেন না , 5উপস্থাপন করতে পছন্দ করুন 101

আউটপুট: একটি ধারাবাহিক সত্যবাদী বা ফলসী মান যা বলে যে স্ট্রিংটি লিন্ডন শব্দ কিনা।

লিন্ডন শব্দের জন্য বিশেষত বিল্ট-ইনগুলি অনুমোদিত নয়।

পরীক্ষার কেস:

6 অবধি দৈর্ঘ্যের লিন্ডন শব্দগুলি হ'ল:

0
1
01
001
011
0001
0011
0111
00001
00011
00101
00111
01011
01111
000001
000011
000101
000111
001011
001101
001111
010111
011111

4 অবধি দৈর্ঘ্যের নন-লিন্ডন শব্দগুলি হ'ল:

00
10
11
000
010
100
101
110
111
0000
0010
0100
0101
0110
1000
1001
1010
1011
1100
1101
1110
1111

লিডারবোর্ড:

উত্তর:


5

পাইথন 2, 42

ঘূর্ণনের সাথে বিরক্ত করার পরিবর্তে প্রত্যয়ের সাথে তুলনা করা যথেষ্ট ভাল বলে মনে হচ্ছে।

f=lambda s,i=1:i/len(s)or s<s[i:]*f(s,i+1)

পুনরাবৃত্তির সেটআপটি খুব সুন্দর মনে হয় না; সম্ভবত এটি আরও ভাল করা যেতে পারে।

এই 44-বাইট সংস্করণটি আরও স্পষ্ট করে তোলে যা চলছে:

lambda s:all(s<=s[i:]for i in range(len(s)))

4

হাস্কেল, 43 38 বাইট

f x=all(x<=)$init$scanl(const.tail)x x

scanl(const.tail)x xশেষে xখালি স্ট্রিং সহ সমস্ত প্রত্যয়গুলির একটি তালিকা তৈরি করে "", যা বন্ধ করে দেওয়া হয় init

সম্পাদনা: @ ফেয়ারসাম আমার প্রথম সংস্করণে একটি বাগ খুঁজে পেয়েছিল এবং এই ধারণাটি নিয়ে এসেছিল যে প্রত্যয়টির সাথে তুলনা করা যথেষ্ট।


এটা কিভাবে সেখানে কোন ঘুর্ণন হয় না পরীক্ষা নেই xযে সমান x?
শুক্রবার

@ ফেয়ারসাম: তা হয় না। এটি একটি বাগ। ঠিক কর. জানার জন্য ধন্যবাদ!
নিমি

4

পাইথ, 9 বাইট

!f>z>zTUz

প্রদর্শন

বিহান ইত্যাদি ব্যবহার করে। আল এর প্রত্যয় পদ্ধতি


এটি ড্যাং করুন, আমি ভেবেছিলাম আমি সেখানে কোনও কিছুতে এসেছি: পি +1
ডাউনগোট

3

শেপস্ক্রিপ্ট , 57 47 বাইট

0?1'@"2"@+"20"$""~"21"$""~@2?2?>1<*'3?_1-*!@#@#

আমি এই প্রতিযোগিতার জন্য শেপস্ক্রিপ্ট তৈরি করেছি । GitHub থেকে অনুবাদক সামান্য পরিবর্তিত সিনট্যাক্স হয়েছে।

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


3
ট্রিভিয়া: এটি আমার 700 তম পিপিসি উত্তর।
ডেনিস

2

সিজেম, 15 14 বাইট

r_,,\fm<(f>1-!

ব্যবহার করে দেখুন এই বেহালার CJam অনুবাদক অথবা সমস্ত পরীক্ষার বিষয় যাচাই একবারে।

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

r              e# Read a token from STDIN.
 _,            e# Push the length of a copy.
   ,           e# Turn length L into [0 ... L-1].
    \fm<       e# Rotate the token 0, ..., and L-1 units to the left.
        (      e# Shift out the first rotation, i.e., the original token.
         f>    e# Compare all other rotations with this one.
           1-  e# Remove 1 from the resulting array of Booleans.
             ! e# Apply logical NOT to turn an empty array into 1, and a
               e# non-empty one into 0.

2

জে, 11 চর

1লিন্ডন শব্দের এবং 0অন্যথায় আউটপুট ।

0=0({/:)<\.

<\.প্রত্যয় গ্রহণ করে এবং তারপরে /:কীভাবে সেগুলি ডিকোসোগ্রাফিকভাবে বাছাই করা যায় তা আমাদের জানায়। {চতুর্থ 0সূচকে এন্ট্রি নেয় এবং 0=এটি শূন্য কিনা তা পরীক্ষা করে: যদি এটি হয় তবে আমাদের কাছে লিন্ডন শব্দ রয়েছে, কারণ বৃহত্তম প্রত্যয়টি কোনও স্থানে স্থান পরিবর্তন করতে পারে না; যদি এটি ননজারো হয় তবে এটি কোনও লিন্ডন শব্দ নয়, কারণ কিছু প্রত্যয় এর আগে শব্দকোষের মতো।

   0=0({/:)<\. '001011'
1
   0=0({/:)<\. '001001'
0

2

টিস্ক্রিপ্ট , 10 বাইট

xe»x«xS(i©

খুব গল্ফ, খুব সংক্ষিপ্ত। এটি অনলাইনে চেষ্টা করুন

ব্যাখ্যা এবং & অবহেলিত

xe(#x<=xS(i))

xe(#      // Loop through x
          // Check if all iterations return true
    x <=  // Input is less than or equal to...
    xS(i) // Input chopped at current index
)

পবিত্র গরু, আপনি <s> পাইথকে মারছেন </ s> ডেনিস ! এটা কীভাবে সম্ভব ?!
ETH প্রোডাকশনগুলি

2
@ এথ প্রডাকশনস এমন এক দুনিয়ায় যেখানে ডেনিস যে কোনও কিছুতেই গল্ফ হতে পারে : পি
ডাউনগোট

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

অপেক্ষা করুন, অপেক্ষা করুন ... আমি দেখতে পাচ্ছি যে এটি যথাযথরূপে মামলাগুলি পরিচালনা 00করে তবে এটি নিজের সমতুল্য না হওয়া (অর্থাৎ কখন i==0) এটি কীভাবে এটি করে ?
ETH প্রোডাকশনস

@ এথ প্রডাকশনগুলি এটি আসলে ফেয়ারসামের উত্তরের মতো চক্র হয় না , প্রত্যয়গুলির তুলনা করা
কার্যত

1

হাস্কেল, ২৯

f s=all(s<=)$init$scanr(:)[]s

নিমির উত্তরেরs মতো এটির প্রতিটি খালি খালি প্রত্যয়গুলির বেশিরভাগটি কিনা তা যাচাই করে ।

এক্সপ্রেশন scanr(:)[]তালিকা করে প্রত্যয়গুলির তালিকা তৈরি করে।

>> scanr(:)[] "abcd"
["abcd","bcd","cd","d",""]

initতারপর শেষে খালি স্ট্রিং পরিত্রাণ পায়। পরিশেষে, all(s<=)প্রতিটি প্রত্যয় xসন্তুষ্ট কিনা তা পরীক্ষা করে s<=x। যেহেতু প্রথম প্রত্যয়টি sনিজেই, তাই একটি <=প্রয়োজন।


1

রুবি, 37 বাইট

->s{(1...s.size).all?{|i|s[i..-1]>s}}

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

lyndon_words = %w(0 1 01 001 011 0001 0011 0111 00001 00011 00101 00111
                  01011 01111 000001 000011 000101 000111 001011 001101
                  001111 010111 011111)

not_lyndon_words = %w(00 10 11 000 010 100 101 110 111 0000 0010 0100 0101
                      0110 1000 1001 1010 1011 1100 1101 1110 1111)

f=->s{(1...s.size).all?{|i|s[i..-1]>s}}

p lyndon_words.all? &f      # => true
p not_lyndon_words.any? &f  # => false

1

বার্লেস্ক, 15 বাইট

JiRJU_j<]x/==&&

মূলত এই 7 বাইটের মধ্যে 8 টি এটি বেঁধে দেয় না কিনা তা পরীক্ষা করে দেখতে হবে। অন্যথায় আপনি সহজভাবে যেতে পারেন JiR<]==

ব্যাখ্যা:

J       -- duplicate word
iR      -- all rotations
J       -- duplicate list of all rotations
U_      -- check if list contains no duplicates
j       -- swap
<]      -- find minimum of the list
x/      -- rotate top
==      -- compare minimum with the original word
&&      -- and results of min == orig and list unique


0

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

a=Array;s=prompt();console.log(a.from(a(s.length),(x,i)=>i).map(n=>(s.substring(n)+s.substring(0,n--))).sort().pop().contains(s))

0

জাভাস্ক্রিপ্ট, 91 87 বাইট

f=x=>(y=(x+x).slice(1,-1),x[0]==x||!(y.indexOf(x)+1)&&!x.indexOf('0')&&x.slice(-1)==1);

আমি মূলত শব্দটি নিজের সাথে যুক্ত করছি এবং এটি এখনও আছে কিনা তা পরীক্ষা করে দেখছি। এটি সম্ভাব্যতম ক্ষুদ্রতম সংখ্যা কিনা তা যাচাই করতে, আমি কেবলমাত্র এটি 0 দিয়ে শুরু হয় এবং 1 দিয়ে শেষ হয় তা পরীক্ষা করে দেখি।

টেস্ট

[
['0',1],
['1',1],
['01',1],
['001',1],
['011',1],
['0001',1],
['0011',1],
['0111',1],
['00001',1],
['00011',1],
['00101',1],
['00111',1],
['01011',1],
['01111',1],
['000001',1],
['000011',1],
['000101',1],
['000111',1],
['001011',1],
['001101',1],
['001111',1],
['010111',1],
['011111',1],
['00',0],
['10',0],
['11',0],
['000',0],
['010',0],
['100',0],
['101',0],
['110',0],
['111',0],
['0000',0],
['0010',0],
['0100',0],
['0101',0],
['0110',0],
['1000',0],
['1001',0],
['1010',0],
['1011',0],
['1100',0],
['1101',0],
['1110',0],
['1111',0]
].forEach(t =>{ 
  r=f(t[0])
  x=t[1]
  console.log('Test '+(r==x?'OK':'Fail (Expected: ' + x +')')
  +'\nInput: '+t[0]+'\nResult: ' +r+'\n')                       
})  

0

গণিত, 86 বাইট

(s=Table[#~StringRotateLeft~i,{i,StringLength@#}];Last@s==First@Sort@s&&s~Count~#==1)&

ইনপুট

[ "1111"]

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