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 abh
nieokreś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*b
nie 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.
ab*c
jest to niepoprawna analiza, ponieważc
nie jest dozwoloną zmienną.a*aaa aaa*a
i nieab*c c*ab
Odpowiedzi:
Pyth, 18 znaków
To rozwiązanie zostało zaadaptowane z mojego rozwiązania Interpreting Fish . Problemy są bardzo podobne.
Oczekuje, że dane wejściowe jako takie:
Daje dane wyjściowe w następujący sposób:
Wypróbuj tutaj.
sm^Qkhlz
: Generuje wszystkie sekwencje zmiennych zawierające do długości wejściowej liczby zmiennych.fqzsT
: Odfiltrowuje sekwencje zmiennych pasujące do ciągu wejściowegomj\*d
: Wstawia*
symbol i drukuje.źródło
Python 2 -
14794 bajtyDefiniuje funkcję,
R
która ma być używana, np .:Wyświetla dane wyjściowe takie jak:
źródło
JavaScript (ES6) 111
Na podstawie mojej odpowiedzi „ryby” główną różnicą jest znalezienie wszystkich rozwiązań, nie tylko pierwszych.
Dane wyjściowe są drukowane na konsoli. Wynik funkcji nie ma znaczenia i musi zostać odrzucony.
Przetestuj w konsoli Firefox / FireBug
źródło