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.Tomáš Slavíček wrote:Ale s F# si tam asi užijete...
Code Kata: staňte sa lepším programátorom
-
Matajon
- 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
-
Martin Suchan
- 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
Zrovna v F# to jde napsat na jeden radekTomáš Slavíček wrote:Tahle poslední, to je taková vysloveně "úloha z reálného života" :D Ale s F# si tam asi užijete...
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
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;
@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

- Posts: 228
- Joined: Wed Mar 28, 2012 12:46
- Zařízení: ano
Code Kata: staňte sa lepším programátorom
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.sumCode Kata: staňte sa lepším programátorom
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;
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

- 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
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;
(začínám od 0)
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);
}
}
Code Kata: staňte sa lepším programátorom
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
tie si myslim, ze je to proste najlepsie riesenie, zbytocne vytvarat nejake divne struktury a classy naviac... 
-
Igor Kulman
- č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
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

- Posts: 149
- Joined: Sat Jul 11, 2009 22:13
- Zařízení: SGS4
Re: Code Kata: staňte sa lepším programátorom
Asi preto, že u programátora to má byť samozrejmosťou, či nie?

-
Martin Suchan
- 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
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;
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

- Posts: 228
- Joined: Wed Mar 28, 2012 12:46
- Zařízení: ano
Re: Code Kata: staňte sa lepším programátorom
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.martan1981 wrote:Asi preto, že u programátora to má byť samozrejmosťou, či nie?
Code Kata: staňte sa lepším programátorom
Nová Kata nebude?
-
Igor Kulman
- č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
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:
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
mozno som blby, ale toto snad musi napisat do dvoch minut skolak na prvom stupni na zakladke nie?
-
Igor Kulman
- č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
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/
Pozri http://imranontech.com/2007/01/24/using ... ok-coding/
-
Igor Kulman
- č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
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.matoman wrote:mozno som blby, ale toto snad musi napisat do dvoch minut skolak na prvom stupni na zakladke nie?
-
Igor Kulman
- č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
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
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.
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

- 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
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());
}
}Who is online
Users browsing this forum: No registered users and 1 guest