Code Kata: staňte sa lepším programátorom

Vše okolo vývoje aplikací pro platformy Windows Phone a Windows 10 Mobile
Matajon
můj třetí příspěvek
můj třetí příspěvek
Příspěvky: 3
Registrován: čtv srp 09, 2012 10:08
Zařízení: Samsung Omnia 7
Bydliště: Dobruška

Code Kata: staňte sa lepším programátorom

Příspěvek od Matajon »

Tomáš Slavíček píše:Ale s F# si tam asi užijete...
No, moc neužijeme. Tohle je totiž věc, která se učí v každém rozumném kurzu úvodu do funkcionálního programování, takže u toho člověk nebude muset moc přemýšlet. :-)
Martin Suchan
smartmaniak
smartmaniak
Příspěvky: 1138
Registrován: pát bře 11, 2011 10:48
Zařízení: Nokia Lumia 925
Bydliště: Praha

Code Kata: staňte sa lepším programátorom

Příspěvek od Martin Suchan »

Tomáš Slavíček píše:Tahle poslední, to je taková vysloveně "úloha z reálného života" :D Ale s F# si tam asi užijete...
Zrovna v F# to jde napsat na jeden radek :)
U C# to jde bud manualne ve while cyklu, nebo elegantne, staci vedet, jak funguje IEnumerable a 'yield return' :)
RSTEIN
nováček
nováček
Příspěvky: 41
Registrován: ned pro 23, 2007 16:33

Code Kata: staňte sa lepším programátorom

Příspěvek od RSTEIN »

A vidím, že někdo předchozí příspěvek smazal, díky.

@Pomezny
K tomu výkonu. Dovolím si jeden příspěvek mímo téma - (psáno v CPP za pomoci šablon a technika se nedá napodobit v C#, tak snad tím pravidla neporuším).
Číslo 35 (počet F. čísel) se nechá spočítat pomocí Bineta, do šablon jsme to už nechtěl rvát.

https://gist.github.com/3313956" onclick="window.open(this.href);return false;
Igor Kulman
častý přispěvatel
častý přispěvatel
Příspěvky: 228
Registrován: stř bře 28, 2012 12:46
Zařízení: ano

Code Kata: staňte sa lepším programátorom

Příspěvek od Igor Kulman »

Jednoduché riešenie v F#

Kód: Vybrat vše

let fibonacci = Seq.unfold (fun (current,next) -> Some(current, (next, current+next))) (0,1)

let sum =
    fibonacci    
    |> Seq.filter (fun x -> x% 2 = 0)
    |> Seq.takeWhile (fun x-> x<4000000)
    |> Seq.sum
RSTEIN
nováček
nováček
Příspěvky: 41
Registrován: ned pro 23, 2007 16:33

Code Kata: staňte sa lepším programátorom

Příspěvek od RSTEIN »

Takže já sám dám i tu svou (jednu možnou) variantu s využitím RX.

https://gist.github.com/3312979" onclick="window.open(this.href);return false;

Kód: Vybrat vše

sing System;
using System.Reactive.Linq;


namespace FibonacciKata
{
  
  class Program
  {
    public const int LIMIT = 4000000;
    static void Main(string[] args)
    {      
      Observable.Generate(new
                            {
                              Previous = 1,
                              Current = 2,
                              Total = 0
                            },
                          state => state.Previous <= LIMIT,
                          state => new
                                     {
                                       Previous = state.Current,
                                       Current = state.Previous + state.Current,
                                       Total = state.Total + (state.Current % 2 == 0 ? state.Current : 0)
                                     },                          
                          state => state.Total)                          
                          .TakeLast(1)
                          .Subscribe(Console.WriteLine);

      Console.ReadLine();
    }
BEZY
přispěvatel
přispěvatel
Příspěvky: 89
Registrován: čtv srp 30, 2007 2:21
Zařízení: Lumia 925
Bydliště: Praha
Kontaktovat uživatele:

Code Kata: staňte sa lepším programátorom

Příspěvek od BEZY »

Tak já se taky pochlubím se svojí první Káťou, zneužil jsem pro řešení yield :)

http://pastebin.com/YKE6nv3H" onclick="window.open(this.href);return false;

Kód: Vybrat vše

    public static class Fibonacci
    {        
        public static IEnumerable<int> GetNumbers() 
        {
            yield return 0;

            int current = 1;
            int previous = 0;            

            while (true)
            {
                yield return current;                
                current += previous;
                previous = current - previous;
            }                  
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int sum = Fibonacci.GetNumbers().Where(x => x % 2 == 1).TakeWhile(x => x < 4000000).Sum();
            Console.WriteLine(sum);                        
        }        
    }
(začínám od 0)
Pomezny
nováček
nováček
Příspěvky: 7
Registrován: stř kvě 23, 2012 12:58
Zařízení: Lumia 920

Code Kata: staňte sa lepším programátorom

Příspěvek od Pomezny »

navzdory všem pokusům bylo nejjednodušší řešení nejrychlejší :-) docela by mě zajímalo, jestli to jde ještě víc optimalizovat.

Kód: Vybrat vše

int sum = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
int c = 2;
int t1, t2 = 1;
while (c < 4000000)
{
    sum += c;
    t1 = t2 + c;
    t2 = c + t1;
    c = t1 + t2;
}
sw.Stop();
Console.WriteLine(sum + " - " + sw.Elapsed);
Console.ReadKey();
matoman
smartmaniak
smartmaniak
Příspěvky: 1163
Registrován: sob lis 10, 2007 11:56
Zařízení: Nokia Lumia 920

Code Kata: staňte sa lepším programátorom

Příspěvek od matoman »

tie si myslim, ze je to proste najlepsie riesenie, zbytocne vytvarat nejake divne struktury a classy naviac... :)
Igor Kulman
častý přispěvatel
častý přispěvatel
Příspěvky: 228
Registrován: stř bře 28, 2012 12:46
Zařízení: ano

Code Kata: staňte sa lepším programátorom

Příspěvek od Igor Kulman »

Zaujímavé, ako všetci hľadáte najrýchlejšie riešenie. Prečo ? v zadaní to nebolo a cieľom "cvičenia" je naučiť sa písať veci čitateľne, nie ako masu kryptografických znakov s tým, že to ide rýchlo.
martan1981
přispěvatel
přispěvatel
Příspěvky: 149
Registrován: sob črc 11, 2009 22:13
Zařízení: SGS4

Re: Code Kata: staňte sa lepším programátorom

Příspěvek od martan1981 »

Asi preto, že u programátora to má byť samozrejmosťou, či nie?
:-D
Martin Suchan
smartmaniak
smartmaniak
Příspěvky: 1138
Registrován: pát bře 11, 2011 10:48
Zařízení: Nokia Lumia 925
Bydliště: Praha

Code Kata: staňte sa lepším programátorom

Příspěvek od Martin Suchan »

Trochu se spozdenim, moje druha Code Kata - zkusil jsem schvalne maximalne vyuzit potencial nekonecnych sequenci a Linqu :)
http://pastebin.com/MFiVxVXH" onclick="window.open(this.href);return false;

Kód: Vybrat vše

private static void CodeKata2()
{
    const long limit = 4000000;
    long result = FibSeq()
        .TakeWhile(l => l < limit)
        .Where(l => l%2 == 1)
        .Sum();

    Console.WriteLine(result); // 4613731
}

// infinite Fibonacci sequence
public static IEnumerable<long> FibSeq()
{
    long a = 0;
    long b = 1;
    while (true)
    {
        long next = a + b;
        if (a < b) a = next; else b = next;
        yield return next;
    }
}
Igor Kulman
častý přispěvatel
častý přispěvatel
Příspěvky: 228
Registrován: stř bře 28, 2012 12:46
Zařízení: ano

Re: Code Kata: staňte sa lepším programátorom

Příspěvek od Igor Kulman »

martan1981 píše:Asi preto, že u programátora to má byť samozrejmosťou, či nie?
:-D
AK programuje sam pre seba, tak možno. Ak jeho kód majú čítať a udržiavať iní ľudia, tak je jednoznačne cennejšia čitateľnosť. Hardvér je lacnejší ako ľudská práca.
Petrroll
přispěvatel
přispěvatel
Příspěvky: 92
Registrován: sob bře 06, 2010 15:24
Zařízení: Samsung galaxy S

Code Kata: staňte sa lepším programátorom

Příspěvek od Petrroll »

Nová Kata nebude?
Igor Kulman
častý přispěvatel
častý přispěvatel
Příspěvky: 228
Registrován: stř bře 28, 2012 12:46
Zařízení: ano

Code Kata: staňte sa lepším programátorom

Příspěvek od Igor Kulman »

Nová Code Kata, termín: štvrtok 30.8.2012. Čas na napísanie: ideálne do 2 minút, viď text nižšie

Write a program that prints the numbers from 1 to 100. But for multiples of three print “Fizz” instead of the number and for the multiples of five print “Buzz”. For numbers which are multiples of both three and five print “FizzBuzz

Táto Code Kata sa vraj v zahraničí často používa na pohovoroch na prvotné filtrovanie uchádzačov:
Most good programmers should be able to write out on paper a program which does this in a under a couple of minutes.

Want to know something scary ? – the majority of comp sci graduates can’t. I’ve also seen self-proclaimed senior programmers take more than 10-15 minutes to write a solution.
matoman
smartmaniak
smartmaniak
Příspěvky: 1163
Registrován: sob lis 10, 2007 11:56
Zařízení: Nokia Lumia 920

Code Kata: staňte sa lepším programátorom

Příspěvek od matoman »

mozno som blby, ale toto snad musi napisat do dvoch minut skolak na prvom stupni na zakladke nie?
Igor Kulman
častý přispěvatel
častý přispěvatel
Příspěvky: 228
Registrován: stř bře 28, 2012 12:46
Zařízení: ano

Code Kata: staňte sa lepším programátorom

Příspěvek od Igor Kulman »

U nás áno, tiež sa čudujem. Napadlo ma, kamarát mal raz na pohovore nejakého senior programátora, dal mu na papier naprogramovať Fibonacciho a bol bezradný, nedokázal ani rekurzívnu variantu.

Pozri http://imranontech.com/2007/01/24/using ... ok-coding/
Igor Kulman
častý přispěvatel
častý přispěvatel
Příspěvky: 228
Registrován: stř bře 28, 2012 12:46
Zařízení: ano

Code Kata: staňte sa lepším programátorom

Příspěvek od Igor Kulman »

matoman píše:mozno som blby, ale toto snad musi napisat do dvoch minut skolak na prvom stupni na zakladke nie?
tak našiel som programátora (androiďák), ktorý to nezvládol. Jeho výhovorka bola že keby to spustil na počítači tak by zistil, že to nefunguje.
Igor Kulman
častý přispěvatel
častý přispěvatel
Příspěvky: 228
Registrován: stř bře 28, 2012 12:46
Zařízení: ano

Code Kata: staňte sa lepším programátorom

Příspěvek od Igor Kulman »

F#

Kód: Vybrat vše

[1..100]
    |> List.map (fun n->
                    match n with
                    | n when n%5 = 0 && n%3 = 0 -> "FizzBuzz"
                    | n when n%3 = 0 -> "Fizz"
                    | n when n%5 = 0 -> "Buzz"
                    | n -> string n
                 )
    |> List.iter (printfn "%s")
RSTEIN
nováček
nováček
Příspěvky: 41
Registrován: ned pro 23, 2007 16:33

Code Kata: staňte sa lepším programátorom

Příspěvek od RSTEIN »

My už jsme se s Igorem o této katě bavili, tak sem taky dám řešení.
Ta kata obsahuje rozhraní, protože jsem ji kdysi našel na nějakém webu, kde k ní byly i unit testy.

Kód: Vybrat vše

sing System.Linq;

namespace KATA_NASA
{
  using System;

  public class FizzBuzzKata : IFizzBuzzKata
  {
    
    public string Answer(int i)
    {


      Func<int, string, string>[] analysers = new Func<int, string, string>[]
                                                {
                                                  (input, current) => i % 3==0 ? current + "fizz" : current,
                                                  (input, current) => i % 5==0 ? current + "buzz" : current,
                                                  (input, current) => current==String.Empty ? input.ToString() : current
                                                };


      return analysers.Aggregate(String.Empty,
                                 (data, function) => function(i, data));


      //Klasika
      //string result = i.ToString();
      //bool isFizz = false;
      //if (i % 3 == 0)
      //{
      //  result = "fizz";
      //  isFizz = true;
      //}

      //if (i % 5 == 0)
      //{
      //  result = isFizz ? result + "buzz" : "buzz";
      //}

      //return result;
    }
  }

  public interface IFizzBuzzKata
  {
    /// <summary>
    /// Give an answer to the current game
    /// </summary>
    /// <param name="number">current number in the game sequence</param>
    /// <returns>appropriate answer to the current number</returns>
    string Answer(int number);
  }
}

Kód: Vybrat vše

IFizzBuzzKata kata = new FizzBuzzKata();
Enumerable.Range(1, 100).Select(kata.Answer).ToList().ForEach(Console.WriteLine);
Martin Suchan
smartmaniak
smartmaniak
Příspěvky: 1138
Registrován: pát bře 11, 2011 10:48
Zařízení: Nokia Lumia 925
Bydliště: Praha

Code Kata: staňte sa lepším programátorom

Příspěvek od Martin Suchan »

Neni to zadny algoritmicky zazrak, ale budiz:

Kód: Vybrat vše

private void FizzBuzz()
{
    for (int i = 1; i <= 100; i++)
    {
        string s = string.Empty;
        if (i % 3 == 0) s += "Fizz";
        if (i % 5 == 0) s += "Buzz";
        if (s != string.Empty) Console.WriteLine(s);
        else Console.WriteLine(i.ToString());
    }
}
Odpovědět

Zpět na „Programování a vývoj“

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 34 hostů