Q:

Задача про кольцевой путь и неизвестное число вагонов

Есть кольцевой путь, на нем зацепленные в кольцо вагоны. В каждом вагоне может быть включен или выключен свет. Можно ходить из вагона в вагона и включать или выключать в нем свет. Вагонов может быть любое количество.
Как посчитать количество вагонов? 

A:

Мы знаем какой свет горит в первом вагоне и всегда можем вернуться посмотреть не поменялся ли он. Переходим в следующий вагон и запоминаем сколько вагонов мы прошли. Меняем свет на противоположный первому или оставляем без изменений, если он уже таковым является. Смотрим первый вагон, поменялся ли свет. Если не поменялся, то идем дальше. Если поменялся, то число пройденных и есть ответ. 
Cделал реализацию на C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Carriage
    {
        public bool Light { get; set; }
        public Carriage(bool light)
        {
            Light = light;
        }
    }

    class Train
    {
        Carriage[] Carriages { get; set; }
        private int currentPos;

        public Train(int carriageNumber)
        {
            Random random = new Random();
            Carriages = new Carriage[carriageNumber];
            currentPos = 0;
            Carriage carriage;

            for (int i = 0; i < carriageNumber; i++)
            {
                carriage = new Carriage(random.Next(2) == 1);
                Carriages[i] = carriage;
            }
        }

        public Carriage Current
        {
            get { return Carriages[currentPos]; }
        }

        public Carriage Next
        {
            get
            {
                currentPos++;
                if (currentPos >= Carriages.Count())
                    currentPos = 0;
                return Current;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Enter number of carriages: ");
            int carriageNumber = int.Parse(Console.ReadLine());
            Train train = new Train(carriageNumber);

            train.Current.Light = true; //Включаю свет в первом вагоне.
            Carriage startCarriage = train.Current;
            int steps = 0;

            while (startCarriage.Light != false) //Всегда можно вернуться и посмотреть какой свет в вагоне с которого мы стартовали.
            {
                train.Next.Light = false;
                steps++;
            }

            Console.WriteLine("Number of carriages: " + steps);
            Console.ReadKey();
        }
    }
}

