pátek 12. června 2015

Další online C# editor a hádanka k tomu

Je potřeba vypsat hodnoty z pole integerů, ale tak, aby se v případě kladné hodnoty vypsal string 'pos', v případě záporné pak 'neg' a pro nulu pak 'null' - jak to udělat nejjednodušeji?

var values = new int[] { 5, -5, 0 };
foreach (var value in values)
{
 //write out to Console either 'pos' for values above 0, 'neg' for values below 0 or 'null' for zero
}

Možná řešení si lze bez instalace VS  vyzkoušet on-line zde:  https://dotnetfiddle.net/q20ecK

11 komentářů:

  1. Co třeba:
    var results = new string[3] {"neg","null","pos"};
    foreach (var value in values)
    {
    Console.WriteLine(results[Math.Sign(value)+1]);
    }

    OdpovědětVymazat
  2. Myslím, že z principu nelze říct, že bylo nalezeno nejjednodušší řešení.
    Bylo by ale dobré definovat, jaká verze C# se může použít.

    (původní příspěvek nešel editovat)

    OdpovědětVymazat
  3. použijete jakou verzi .NET FW chcete, jednoduchým řešením se myslí co nejkratší a přehledný zápis do daného vyhrazeného místa v ukázce kódu. Není to žádný chyták, jen upozornění na některé ne přiliš známe možnosti často používaných příkazů.

    OdpovědětVymazat
  4. Aha takže takhle?
    Console.WriteLine(value.ToString("pos;neg;null"));

    OdpovědětVymazat
  5. třeba, nebo Console.WriteLine("{0:pos;neg;null}", value);

    OdpovědětVymazat
  6. Otázka je jestli to takhle je nejednodušší i pro procesor. Mnou dříve uvedený způsob se Sign a polem hodnot bude téměř jistě jednodušší než parsování nějakého format stringu. Na druhou stranu pokud by mne měl opravdu zajímat výkon tak by asi byl nejlepší klasický "switch" nebo "if". A abych byl upřímný tak klasický switch nebo if pro mne byl a bude vždy nejjednodušším a nejpřehlednějším řešením a to jednoduše proto, že pokud se na ten kód podívá nějaký jiný programátor tak pokud nebude seznámen s tou danou specifickou feature tak mu vůbec nebude jasné jak to vlastně funguje a co to dělá. Na druhou stranu se zase něco naučí a také existují komentáře, které mohou u takové věci napovědět a napsat důvod (např. chtěl jsem co nejrychlejší vyhodnocení procesorem = použil jsem metodu XY).
    Ale ono na výkonu většinou až tolik nezáleží a na stručnosti zápisu už vůbec ne, takže co je vlastně nejjednodušší? :)

    OdpovědětVymazat
  7. to je pěkné takhle přemýšlet o kódu - to se mi líbí :-)

    Switch nebo if, respektive používání co nejjednodušších konstrukcí, mohou vést k rozvláčnému zápisu a následně k obtížnému čtení kódu. If bude ale zase asi nejrychlejší, tj. možná rozumným kompromisem (délka zápisu, přehlednost, výkon/zatížení PC) je pak:

    Console.WriteLine(value > 0 ? "pos" : value < 0 ? "neg" : "null");

    ale zase trochu trpí čitelnost...

    Jak jsem napsal, chtěl jsem upozornit na ne příliš zažité možnosti.

    OdpovědětVymazat
  8. No správně by člověk měl vzít v úvahu ještě snadnost odladění, k tomu snadnost budoucí údržby při změně zadání. Robustnost pro různé "škodlivé" vstupy.
    A ve finále pak píše blog s názvem "I know too much to program quickly. What can I do?" , "Analysis Paralysis: Over-thinking and Knowing Too Much to Just CODE" apod. :-)

    OdpovědětVymazat
    Odpovědi
    1. Tohle ale není finální fáze - následuje fáze, kdy už umí určit, který přístup použít, kdy psát kód jednoduše a kdy naopak robustně.

      Vymazat
  9. Jak to udělá pak překladač bych mimo extrémní případy dnes neřešil, pro mě je nejpodstatnější čitelný kód, klidně o pár znaků delší. Nejkratší nebývá nejlepší a nejčitelnější. Myslím, že C-čkaři by mohli vyprávět, někdy jejich kód vypadá jako z obfuscatoru :-)

    OdpovědětVymazat