Lyndon kelimesini kontrol et


22

Bir Lyndon kelimesi , kesinlikle döngüsel olarak herhangi bir döngüsel dönüşten daha küçük olan bir dizedir . İkili bir dize verildiğinde, bunun bir Lyndon sözcüğü olup olmadığını mümkün olduğunca az bayt olarak belirleyin.

Örneğin 001011, bir Lyndon kelimesidir. Aşağıda listelenen rotasyonları, ilk sembolü sonuna kadar tekrar tekrar hareket ettirerek elde edilir.

001011
010110
101100
011001
110010
100101

Bunlardan, orijinal dize sözlüksel olarak ilk önce gelir veya eşit olarak en küçük ikili sayıyı temsil eder.

Ancak, 001001bir Lyndon sözcüğü değildir , çünkü rotasyonlarından biri sözlükbilimsel olarak en erken tarih için onu bağlayanla aynıdır.

İlgili bir problem.

Giriş: Boş olmayan bir ikili dize veya basamak listesi 0ve 1. Sen olabilir değil gibi numaraları kullanmak 5temsil etmek 101.

Çıktı: Dizenin Lyndon sözcüğü olup olmadığını belirten tutarlı bir Truthy veya Falsey değeri.

Özel olarak Lyndon kelimeleri için yerleşik yapılara izin verilmez.

Test durumları:

Uzunluğu 6'ya kadar olan Lyndon kelimeleri:

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

4'e kadar uzunluktaki Lyndon olmayan kelimeler:

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

Liderler Sıralaması:

Yanıtlar:


5

Python 2, 42

Bir döndürmeyle uğraşmak yerine son eklerle karşılaştırılacak kadar iyi görünüyor.

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

Özyinelemenin düzeni pek hoş görünmüyor; belki daha iyi yapılabilirdi.

Bu 44 baytlık sürüm, neler olup bittiğini daha belirgin hale getiriyor:

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

4

Haskell, 43 38 bayt

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

scanl(const.tail)x xsonunda sıyrılan xboş dize ""de dahil olmak üzere tüm eklerin bir listesini oluşturur init.

Düzenleme: @feersum ilk sürümümde bir hata gördü ve son ekleri karşılaştırmanın yeterli olduğu fikri geldi .


Rotasyonların xeşit olmadığının nasıl kontrol edilir x?
feersum

@ feersum: öyle değil. Bu bir böcek. Onu düzeltti. Öğrendiğin için teşekkürler!
nimi



2

CJam, 15 14 bayt

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

Bu kemanı CJam yorumlayıcısında deneyin veya tüm test durumlarını bir kerede doğrulayın .

Nasıl çalışır

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 karakter

1Lyndon kelimeleri ve 0başka çıktılar .

0=0({/:)<\.

<\.son ekleri alır ve sonra /:bunları sözlüksel olarak nasıl sıralayacağımızı söyler. {- 0indeksindeki girdiyi alır ve 0=sıfır olup olmadığını kontrol eder: eğer öyleyse, Lyndon kelimemiz vardır, çünkü en büyük son ek bir sıralamada yer değiştirmez; sıfır değilse, bir Lyndon sözcüğü değildir, çünkü bazı son ekler sözlüksel olarak daha erkendir.

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

2

TeaScript , 10 bayt

xe»x«xS(i©

Çok golf, çok kısa. Çevrimiçi deneyin

Açıklama & & 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
)

İnek, <s> Pyth </s> Dennis'i yeniyorsun ! Bu nasıl mümkün olabilir?
ETHproductions

2
Dennis olabilir bir dünyada @ETHproductions dışı golfed şey mümkün: p
Downgoat

Sürerken bu anın tadını çıkaracağım, sonra CJam ve Pyth cevapları muhtemelen daha çok golf oynayacak
Downgoat

Bekle, bekle ... Bunun gibi durumları düzgün bir şekilde ele aldığını görüyorum 00, ancak bunu kendine eşit olmak zorunda olmadan (yani ne zaman i==0) yapmıyor ?
ETHProductions

@ETHproductions Bu kadarı feersum en gibi değil aslında döngüsü yapar cevap , sadece son eklerini karşılaştıran işlevsel eşdeğerdir
Downgoat

1

Haskell, 29

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

Nimi'nin yanıtıs gibi boş olmayan son eklerinin her birinde en fazla olup olmadığını kontrol eder .

İfade scanr(:)[]listeleme ile son eklerin listesini oluşturur.

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

initSonra sonunda boş dize kurtulur. Son olarak, all(s<=)her son ekin xkarşılayıp karşılamadığını kontrol eder s<=x. İlk son ekin skendisi olduğundan, a <=gereklidir.


1

Ruby, 37 bayt

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

Test yapmak:

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 bayt

JiRJU_j<]x/==&&

Temelde, bu 7 bayttan 8'i bağlanmadığını kontrol etmelidir. Aksi takdirde basitçe gidebilirsiniz JiR<]==.

Açıklama:

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 bayt

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 bayt

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

Temel olarak kelimeyi kendisiyle birleştiriyorum ve hala orada olup olmadığını kontrol ediyorum. Mümkün olan en küçük sayı olup olmadığını kontrol etmek için sadece 0 ile başlayıp 1 ile bitip bitmediğini kontrol ediyorum.

Testler

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

Mathematica, 86 bayt

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

giriş

[ "1111"]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.