RegexCombinationAnalyzer.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Text.RegularExpressions;
  4. using UnityEngine;
  5. namespace JTFold
  6. {
  7. [RequireComponent(typeof(Paper))]
  8. public class RegexCombinationAnalyzer : MonoBehaviour
  9. {
  10. [SerializeField] private string _pattern;
  11. private readonly char[] _alphabet = "abcdefghij".ToCharArray();
  12. private void OnValidate()
  13. {
  14. void AssignMarkerAndRandomIdentifier(Transform folding, int alphabetIndex)
  15. {
  16. if (folding.TryGetComponent<FoldingMarker>(out _) == false)
  17. {
  18. var marker = folding.gameObject.AddComponent<FoldingMarker>();
  19. marker.identifier = _alphabet[alphabetIndex];
  20. folding.name = $"{folding.name} ({marker.identifier})";
  21. _pattern += marker.identifier;
  22. }
  23. }
  24. void AttachMarkersToFoldings(Paper relatedPaper)
  25. {
  26. var alphabetIndex = 0;
  27. foreach (var folding in relatedPaper.foldingsParent.Cast<Transform>())
  28. {
  29. AssignMarkerAndRandomIdentifier(folding, alphabetIndex);
  30. alphabetIndex++;
  31. }
  32. }
  33. var paper = GetComponent<Paper>();
  34. AttachMarkersToFoldings(paper);
  35. paper.RegexAnalyzer = this;
  36. }
  37. public bool IsCorrect(IEnumerable<Folding> combination)
  38. {
  39. var translated = combination.Select(x => x.GetComponent<FoldingMarker>())
  40. .Select(x => x.identifier)
  41. .ToArray();
  42. return Regex.IsMatch(new string(translated), _pattern);
  43. }
  44. }
  45. }