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
Posts: 3
Joined: Thu Aug 09, 2012 10:08
Zařízení: Samsung Omnia 7
Location: Dobruška

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

Post by Matajon »

Tomáš Slavíček wrote: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
Posts: 1138
Joined: Fri Mar 11, 2011 10:48
Zařízení: Nokia Lumia 925
Location: Praha

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

Post by Martin Suchan »

Tomáš Slavíček wrote: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
Posts: 41
Joined: Sun Dec 23, 2007 16:33

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

Post by 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
Posts: 228
Joined: Wed Mar 28, 2012 12:46
Zařízení: ano

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

Post by Igor Kulman »

Jednoduché riešenie v F#

Code: Select all

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
Posts: 41
Joined: Sun Dec 23, 2007 16:33

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

Post by 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;

Code: Select all

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
Posts: 89
Joined: Thu Aug 30, 2007 2:21
Zařízení: Lumia 925
Location: Praha
Contact:

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

Post by 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;

Code: Select all

    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
Posts: 7
Joined: Wed May 23, 2012 12:58
Zařízení: Lumia 920

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

Post by Pomezny »

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

Code: Select all

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
Posts: 1163
Joined: Sat Nov 10, 2007 11:56
Zařízení: Nokia Lumia 920

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

Post by 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
Posts: 228
Joined: Wed Mar 28, 2012 12:46
Zařízení: ano

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

Post by 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
Posts: 149
Joined: Sat Jul 11, 2009 22:13
Zařízení: SGS4

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

Post by martan1981 »

Asi preto, že u programátora to má byť samozrejmosťou, či nie?
:-D
Martin Suchan
smartmaniak
smartmaniak
Posts: 1138
Joined: Fri Mar 11, 2011 10:48
Zařízení: Nokia Lumia 925
Location: Praha

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

Post by 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;

Code: Select all

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
Posts: 228
Joined: Wed Mar 28, 2012 12:46
Zařízení: ano

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

Post by Igor Kulman »

martan1981 wrote: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
Posts: 92
Joined: Sat Mar 06, 2010 15:24
Zařízení: Samsung galaxy S

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

Post by Petrroll »

Nová Kata nebude?
Igor Kulman
častý přispěvatel
častý přispěvatel
Posts: 228
Joined: Wed Mar 28, 2012 12:46
Zařízení: ano

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

Post by 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
Posts: 1163
Joined: Sat Nov 10, 2007 11:56
Zařízení: Nokia Lumia 920

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

Post by 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
Posts: 228
Joined: Wed Mar 28, 2012 12:46
Zařízení: ano

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

Post by 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
Posts: 228
Joined: Wed Mar 28, 2012 12:46
Zařízení: ano

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

Post by Igor Kulman »

matoman wrote: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
Posts: 228
Joined: Wed Mar 28, 2012 12:46
Zařízení: ano

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

Post by Igor Kulman »

F#

Code: Select all

[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
Posts: 41
Joined: Sun Dec 23, 2007 16:33

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

Post by 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.

Code: Select all

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);
  }
}

Code: Select all

IFizzBuzzKata kata = new FizzBuzzKata();
Enumerable.Range(1, 100).Select(kata.Answer).ToList().ForEach(Console.WriteLine);
Martin Suchan
smartmaniak
smartmaniak
Posts: 1138
Joined: Fri Mar 11, 2011 10:48
Zařízení: Nokia Lumia 925
Location: Praha

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

Post by Martin Suchan »

Neni to zadny algoritmicky zazrak, ale budiz:

Code: Select all

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());
    }
}
Post Reply

Return to “Programování a vývoj”

Who is online

Users browsing this forum: No registered users and 1 guest