Ahoj všichni, vítám vás u další minisoutěže, tento týden hrajeme o
placku Machr na C# .NET a jako vždy o samolepky. Dnešní zadání bude
obzvláště zábavné a speciální, výsledná aplikace se bude totiž
hodnotit podle toho, jak je zdrojový kód dlouhý. Vyhrává nejkratší,
soutěž je omezena na C# .NET a framework verze 3.5.
Zadání není komplikované, vytvořte analyzátor textových souborů,
program si načte soubor z textového souboru vstup.txt (bude ve složce s
programem) a analyzuje jeho text. Do konzole vypíše následující údaje:
Řádků: x
Samohlásek: x
Slov: x
Číslic: x
Emailových adres: x
Palindromů: x
Palindrom je slovo, které se čte stejně zleva i zprava, třeba kuk nebo
oto. Program ignoruje velikost písmen. Sekvence znaků 2013 jsou 4
číslice.
Všechny programy potom spustím na stejném vstupním textu, abych
vyzkoušel, jestli fungují. Dále spočítám počet znaků ve zdrojovém
souboru Program.cs (samozřejmě nesmíte používat jinou knihovnu nebo třídu
mimo těch v .NETu).
Hint: Používejte ternární operátory, namespace bude zbytečný,
některé usingy budou zbytečné, kód pravděpodobně odevzdáte na jednom
řádku. Nejdříve si program napište normálně a potom začněte s
"kompresí"
Počítá se opravdu každý znak, machr, co napíše nejkratší program
získává placku a nálepky. Čas máte do neděle 2.6. do 15:00.
No a takové přece na vstupu nebudou. Znak \ se dá vyhodnotit
jako oddělovač, ddd jako slovo. Ale proč by to tam sdraco
dával? V běžném textu se nevyskytují.
foreach(char c in System.IO.File.ReadAllText(args[0]))
{
if (c == '\n')
Console.WriteLine("Je tam!");
}
Výstup:
./Praes.exe /mnt/Data/MonoProjects/Rumdych/Rumdych/bin/Debug/source
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Je tam!
Není. Escape znak je reprezentován pouze tím symbolem '\'. To
'n' už není escape znak. Takže v tom souboru je možná znak s
ordinální hodnotou 13, což je LF, ale nic to nevypovídá o znaku s
ordinální hodnotou 92, což je \.
Zkus si to schválně otestovat na '\\' - tak se v C# dá zapsat
backslash, který se nejčastěji používá jako escape znak.
Ale ty nemáš za úkol kompilovat vstupní text a převádět escape znaky.
Máš kompilovat svůj program v C#, který bude číst vstupní text a vypsat z
něj report. Žádné escape znaky v něm přece nebudou.
Escape znaky jsou záležitostí kompilátoru, ale ne tvého programu.
Očividně ti to escape znak nenašlo, ale našlo to jen '\n',
což není escape znak. To je LF. LF není escape znak, ale netisknutelný znak
pro návrat vozíku.
Jak moc spravne to musi byt?
Řádků: pocitaji se prazdne radky?
Samohlásek: pocitaji se s hackem, carkou, krouzkem?
Slov: jsou slova vzdy oddelena mezerou? muze se prazdny radek pocitat jako
slovo?
Emailových adres: budou vsechny zavinace v dokumentu soucasti emailovych
adres?
Palindromů: pocita se diakritika?
To je otázek Kdybych
někoho přehlédl, ptejte se prosím znovu.
Řádků: pocitaji se prazdne radky? - ano
Samohlásek: pocitaji se s hackem, carkou, krouzkem? - ano
Slov: jsou slova vzdy oddelena mezerou? - počítej i s čárkou, tečkou nebo
vykřičníkem.
Muze se prazdny radek pocitat jako slovo? - ne
Emailových adres: budou vsechny zavinace v dokumentu soucasti emailovych adres?
- ne
Palindromů: pocita se diakritika? - Ano, např. "nezařazen"
Víte co? Já vám ten ukázkový text během dneška dodám, ať si to
odladíte
Abychom se shodli na tom, zda aplikace funguje korektně, zde je text, na
kterém ji budu zkoušet:
Text slouží k vyzkoušení už asi 30. soutěže
v programování, která se zaměřuje na počítání
slov v textu, samohlásek a znaků! Dále zde
naleznete příklady palindromů, jako je třeba
děd, rotor, madam a radar. Zajímavé palindromy
jsou nepochopen a nezařazen, že? Kdybychom
rozříšili definici palindromu, je palindromická
věta třeba: "Ne debile, doma má má máma modely
beden". Takové věty ale rozeznávat nemusíte.
Posledním prvkem jsou emailové adresy, jako třeba
[email protected] nebo [email protected]. Nenechte
se v textu zmást znaky jako @!
Statistiky nemám, jelikož jsem sám program neimplementoval, ale bude
bohatě stačit, když se tu spolu dohodnete na výsledku, co vyjde více lidem
a bude dávat smysl
A pro úplnost dodávám, že nestačí, když výsledný program bude umět
vypsat údaje jen přesně o tomto textu
Soutěže se sice neúčastním, ale chtěl bych podotknout, že by bylo
dobré odpovědět na otázku matesaxe, zda se počítá výstupní text a
ujasnit jak má vypadat výstup programu, aby nakonec o výherci nerozhodovalo
to, jak hodně, omlouvám se za ten výraz, zprasil výstup programu.
A mezery se počítají také? 444 mám s mezerami - třeba mezi var a
názvem proměnné... Jinak mám 428 znaků... Kolik si tedy mám počítat?
Nějak si pořád nejsem jist,
jaké hodnoty jsou správné - mohl by jsi tedy poslat i korektní výsledky?
Děkuji.
Také gratuluji. 442 znaků je opravdu málo. Nechceš sem hodit zdroják?
Zkoušel jsem si pro sebe udělat detekci palindromů a zajímalo by mě, jestli
jsi to řešil obdobně.
Poslat mohu všechny verze, co si pamatuji. Bohužel ta která splňovala
podmínky soutěže nejvíce, měla jen 490 znaků, nebo tak nějak... Protože
jsem nepočítal s několika faktory - samohlásky se nedají obejít - jen
vypsat, počet řádků se musí brát ze Split - ne z Matches - tak jsem musel
přidat začátek - ^ atd. Tudíž nejmenší funkční verze:
using System.Text.RegularExpressions;
using System.Linq;
class M
{
staticvoid Main(string[]a)
{
var s=Regex.Replace(System.IO.File.ReadAllText(a[0]),"[!-/]|ch| @","");
foreach(string b in s.Split(' ','\n'))
s+=(b.Length>1&&b.SequenceEqual(b.Reverse()))?'-':'>';
foreach(string o in@"Lines/^|\n;Vowels/ou|[aeiouáíýyůěé];Words/-|>;Digits/\d;Emails/\S@;Palindromes/-".Split(';'))
{
var c=o.Split('/');
System.Console.Write(c[0]+':'+Regex.Matches(s,c[1]).Count+'\n');
}
}
}
439:
using System.Text.RegularExpressions;using System.Linq;using System;class M{staticvoid Main(string[]a){var s=System.IO.File.ReadAllText(a[0]);foreach(string b in s.Split(null))if (b.All(i=>i>43))s+=b.SequenceEqual(b.Reverse())?'-':'>';foreach(string o in@"Řádků/^|\n;Samohlásek/[aeiouáíů];Slov/-|>;Číslic/\d;Emailových adres/\S@;Palindromů/-".Split(';')){var c=o.Split('/');Console.Write("{0}:{1}\n",c[0],Regex.Matches(s,c[1]).Count);};}}
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.