ตรวจสอบคำ Lyndon


22

ลินดอนคำเป็นสตริงที่เป็นอย่างเคร่งครัดlexicographically ที่มีขนาดเล็กกว่าใด ๆ ของการหมุนวงโคจรของมัน กำหนดสตริงไบนารีให้ตรวจสอบว่าเป็นคำ Lyndon เป็นไบต์น้อยที่สุดหรือไม่

ตัวอย่างเช่น001011เป็นคำ Lyndon การหมุนของรายการด้านล่างนั้นได้มาจากการย้ายสัญลักษณ์แรกไปยังจุดสิ้นสุดซ้ำ ๆ

001011
010110
101100
011001
110010
100101

สตริงเหล่านี้มาก่อน lexicographically หรือเท่ากันแสดงถึงเลขฐานสองที่เล็กที่สุด

อย่างไรก็ตาม001001ไม่ใช่คำ Lyndon เพราะหนึ่งในการหมุนของมันเหมือนกันกับตัวมันเอง

ปัญหาที่เกี่ยวข้อง

การป้อนข้อมูล:สตริงไบนารีไม่ว่างเปล่าหรือรายการของตัวเลขและ0 1คุณอาจจะไม่ได้ใช้ตัวเลขเช่นการเป็นตัวแทนของ5101

ผลลัพธ์:ค่า Truthy หรือ Falsey ที่สอดคล้องกันซึ่งระบุว่าสตริงนั้นเป็นคำ Lyndon หรือไม่

ไม่อนุญาตให้ใช้บิวด์อินเฉพาะสำหรับคำ Lyndon

กรณีทดสอบ:

คำ Lyndon ที่มีความยาวสูงสุด 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

Python 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

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


3

ShapeScript , 57 47 ไบต์

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

ฉันสร้าง ShapeScript สำหรับการแข่งขันครั้งนี้ ล่ามบน GitHubมีไวยากรณ์การแก้ไขเล็กน้อย

ลองออนไลน์!


3
เรื่องไม่สำคัญ:นี่คือคำตอบ PPCG ที่ 700 ของฉัน
เดนนิส

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 ตัวอักษร

แสดงผล1คำ Lyndon และ0อื่น ๆ

0=0({/:)<\.

<\.ใช้คำต่อท้ายจากนั้น/:บอกเราถึงวิธีการเรียงลำดับพจนานุกรม {ใช้รายการที่0ดัชนี -th และ0=ตรวจสอบว่าเป็นศูนย์: ถ้าเป็นเรามีคำ Lyndon เพราะคำต่อท้ายที่ใหญ่ที่สุดจะไม่เปลี่ยนสถานที่ในการจัดเรียง; ถ้าไม่ใช่ศูนย์ไม่ใช่คำ Lyndon เนื่องจากคำต่อท้ายบางคำเป็นคำก่อนหน้านี้

   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> เดนนิส ! มันเป็นไปได้ยังไงกันเนี่ย!
ETHproductions

2
@ETHproductions ในโลกที่เดนนิสสามารถเล่นกอล์ฟได้ทุกสิ่ง: p
Downgoat

ฉันจะได้ลิ้มรสช่วงเวลานี้ในขณะที่มันอยู่ได้คำตอบจาก CJam และ Pyth อาจจะถูกเล่นกอล์ฟมากขึ้น
Downgoat

เดี๋ยวก่อนรอ ... ฉันเห็นว่าสิ่งนี้จัดการกรณีเช่นนี้ได้อย่างเหมาะสม00แต่จะทำเช่นนี้ได้อย่างไรโดยไม่ต้องจับตัวเองให้เท่ากัน (เช่นเมื่อi==0)
ETHproductions

@ETHproductions สิ่งนี้ไม่ได้วนซ้ำเหมือนคำตอบของ feersum เพียงแค่เปรียบเทียบคำต่อท้ายนั้นเทียบเท่ากับการทำงาน
Downgoat

1

Haskell, 29

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

ตรวจสอบว่าsเป็นที่มากที่สุดของแต่ละคำต่อท้ายไม่ว่างเปล่าของตนเช่นเดียวกับคำตอบของ Nimi

การแสดงออก scanr(:)[]สร้างรายการของคำต่อท้ายตามรายการ

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

initแล้วได้รับกำจัดของสตริงที่ว่างเปล่าในตอนท้าย สุดท้ายall(s<=)ตรวจสอบว่าทุกคำต่อท้ายความพึงพอใจx s<=xเนื่องจากส่วนต่อท้ายแรกเป็นของsตัวเอง<=จึงจำเป็นต้องมี


1

Ruby, 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/==&&

ส่วนใหญ่ 8 ใน 7 ไบต์นั้นจะต้องตรวจสอบว่ามันไม่ได้ผูก มิฉะนั้นคุณสามารถไปได้อย่างง่ายดาย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

Javascript, 91 87 bytes

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')                       
})  

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.