IMP: Örtülü çarpma ayrıştırıcı


9

Jack, C programlama dilini sever, ancak V=a*b*h; değerleri çoğaltmak gibi ifadeler yazmaktan nefret eder .

Bunun V=abh;yerine yazmak istiyor , derleyici abhtanımlandığından beri tanımsız olan sembol hakkında neden inliyor int a, b, h;, böylece çarpımı çıkarabiliriz?

Geçerli kapsamda tanımlanan değişkenler kümesi biliniyorsa, tek bir çarpma terimini deşifre eden bir ayrıştırıcıyı uygulamasına yardımcı olun.

Basit olması için, sayının (olduğu gibi 2*a*b) çarpılması dikkate alınmaz, yalnızca değişkenler görünür.

Girdi regexp'yi karşılayan bir çarpma terimi T'dir:

[a-zA-Z_][a-zA-Z_0-9]*

ve Z değişken takımı .

T değişkeninin Z değişken kümesi üzerinden ayrıştırma P'si aşağıdakileri sağlayan bir dizedir:

  1. *P'nin tüm oluşumlarını kaldırdıktan sonra T alırız,
  2. ya Z'den gelen bir değişken adıdır ya da Z'den gelen tek değişkenli bölünmüş doğru değişken adlarından oluşur *.

Çözüm, bir terimin tüm çözümlemelerini yazdırmalıdır.

Örneklem:

Vars           a, c, ab, bc
Term           abc
Solution       ab*c, a*bc

Vars           ab, bc
Term           abc
Solution       -

Vars           -
Term           xyz
Solution       -

Vars           xyz
Term           xyz
Solution       xyz

Vars           width, height
Term           widthheight
Solution       width*height

Vars           width, height
Term           widthheightdepth
Solution       -

Vars           aaa, a
Term           aaaa
Solution       aaa*a, a*aaa, a*a*a*a

Giriş (değişkenler listesi ve terim), dile uygun herhangi bir şekilde sağlanabilir.

Çıktı herhangi bir mantıklı biçimde olabilir (satır başına bir ayrıştırma veya virgülle ayrılmış liste vb.) - ancak açık ve okunması mümkün olmalıdır.

Bir terimin olası ayrıştırılması yoksa boş çıktı kabul edilebilir (açıklık için '-' kullandığım örneklerde).

Bu bir kod golf, bu yüzden en kısa kod kazanır.


1
İlk örneğinizde, izin verilen bir değişken olmadığından ab*cyanlış bir ayrıştırma olduğuna inanıyorum c.
isaacg

1
Özyinelemeli tarama ile sonucunuzu tam olarak numunede bulurum. Ama tartışmalı: neden a*aaa aaa*ave değilab*c c*ab
edc65

Ayrıştırma kuralı 1. nedeniyle. Evet, çarpma genellikle değişmeli olmakla birlikte, şu ana kadar gitmiyoruz - sadece çarpmayı yapıldığı sırada "yeniden yapılandırmak" istiyoruz. Aslında Jack'in dilinde bir matris türümüz olabilirdi - çarpma o zaman değişmeli değildir. Ve "aaaa" hem "aaa" hem de "a" veya "a" ve "aaa" yan yana olabilir - bu değişebilirlik için değil, ikisini de hesaba katıyoruz.
pawel.boczarski

Yanıtlar:


4

Pyth, 18 karakter

mj\*dfqzsTsm^Qkhlz

Bu çözüm Benim Tercüme Balık çözümümden uyarlanmıştır . Sorunlar aslında çok benzer.

Girdiyi şu şekilde bekler:

aaaa
"a", "aaa"

Bunun gibi çıktılar verir:

['a*aaa', 'aaa*a', 'a*a*a*a']

Burada deneyin.

  • sm^Qkhlz: Değişkenlerin giriş dizesi sayısının uzunluğuna kadar içeren tüm değişken dizilerini oluşturur.

  • fqzsT: Giriş dizesiyle eşleşen değişken sekansları filtreler

  • mj\*d: *Sembol ekler ve yazdırır.


3

Python 2-144 94 bayt


R=lambda S,V,F=[]:S and[R(S[len(v):],V,F+[v])for v in V if v==S[:len(v)]]or print("*".join(F))

Bu, Raşağıdaki gibi kullanılacak bir işlevi tanımlar :

>>> R("abc", ["a", "bc", "ab", "c"])

Çıktıyı aşağıdaki gibi yazdırır:

a*bc
ab*c

1

JavaScript (ES6) 111

"Balık" cevabımdan uyarlanan temel fark, sadece ilk değil tüm çözümleri bulmaktır.

F=(v,t)=>(k=(s,r)=>s?v.map(v=>s.slice(0,l=v.length)==v&&k(s.slice(l),[...r,v])):console.log(r.join('*')))(t,[])

Çıktı konsola yazdırılır. İşlev sonucunun bir anlamı yoktur ve atılması gerekir.

Firefox / FireBug konsolunda test et

F(['a','c','ab','bc'],'abc')  
a*bc  
ab*c

F(['ab','bc'],'abc')

F(['aaa','a'],'aaaa')
aaa*a
a*aaa
a*a*a*a

F(['xyz'],'xyz')
xyz
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.