Page 3 of 4
Code Kata: staňte sa lepším programátorom
Posted: Fri Aug 10, 2012 8:28
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.

Code Kata: staňte sa lepším programátorom
Posted: Fri Aug 10, 2012 10:26
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'

Code Kata: staňte sa lepším programátorom
Posted: Fri Aug 10, 2012 13:51
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;
Code Kata: staňte sa lepším programátorom
Posted: Thu Aug 16, 2012 8:10
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
Code Kata: staňte sa lepším programátorom
Posted: Thu Aug 16, 2012 13:21
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();
}
Code Kata: staňte sa lepším programátorom
Posted: Thu Aug 16, 2012 19:02
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)
Code Kata: staňte sa lepším programátorom
Posted: Thu Aug 16, 2012 22:26
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();
Code Kata: staňte sa lepším programátorom
Posted: Fri Aug 17, 2012 12:43
by matoman
tie si myslim, ze je to proste najlepsie riesenie, zbytocne vytvarat nejake divne struktury a classy naviac...

Code Kata: staňte sa lepším programátorom
Posted: Fri Aug 17, 2012 13:26
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.
Re: Code Kata: staňte sa lepším programátorom
Posted: Sat Aug 18, 2012 7:16
by martan1981
Asi preto, že u programátora to má byť samozrejmosťou, či nie?

Code Kata: staňte sa lepším programátorom
Posted: Sat Aug 18, 2012 7:32
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;
}
}
Re: Code Kata: staňte sa lepším programátorom
Posted: Sat Aug 18, 2012 9:10
by Igor Kulman
martan1981 wrote:Asi preto, že u programátora to má byť samozrejmosťou, či nie?

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.
Code Kata: staňte sa lepším programátorom
Posted: Sun Aug 26, 2012 15:17
by Petrroll
Nová Kata nebude?
Code Kata: staňte sa lepším programátorom
Posted: Sun Aug 26, 2012 15:42
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.
Code Kata: staňte sa lepším programátorom
Posted: Sun Aug 26, 2012 16:01
by matoman
mozno som blby, ale toto snad musi napisat do dvoch minut skolak na prvom stupni na zakladke nie?
Code Kata: staňte sa lepším programátorom
Posted: Sun Aug 26, 2012 16:06
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/
Code Kata: staňte sa lepším programátorom
Posted: Mon Aug 27, 2012 9:52
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.
Code Kata: staňte sa lepším programátorom
Posted: Thu Aug 30, 2012 8:36
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")
Code Kata: staňte sa lepším programátorom
Posted: Thu Aug 30, 2012 8:44
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);
Code Kata: staňte sa lepším programátorom
Posted: Thu Aug 30, 2012 9:01
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());
}
}