Olen tekemässä pokeri peliä missä koneen tulisi huomata mahdollinen suora. Ongelma on että minun pitäisi tutkia onko seitsemästä numerosta 5 peräkkäin. Vastauksen voi lähettää sanallisesti tai koodilla (java tai c#).
Lisäys: Luvut on siis satunnaisia ja sekaisin.
Käy läpi kortit yksi kerrallaan ja merkitse boolean-taulukkoon True kunkin korteista löytyneen arvon kohdalle. Sen jälkeen käyt tuon taulukon läpi järjestyksessä ja tutkit onko siinä viisi True-arvoa peräkkäin.
Pythonilla tekisin näin:
>>> def suora(arvot): ... arvot = sorted(set(arvot)) ... return any(a + 4 == b for a, b in zip(arvot, arvot[4:])) ... >>> suora((7,12,2,3,5,4,6)) True >>> suora((7,12,2,3,5,4,8)) False
Varmaan nopeiten menee bittimaskeilla: http://stackoverflow.com/questions/4040004/
Toi mitmaskit ois muuten hyvä mutta oon jo kerinnyt kirjottaa paljon koodia niin että se vähän menis sekasin. Chiman ideaa en ihan ymmärtänyt. En tajunnut python koodista mitään joten olisiko täällä joku joka osaisi kääntää tuon javalle tai c#pille. Kiitos kuitenkin vastauksista.
Voit varmaan ensiksi poistaa seitsemän luvun joukosta kaikki samannumeroiset kortit. Sitten voit järjestää korttien arvot numerojärjestykseen. Nyt sinulla on jono kortteja: (x1,x2,...,xn). Nyt voit tarkastella näistä saatuja viiden peräkkäisen kortin järjestettyä jonoa (y1,y2,...y5) jos viiden kortin jono on olemassa. Suora on olemassa jos ja vain jos y5-y1=4 tai y1=1, y2=10, y5=K ja kortit eivät ole kaikki samaa maata olettaen että käytät koodissasi arvoa A=1. En tiedä onko pokerissa mukana jokereita.
Tässä kysymyksessä nopeus ei liene olennainen asia. Bittikikkailusta ei ole erityistä hyötyä. Kannattaa valita algoritmi, jonka ymmärtää itse.
Tässä on äärimmäisen yksinkertainen algoritmi: Käy läpi kaikki kortit. Jokaisen kortin kohdalla tutki, alkaako suora tästä kortista, eli käy läpi luvut 1–4 suoran muiden korttien etsimiseksi. Jokaisen luvun kohdalla käy taas läpi kaikki kortit ja katso, onko siinä tarvittava kortti eli alkukortti+luku. Jos jokin kortti puuttuu, tästä kohti ei löydy suoraa.
Algoritmi on helppo toteuttaa kolmena funktiona:
// Korteissa on suora, jos jostain kortista alkaa suora. boolean suoraLöytyy(Kortti[] kortit) { for (Kortti alkukortti: kortit) if (suoraAlkaaKortista(kortit, alkukortti)) return true; return false; } // Kortista alkaa suora, jos korteista löytyvät myös kaikki 4 seuraavaa korttia. boolean suoraAlkaaKortista(Kortti[] kortit, Kortti alkukortti) { for (int i = 1; i <= 4; ++i) if (!korttiLöytyy(kortit, alkukortti.arvo + i)) return false; return true; } // Kortti vain etsitään kädestä. boolean korttiLöytyy(Kortti[] kortit, int arvo) { for (Kortti k: kortit) if (k.arvo == arvo) return true; return false; }
Myös sisäkkäisillä silmukoilla toteutus on mahdollinen mutta vaatii enemmän huolellisuutta.
boolean suora = false; for (Kortti alkukortti: kortit) { boolean suoraNyt = true; for (int i = 1; i <= 4; ++i) { boolean puuttuu = true; for (Kortti k: kortit) { if (k.arvo == alkukortti.arvo + i) { puuttuu = false; break; } } if (puuttuu) { suoraNyt = false; break; } } if (suoraNyt) { suora = true; break; } }
Aihe on jo aika vanha, joten et voi enää vastata siihen.