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 píše:Ale s F# si tam asi užijete...
Code Kata: staňte sa lepším programátorom
-
- 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
-
- 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
Zrovna v F# to jde napsat na jeden radekTomáš 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...
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;
-
- č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
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
Code 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;
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();
}
-
- 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
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;
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);
}
}
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.
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();
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...
-
- č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
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.
-
- 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
Asi preto, že u programátora to má byť samozrejmosťou, či nie?
-
- 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
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;
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;
}
}
-
- č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
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 píše: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?
-
- č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
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?
-
- č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
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/
-
- č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
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 píše:mozno som blby, ale toto snad musi napisat do dvoch minut skolak na prvom stupni na zakladke nie?
-
- č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
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")
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.
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);
-
- 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
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());
}
}
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 34 hostů