Kiểm tra từ Lyndon


22

Một từ Lyndon là một chuỗi nhỏ hơn về mặt từ vựng so với bất kỳ phép quay tuần hoàn nào của nó. Đưa ra một chuỗi nhị phân, xác định xem đó có phải là một từ Lyndon trong càng ít byte càng tốt không.

Ví dụ, 001011là một từ Lyndon. Các phép quay của nó, được liệt kê dưới đây, có được bằng cách liên tục di chuyển biểu tượng đầu tiên đến cuối.

001011
010110
101100
011001
110010
100101

Trong số này, chuỗi gốc xuất hiện trước tiên về mặt từ vựng, hoặc tương đương, đại diện cho số nhị phân nhỏ nhất.

Tuy nhiên, đó 001001không phải là một từ Lyndon bởi vì một trong những phép quay của nó giống với chính nó, nó liên kết nó với từ vựng sớm nhất.

Một vấn đề liên quan.

Dữ liệu vào: Một chuỗi nhị phân không trống hoặc danh sách các chữ số 01. Bạn không thể sử dụng số, muốn 5đại diện 101.

Đầu ra: Một giá trị Truthy hoặc Falsey nhất quán cho biết chuỗi đó có phải là từ Lyndon hay không.

Xây dựng đặc biệt cho các từ Lyndon không được phép.

Các trường hợp thử nghiệm:

Các từ Lyndon có độ dài lên đến 6 là:

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

Các từ không phải Lyndon có độ dài lên đến 4 là:

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

Bảng xếp hạng:

Câu trả lời:


5

Con trăn 2, 42

Nó dường như là đủ tốt để so sánh với hậu tố thay vì bận tâm với một vòng quay.

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

Thiết lập của đệ quy có vẻ không đẹp lắm; có lẽ nó có thể được thực hiện tốt hơn.

Phiên bản 44 byte này làm cho nó rõ ràng hơn những gì đang diễn ra:

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

4

Haskell, 43 38 byte

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

scanl(const.tail)x xxây dựng một danh sách tất cả các hậu tố x, bao gồm cả chuỗi trống ""ở cuối, được loại bỏ bằng init.

Chỉnh sửa: @feersum phát hiện ra một lỗi trong phiên bản đầu tiên của tôi và đưa ra ý tưởng rằng so sánh với các hậu tố là đủ.


Làm thế nào để kiểm tra xem không có bất kỳ phép quay xnào bằng x?
frageum

@feersum: không. Đó là một lỗi. Đã sửa nó. Cảm ơn đã tìm hiểu!
nimi

4

Bình thường, 9 byte

!f>z>zTUz

Trình diễn

Sử dụng Vihan et. cách tiếp cận hậu tố của al.


Xin chào, tôi nghĩ rằng tôi đã tham gia vào một cái gì đó ở đó: p +1
Downgoat


2

CJam, 15 14 byte

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

Hãy thử fiddle này trong trình thông dịch CJam hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc.

Làm thế nào nó hoạt động

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

J, 11 char

Đầu ra 1trên từ Lyndon và 0cách khác.

0=0({/:)<\.

<\.có hậu tố và sau đó /:cho chúng ta biết cách sắp xếp chúng theo từ vựng. {lấy mục ở 0chỉ số -th và 0=kiểm tra xem nó có bằng không không: nếu có, chúng ta có một từ Lyndon, vì hậu tố lớn nhất sẽ không thay đổi vị trí; nếu nó không khác, nó không phải là một từ Lyndon, bởi vì một số hậu tố là từ vựng sớm hơn.

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

2

TeaScript , 10 byte

xe»x«xS(i©

Rất golf, ngắn nhiều. Dùng thử trực tuyến

Giải thích && Ungolfed

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
)

Chúa ơi, bạn đang đánh <s> Pyth </ s> Dennis ! Làm thế nào điều này thậm chí có thể?!
Sản xuất ETH

2
@ETHproductions Trong một thế giới nơi Dennis có thể chơi gôn bất cứ điều gì đều có thể: p
Downgoat

Tôi sẽ thưởng thức khoảnh khắc này trong khi nó kéo dài, sau đó câu trả lời của CJam và Pyth có thể sẽ được đánh gôn nhiều hơn
Downgoat

Đợi, đợi đã ... Tôi thấy rằng điều này xử lý đúng các trường hợp như thế nào 00, nhưng làm thế nào để làm điều này mà không bắt chính nó phải bằng chính nó (tức là khi nào i==0)?
Sản xuất ETH

@ETHproductions Điều này thực sự không giống như câu trả lời của frageum , chỉ đơn giản là so sánh các hậu tố là tương đương về chức năng
Downgoat

1

Haskell, 29

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

Kiểm tra xem scó nhiều nhất là mỗi hậu tố không trống của nó không, như câu trả lời của nimi .

Biểu thức scanr(:)[]tạo danh sách các hậu tố bằng cách liệt kê.

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

Sau initđó được loại bỏ chuỗi trống ở cuối. Cuối cùng, all(s<=)kiểm tra xem mọi hậu tốx thỏa mãn hay không s<=x. Vì hậu tố đầu tiên là schính nó, nên a <=là cần thiết.


1

Ruby, 37 byte

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

Kiểm tra:

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

Burlesque, 15 byte

JiRJU_j<]x/==&&

Chủ yếu 8 trong số 7 byte đó là để kiểm tra xem nó có bị ràng buộc không. Nếu không, bạn có thể đi với đơn giản JiR<]==.

Giải trình:

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

Javascript (ES6), 129 byte

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

Javascript, 91 87 byte

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

Về cơ bản, tôi đang ghép từ với chính nó và kiểm tra xem nó có còn ở đó không. Để kiểm tra xem đó có phải là số nhỏ nhất có thể không, tôi chỉ cần kiểm tra xem nó bắt đầu bằng 0 và kết thúc bằng 1.

Xét nghiệm

[
['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

Toán học, 86 byte

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

đầu vào

["1111"]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.