Diskuze: Vybrání cifer z lichých pozic z dlouhého čísla
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 5 zpráv z 5.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Ty zadáš něco jako: "1248" a program má do proměnné uložit "14" (tj.
textový řetězec vytvořený z 1. a 3 číslice), chápu to správně?
Toto je snadné. Stačí ten vstup projít for cyklem s krokem 2 a znak na té
pozici přilepit do té nové proměnné.
Vzhledem k tomu, že pro ověření budeš muset pracovat se všemi čísly, nejen lichými, tak bych si nejprve celý String naparsoval na pole čísel (resp. při použití LINQ objekt IEnumerable). To lze úplně nejlépe udělat asi takto:
var numbers = input.Select(x => (int)char.GetNumericValue(x));
Potom už jen vynásobíš všechna lichá čísla 2, nejjednodušší je:
numbers = numbers.Select((x, i) => (i % 2 == 0) ? (x * 2) : x);
No a nakonec vše jen sečteš, jen pozor, že čísla větší než 9 je nutné nejprve ciferovat, tj. v tomto případě asi nejlépe odečíst od nich 9 (10 - 1):
int sum = numbers.Sum(x => (x >= 10) ? (x - 9) : x);
No a zjistit platnost přes modulo 10 by jsi asi už zvládl 
return sum % 10 == 0
(pokud to nemáš v metodě, tak místo return použij if, Console.WriteLine nebo cokoliv jiného potřebuješ.)
Ještě by bylo vhodné hned po bodu č. 1 zkontrolovat, že v čísle byla pouze čísla, ne nějaké jiné znaky. Každý jiný znak bude v poli reprezentován hodnotou -1, tj. můžeš je třeba jen vyházet (čímž mimo jiné umožníš zápis s mezerami po 4 číslicích):
numbers = numbers.Where(x => x >= 0);
nebo vypsat nějaké chybové hlášení, vyhodit výjimku apod.
Pokud ti toto zápisy přes LINQ nejsou příjemné, tak vše to lze samozřejmě zapsat i jen pomocí cyklů.
Pozn: Kód jsem nezkoušel, ale měl by fungovat 
Já bych to udělal takto, ošetřila by se tím možnost, že uživatel zadá třeba mezeru nebo pomlčku
using System;
using System.Text;
namespace TestConsoleApp
{
class Program
{
static void Main(string[] args)
{
ulong pn = ParseNumber(Console.ReadLine());
Console.WriteLine(pn);
}
static ulong ParseNumber(string str)
{
ulong value = 0;
if (!string.IsNullOrEmpty(str))
{
int counter = 0;
var bu = new StringBuilder(str.Length);
foreach (var c in str)
{
if (char.IsDigit(c))
{
if ((counter & 0x00000001) == 0) bu.Append(c);
counter++;
}
}
ulong.TryParse(bu.ToString(), out value);
}
return value;
}
}
}
Omlouvám se, nečetl jsem pozorně otázku, ani jsem se nedíval na ten
uvedený odkaz.
Takže tady je oprava bez LINQ
using System;
namespace TestConsoleApp
{
class Program
{
static void Main(string[] args)
{
bool valid = IsValidCardID(Console.ReadLine());
Console.WriteLine((valid) ? "ANO" : "NE");
}
static bool IsValidCardID(string str)
{
if (!string.IsNullOrEmpty(str))
{
int counter = 0, sum = 0;
int v, w;
foreach (var c in str)
{
if (char.IsDigit(c))
{
v = (int)char.GetNumericValue(c);
if ((counter & 0x00000001) == 0)
{
w = v * 2;
if (w > 9) w -= 9;
sum += w;
}
else sum += v;
counter++;
}
}
//Console.WriteLine(sum);
return ((sum % 10 == 0) && sum > 0);
}
return false;
}
}
}
Příspěvek Jana Kerharta řeší problém nejspíš správně, já jen LINQ neovládám.
Zobrazeno 5 zpráv z 5.