Önek Ağacı Geçişi


13

Özyinelemeli formla bir dizeyi (stdin veya komut satırı aracılığıyla) alan bir program yazın

PREFIX[SUFFIXES]

nerede

  • PREFIX boş dize de dahil olmak üzere herhangi bir küçük harf dizesi (az) olabilir ve
  • SUFFIXES"Boşaltım" PREFIX[SUFFIXES]terimi, boş diziyi içeren, özyinelemeli formun bir araya getirildiği herhangi bir dizgi dizisi olabilir.

Soneklerin her birindeki dize listesini özyineli olarak değerlendirip önekine ekleyerek girişten küçük harfli dizelerin bir listesini oluşturun. Bu listedeki dizgileri her satıra bir tane olacak şekilde sırayla çıktılamak için çıktı (artı isteğe bağlı bir son satırsonu).

Misal

Giriş

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

Sonra öneki catve ve ekleri vardır s[up[][]], [], ch[e[r[]s[]]], ve a[maran[]comb[]pult[[]ing[]]]. Her son ekin kendi öneki ve sırayla ekleri vardır.

Çıktı herhangi bir sırayla bu 9 kelime olurdu

catsup
cats
cat
catcher
catches
catamaran
catacomb
catapult
catapulting

çünkü giriş bu ağacı kodlar

ağaç diyagramı

ve 9 çıktı kelimesinin her biri, ağacın kökten yaprağa geçirilmesiyle oluşturulabilir.

notlar

  • Ön ekin boş dize olabileceğini unutmayın.

    [donut[][]cruller[]]
    

    çıkışı (herhangi bir sırayla) olacak geçerli girdidir

    donut
    
    cruller
    

    burada boş satır, ikinci son ekin eşleştiği boş dize içindir.

  • Sonek sırası da boş olabilir, bu nedenle önemsiz girdi durumu

    []
    

    çıktısı olarak tek bir boş satır vardır:

    
    
  • Girdinin yalnızca benzersiz çıktı sözcükleri üreteceğini varsayabilirsiniz.
    • Örneğin hat[s[]ter[]s[]], hatsiki kez kodlandığı için geçersiz giriş olur .
    • Benzer şekilde, [[][]]boş dize iki kez kodlandığı için geçersizdir.
  • Sen olabilir değil girişi Kısa gibidir ya da mümkün olduğunca sıkıştırılmış varsayalım.
    • örneğin, 'e'yukarıdaki ana örnekteki 'ch'düğüm düğüm ile birleştirilebilir , ancak bu girişin geçersiz olduğu anlamına gelmez.
    • Benzer şekilde, [[[[[]]]]]yalnızca boş dizgiyi en uygun olmayan şekilde kodlamaya rağmen geçerlidir.
  • Bir program yerine, giriş dizesini bağımsız değişken olarak alan ve çıktıyı normal olarak yazdıran veya bir dize veya liste olarak döndüren bir işlev yazabilirsiniz.

Bayt cinsinden en kısa kod kazanır.

Yanıtlar:


2

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

Misal

Deneyin: http://ideone.com/NW0CNB

Açıklama

Program girişi stdin'den alır ve sonucu stdout'a verir.

Geçerli dalı bir yığın halinde tutarak ağacı geçer. Ayrıca weights, her bir düğümün çocuk sayısını izleyen farklı bir yığın var . Bir düğümün gerçekten bir yaprak olup olmadığını veya geçmişte çocukları olup olmadığını belirlemek için bu gereklidir.

Okunabilir program:

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 bayt

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

Fonksiyon t(geçiş için):

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

Kodunuz 125 değil, 124 bayttır :)
Cristian Lupascu

desen yerine (a,(_:t))olabilir düşünüyorum(a,_:t)
gurur haskeller

2

Java, 206 bayt

Bir dizeyi bağımsız değişken olarak kabul eden ve bir dize listesi döndüren bir işlevi tanımlar. Ek bir bonus için dizeleri soru ile aynı sırada döndürür.

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

Örnek kullanım:

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

Expanded:

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

Yarın bir açıklama ekleyeceğim.


0

Python, 212 karakter

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'ün altına düşmeyi umuyordum, ama yine de bundan çok memnunum.


0

Javascript ES6, 142 bayt

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 Bayt

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

bir dizeyi kabul eden ve bir dizeler listesi (kelimeler) döndüren bir f işlevini tanımlar

Bir lambda (anonim fonksiyon) olarak f: ilk 2 karakterini düşürüyoruz, bu yüzden uzunluk 68 Byte

Ölçek

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

( "Ketçap"; "kediler"; "kedi"; "yakalayıcı"; "yakalar"; "katamaran"; "catacomb"; "mancınık"; "catapulting")

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

( "Halka"; ""; "cruller")

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

""

notlar

, "" yalnızca boş bir dize içeren dizelerin listesini gösterir

Semboller atomiktir. Yığındaki bir simgeye bas / patlat sembolün uzunluğundan etkilenmeyen basit bir işlemdir (açıklamaya bakın)

açıklama

Q bir APL kuzeni (kx.com)

pseudocode:

  • Dizeyi (arg x) "[" char. Sonuç (dize listesi)
  • Her elemdeki "]" karakterleri sayar. w. Sonuç b
  • "]" Karakterini filtrelemek için w'deki her öğeyi değiştirir ve her dizeyi bir sembole dönüştürür
  • B> 0 öğelerini işaretlemek için mantıksal bir sıra (bitmap) oluşturur
  • Bir yığınla kısmi sonuçları yineliyor: işaretli öğe daha fazla simgeden birini düşürmeliyiz (b'deki değere göre). Yığına her zaman gerçek sembolü ekle
  • Yinelemeden sonra, tüm ara yığın durumlarına sahibiz. Önceden işaretlenmiş durumları seçiyoruz
  • Sonunda her sonuç için sembolleri dizelere dönüştürüyor ve birleştiriyoruz

-1

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

Eğer intikamcı, bunun neyin yanlış olduğunu söyleyen bir yorum bırakırsa, bu takdir edilecektir.
Οurous
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.