Lyndon 단어 확인


22

린든 단어는 엄격하게 문자열입니다 전적으로 작은 그 순환 회전들보다. 이진 문자열이 주어지면 가능한 적은 바이트로 Lyndon 단어인지 확인하십시오.

예를 들어, 001011Lyndon 단어입니다. 아래에 나열된 회전은 첫 번째 기호를 끝까지 반복해서 이동하여 얻습니다.

001011
010110
101100
011001
110010
100101

이 중 원래 문자열은 사전 식으로 먼저 나오거나 동등하게 가장 작은 이진수를 나타냅니다.

그러나 001001회전 중 하나가 자전적으로 가장 빨리 연결되는 것과 동일하므로 Lyndon 단어가 아닙니다.

관련 문제.

입력 : 비어 있지 않은 이진 문자열 또는 숫자 목록 01. 을 나타 내기 위해 숫자를 사용할 수 없습니다 .5101

출력 : 문자열이 Lyndon 단어인지를 나타내는 일관된 Truthy 또는 Falsey 값입니다.

Lyndon 단어 전용 내장 기능은 허용되지 않습니다.

테스트 사례 :

길이가 최대 6 인 Lyndon 단어는 다음과 같습니다.

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

최대 4 개 길이의 비 Lyndon 단어는 다음과 같습니다.

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.

편집 : @feersum은 첫 번째 버전에서 버그를 발견하고 접미사 비교하면 충분하다는 아이디어생각해 냈습니다 .


회전 x이 동일 하지 않은지 어떻게 확인 x합니까?
feersum

@ feersum : 그렇지 않습니다. 버그입니다. 고쳤다. 찾아 주셔서 감사합니다!
nimi

4

Pyth, 9 바이트

!f>z>zTUz

데모

Vihan 등을 사용합니다. al.의 접미사가 다가옵니다.


Dang 그것, 내가 거기에 뭔가 있다고 생각했다 : p +1
Downgoat


2

CJam, 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

J, 11 자

1Lyndon 단어 및 0기타 출력 .

0=0({/:)<\.

<\.접미사를 취한 다음 /:사전 순으로 정렬하는 방법을 알려줍니다. -th 색인 {에서 항목을 가져 와서 0인지 확인합니다. 만약 그렇다면, 가장 큰 접미사는 정렬에서 자리를 바꾸지 않기 때문에 Lyndon 단어가 있습니다. 0이 아닌 경우 일부 접미어가 사전 순으로되어 있기 때문에 Lyndon 단어가 아닙니다.00=

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

2

TeaScript , 10 바이트

xe»x«xS(i©

골프는 아주 짧고 온라인으로 사용해보십시오

&& 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
)

이런 소, <s> Pyth </ s> Dennis를 ! 이것이 어떻게 가능합니까?!
ETHproductions

2
@ETHproductions Dennis가 아웃 골프를 할 수있는 세상에서는 무엇이든 가능합니다 : p
Downgoat

이 순간이 지속되는 동안이 순간을 맛볼 것입니다. 그러면 CJam과 Pyth의 답변이 더 골프를 칠 것입니다
Downgoat

잠깐, 잠깐만 .. 이것이와 같은 경우를 올바르게 처리한다는 것을 00알지만, 자신과 동등한 것을 잡지 않고 어떻게해야합니까 (예 : 언제 i==0)?
ETHproductions

@ETHproductions 이것은 실제로 feersum의 답변 처럼 순환하지 않습니다. . 단순히 접미사를 비교하는 것은 기능적으로 동일합니다
Downgoat

1

하스켈, 29

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

nimi의 답변s 과 같이 비어 있지 않은 접미어가 각각 있는지 확인합니다 .

이 표현식 scanr(:)[]은 목록별로 접미사 목록을 생성합니다.

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

그만큼 init 다음 끝에 빈 문자열을 제거합니다. 마지막으로 all(s<=)모든 접미사가를 x만족 하는지 확인합니다 s<=x. 첫 번째 접미사 s자체이므로 a <=가 필요합니다.


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.