Jack lubi język programowania C, ale nie lubi pisać wyrażeń takich jak V=a*b*h;
zwielokrotnienie wartości.
V=abh;Zamiast tego chciałby napisać , dlaczego kompilator miałby narzekać na abhnieokreślony symbol, skoro int a, b, h;są zdefiniowane, abyśmy mogli wydedukować mnożenie?
Pomóż mu zaimplementować analizator składni, który rozszyfrowuje pojedynczy warunek mnożenia, pod warunkiem, że znany jest zestaw zmiennych zdefiniowanych w bieżącym zakresie.
Dla uproszczenia 2*a*bnie bierze się pod uwagę mnożenia przez liczbę (jak w ), pojawiają się tylko zmienne.
Dane wejściowe to warunek mnożenia T , spełniający wyrażenie regularne:
[a-zA-Z_][a-zA-Z_0-9]*
oraz zmienny zbiór Z .
Analiza składniowa P terminu T nad zestawem zmiennych Z jest ciągiem spełniającym następujące kryteria:
- po usunięciu wszystkich wystąpień
*z P otrzymujemy T, - albo jest nazwą zmiennej z Z, albo składa się z odpowiednich nazw zmiennych z Z podzielonych na pojedyncze
*znaki.
Rozwiązanie powinno wydrukować wszystkie parsowania terminu.
Próba:
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
Dane wejściowe (lista zmiennych i termin) mogą być dostarczone w dowolny sposób odpowiedni dla języka.
Dane wyjściowe mogą mieć dowolną sensowną formę (jedna parsowanie na wiersz lub listę oddzieloną przecinkami itp.) - ale powinny być jednoznaczne i możliwe do odczytania.
Puste wyjście jest akceptowalne, jeśli nie ma możliwości parsowania terminu (w przykładach użyłem „-” dla jasności).
To jest golf golfowy, więc wygrywa najkrótszy kod.
a*aaa aaa*ai nieab*c c*ab
ab*cjest to niepoprawna analiza, ponieważcnie jest dozwoloną zmienną.