コード例 #1
0
ファイル: DnaRunner.cs プロジェクト: VitalyKalinkin/ICFP
        private TemplateInfo DecodeTemplate()
        {
            var template = new TemplateInfo();

            bool flag = true;
            while (flag)
            {
                if (_currentIndex >= _runningDna.Length)
                {
                    lock (_runningMutex)
                    {
                        _state = RunningState.Stoped;
                        return null;
                    }
                }

                if (_runningDna.HasPatternAtPosition(
                    new[]
                        {
                            "C"
                        },
                    _currentIndex))
                {
                    ++_currentIndex;
                    template.AppendBack('I');
                    continue;
                }

                if (_runningDna.HasPatternAtPosition(
                    new[]
                        {
                            "F"
                        },
                    _currentIndex))
                {
                    ++_currentIndex;
                    template.AppendBack('C');
                    continue;
                }

                if (_runningDna.HasPatternAtPosition(
                    new[]
                        {
                            "P"
                        },
                    _currentIndex))
                {
                    ++_currentIndex;
                    template.AppendBack('F');
                    continue;
                }

                if (_runningDna.HasPatternAtPosition(
                    new[]
                        {
                            "IC"
                        },
                    _currentIndex))
                {
                    _currentIndex += 2;
                    template.AppendBack('P');
                    continue;
                }

                if (_runningDna.HasPatternAtPosition(
                    new[]
                        {
                            "IF", "IP"
                        },
                    _currentIndex))
                {
                    _currentIndex += 2;
                    int level = DecodeNumber();
                    int reference = DecodeNumber();
                    template.AddReference(reference, level);
                    continue;
                }

                if (_runningDna.HasPatternAtPosition(
                    new[]
                        {
                            "IIC", "IIF"
                        },
                    _currentIndex))
                {
                    _currentIndex += 3;
                    flag = false;
                    continue;
                }

                if (_runningDna.HasPatternAtPosition(
                    new[]
                        {
                            "IIP"
                        },
                    _currentIndex))
                {
                    _currentIndex += 3;
                    int reference = DecodeNumber();
                    template.AddLengthOfReference(reference);
                    continue;
                }

                if (_runningDna.HasPatternAtPosition(
                    new[]
                        {
                            "III"
                        },
                    _currentIndex))
                {
                    string toRna = _runningDna.Substring(_currentIndex + 3, 7).ToString();
                    OutputToRna(toRna);
                    _currentIndex += 10;
                    continue;
                }

                // Else stop.
                lock (_runningMutex)
                {
                    _state = RunningState.Stoped;
                    return null;
                }
            }

            return template;
        }