Tiền tố cây


13

Viết chương trình nhận (thông qua stdin hoặc dòng lệnh) một chuỗi với dạng đệ quy

PREFIX[SUFFIXES]

Ở đâu

  • PREFIX có thể là bất kỳ chuỗi chữ cái viết thường (az), bao gồm cả chuỗi trống và
  • SUFFIXEScó thể là bất kỳ chuỗi nào có dạng đệ quy được PREFIX[SUFFIXES]nối với nhau, bao gồm cả chuỗi trống.

Tạo một danh sách các chuỗi chữ thường từ đầu vào bằng cách đánh giá đệ quy danh sách các chuỗi trong mỗi hậu tố và nối chúng vào tiền tố. Đầu ra để xuất ra các chuỗi trong danh sách này theo bất kỳ thứ tự nào, mỗi chuỗi trên một dòng (cộng với một dòng mới tùy chọn).

Thí dụ

Nếu đầu vào là

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

sau đó tiếp đầu ngữ là catvà và hậu tố là s[up[][]], [], ch[e[r[]s[]]], và a[maran[]comb[]pult[[]ing[]]]. Mỗi hậu tố có tiền tố riêng và hậu tố lần lượt.

Đầu ra sẽ là 9 từ này theo thứ tự bất kỳ

catsup
cats
cat
catcher
catches
catamaran
catacomb
catapult
catapulting

bởi vì đầu vào mã hóa cây này

sơ đồ cây

và mỗi trong số 9 từ đầu ra có thể được hình thành bằng cách duyệt qua cây từ gốc đến lá.

Ghi chú

  • Hãy nhớ rằng tiền tố có thể là chuỗi rỗng, vì vậy một cái gì đó như

    [donut[][]cruller[]]
    

    là đầu vào hợp lệ có đầu ra sẽ (theo thứ tự bất kỳ)

    donut
    
    cruller
    

    trong đó dòng trống dành cho chuỗi trống mà hậu tố thứ hai khớp.

  • Chuỗi hậu tố cũng có thể để trống, vì vậy trường hợp đầu vào tầm thường

    []
    

    có một dòng trống duy nhất là đầu ra của nó:

    
    
  • Bạn có thể cho rằng đầu vào sẽ chỉ tạo ra các từ đầu ra duy nhất.
    • ví dụ hat[s[]ter[]s[]]sẽ là đầu vào không hợp lệ vì hatsđược mã hóa hai lần.
    • Tương tự, [[][]]không hợp lệ vì chuỗi rỗng được mã hóa hai lần.
  • Bạn không thể cho rằng đầu vào càng ngắn hoặc nén càng tốt.
    • ví dụ: 'e'nút trong ví dụ chính ở trên có thể được kết hợp với 'ch'nút, nhưng điều đó không có nghĩa là đầu vào không hợp lệ.
    • Tương tự, [[[[[]]]]]là hợp lệ, mặc dù chỉ mã hóa chuỗi rỗng theo cách tối ưu phụ.
  • Thay vì một chương trình, bạn có thể viết một hàm lấy chuỗi đầu vào làm đối số và in đầu ra bình thường hoặc trả về dưới dạng chuỗi hoặc danh sách.

Mã ngắn nhất tính bằng byte thắng.

Câu trả lời:


2

Ruby, 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}

Thí dụ

Hãy dùng thử: http://ideone.com/NW0CNB

Sự miêu tả

Chương trình nhận đầu vào từ stdin và đưa kết quả ra thiết bị xuất chuẩn.

Nó đi ngang qua cây giữ nhánh hiện tại trong một ngăn xếp. Ngoài ra còn có một ngăn xếp khác nhau, được gọi là weightstheo dõi số lượng con của mỗi nút. Điều này là cần thiết để xác định xem một nút có thực sự là một chiếc lá hay nó đã có con trong quá khứ.

Chương trình có thể đọc được:

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 byte

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

Hàm này là t(cho truyền tải):

λ: 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 "[[[[[]]]]]"
[""]

Mã của bạn là 124 byte, không phải 125 :)
Cristian Lupascu

tôi nghĩ rằng mô hình (a,(_:t))có thể được (a,_:t)thay thế
tự hào

2

Java, 206 byte

Xác định hàm chấp nhận một chuỗi làm đối số và trả về danh sách các chuỗi. Đối với phần thưởng được thêm vào, nó trả về các chuỗi theo thứ tự giống như câu hỏi.

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;}

Ví dụ sử dụng:

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;}
}

Mở rộng:

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;
}

Tôi sẽ thêm một lời giải thích vào ngày mai.


0

Python, 212 ký tự

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,

Tôi đã hy vọng đạt được dưới 200, nhưng tôi vẫn khá hạnh phúc với điều này.


0

Javascript ES6, 142 byte

s=>(o=[],x=_=>s[0]==']'?s=s.slice(1):0,(g=d=>{while(s&&!x())[o[d],s]=s.split(/\[(.*)/).concat``,x()?console.log(o.join``):g(d+1),o.pop()})(0))

0

Q: 70 byte

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

định nghĩa một hàm f chấp nhận một chuỗi và trả về một danh sách các chuỗi (các từ)

Là một lambda (hàm ẩn danh), chúng tôi bỏ 2 ký tự đầu tiên f:, vì vậy độ dài là 68 Byte

Kiểm tra

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

("catup"; "mèo"; "mèo"; "bắt"; "bắt"; "catamaran"; "catacomb"; "catapult"; "catapulting")

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

("bánh rán"; ""; "bánh mì")

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

, ""

Ghi chú

, "" cho biết danh sách các chuỗi chỉ chứa một chuỗi trống

Biểu tượng là nguyên tử. Đẩy / bật một biểu tượng trên ngăn xếp là một thao tác đơn giản không bị ảnh hưởng bởi chiều dài của biểu tượng (xem giải thích)

Giải trình

Q là anh em họ của APL (kx.com)

Mã giả:

  • Chia chuỗi (arg x) tại "[" char. Kết quả (danh sách các chuỗi) trong w
  • Đếm "]" ký tự trong mỗi elem. của w. Kết quả trong b
  • Sửa đổi từng mục trong w để lọc ký tự "]" và chuyển đổi từng chuỗi thành ký hiệu
  • Tạo một chuỗi logic (bitmap) để đánh dấu các mục> 0 trong b
  • Lặp lại kết quả một phần với một ngăn xếp: nếu mục được đánh dấu, chúng ta phải bỏ thêm một trong các ký hiệu (theo giá trị trong b). Luôn nối biểu tượng thực tế vào ngăn xếp
  • Sau khi lặp chúng ta có tất cả các trạng thái trung gian của ngăn xếp. Chúng tôi chọn các trạng thái được đánh dấu trước đó
  • cuối cùng cho mỗi kết quả, chúng tôi chuyển đổi các ký hiệu thành chuỗi và nối chúng

-1

Rắn hổ mang - 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''

Nếu downvoter sẽ để lại một bình luận nói điều gì sai với điều này, điều đó sẽ được đánh giá cao.
Οurous
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.