Avatar
Michal Žůrek (misaz):

Ahoj,
vítám Vás u pravidelné minisoutěže Machr, tentokrát na algoritmy. Naprogramujte algoritmus pro převod čísel na římská čísla nebo naopak, pokud jste šikovní a máte čas, můžete obousměrně. Krom Whitespace a podobných výjevů můžete použít libovolný programovací jazyk.

1234 = MCCXXXIV

Cílem není zkopírovat nejhezčí řešení ze Stackoverflow, ale napsat svoje vlastní, proto zkuste kód obohatit komentáři, kterými nějak popíšete co, proč a jak jste k tomu došli.

Znova bych chtěl zdůraznit, že pro výhru nemusíte implementovat oba směry ani 30 dalších features. můžete vyhrát s nějakým pěkným a jednoduchým kódem, který bude umět třeba jen nutný základ v jednom směru.

Odkaz na řešení posílíte buď zde nebo do PM Michal Žůrek (misaz) ideálně v zazipované složce (soubor *.zip), ať to nemusím rozbalovat 3rd party aplikací. Deadline si dejme na sobotu 1.listopadu.

Kompletní pravidla: http://www.itnetwork.cz/…outezi-machr

Editováno 26.10.2014 22:04
Odpovědět  +8 26.10.2014 22:03
Nesnáším {}, proto se jim vyhýbám.
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:
#include "stdafx.h"
#include <iostream>
#include <unordered_map>
#include <string>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
        unordered_map<string, int> n = {
                        { "I", 1 },
                        { "IV", 4 },
                        { "V", 5 },
                        { "IX", 9 },
                        { "X", 10 },
                        { "L", 50 },
                        { "C", 100 },
                        { "D", 500 },
                        { "M", 1000 },
        };

        int number;
        while (cin >> number)
        {
                for (auto i = n.rbegin(); i != n.rend(); ++i)
                {
                        while (number - i->second >= 0)
                        {
                                number -= i->second;
                                cout << i->first;
                        }
                }
                cout << endl;
        }
        return 0;
}

Pro inspiraci :)

 
Nahoru Odpovědět 26.10.2014 22:55
Avatar
Lukáš Křehula
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Lukáš Křehula:

To je až moc jednoduché, práce tak na 10 minut, to už víc času zabere to komentování. Nechceš změnit zadání?

 
Nahoru Odpovědět 26.10.2014 23:01
Avatar
Odpovídá na Michal Žůrek (misaz)
Michael Škrášek:

Musí být číslo jakékoli, nebo může být omezené jen na max 9999 - pak už jsou to samé MMMMM ...

Nahoru Odpovědět 26.10.2014 23:01
Proč to dělat složitě, když to jde jednoduše.
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Matúš Petrofčík:

Unafený Konyk, mohol by si niečo skúsiť, nech sa toľko neflákaš :D

Nahoru Odpovědět 26.10.2014 23:18
obsah kocky = r^2 ... a preto vlak drnká
Avatar
MadaraCZech
Redaktor
Avatar
Odpovídá na Lukáš Křehula
MadaraCZech:

Třeba já to dělám trochu složitější a některé funkce nahrazuji vlastním kódem

 
Nahoru Odpovědět  ±0 26.10.2014 23:25
Avatar
1Pupik1989
Člen
Avatar
1Pupik1989:

A zadání udělá složitější a pak si hromada lidí bude stěžovat, že je to složité. Żádné takové, nech zadaní zadáním. Přidej k tomu třeba zpětnou konverzi.

 
Nahoru Odpovědět 27.10.2014 0:02
Avatar
Michal Žůrek (misaz):

pokud Vám to přijde jednoduché není nic jednoduší, než, že si to vy sami něčím vylepšíte.

Nahoru Odpovědět  +1 27.10.2014 9:10
Nesnáším {}, proto se jim vyhýbám.
Avatar
Hartrik
Redaktor
Avatar
Hartrik:

Kompaktní řešení.

public class MagicSquare{enum
N{M(0x3e8),CM(01604),D(0x1f4)
,CD(0620),C(0144),XC(0132),L(
062),XL(050),X(0b1010),IX(011
),V(5),IV(0b100),I(0b1);final
int v; N(int va){this.v=va;}}
public static String toRoman(
int i){String r=""; for(N n:N
.values()){while(n.v <=i){i-=
n.v;r+=n.name();}}return r;}}
assert MagicSquare.toRoman(-1).equals("");
assert MagicSquare.toRoman(0).equals("");
assert MagicSquare.toRoman(11).equals("XI");
assert MagicSquare.toRoman(93).equals("XCIII");
 
Nahoru Odpovědět  +3 27.10.2014 13:56
Avatar
Odpovídá na Hartrik
Michal Žůrek (misaz):

jo a ten komentář myšlenkového pochodu.

Nahoru Odpovědět 27.10.2014 13:59
Nesnáším {}, proto se jim vyhýbám.
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
gcx11:

Ahoj, tady je odkaz na moje řešení napsané v Pythonu.

http://leteckaposta.cz/884710319

 
Nahoru Odpovědět 28.10.2014 16:12
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
gcx11:

Ještě dotaz - proč je to vlákno umístěné v sekci pro Javu?

 
Nahoru Odpovědět 28.10.2014 16:14
Avatar
Jan Vargovský
Redaktor
Avatar
 
Nahoru Odpovědět  +1 28.10.2014 16:30
Avatar
Odpovídá na gcx11
Michal Žůrek (misaz):

Sekce na algoritmy tu není.

Nahoru Odpovědět 28.10.2014 16:46
Nesnáším {}, proto se jim vyhýbám.
Avatar
Nahoru Odpovědět 28.10.2014 17:49
Proč to dělat složitě, když to jde jednoduše.
Avatar
dave_23
Člen
Avatar
dave_23:

Tak sem to taky zkusil:

http://leteckaposta.cz/342166834
 
Nahoru Odpovědět 28.10.2014 20:42
Avatar
coells
Redaktor
Avatar
coells:

Řešení v Prologu (GNU Prolog), základem je predikát conversion/2 se vstupně/výstupními parametry.
Dál už je kód samopopisný :-)

% knowledge base for romans characters
romans('M', 1000). romans('CM', 900). romans('D', 500). romans('CD', 400).
romans('C', 100). romans('XC', 90). romans('L', 50). romans('XL', 40).
romans('X', 10). romans('IX', 9). romans('V', 5). romans('IV', 4). romans('I', 1).

% numeral/2, numeral(?Roman, +Arabic)
numeral('', 0).
numeral(Roman, Arabic) :- romans(Rh, Ah), Ah =< Arabic, !,
    Am is Arabic - Ah, numeral(Rt, Am), atom_concat(Rh, Rt, Roman).

% numeral/3, numeral(?Roman, -Arabic, +Acc)
numeral('', 0, 0).
numeral(Roman, Arabic, Arabic) :- numeral(Roman, Arabic), !.
numeral(Roman, Arabic, Acc) :- An is Acc - 1, numeral(Roman, Arabic, An).

% conversion/2, conversion(?Roman. ?Arabic)
conversion('', 0).
conversion(Roman, Arabic) :- integer(Arabic), !, numeral(R, Arabic), R = Roman.
conversion(Roman, Arabic) :- numeral(Roman, Arabic, 4999).

Test cases:

:- initialization(main).

main :- conversion(R, 19), write(R), nl, fail.
main :- conversion('XIX', A), write(A), nl, fail.
main :- conversion(R, 99), write(R), nl, fail.
main :- conversion('XCIX', A), write(A), nl, fail.
main :- conversion(R, 1957), write(R), nl, fail.
main :- conversion('MCMLVII', A), write(A), nl, fail.
main :- conversion('XIX', 19), write(ok), nl, fail.
main :- conversion('XCIX', 99), write(ok), nl, fail.
main :- conversion('MCMLVII', 1957), write(ok), nl, fail.
main.
 
Nahoru Odpovědět 28.10.2014 22:49
Avatar
coells
Redaktor
Avatar
coells:

Michale, posílám upravenou verzi, která je jednodušší a efektivnější. Přece jenom jsem dlouho v PL nedělal, takže chvilku trvá, než se přizpůsobí myšlenkové pochody.

% romans/2, romans((?Roman, ?Arabic)
romans("M", 1000). romans("CM", 900). romans("D", 500). romans("CD", 400).
romans("C", 100). romans("XC", 90). romans("L", 50). romans("XL", 40).
romans("X", 10). romans("IX", 9). romans("V", 5). romans("IV", 4). romans("I", 1).

% numeral/2, numeral(?Roman, +Arabic), numeral(+Roman, ?Arabic)
numeral([], 0).
numeral(Roman, Arabic) :- integer(Arabic), !, romans(Rh, Ah), Arabic >= Ah, !,
    At is Arabic - Ah, numeral(Rt, At), append(Rh, Rt, Roman).
numeral(Roman, Arabic) :- romans(Rh, Ah), append(Rh, Rt, Roman), !,
    numeral(Rt, At), Arabic is Ah + At, !, numeral(Roman, Arabic).

% conversion/2, conversion(?Roman, +Arabic), conversion(+Roman, ?Arabic)
conversion(Roman, Arabic) :- integer(Arabic), !, numeral(Rc, Arabic), atom_codes(Roman, Rc).
conversion(Roman, Arabic) :- atom(Roman), atom_codes(Roman, Rc), !, numeral(Rc, Arabic).

Test cases:

:- initialization(main).

main :- conversion(R, 14), write(R), nl, fail.
main :- conversion('XIV', A), write(A), nl, fail.
main :- conversion(R, 99), write(R), nl, fail.
main :- conversion('XCIX', A), write(A), nl, fail.
main :- conversion(R, 1957), write(R), nl, fail.
main :- conversion('MCMLVII', A), write(A), nl, fail.
main :- conversion(R, 8765), write(R), nl, fail.
main :- conversion('MMMMMMMMDCCLXV', A), write(A), nl, fail.
main :- conversion('XIV', 14), write(ok), nl, fail.
main :- conversion('XCIX', 99), write(ok), nl, fail.
main :- conversion('MCMLVII', 1957), write(ok), nl, fail.
main :- conversion('IL', _), write(fail), nl, fail.
main :- conversion('IXI', _), write(fail), nl, fail.
main.
 
Nahoru Odpovědět  +1 29.10.2014 13:14
Avatar
Phyber
Člen
Avatar
Phyber:

Zde zasílám řešení http://leteckaposta.cz/801187890 Pokud to nebude fachšit na windows, tak napiš a já se to pokusim napravit :). V zipu je i video z iPhone simulatoru.

Nahoru Odpovědět 29.10.2014 20:28
Nic není nemožné
Avatar
coells
Redaktor
Avatar
Odpovídá na Phyber
coells:

Pár tipů pro iOS:

  1. tvoje úvodní obrazovka porušuje HIG, určitě si přečti https://developer.apple.com/…l/mobilehig/
  2. modal segues ti tam dělají memory-leaky, protože views stackuješ modálně na sebe, použij UINavigationCon­troller a [self.navigati­onController popViewContro­llerAnimated:Y­ES]
  3. auto-layout je pro takhle malé programy ideální věc, bude ti to pak fungovat i v landscape módu
  4. [NSString stringWithFor­mat:@"%c", [string characterAtIn­dex:i]] stačí nahradit [string characterAtIndex:i] a porovnávat přímo integer
  5. můžeš použít [text uppercaseString], aby to fungovalo i pro malá písmena, protože nutit uživatele iPhone používat shift je masochismus
  6. @synthesize už na 64-bitovém kompilátoru nemusíš používat
  7. všechny instanční proměnné by měly jít do metody -[button:], když už je tam chceš mít, udělej si privátní kategorii a dej je tam (dokonce ji tam máš prázdnou)

No, v AppStoru bys zaručeně dostal rejection, čeká tě ještě hodně práce.

 
Nahoru Odpovědět 29.10.2014 21:09
Avatar
Phyber
Člen
Avatar
Odpovídá na coells
Phyber:

Díky moc za rady ! :)

Nahoru Odpovědět  -1 29.10.2014 21:16
Nic není nemožné
Avatar
Phyber
Člen
Avatar
Phyber:

To s těmi malými písmeny mne také napadlo, ale už se mi to nechtělo dělat.

Editováno 29.10.2014 21:18
Nahoru Odpovědět 29.10.2014 21:17
Nic není nemožné
Avatar
IT Man
Redaktor
Avatar
IT Man:

Tak přidávám též svoje řešení. Napsal jsem ho v PHP a umí pouze převádět z arabských čísel na římská čísla. Snad se bude líbit. :)

On-line: http://application.wz.cz/machr/
Ke stažení: http://leteckaposta.cz/356433278

Nahoru Odpovědět 31.10.2014 10:34
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
IT Man
Redaktor
Avatar
Odpovídá na IT Man
IT Man:

Omlouvám se, ale až teď odpoledne jsem si uvědomil, že existuje i více římských čísel, než jsem měl v původním programu. Proto dávám na nový program nový odkaz. Snad to nebude vadit. :(

Ke stažení: http://leteckaposta.cz/853804761

Nahoru Odpovědět 31.10.2014 15:53
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
1001001
Člen
Avatar
 
Nahoru Odpovědět 31.10.2014 15:58
Avatar
tomisoka
Redaktor
Avatar
 
Nahoru Odpovědět 31.10.2014 16:49
Avatar
Tukmak
Člen
Avatar
Avatar
Ladislav Ondris:

Jelikož mi nejde stránka letecká pošta a nevím proč, tak tady vložím přímo kód. Snad vám to nebude moc vadit :-)

|
public class PrevodNaArabske {

    public static void main(String[] args) {
        String rimske = "MCCXXXIV";
        int aktualni = 0, minulaCislice = 0, arabske = 0;
        //číslice(znaky) čte od konce (zprava) a zjišťuje zda byla předchozí číslice menší nebo větší a podle toho počítá
        for(int i = rimske.length()-1; i >= 0; i--){
            //inicializace aktuálního čísla
            switch(rimske.charAt(i)) {
                case 'I': aktualni = 1; break;
                case 'V': aktualni = 5; break;
                case 'X': aktualni = 10; break;
                case 'L': aktualni = 50; break;
                case 'C': aktualni = 100; break;
                case 'D': aktualni = 500; break;
                case 'M': aktualni = 1000; break;
            }
            //pokud je minulaCislice větší než aktuální, tak se od arabskeho odečte aktuální, a pokud je menší nebo rovna, tak se přičte
            if(minulaCislice > aktualni) {
                arabske -= aktualni;
            } else {
                arabske += aktualni;
            }
            //inicializace minuleCislice
            minulaCislice = aktualni;
        }
        //výpis arabského čísla
        System.out.println(arabske);
    }
}
Nahoru Odpovědět 1.11.2014 1:34
Pokud neděláš chyby, nepracuješ na dostatečně těžkých problémech.
Avatar
Frofo1
Redaktor
Avatar
Frofo1:

Taky jsem se rozhodl pro svoje řešení. [Python]

http://leteckaposta.cz/479591720

Nahoru Odpovědět 1.11.2014 2:46
Dobří ajťáci umí technologie dobře používat. Ti nejlepší je vytvářejí. :)
Avatar
Michal Žůrek (misaz):

protože jsem zapoměl zmínit čas deadline, tak do dnešní půlnoci máte ještě spoustu času. Jak říkal Lukáš Křehula, je to "práce tak na 10 minut".

Nahoru Odpovědět  +1 1.11.2014 9:43
Nesnáším {}, proto se jim vyhýbám.
Avatar
Phyber
Člen
Avatar
Odpovídá na Ladislav Ondris
Phyber:

Tento algoritmus se mi líbí, ale neřeší ostatní převody z římských čísel. Kdyby String rimske bylo např. "IIV" tak by výsledek byl 5, jelikož čteme od konce to znamená 5-1+1 (číslo před není větší(není žádne=0)+5(V),číslo před je větší(I=1<V=5)-1,číslo před není větší (I=1je rovno I=1) takže +1 a to se rovná 5...

Nahoru Odpovědět 1.11.2014 20:21
Nic není nemožné
Avatar
Hartrik
Redaktor
Avatar
Odpovídá na Hartrik
Hartrik:

Tak tedy ještě vysvětlení mého kódu...

V Javě bohužel nemůžeme moc elegantně inicializovat mapy nebo 2D pole s více typy a itaraci dvou polí jsem se chtěl vyhnout (ošklivý for i cyklus), proto jsem jako formát dat jsem zvolil enum. Kromě základních římských číslic jsem deklaroval i čísla složená, typu: IV, IX,... řešení těchto speciálních případů by jen zesložitilo kód.
Konstanty jsou úmyslně seřazeny sestupně podle své hodnoty.

private enum Numbers {
    M(1000), CM(900), D(500), CD(400),
    C(100),  XC(90),  L(50),  XL(40),
    X(10),   IX(9),   V(5),   IV(4),
    I(1);

    private final int value;

    private Numbers(int value) {
        this.value = value;
    }

    public int value() {
        return value;
    }
}

A dále už je to jasné...

public static String toRoman(int integer) {
    String result = "";
    for (Numbers number : Numbers.values()) {
        while (number.value() <= integer) {
            integer -= number.value();
            result  += number.name();
        }
    }
    return result;
}

Toto je jen pro porozumění hodnoťte kód postnutý výše :)

 
Nahoru Odpovědět 1.11.2014 20:35
Avatar
Phyber
Člen
Avatar
Odpovídá na Ladislav Ondris
Phyber:

Jo sorry za ten koment předtím. Já si neuvědomil že nejde IIV :D :D. Byl jsem do toho tak zažrán že jsem si to neuvědomil.

Nahoru Odpovědět 1.11.2014 20:42
Nic není nemožné
Avatar
Odpovídá na Phyber
Ladislav Ondris:

Ano:) a právě proto tohle nemusím řešit v mém algoritmu, protože 3 je římsky III, nikoli IIV :D

Nahoru Odpovědět 1.11.2014 21:05
Pokud neděláš chyby, nepracuješ na dostatečně těžkých problémech.
Avatar
Phyber
Člen
Avatar
Odpovídá na Ladislav Ondris
Phyber:

Jo právě a to jsem si neuvědomil takže jsem to složitě řešil v mém algoritmu :D

Nahoru Odpovědět 1.11.2014 21:11
Nic není nemožné
Avatar
Phyber
Člen
Avatar
Odpovídá na Ladislav Ondris
Phyber:

Toto řešení mě také napadlo s tím switchem ale já jsem si to neuvědomil a řešil jsem to tak jak jsem psal předtím... :D

Nahoru Odpovědět 1.11.2014 21:15
Nic není nemožné
Avatar
Odpovídá na Phyber
Ladislav Ondris:

Ještě jsem na tvé řešení nedíval :) na žádné řešení ještě :-) pak kouknu na ta řešení, která vyhrála :)

Nahoru Odpovědět 1.11.2014 21:30
Pokud neděláš chyby, nepracuješ na dostatečně těžkých problémech.
Avatar
Tomáš "CrashTest" Bitter:

To jste tu skoro všichni museli definovat 4 a 9 ?

Nahoru Odpovědět  ±0 1.11.2014 22:46
Need for Steve
Avatar
Odpovídá na Tomáš "CrashTest" Bitter
Ladislav Ondris:

Ne, já ne. Já definoval jen ty základní, viz nahoře :)

Nahoru Odpovědět 1.11.2014 23:03
Pokud neděláš chyby, nepracuješ na dostatečně těžkých problémech.
Avatar
Odpovídá na Tomáš "CrashTest" Bitter
Michal Žůrek (misaz):

Tentokrát dorazilo nevídaně mnoho řešení. Většina z Vás si vybrala Javu nebo C#. Někteří z Vás to využili jako ukázku něčeho zajímavého. Ačkoliv algoritmus může být jednoduchý, moc se mi nezamlouvalo, když do programu pošlete předvyplněné pole a on to jenom nějak slepí. Tak jako jste k těm hodnotám pole došli vy, mohl k tomu dojít program. Protože řešení je strašně moc, tak mi docela dělalo problém zpětně zjišťovat, kdo se jmenuje Number, převody římských čísel a podobně.

Tukmak
Tvoje řešení je oboustranné, objektové, umí validovat, bohužel na úkor přehlednosti a jednoduchosti, šlo to pole, kde máš všechny jednotky, desítky a stovky. Nesedí mi tam ta metoda, pro vypisování „O programu“, třída by měla dělat jednu věc, ne 2 (počítat a vypisovat) čímž ses vlastně i částečně zbavil rozšiřitelnosti kódu, protože z tohoto vypisování lze vycítit, že třída byla navržena jen pro tebe jen do tohoto machra a nikam dál s ní nepočítáš.

Kokosmán
Tvůj kód je jednoduchý a účelný, všechno je v main. Switch by se moc neměl používat, šlo to vyřešit polem. Do budoucna je lepší to dělat objektově nebo minimálně do funkcí/metod.

Fuull - (10 bodová penalizace)
Nijak v tom názvu Number nevidím tvůj nick (-10 bodů). Název Parser není moc výstižný pro římská čísla. Algoritmus je jednoduchý, nemá zbytečné pole, které nepotřebuje a je skoro zázračně krátký.

Omega
Název Prevadec, je hodně obecný Mělo by tam být zmíněno to hlavní – Římská čísla. Kód je napatlaný v jedné třídě a děláš toho zbytečně moc v Mainu. Existuje taková poučka, že řádek kódu by neměl mít více jak 80 znaků. Nemusíš se toho striktně držet, ale je fajn, když se mi to vleze i do okna a editor to nemusí znásilňovat nějakým rozždákováním nebo dalším scrollbarem. V Charu máš „dvoj chary“, takže to není až zas tak výstižné a hlavně to je zbytečné. Jak jsi došel k tomu, že CM = 900? Nemohl k tomu dojít program sám?

Hartrik
Tvůj kód je sice skladný a celkem krátký, ale v reálu to asi nepoužijeme.

Škrášek Michal – (10 bodová penalizace)
V názvu převod římských čísel.zip nikde nevidím tvůj nick (-10 bodů) Tvůj kód je napsaný v Mainu výchozí třídy. Na první pohled není vůbec jasné, co dělá, chtělo by to nějak pojmenovat.

1001001
PřevodČísel není vhodný název. Za prvné nevíme jakých čísel a za druhé v názvech by neměla být diakritika. Kolekce obsahuje věci, ke kterým mohl program dojít sám. Kód je naplácaný v Mainu.

Werty
Název Vypocet s metodou Preved? Trochu divné, když se třída jmenuje podle toho, co nedělá. Kód je však celkem pěkný a překvapivě krátký.

Kaczmi
Kontrola1, Kontrola2, … by šlo vyřešit lépe, minimálně podle názvu, ale tak zrovna u kontrol to není taková tragédie. příště se podívej na rozhraní (IKontrola, metoda Kontroluj) a třídy KontrolaNeco : IKontrola.

Gcx11 – (10 bodová penalizace)
Neumíš pojmenovat soubor podle svého jména (-10 bodů). Tvůj kód vypadá dobře, jen k tomu šílenému poli mohl program dojít sám.

dave23
Tvůj kód není vůbec špatný, akorát si taky pohlídej délku řádku. Taková doporučená délka je 80 znaků. Visual Studio ti to píše na stavové liště.

coells
Hezká ukázka již ne příliš známého jazyka.

Phyber
Na Windows je hustě rozbombardované kódování složek a názvu souborů. A spousta editorů neumí odřádkování i přesto jsem se tím nějak letmo prokousal, škoda že jsi to takhle nedal na poprvé a spoustu chyb si opravil až po upozornění coelsem.

IT Man
Není to vůbec objektové. Spousta věcí se tam několikrát neskutečně opakuje, to co lze jednoduše vyřešit polem, děláš asi 10 funkcemi. Zkus si pohlídat délku řádku, abys na menším monitoru v editoru horizontální scroolbar.

Tomisoka
Kód je spíše nepřehledný, ale poměrně krátký. Komentáři ses moc nezabýval a jde to poznat.

Frofo1 – (10 bodová penalizace)
Neumíš pojmenovat soubor podle svého jména (-10 bodů). Tak tento kód je fakt úžasný, krátky, přehledný, bez zbytečností a bez potřeby složitého komentáře u každého řádku.

Tomáš "CrashTest" Bitter
Kód je pěkný a komentář „NEPOUŽÍVAT, NEFUNGUJE PŘEVOD DEVÍTEK (A NAVÍC JE V TOM BORDEL)“ mě docela pobavil. Jestli jsi ten druhý směr nestihl, tak si to měl smazat. Ze C#pistů jsi to měl asi nejlepší, tady by se taky dala udělit placka.

Jsem rád, že jste to zkusili, příště nezapomeňte, že i malé aplikace a algoritmy programujeme objektově, protože když Vás to chytí, tak se to bude rozšiřovat a pak se v tom začnete ztrácet. Kód by měl být dobře čitelný pro každého. Krátký kód = (ale výjimky se najdou) lepší kód, jelikož je toho ke zkoumání méně. Osobně jsem uděloval i body, ale ty nemají vypovídající hodnotu (snad krom penalizací), protože většina z Vás na tom byla víceméně stejně. Za porušení pravidel jsem tentokrát body jenom odečítal, příště budu diskvalifikovat. V 17 řešeních se fakt špatně dohledává, kdo odevzdává soubor Number.zip a podobné. Zdrojové kódy jsem zkoumal v Poznámkovém bloku :O a některé specifičtější v PSpadu. Je třeba si však uvědomit, že pokud ty řádky (hlavně s komentáři) budou hodně dlouhé, tak buď tam editor přidá scroolbar nebo to rozděli na více řádků a tím se to akorát znepřehledňuje. 80 znaků sice nemusíte striktně držet, ale jestli to překročíte 3×, tak se někde stala chyba. Nezapomeňte, že většina jazyků má víceřádkové komentáře a ze srandy králíkům tam nejsou. Zkuste program nechat řešit vše, když mu něco předvypočítáne je to sice super a možná rychlejší, ale zbytečně se to akorát komplikuje. Úplně stačilo jedno pole s těmi základními číslicemi. Placky teda rozdám 2. Úplný vítěz je Frofo1, který neumí pojmenovat soubor (příště by byl diskvalifikován) a ještě se mi celkem líbilo řešení od Tomáš "CrashTest" Bitter. Prosím publikovat a o placku pak požádejte Zdeněk Pavlátka.

Editováno 2.11.2014 9:46
Akceptované řešení
+20 Zkušeností
Řešení problému
Nahoru Odpovědět  +4 2.11.2014 9:45
Nesnáším {}, proto se jim vyhýbám.
Avatar
Odpovídá na Tomáš "CrashTest" Bitter
Michal Žůrek (misaz):

kéž by jenom 4 a 9. Někteří definovali skoro všechno.

Nahoru Odpovědět  ±0 2.11.2014 11:51
Nesnáším {}, proto se jim vyhýbám.
Avatar
Lukáš Křehula
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Lukáš Křehula:

Ono je to ale celkem logické, protože podle CrashTestova řešení se jakékoliv menší číslo, které je před větším odečítá od toho většího. Tím pádem pokud zadáš "IM" tak je výsledek 999. To je ale špatně, mělo by to hodit výjimku.

IV = 4
IX = 9
XL = 40
XC = 90
CD = 400
CM = 900

To znamená, že číslo 999 v římských číslicích je CMXCIX
CM = 900
XC = 90
IX = 9
900+90+9 = 999

Na to já jsem myslel, proto tam mám tolik kontrol a jelikož pracovat s rozhraními ještě neumím, tak jsem to udělal tak jak jsem to udělal.

Každopádně gratuluji vítězům.

Kaczmi.

 
Nahoru Odpovědět  +4 2.11.2014 12:26
Avatar
Odpovídá na Lukáš Křehula
Michal Žůrek (misaz):

není to špatně, protože to pravidlo není povinné, alespoň podle wikipedie.

Nahoru Odpovědět 2.11.2014 13:35
Nesnáším {}, proto se jim vyhýbám.
Avatar
Matěj Kripner
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Matěj Kripner:

Povinné není ani programovat objektově nebo psát komentáře, je to jen lepší a rozšířenější.

Nahoru Odpovědět  +3 2.11.2014 13:47
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
tomisoka
Redaktor
Avatar
Odpovídá na Matěj Kripner
tomisoka:

Není to povinné tak proč to brát jako chybu? Pokud uživatel bude používat toto pravidlo tak mu to nic nezmění, pokud nebude používat toto pravidlo tak se jedině tak naštve, že to nefunguje...

 
Nahoru Odpovědět  +1 2.11.2014 14:03
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Lukáš Křehula
Marek Z.:

Toto pravidlo není povinné a pokud to není uvedeno v zadání jako podmínka tak bych to tak nehrotil.. :)

Nahoru Odpovědět 2.11.2014 14:38
Chybami se člověk učí, běžte se učit jinam!
Avatar
Tomáš "CrashTest" Bitter:

Skončeme to takhle:

Za všechno mohou Římané. Měli si vytvořit neprůstřelnější číselnou soustavu (jako máme teď my).

Jdeme na pivo ...

Nahoru Odpovědět  +12 2.11.2014 16:44
Need for Steve
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.

Zobrazeno 49 zpráv z 49.