IMP: Pengurai multiplikasi implisit

9

Jack suka bahasa pemrograman C, tetapi tidak suka menulis ekspresi suka V=a*b*h; mengalikan nilainya.

Dia ingin menulis V=abh;sebagai gantinya, mengapa kompiler harus mengeluh tentang abhsimbol yang tidak terdefinisi sejak int a, b, h;didefinisikan, sehingga kita dapat menyimpulkan perkalian?

Bantu dia mengimplementasikan parser yang mendekripsi istilah multiplikasi tunggal, asalkan set variabel yang didefinisikan dalam lingkup saat ini diketahui.

Untuk kesederhanaan, mengalikan dengan angka (seperti dalam 2*a*b) tidak diperhitungkan, hanya variabel yang muncul.

Input adalah istilah multiplikasi T , yang memenuhi regexp:

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

dan variabel set Z .

P parsing dari istilah T over set variabel Z adalah string yang memenuhi berikut:

  1. setelah menghapus semua kejadian *dari P kita menerima T,
  2. baik itu nama variabel dari Z atau terdiri dari nama variabel yang tepat dari Z yang dipisah dengan *karakter tunggal .

Solusinya harus mencetak semua parsing dari suatu istilah.

Sampel:

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

Input (daftar variabel dan istilah) dapat diberikan dengan cara apa pun yang sesuai untuk bahasa.

Outputnya dapat dalam bentuk apa pun yang masuk akal (satu parsing per baris atau daftar yang dipisahkan koma, dll.) - tetapi harus jelas dan mungkin dibaca.

Keluaran kosong dapat diterima jika tidak ada kemungkinan penguraian istilah (dalam contoh yang saya gunakan '-' untuk kejelasan).

Ini adalah kode golf, sehingga kode terpendek menang.

pawel.boczarski
sumber
1
Dalam contoh pertama Anda, saya yakin ab*cini tidak benar, karena cbukan variabel yang diizinkan.
isaacg
1
Dengan pemindaian rekursif saya menemukan persis hasil Anda dalam sampel. Tapi itu dipertanyakan: mengapa a*aaa aaa*adan tidakab*c c*ab
edc65
Karena aturan 1. penguraian. Ya, perkalian biasanya komutatif, tetapi kami tidak melangkah sejauh ini - kami hanya ingin "merekonstruksi" perkalian dalam urutan yang dilakukan. Sebenarnya dalam bahasa Jack kita bisa memiliki tipe matriks - perkaliannya tidak komutatif. Dan "aaaa" dapat menjadi penjajaran dari "aaa" dan "a" atau "a" dan "aaa" - ini bukan untuk kesia-siaan, melainkan untuk ambiguitas, kami mempertimbangkan keduanya.
pawel.boczarski
Duplikat yang tepat dari codegolf.stackexchange.com/questions/45496/…
feersum

Jawaban:

4

Pyth, 18 karakter

mj\*dfqzsTsm^Qkhlz

Solusi ini diadaptasi dari solusi Interpreting Fish saya . Masalahnya sebenarnya sangat mirip.

Diharapkan input seperti itu:

aaaa
"a", "aaa"

Memberikan output seperti ini:

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

Coba di sini.

  • sm^Qkhlz: Menghasilkan semua urutan variabel yang berisi hingga panjang jumlah string input variabel.

  • fqzsT: Menyaring urutan variabel yang cocok dengan string input

  • mj\*d: Menyisipkan *simbol dan cetakan.

isaacg
sumber
3

Python 2 - 147 94 byte


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

Ini mendefinisikan fungsi yang Rakan digunakan seperti:

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

Mencetak output seperti:

a*bc
ab*c
matsjoyce
sumber
1

JavaScript (ES6) 111

Diadaptasi dari jawaban "ikan" saya , perbedaan utama adalah menemukan semua solusi, bukan hanya yang pertama.

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,[])

Outputnya dicetak ke konsol. Hasil fungsi tidak memiliki arti dan harus dibuang.

Uji di Firefox / konsol FireBug

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
edc65
sumber