Tehetséggondozás az informatikában

Fej vagy írás? (inf_e_20151016_m_04)

A feladat egy megoldása C# nyelven:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace fejvagyiras
{
    class Program
    {
        static Random veletlen = new Random();
        static string dob()
        {
            string dob = "";
            if (veletlen.Next(0, 2) == 0)
                dob = "F";
            else
                dob = "I";
            return dob;
        }
        static void Main(string[] args)
        {
            Console.WriteLine("1. feladat");
            string dobas = dob();
            Console.WriteLine("A pénzfeldobás eredménye: {0}", dobas);

            Console.WriteLine("2. feladat");
            Console.Write("Tippeljen! (F/I)= ");
            string tipp = Console.ReadLine();
            dobas = dob();
            Console.WriteLine("A tipp {0}, a dobás eredménye {1} volt.", tipp, dobas);
            if (tipp == dobas)
                Console.WriteLine("Ön eltalálta.");
            else
                Console.WriteLine("Ön nem találta el.");

            FileStream be = new FileStream("kiserlet.txt", FileMode.Open);
            StreamReader olvaso = new StreamReader(be);

            Int32 n = 0;
            bool egyfej = false;
            bool ketfej = false;
            bool tobbfej = false;
            int fejek = 0;
            int fejdb = 0;
            int duplafej = 0;
            int maxfej = 0;
            int fejkezd=0, maxhely=0;

            while (!olvaso.EndOfStream)
            {
                dobas = olvaso.ReadLine();
                n++;
                if (dobas == "F")
                {
                    fejek++;
                    fejdb++;
                    if (egyfej)
                    {
                        egyfej = false;
                        ketfej = true;
                    }
                    else if (ketfej)
                    {
                        ketfej = false;
                        tobbfej = true;
                    }
                    else if (!tobbfej)
                    {
                        egyfej = true;
                        fejkezd = n;
                    }
                }
                else
                {
                    if (ketfej) duplafej++;
                    egyfej = false;
                    ketfej = false;
                    tobbfej = false;
                    if (fejdb > maxfej)
                    {
                        maxfej = fejdb;
                        maxhely = fejkezd;
                    }
                    fejdb = 0;
                }
            }
            if (ketfej) duplafej++;
            if (fejdb > maxfej)
            {
                maxfej = fejdb;
                maxhely = fejkezd;
            }
            olvaso.Close();
            be.Close();

            Console.WriteLine("3. feladat");
            Console.WriteLine("A kísérlet {0} dobásból állt.", n);

            Console.WriteLine("4. feladat");
            double relgyak = 100.0 * fejek / n;
            Console.WriteLine("A kísérlet során a fej relatív gyakorisága {0:F2}% volt.", relgyak);

            Console.WriteLine("5. feladat");
            Console.WriteLine("A kísérlet során {0} alkalommal dobtak pontosan két fejet egymás után.", duplafej);

            Console.WriteLine("6. feladat");
            Console.WriteLine("A leghosszabb tisztafej sorozat {0} tagból áll, kezdete a(z) {1}. dobás.", maxfej, maxhely);

            Console.WriteLine("7. feladat");
            int ffff = 0;
            int fffi = 0;
            string[] dobassor = new string[1001];

            for (int i = 1; i <= 1000; i++)
            {
                dobassor[i] = dob() + dob() + dob() + dob();
                if (dobassor[i] == "FFFF") ffff++;
                if (dobassor[i] == "FFFI") fffi++;
            }
            FileStream ki = new FileStream("dobasok.txt", FileMode.Create);
            StreamWriter iro = new StreamWriter(ki);
            iro.WriteLine("FFFF: {0}, FFFI: {1}", ffff, fffi);
            for (int i = 1; i <= 1000; i++)
                iro.Write(dobassor[i] + ' ');
            iro.WriteLine();

            iro.Close();
            ki.Close();
            Console.ReadKey();
        }
    }
} 
A feladat megoldása Excel-ben: fejvagyiras.xlsx.

A beolvasott szövegfájl tartalma az A oszlopban az A2 cellától kezdve található.
A feladatok megoldását megadó függvények a következők:

1. feladat: A pénzfeldobás eredménye
D3 cellában: =HA(VÉLETLEN.KÖZÖTT(0;1)=0;"F";"I")

2. feladat:
A tipp:
D6 cellába: F vagy I beírása
A dobás eredménye:
D7 cellában: =HA(VÉLETLEN.KÖZÖTT(0;1)=0;"F";"I")
E7 cellában: =HA(D7=D6;"Ön eltalálta";"Ön nem találta el")

3. feladat: A dobások száma
D10 cellában: =DARAB2(A:A)-1

4. feladat: A fej relatív gyakorisága
D13 cellában: =DARABTELI(A2:A4322;"F")/D10

5. feladat: Két fej egymás után
G segédoszlopban a két egymás utáni fej esetén (a második fejnél) 1, különben 0 szerepel, ennek másolható képlete a G3 cellában: =HA(ÉS(A3="F";A2="F";A1<>"F";A4<>"F");1;0)
D16 cellában: =SZUM(G3:G4322)

6. feladat: A leghosszabb tisztafej sorozat
I segédoszlopban a dobás sorszáma, a J segédoszlopban a fej sorszáma szerepel az egymás után dobott fejek esetén, különben 0,
J2 cellában: =HA(A2="F";1;0), J3 cellában (amit lefelé másolunk: =HA(A3="F";J2+1;0)
D19 cellában: =MAX(J2:J4322)
D20 cellában a tisztafej-sorozat kezdete: =INDEX(I2:I4322;HOL.VAN(D19;J2:J4322;0))-D19+1

7. feladat: a 4-es dobások előállítása az L, M, N, O segédoszlopban L2:O1001-ig a következő függvénnyel: =HA(VÉLETLEN.KÖZÖTT(0;1)=0;"F";"I")
Q segédoszlopban 1 van az FFFF dobások esetén, különben 0, Q2 cellában: =HA(ÉS(L2="F";M2="F";N2="F";O2="F");1;0)
R segédoszlopban 1 van az FFFI dobások esetén, különben 0, R2 cellában: =HA(ÉS(L2="F";M2="F";N2="F";O2="I");1;0)
az FFFF dobások száma au U1 cellában: =SZUM(Q2:Q1001)
az FFFI dobások száma a W1 cellában: =SZUM(R2:R1001)

A megoldás képernyőképe: