คำนำหน้าทรี Traversal


13

เขียนโปรแกรมที่รับ (ผ่าน stdin หรือบรรทัดคำสั่ง) สตริงที่มีรูปแบบเรียกซ้ำ

PREFIX[SUFFIXES]

ที่ไหน

  • PREFIX อาจเป็นสตริงของตัวอักษรตัวเล็ก (az) รวมถึงสตริงว่างและ
  • SUFFIXESอาจเป็นลำดับของสตริงใด ๆ ที่มีรูปแบบที่เรียกซ้ำPREFIX[SUFFIXES]กันรวมกันรวมถึงลำดับที่ว่างเปล่า

สร้างรายการของสตริงตัวอักษรตัวพิมพ์เล็กจากอินพุตโดยการประเมินรายการสตริงซ้ำในแต่ละส่วนต่อท้ายและผนวกเข้ากับคำนำหน้า ส่งออกไปยัง stdout สตริงในรายการนี้ในลำดับใด ๆ หนึ่งรายการต่อบรรทัด (รวมถึงบรรทัดใหม่ต่อท้ายที่เป็นตัวเลือก)

ตัวอย่าง

หากอินพุตเป็น

cat[s[up[][]][]ch[e[r[]s[]]]a[maran[]comb[]pult[[]ing[]]]]

แล้วคำนำหน้าเป็นcatและและคำต่อท้ายที่มีs[up[][]], [], และch[e[r[]s[]]] a[maran[]comb[]pult[[]ing[]]]แต่ละคำต่อท้ายมีคำนำหน้าและคำต่อท้ายของตัวเองในทางกลับกัน

ผลลัพธ์จะเป็น 9 คำเหล่านี้ในลำดับใด ๆ

catsup
cats
cat
catcher
catches
catamaran
catacomb
catapult
catapulting

เพราะอินพุตเข้ารหัสต้นไม้นี้

แผนภาพต้นไม้

และคำศัพท์เอาต์พุตทั้ง 9 คำนั้นสามารถสร้างขึ้นได้โดยการข้ามต้นไม้จากรากหนึ่งไปยังอีกใบ

หมายเหตุ

  • โปรดจำไว้ว่าคำนำหน้าอาจเป็นสตริงว่างดังนั้นจึงเป็นเช่นนั้น

    [donut[][]cruller[]]
    

    เป็นอินพุตที่ถูกต้องซึ่งเอาต์พุตจะเป็น (ในลำดับใด ๆ )

    donut
    
    cruller
    

    โดยที่บรรทัดว่างสำหรับสตริงว่างที่ส่วนต่อท้ายที่สองตรงกัน

  • ลำดับคำต่อท้ายอาจเป็นค่าว่างได้ดังนั้นกรณีอินพุตเล็กน้อย

    []
    

    มีบรรทัดว่างหนึ่งบรรทัดเป็นเอาต์พุต:

    
    
  • คุณอาจสมมติว่าอินพุตจะสร้างคำเอาต์พุตที่ไม่ซ้ำกันเท่านั้น
    • เช่นhat[s[]ter[]s[]]จะใส่ไม่ถูกต้องเพราะhatsถูกเข้ารหัสสองครั้ง
    • ในทำนองเดียวกัน[[][]]ไม่ถูกต้องเนื่องจากสตริงที่ว่างเปล่าถูกเข้ารหัสสองครั้ง
  • คุณอาจไม่คิดว่าอินพุตนั้นสั้นหรือบีบอัดมากที่สุด
    • เช่น'e'โหนดในตัวอย่างหลักข้างต้นสามารถรวมกับ'ch'โหนดได้ แต่นั่นไม่ได้หมายความว่าอินพุตไม่ถูกต้อง
    • ในทำนองเดียวกัน[[[[[]]]]]ถูกต้องแม้จะมีการเข้ารหัสสตริงที่ว่างเปล่าในวิธีที่ดีที่สุดย่อย
  • แทนที่จะเป็นโปรแกรมคุณสามารถเขียนฟังก์ชั่นที่รับสตริงป้อนเข้าเป็นอาร์กิวเมนต์และพิมพ์ผลลัพธ์ตามปกติหรือส่งกลับเป็นสตริงหรือรายการ

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

คำตอบ:


2

ทับทิม, 119 115

t=['']
l=[0]
gets.chars{|c|c<?]?t<<''&&(l<<0)[-2]+=1:c<?^?(x=l.pop;t.pop==''&&(puts t*''if x<1;t[-1]='')):t[-1]<<c}

ตัวอย่าง

ลองทำดู: http://ideone.com/NW0CNB

ลักษณะ

โปรแกรมรับอินพุตจาก stdin และส่งผลลัพธ์เป็น stdout

มันลัดวงจรต้นไม้รักษาสาขาปัจจุบันในกอง นอกจากนี้ยังมีสแต็กที่แตกต่างกันweightsซึ่งเรียกว่าติดตามจำนวนลูกของแต่ละโหนด สิ่งนี้จำเป็นสำหรับการตรวจสอบว่าโหนดเป็นใบไม้จริงหรือมีลูกในอดีต

โปรแกรมที่อ่านได้:

stack = ['']
weights = [0]

gets.chars do |c|
  case c
  when '['
    weights[-1] += 1
    stack << ''
    weights << 0
  when ']'
    last_weight = weights.pop

    if stack.pop == ''
      puts stack.join if last_weight < 1
      stack[-1] = ''
    end
  else
    stack[-1] << c
  end
end

6

Haskell, 125 ไบต์

t=tail.p
p=g.break(=='[')
g(a,(_:t))=(:)&(map(a++).z)$t#[]
z[]=[""];z x=x
(']':u)#a=u:a
s#a=(#)&(a++)$p s
(g&f)(x:y)=g x$f y

ฟังก์ชั่นคือt(สำหรับการสำรวจเส้นทาง):

λ: t "cat[s[up[][]][]ch[e[r[]s[]]]a[maran[]comb[]pult[[]ing[]]]]"
["catsup","cats","cat","catcher","catches","catamaran","catacomb","catapult","catapulting"]
λ: t "[donut[][]cruller[]]"
["donut","","cruller"]
λ: t "[[[[[]]]]]"
[""]

รหัสของคุณคือ 124 ไบต์ไม่ใช่ 125 :)
Cristian Lupascu

ฉันคิดว่ารูปแบบ(a,(_:t))สามารถ(a,_:t)แทนได้
ภูมิใจ Haskeller

2

Java, 206 ไบต์

กำหนดฟังก์ชั่นที่ยอมรับสตริงเป็นอาร์กิวเมนต์และส่งคืนรายการสตริง สำหรับโบนัสที่เพิ่มเข้ามาจะส่งคืนสตริงในลำดับเดียวกันกับที่คำถามทำ

int c,i;List a(String a){String b=a.substring(c,c=a.indexOf(91,c));List d=new ArrayList();for(;a.charAt(++c)!=93;)d.addAll(a(a));if(d.isEmpty())d.add("");for(i=0;i<d.size();)d.set(i,b+d.get(i++));return d;}

ตัวอย่างการใช้งาน:

class A{
    public static void main(String[] args){
        System.out.println(new A.a("cat[s[up[][]][]ch[e[r[]s[]]]a[maran[]comb[]pult[[]ing[]]]]"));
    }

    int c,i;List a(String a){String b=a.substring(c,c=a.indexOf(91,c));List d=new ArrayList();for(;a.charAt(++c)!=93;)d.addAll(a(a));if(d.isEmpty())d.add("");for(i=0;i<d.size();)d.set(i,b+d.get(i++));return d;}
}

ขยาย:

int c, i;
List a(String a){
    String b = a.substring(c, c = a.indexOf(91, c));
    List d = new ArrayList();
    for(; a.charAt(++c) != 93 ;)
        d.addAll(a(a));
    if (d.isEmpty())
        d.add("");
    for (i = 0; i < d.size();)
        d.set(i, b + d.get(i++));
    return d;
}

ฉันจะเพิ่มคำอธิบายในวันพรุ่งนี้


0

Python 212 ตัวอักษร

def p(t,f="",o="",d=0):
 if[]==t:return
 b=[""]
 for c in t:d+=c=="[";b[-1]+=c;d-=c=="]";b+=[""]*(d==0)*(c=="]")
 for r in b[:-1]:i=r.index("[");w,s=f+r[:i],r[i:][1:-1];p(s,w);o+= ["",w+"\n"][""==s]
  if o:print o,

ฉันหวังว่าจะได้อายุต่ำกว่า 200 แต่ก็ยังมีความสุขกับเรื่องนี้



0

Q: 70 ไบต์

f:{,/'$({(z_x),y}\[();{`$x@&~x="]"}'w;-b])@-1+&0<b:(+/"]"=)'w:"["\:x}

กำหนดฟังก์ชั่น f ที่ยอมรับสตริงและส่งคืนรายการสตริง (คำ)

ในฐานะแลมบ์ดา (ฟังก์ชั่นนิรนาม) เราวาง 2 ตัวอักษรแรก f: ดังนั้นความยาวคือ 68 ไบต์

ทดสอบ

f "cat[s[up[][]][]ch[e[r[]s[]]]a[maran[]comb[]pult[[]ing[]]]]"

( "ซอสมะเขือเทศ"; "แมว"; "แมว"; "จับ"; "จับ"; "ตื้น"; "สุสาน"; "หนังสติ๊ก"; "ถอยร่น")

f "[donut[][]cruller[]]"

( "โดนัท"; ""; "cruller")

f "[[[[[]]]]]"

""

หมายเหตุ

, "" หมายถึงรายการสตริงที่มีเพียงสตริงว่างเท่านั้น

สัญลักษณ์เป็นอะตอม กด / วางสัญลักษณ์บนสแต็กเป็นการดำเนินการอย่างง่ายที่ไม่ได้รับผลกระทบจากความยาวของสัญลักษณ์ (ดูคำอธิบาย)

คำอธิบาย

Q เป็นลูกพี่ลูกน้องของ APL (kx.com)

pseudocode:

  • แยกสตริง (หาเรื่อง x) ที่ "[" อักขระ ผลลัพธ์ (รายการสตริง) ในหน่วย
  • นับ "]" ตัวอักษรในแต่ละองค์ประกอบ ของ w ผลลัพธ์ใน b
  • แก้ไขแต่ละรายการด้วย w เพื่อกรองอักขระ "]" และแปลงแต่ละสตริงเป็นสัญลักษณ์
  • สร้างลำดับตรรกะ (บิตแมป) เพื่อทำเครื่องหมายรายการ> 0 ใน b
  • วนซ้ำกับผลลัพธ์บางส่วนด้วยสแต็ก: หากรายการที่ทำเครื่องหมายว่าเราจะต้องวางสัญลักษณ์อีกหนึ่งสัญลักษณ์ (ตามค่าใน b) ผนวกสัญลักษณ์ที่แท้จริงต่อท้ายเสมอ
  • หลังจากวนซ้ำเรามีสถานะสแต็กทั้งหมดระหว่างกลาง เราเลือกสถานะที่ทำเครื่องหมายไว้ก่อนหน้านี้
  • ในที่สุดสำหรับผลลัพธ์แต่ละรายการเราจะแปลงสัญลักษณ์เป็นสตริงและต่อกัน

-1

คอบร้า - 181

def f(s='')as String*
    for m in RegularExpressions.Regex.matches(s,r'(\w*)\[((?:(?<B>\[)|\w|(?<-B>]))*)](?(B)(?!))'),for r in.f('[(u=m.groups)[2]]'),yield'[u[1]]'+r
    if''==s,yield''

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