Het Grote Tweakers Programmeervuur

Pagina: 1 ... 3 ... 7 Laatste
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Vindt dit eigenlijk niet iets voor alle niveau's. Meer beginner, de uitdaging ligt hem hier in de wiskunde, en deze is van het niveau wat mijn zusje van 17 nog kan oplossen.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19:58

.oisyn

Moderator Devschuur®

Demotivational Speaker

HawVer schreef op woensdag 28 oktober 2009 @ 12:35:
[...]

Volgens mij is P het aantal plekken in het vierkant, dus breedte x hoogte.
dat noemt men ook wel oppervlakte ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 03-09 19:59
.oisyn schreef op woensdag 28 oktober 2009 @ 13:21:
[...]
dat noemt men ook wel oppervlakte ;)
Stel dan geen vraag, als je het antwoord gebruikt om af te zeiken. ;)

http://hawvie.deviantart.com/


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
De verwarring zit 'm er in dat perfect square vertaald is als perfect vierkant terwijl geheeltallig kwadraat bedoeld wordt. .oisyn had 't best kunnen begrijpen als 'ie wat beter z'n best had gedaan, maar de verborgen boodschap was waarschijnlijk dat de probleemstelling iets helderder zou kunnen. ;)

Ik zou simpelweg stellen dat het bericht in een zo klein mogelijk vierkant geplaatst moet worden; een vierkant is immers al een gelijkzijdige rechthoek. Dan kun je zelf wel bedenken dat de zijden van dat vierkant ceil(sqrt(lengte van de invoer)) worden. Een voorbeeldje erbij en 't is duidelijker dan met een wiskundige definitie.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19:58

.oisyn

Moderator Devschuur®

Demotivational Speaker

HawVer schreef op woensdag 28 oktober 2009 @ 13:23:
[...]

Stel dan geen vraag, als je het antwoord gebruikt om af te zeiken. ;)
Het was ten eerste geen afzeiking (is dat een woord? nu wel :P), en ten tweede was oppervlakte een van de mogelijke antwoorden op mijn vraag, waar jij voor koos om te negeren, waardoor je de indruk wekte dat je zelf niet helemaal doorhad dat het over oppervlakte ging en ik je dus aan die associatie wilde helpen :)
Soultaker schreef op woensdag 28 oktober 2009 @ 13:56:
De verwarring zit 'm er in dat perfect square vertaald is als perfect vierkant
Ah ja, makes sense idd.
maar de verborgen boodschap was waarschijnlijk dat de probleemstelling iets helderder zou kunnen. ;)
Klopt als een bus :). Áls je al de wiskundige definitie van het probleem wilt geven moet je er natuurlijk ook voor zorgen dat die helemaal klopt, want itt geschreven tekst waar je fouten uit kunt filteren mbv begrijpend lezen kan het voor wiskundige definities desastreuze gevolgen hebben. Maar nog beter...:
Ik zou simpelweg stellen dat het bericht in een zo klein mogelijk vierkant geplaatst moet worden; een vierkant is immers als een gelijkzijdige rechthoek. Dan kun je zelf wel bedenken dat de zijden van dat vierkant ceil(sqrt(lengte van de invoer)) worden. Een voorbeeldje erbij en 't is duidelijker dan met een wiskundige definitie.
Helemaal mee eens.

[ Voor 10% gewijzigd door .oisyn op 28-10-2009 14:09 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
Een oplossing in Haskell:
Haskell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import System
import List

rotate      = map reverse.transpose
addSide r   = [0..length r - 1]:(map.map) (+length r) (rotate r)
squares     = iterate (addSide.addSide) []
permFor     = concat.(squares!!).ceiling.sqrt.fromIntegral.length
invert p    = map snd $ sort $ zip p [0..]
permute     = map.(!!)
padWith c   = (++ repeat c)
rtrim c     = reverse.dropWhile (==c).reverse
encode s    = permute (padWith '$' s) $ permFor s
decode s    = rtrim '$' $ permute (padWith ' ' s) $ invert $ permFor s

main = getArgs >>= (putStrLn.run)
    where   run ["-e", s]   = encode s
            run ["-d", s]   = decode s
            run _           = "usage:\tzitscode -d <text> (to decode)\n"
                                 ++ "\tzitscode -e <text> (to encode)"


$ ./zitscode -e 'Hello world!'
Hell!$$od$$ lrow
$ ./zitscode -d 'Hell!$$od$$ lrow'
Hello world!


Wellicht zijn imperatieve talen toch wat geschikter voor dit probleem. (Code zoals van RobIII is wel wat efficiënter, hoewel dat voor strings tot lengte duizend natuurlijk niet heel belangrijk is.)

Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 22:12

RayNbow

Kirika <3

Soultaker schreef op woensdag 28 oktober 2009 @ 18:57:
Een oplossing in Haskell:
Haskell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import System
import List

rotate      = map reverse.transpose
addSide r   = [0..length r - 1]:(map.map) (+length r) (rotate r)
squares     = iterate (addSide.addSide) []
squareFor   = (squares!!).ceiling.sqrt.fromIntegral.length
permFor     = foldr (++) [].squareFor
invert p    = map snd $ sort $ zip p [0..]
permute s   = map (s!!)
padWith c   = (++ repeat c)
rtrim c     = reverse.dropWhile (==c).reverse
encode s    = permute (padWith '$' s) $ permFor s
decode s    = rtrim '$' $ permute (padWith ' ' s) $ invert $ permFor s

main = getArgs >>= (putStrLn.run)
    where   run ["-e", s]   = encode s
            run ["-d", s]   = decode s
            run _           = "usage:\tzitscode -d <text> (to decode)\n"
                                 ++ "\tzitscode -e <text> (to encode)"


$ ./zitscode -e 'Hello world!'
Hell!$$od$$ lrow
$ ./zitscode -d 'Hell!$$od$$ lrow'
Hello world!


Wellicht zijn imperatieve talen toch wat geschikter voor dit probleem. (Code zoals van RobIII is wel wat efficiënter, hoewel dat voor strings tot lengte duizend natuurlijk niet heel belangrijk is.)
Twee suggesties van hlint:
C:\tmp>hlint soultaker.hs
test.hs:8:1: Error: Use concat
Found:
  foldr (++) [] . squareFor
Why not:
  concat . squareFor

test.hs:10:1: Warning: Eta reduce
Found:
  permute s = map (s !!)
Why not:
  permute = map . (!!)

Found 2 suggestions (1 error)

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 19:57
Mijn eerste poging:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <iostream>
#include <cmath>
#include <algorithm>
#include <exception>

enum ZitCoding {zitEncode, zitDecode};

std::string zit (const std::string& source, ZitCoding coding)
{
    size_t p = static_cast<size_t> (std::ceil (std::sqrt (source.size ())));

    if (coding == zitDecode && p*p != source.size ())
        throw std::exception ();

    std::string target (p*p, '$');

    size_t x = 0, y = 0;
    int incx = 1, incy=0;
    size_t maxsteps = p, currentsteps=1;

    for (size_t i=0; i < source.size (); ++i)
    {
        if (coding == zitDecode)
            target[i] = source [y*p + x];
        else
            target[y*p + x] = source [i];

        x += incx;
        y += incy;
        ++currentsteps;

        if (currentsteps == maxsteps)
        {
            currentsteps = 0;

            if (! incy)
                --maxsteps;
            else
                incy = -incy;

            std::swap (incx, incy);
        }
    }

    return target;

}

std::string encode (const std::string& source)
{
    return zit (source, zitEncode);
}

std::string decode (const std::string& source)
{
    std::string target = zit (source, zitDecode);

    int size = target.size ();

    while (size > 0 && target [size-1] == '$')
        --size;

    target.resize (size);

    return target;
}

int main()
{
    std::cout << "Enter line: " << std::endl;
    std::string inputString;
    std::getline (std::cin, inputString);
    //std::cin >> inputString; <-- code plaatsen zonder testen is nooit slim :)

    std::string encoded = encode (inputString);
    std::string decoded = decode (encoded);

    std::cout << encoded << std::endl;
    std::cout << decoded << std::endl;

    return 0;
}

Enter line:
abcd fgh jklmn pqrstu wxyz1 34567
abcd ftu wxgs67$yhr5$$z q43 1jp nmlk
abcd fgh jklmn pqrstu wxyz1 34567


Nadien de bestaande oplossingen bekeken, werkwijze is zoals bij RobIII

[ Voor 3% gewijzigd door schoene op 28-10-2009 23:31 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
.oisyn schreef op woensdag 28 oktober 2009 @ 12:14:
[...]

Que? Wat is dan >= M? Een zijde van P? De oppervlakte van P? De omtrek? P is het vierkant, dat is op zichzelf geen getal.
Ik heb "letterlijk" vertaald wat er als uitleg stond. Daarom staat er niet voor niets een link naar de opdracht zelf om dit soort situaties te voorkomen.
D-Raven schreef op woensdag 28 oktober 2009 @ 13:15:
Vindt dit eigenlijk niet iets voor alle niveau's. Meer beginner, de uitdaging ligt hem hier in de wiskunde, en deze is van het niveau wat mijn zusje van 17 nog kan oplossen.
Klagen, klagen maar zelf niet met iets komen is makkelijk.
Soultaker schreef op woensdag 28 oktober 2009 @ 13:56:
De verwarring zit 'm er in dat perfect square vertaald is als perfect vierkant terwijl geheeltallig kwadraat bedoeld wordt. .oisyn had 't best kunnen begrijpen als 'ie wat beter z'n best had gedaan, maar de verborgen boodschap was waarschijnlijk dat de probleemstelling iets helderder zou kunnen. ;)
Hmm, my bad. :/

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
Handig tooltje. :) De functie concat kende ik niet eens en de tweede vereenvoudiging had ik over het hoofd gezien. Ik heb 't even aangepast in m'n post. (Overigens vind ik error wel erg sterk voor wat feitelijk neerkomt op het herimplementeren van een standaardfunctie onder een andere naam.)

Het is trouwens de vraag of al die point-free definities het veel leesbaarder maken, maar goed, het is wel heel functioneel natuurlijk.


schoene schreef op woensdag 28 oktober 2009 @ 20:23:
Mijn eerste poging: [..]
Enter line:
abcd fgh jklmn pqrstu wxyz1 34567
abcd ftu wxgs67$yhr5$$z q43 1jp nmlk
abcd fgh jklmn pqrstu wxyz1 34567
Leuk geprobeerd, maar ik geloof niet dat die uitvoer door het door jou gepostte programma gegenereerd is. ;)

[ Voor 57% gewijzigd door Soultaker op 28-10-2009 22:43 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:13

crisp

Devver

Pixelated

Ook een bijdrage:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function zitscode(o,s)
{
    var e=[],w=x=y=Math.ceil(Math.sqrt(s.length)),i=1,j=k=0,l=w*w;
    o=o=='d';
    while(l--)
    {
        e[k]=s.charAt(j)||'$';

        if(!--y)
        {
            i=i*i==1&&x--?i*w:-i/w;
            y=x;
        }

        j+=o?i:1;
        k+=o?1:i;
    }
    e=e.join('');
    return o?e.replace(/\$+$/,''):e;
}

alert(zitscode('e','The quick brown fox jumps over the lazy dog'));

alert(zitscode('d','The quips ovecm dogrkuy$$$  jz$$$tb al ehrxof nwo'));

:)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 19:57
Soultaker schreef op woensdag 28 oktober 2009 @ 20:59:
Leuk geprobeerd, maar ik geloof niet dat die uitvoer door het door jou gepostte programma gegenereerd is. ;)
Haha, je bedoelt waarschijnlijk dat de 'Enter line' niet in de code staat? ik was al mn post aan het maken, met mn code reeds gepaste, en om de output te genereren had ik ondertussen nog die 'Enter line' er aan toegevoegd. Echter die nog vergeten toevoegen in mn code hier :)

edit: ik merk nu pas dat ik mn code toen iets te vroeg gepost had: tijdens testen gebruikte ik std::cin niet, en ik paste nadien de code zonder eventjes te testen aan, en eventjes vergeten dat ik getline moest gebruiken. lol, bij deze is het aangepast ;)

[ Voor 27% gewijzigd door schoene op 28-10-2009 23:33 ]


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 22:12

RayNbow

Kirika <3

Soultaker schreef op woensdag 28 oktober 2009 @ 20:59:
[...]

Handig tooltje. :) De functie concat kende ik niet eens en de tweede vereenvoudiging had ik over het hoofd gezien. Ik heb 't even aangepast in m'n post. (Overigens vind ik error wel erg sterk voor wat feitelijk neerkomt op het herimplementeren van een standaardfunctie onder een andere naam.)
Mjah, ik vind zelf de melding "error" ook niet zo geweldig. Let wel dat het gebruik van foldr (++) [] als mogelijk nadeel heeft dat bepaalde optimalisaties niet worden doorgevoerd.

* RayNbow ziet namelijk in de source van GHC een rewrite rule voor het gebruik van concat...
Het is trouwens de vraag of al die point-free definities het veel leesbaarder maken, maar goed, het is wel heel functioneel natuurlijk.
Ik ben een voorstander van point-free mits duidelijk. :p

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

crisp schreef op woensdag 28 oktober 2009 @ 23:14:
Ook een bijdrage:

JavaScript:
1

:)
WTF, nice :D

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
:Y _O_
Nu nog effe jsmin+ eroverheen :D

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Zoals al gemerkt hebben is er voor deze week geen nieuwe opdracht.
Dit ivm met verhuizing van TS. En dat zal twee weken nog wel zo zijn.

Van mij mag er iemand een vrije opdracht oppperen.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
Om het topic niet dood te laten bloeden wil ik wel een voorstel doen voor het spelen van een Rummikubtoernooi. Dat kan wat langer dan één week lopen (aangezien Typnix druk bezig is met verhuizen, en er toch nog geen concurrerende GoTPC is). Ik zal de opdracht voor de overzichtelijkheid in een aparte post plaatsen.

Het is maar een voorstel, dus suggesties en correcties zijn welkom, maar ik zou wel graag weten wie er zoal van plan is om een speler te schrijven. Als er enig enthousiasme is wil ik wel wat testscriptjes enzo schrijven, maar als ik de enige ben die mee wil doen heeft dat natuurlijk weinig zin. Met minstens vier spelers kunnen we een toernooitje van N ronden doen en de punten optellen. (Puur voor de lol, er valt niets te winnen behalve eeuwige roem natuurlijk.)

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24

Rummikub

Velen van jullie zullen het gezelschapsspel Rummikub wel kennen. Wie het spel niet kent, doet er misschien goed aan de officiële regels te lezen, hoewel die niet normatief zijn.

Het doel is om een programma te schrijven dat een vereenvoudigde variant van Rummikub kan spelen via een webinterface. Die kan dan gebruikt worden om een toernooitje te spelen met alle deelnemers.

Moeilijkheidsgraad
Gemiddeld tot moeilijk. Het is lastig om een perfecte speler te maken, maar een niet al te snuggere speler moet kunnen. Meedoen is belangrijker dan winnen. :)

Spelregels
Rummikub wordt gespeeld met stenen die elk een kleur (rood, groen, blauw of zwart) en een waarde (tussen 1 en 13, inclusief) hebben. Elke combinatie komt twee keer voor, dus er zijn in totaal 4x13x2=104 stenen. We doen niet aan jokers.

Het spel wordt gespeeld met vier spelers, die elk een eigen rekje met stenen hebben (bij de tegenstanders is het aantal bekend). In het begin krijgt elke speler veertien willekeurige stenen; de overige stenen kunnen later gepakt worden. Spelers zijn om de beurt aan zet, en moeten proberen zo snel mogelijk hun stenen zien kwijt te raken.

Als je aan de beurt bent, mag je ofwel één steen trekken (als er nog over zijn) of één of meer stenen op tafel leggen (spelen). Je mag daarbij alle stenen op tafel hergroeperen zoals je wil, zolang er uiteindelijk maar een geldige configuratie op tafel ligt. (Alleen als je niet kunt spelen én er zijn geen stenen meer om te trekken kun je passen, d.w.z. de beurt doorgeven zonder te spelen of te trekken.)

Een configuratie is geldig als alle stenen zijn ondergebracht in groepjes. Een groepje bestaat uit:
  1. drie of meer stenen met dezelfde waarde maar verschillende kleuren:
    Afbeeldingslocatie: http://www.rummikub.com/Themes/rummikub/Info/rules_images/rules_tiles_1.png
  2. drie of meer stenen met dezelfde kleur en strict opvolgende waarden:
    Afbeeldingslocatie: http://www.rummikub.com/Themes/rummikub/Info/rules_images/rules_tiles_2.png
Logischerwijs kunnen in zo'n groepje maximaal vier respectievelijk dertien stenen zitten.

Het spel eindigt zodra een speler zijn rekje leeggespeeld heeft, of er vier keer op een rij gepast wordt. De score van een speler is de som van de waarden van de stenen die hij nog over heeft; hoe lager hoe beter.


Technische regels
Implementeer een Rummikubspeler met een webinterface, zodat een spelsituatie ofwel in de query string van een GET request gegeven kan worden, ofwel in de request body van een POST request, en de speler zijn zet als plain-text response body teruggeeft.


Request parameters
Elke request krijgt de volgende parameters. Je mag er vanuit gaan dat de parameters consistent zijn, d.w.z. overeenkomen met een geldig lopend spel en voldoen aan de hier beschreven formattering.

Stenen worden gecodeerd met een letter voor de kleur (R, G, B of K) gevolgd door een getal. Bijvoorbeeld R11 is de rode elf.
ParameterBetekenisVoorbeeld
yourTilesJouw stenen, gescheiden door punten.R7.G10.B2
tableHuidige configuratie op tafel. Stenen in een groepje gescheiden door punten, groepjes gescheiden door streepjes. Stenen in een groepje zijn gesorteerd op kleur en daarna op getal; de groepjes zelf staan in willkeurige volgorde.G3.G4.G5-R7.G7.B7.K7
poolTilesAantal te pakken stenen over.70
opponentsTilesAantal stenen dat je tegenstanders nog overhebben, gescheiden door punten, in speelvolgorde.3.13.8

De meeste spelers zullen aan de eerste twee parameters genoeg hebben. De laatste twee zijn wellicht handig als je geavanceerde strategiën wil implementeren. Een volledige request URL kan er bijvoorbeeld zo uit zien:
code:
1
http://example.com/rummikub.cgi?yourTiles=R12.B12.K13.R3.R2.K4.B9.B8.K11&table=G6.G7.G8.G9-B1.B2.B3-R5.R6.R7-R7.R8.R9.R10-R1.G1.B1-K5.K6.K7-B4.B5.B6.B7&poolTiles=47&opponentsTiles=5.13.6
Response body
Eén regel plain text met ofwel de tekst draw (om te trekken indien mogelijk, of anders te passen) of een nieuwe tafelconfiguratie. Deze nieuwe configuratie moet gevormd worden met álle oude stenen op tafel én minstens één van jouw stenen. De groepjes of stenen in een groepje hoeven niet op een bepaalde manier gesorteerd te worden, maar moeten wel voldoen aan de bij table genoemde syntax.

De respons op het eerdergenoemde voorbeeld kan bijvoorbeeld zijn:
code:
1
G6.G7.G8.G9-B1.B2.B3-R5.R6.R7-R7.R8.R9.R10-R1.G1.B1-K5.K6.K7-B4.B5.B6.B7.B8.B9

Hierbij legt een speler een blauwe 8 en 9 aan het laatste rijtje op tafel aan.


Uitzonderingen
Mocht een programma een ongeldige zet doen, dan wordt die zet automatisch omgezet in een draw om het spel door te kunnen laten gaan. Er geldt een tijdlimiet van vijf seconden per zet. (Ik gebruik een iets hogere request timeout om te compenseren voor network latency.)


Testen
Je kunt hier je speler testen en zo verifiëren dat je de regels en het protocol goed geïmplementeerd hebt.

Competities
DatumTijdDeelnemersResultaten
Testcompetitie 1Zondag 15 november19:00-23:00EdwinG, Soultaker, Onbekend, qanar, GuidoHpost, html
Testcompetitie 2Zondag 22 november19:00-23:00bat266, Bolukan, EdwinG, GuidoH, jfeitsma, joostvanpinxten, Memorice, Onbekend, Soultaker, Vaan Banaanpost, html
EindcompetitieZondag 29 november19:00-23:00bat266, Bolukan, Cavalera125, Domdo, dragontje124, EdwinG, GuidoH, jfeitsma, joostvanpinxten, Memorice, Onbekend, Soultaker, Tharulerz, Vaan Banaanpost, html

[ Voor 41% gewijzigd door Soultaker op 30-11-2009 00:35 ]


Acties:
  • 0 Henk 'm!

  • writser
  • Registratie: Mei 2000
  • Laatst online: 11-09 09:31
Klinkt als een leuke opdracht. En heb tijd zat dus doe wel mee! Maar wat is de bedoeling van de web-interface? Dat je je bot thuis laat draaien? Is het gebaseerd op HTTP? En is het makkelijk om zo'n interface te implementeren in C++?

[ Voor 5% gewijzigd door writser op 05-11-2009 18:45 ]

Onvoorstelbaar!


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
Het idee achter de webinterface is dat ik vermoed dat veel Tweakers toch wel aan webdevelopment doen, en op deze manier ik makkelijk een toernooitje kan draaien met alle deelnemers door HTTP requests te doen op hier aangekondigde URLs, zonder dat ik mensen specifieke talen/platforms/hardware moet opleggen of heel veel moeite moet doen om zelf alle programma's lokaal te draaien.

In C/C++ kun je vrij simpel een CGI app coden. Bijvoorbeeld, onderstaand programma parset de query string en print de parameters in plain text terug. (Ik denk dat je 't zelf wel naar smaak kunt aanpassen aan de specificaties hierboven.)
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char *data, *k, *v;

    if (!(qs = getenv("QUERY_STRING")))
    {
        fprintf(stderr, "No query string!\n");
        return EXIT_FAILURE;
    }

    printf("Content-type: text/plain\n\n");

    for (k = strtok(qs, "&"); k; k = strtok(NULL, "&"))
    {
        if ((v = strchr(k, '=')))
        {
            *v++ = '\0';
            printf("'%s' -> %s\n", k, v);
        }
    }

    return EXIT_SUCCESS;
}


Ik kan me voorstellen dat je om zelf te ontwikkelen een andere interface zou willen gebruiken (bijvoorbeeld, als in het voorbeeld hierboven QUERY_STRING niet gezet is, haal je je invoer uit een bestand of de command line ofzo). Mochten mensen het problematisch vinden om een webapp te bouwen dan kan ik eventueel wel een wrapper schrijven en programma's lokaal draaien. Doe maar een voorstel zou ik zeggen. ;) (Dan ben je overigens wel gebonden aan Linux en niet al te veel CPU tijd en geheugen gebruiken.)

[ Voor 8% gewijzigd door Soultaker op 05-11-2009 19:19 ]


Acties:
  • 0 Henk 'm!

  • writser
  • Registratie: Mei 2000
  • Laatst online: 11-09 09:31
Niemand anders enthousiast? Of mis ik het nieuwe topic ..

Onvoorstelbaar!


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19:58

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja, we zijn allemaal verhuisd maar hebben jou niets verteld >:)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
FWIW ik heb even snel iets in elkaar gehackt om je speler online te kunnen testen. (Zie link in de opdrachtbeschrijving hierboven).

offtopic:
Ik ben me bewust van de beveiliginsrisico's van het doen van server-side requests naar gebruikergespecificeerde URLs; gelieve daar gewoon geen misbruik van te maken.

Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 09-09 16:54
Soultaker schreef op donderdag 05 november 2009 @ 18:22:
en er toch nog concurrerende GoTPC is
Mis ik hier het woord geen of een compleet topic?

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
Ja, ik bedoelde geen (of ik heb het topic ook gemist :+)

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
*schop*

Geen animo?

[ Voor 3% gewijzigd door Soultaker op 10-11-2009 18:10 ]


Acties:
  • 0 Henk 'm!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Ik lees deze opdracht nu pas. Lijkt me wel interessant.

Acties:
  • 0 Henk 'm!

  • Dricus
  • Registratie: Februari 2002
  • Laatst online: 19:46

Dricus

ils sont fous, ces tweakers

Wel animo, maar deze week helaas erg weinig tijd...

Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 19:03

Sebazzz

3dp

Het is zowat PRG contest waardig, misschien daarom ;)

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:39

Onbekend

...

compufreak88 schreef op dinsdag 10 november 2009 @ 18:48:
Ik lees deze opdracht nu pas. Lijkt me wel interessant.
Ik lees hem nu ook pas, een Rummicub lijkt mij ook wel leuk om de programmeren. Er zijn weinig spelregels wat je moet programmeren, dus de tijd die je daaraan moet besteden valt mee en je kan de meeste tijd besteden aan het hoofdonderdeel; namelijk het algoritme. :)
Vanaf morgen ga ik een beginnetje maken, en hoop van het weekend iets te kunnen posten....

Edit: Hoe weet ik of ik al de eerste 30 punten al heb gelegd?

[ Voor 14% gewijzigd door Onbekend op 10-11-2009 19:21 ]

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
Die 30 punten doen we niet aan. (Ik heb de regels iets veranderd om de opdracht zo simpel mogelijk te houden. Er zitten ook geen jokers in 't spel.) Ik vraag me sowieso af wat de meerwaarde van die regel is, maar dat terzijde. :)

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 11-09 13:16
En is er een maximale tijd per zet?

edit:
De officiële regels (de Sabra- versie) spreken van maximaal 2 minuten per zet. Is het een idee om dat aan te houden?

[ Voor 73% gewijzigd door Jaap-Jan op 11-11-2009 12:25 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

Verwijderd

Mocht je bij normaal Rummikub nou ook stenen bij tegenstanders aanleggen? Zo ja, mag dat hier ook? :P
/me heeft niet zo vaak Rummikub gespeeld :$

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 11-09 13:16
Je hebt gewoon stenen in groepjes van minimaal 3 op tafel liggen en daar mag je mee schuiven wat je wilt, zolang je uiteindelijk maar groepjes overhoudt van minimaal 3 stenen. Stenen die op tafel liggen, mag je niet pakken (op je eigen rekje zetten).

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

Verwijderd

Jaap-Jan schreef op woensdag 11 november 2009 @ 01:07:
Je hebt gewoon stenen in groepjes van minimaal 3 op tafel liggen en daar mag je mee schuiven wat je wilt, zolang je uiteindelijk maar groepjes overhoudt van minimaal 3 stenen. Stenen die op tafel liggen, mag je niet pakken (op je eigen rekje zetten).
Ah dat was 't. Denk dat ik hem even oversla, wordt iets te. :9

Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:39

Onbekend

...

Mogen bij groepjes van gelijke nummers de zelfde kleuren voorkomen? Oftewel: is dat ook versimpeld of moeten we daar wel rekening mee houden?

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Onbekend schreef op woensdag 11 november 2009 @ 07:59:
Mogen bij groepjes van gelijke nummers de zelfde kleuren voorkomen? Oftewel: is dat ook versimpeld of moeten we daar wel rekening mee houden?
Staat in de regels:
Soultaker schreef op donderdag 05 november 2009 @ 18:26:
  1. drie of meer stenen met dezelfde waarde maar verschillende kleuren:
    [afbeelding]

[ Voor 102% gewijzigd door compufreak88 op 11-11-2009 09:24 ]


Acties:
  • 0 Henk 'm!

  • joostvanpinxten
  • Registratie: Maart 2007
  • Laatst online: 03-09 12:50
Interessante opdracht! Ook leuk verzonnen dat je op deze manier een toernooi via HTTP-requests kan uitvoeren!

Ik zal er eens over nadenken en kijken of ik iets geinigs in PHP kan bedenken, dan kom ik miss ook wel met een opzet. Hoe lang gaat deze opdracht nog duren? Want als het op de 14e af moet zijn, dan haal ik dat waarschijnlijk niet meer.

Acties:
  • 0 Henk 'm!

Verwijderd

cool, heb ooit het spel TriOminos gemaakt in een ver verleden ('91-'92 ofzo), wat weer een afgeleide is van rumnikub. 's kijken of we wat tijd kunnen vrijmaken.

Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Klinkt erg interessant :) Misschien dat ik ook mee ga doen. Leuke manier om Ruby eens te leren, maar moet een kijken of ik de tijd kan vinden. Heb namelijk wel een leuke strategie bedacht.

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
Jaap-Jan schreef op dinsdag 10 november 2009 @ 23:48:
En is er een maximale tijd per zet?
edit:
De officiële regels (de Sabra- versie) spreken van maximaal 2 minuten per zet. Is het een idee om dat aan te houden?
Ik zou een veel lagere limiet aanhouden. Voorstel: 5 seconden.

Één potje duurt immers al gauw rond de 100 beurten (het maximum is 147 als ik het goed berekend heb) en met 5 seconden per beurt zit je dan rond de 8 minuten voor een spelletje (terwijl je met 2 minuten ruim drie uur bezig bent!) Voor menselijke spelers zou vijf seconden niet te doen zijn, maar met een computerprogramma zou je een heel eind moeten kunnen komen.
Onbekend schreef op woensdag 11 november 2009 @ 07:59:
Mogen bij groepjes van gelijke nummers de zelfde kleuren voorkomen? Oftewel: is dat ook versimpeld of moeten we daar wel rekening mee houden?
Nee, dat is niet versimpeld, en dat mag dus niet. (Vandaar dat een groepje stenen met dezelfde waarde uit maximaal vier stenen kan bestaan, in plaats van acht.)
joostvanpinxten schreef op woensdag 11 november 2009 @ 09:34:
Hoe lang gaat deze opdracht nog duren? Want als het op de 14e af moet zijn, dan haal ik dat waarschijnlijk niet meer.
Mijn plan was om aanstaande zondag (15 november) een testcompetitie te doen, en dan een week erna (21 november) een officiële competitie te houden. Gezien de recente belangstelling is het misschien beter de officiële competitie een week later te houden, maar wat mij betreft is dat het maximum om GoTPC-achtige toestanden te voorkomen waarbij één opdracht een jaar in beslag neemt.

Vereiste voor de officiële competitie is wel dat alle spelers tegelijk online zijn. (Zoals gezegd ben ik wel bereid om enkele spelers lokaal draaien voor mensen die 'm niet zelf online kunnen zetten op een vast tijdstip.) Misschien handig om even een poll te maken:

edit:
Resultaat poll: competities op zondagavond (poll), eindcompetitie op zondag 29 november (poll). Ik heb de opdracht aangepast.

[ Voor 25% gewijzigd door Soultaker op 14-11-2009 20:01 ]


Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 09-09 16:54
Volgens mij kan een potje uit maximaal 150 beurten bestaan:

48 'draw' (na de start zitten er nog 48 stenen in de pot)
1x 3 stenen uitleggen (begin)
101x 1 steen bijleggen

Als ik op tijd iets afkrijg, zal ik dat met PHP maken. Dat kan ik dus gewoon op mijn eigen site plaatsen, altijd online dus.

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Oei, ik ga dat denk ik niet op tijd af krijgen. Helaas pindakaas.

Engineering is like Tetris. Succes disappears and errors accumulate.


  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 23-08 23:43
EdwinG schreef op woensdag 11 november 2009 @ 20:00:
48 'draw' (na de start zitten er nog 48 stenen in de pot)
Dan ga je uit van 4 spelers... Met 2 spelers zitten er 76 stenen in de pot, die in 38 rondes zijn te trekken. Dan legt iedere speler in 50 rondes zijn stenen weg (1x3 en 49x1).
Ik kom op maximaal 88 rondes, oftewel 176 beurten.

Edit:
|:( Sorry, in opzet staat dat met 4 spelers wordt gespeeld:
Het spel wordt gespeeld met vier spelers, die elk een eigen rekje met stenen hebben (bij de tegenstanders is het aantal bekend).

[ Voor 21% gewijzigd door Bolukan op 12-11-2009 15:08 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
Bedenk ook dat het spel eindigt zodra een speler zijn stenen kwijt is, óf de trekstapel leeg is. Dus je kunt 47x een steen trekken (dan zijn er 103 stenen bij spelers, en 1 nog te trekken), vervolgens kunnen daarvan 100 stenen gespeeld worden totdat iemand zonder stenen zit, dus kun je sowieso maximaal 147 beurten spelen.

Als je er bedenkt dat er geopend moet worden met een drietal wordt dat aantal 145. Om een tweede kleur op tafel te krijgen heb je ook (eenmalig) een drietal of twee tweetallen nodig, denk ik, dus dan wordt het minimum op beide manieren 143. De overige stenen kun je wel één voor één aanleggen.

Ik denk dus dat een spelletje maximaal 143 beurten duurt. In de praktijk red je dat zelden of nooit natuurlijk, maar je kunt wel aardig in de buurt komen (meer dan 100 beurten is geen uitzondering met mijn simpele spelers).

[ Voor 39% gewijzigd door Soultaker op 12-11-2009 16:33 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Maar kan het ook niet gebeuren dat een speler niet meer kan, nadat alle stenen uit de pot zijn? Dat hij afhankelijk is van wat een andere speler doet. Dan zou je dus een Draw kunnen doen, terwijl er geen stenen meer in de pot zitten.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Leuk idee, ik heb waarschijnlijk te weinig tijd om mee te doen, maar even voor de zekerheid:
Als je aan de beurt bent, mag je ofwel één steen pakken (als er nog over zijn) of één of meer stenen op tafel leggen. Je mag daarbij alle stenen op tafel hergroeperen zoals je wil, zolang er uiteindelijk maar een geldige configuratie op tafel ligt
Dan zou dit dus een geldige zet zijn:
code:
1
2
3
4
plank          tafel          resultaat
R1, G3, G5     R2, R3, R4     R1, R2, R3
               B4, G4, K4     B4, K4, R4
                              G3, G4, G5

Hmm, ik zit hier wat op een A4-tje te krabbelen en krijg al allerlei algoritme ideetjes. Misschien toch maar eens kijken of ik een gaatje kan vinden of met wat minder slaap kan.

500 "The server made a boo boo"


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
@Woy: als de pot leeg is, eindigt het spel. Dus als je aan de beurt bent, kun je áltijd trekken (als je niet kan/wil spelen). Het is dus zaak je stenen kwijt te raken voor dat gebeurt. ;)

@Vaan Banaan: klopt precies! Dat soort ingewikkelde operaties zijn waarin goede spelers zich kunnen onderscheiden.

  • gammuts
  • Registratie: April 2001
  • Laatst online: 02-04 09:55
Ik kom in de knoei met de de puntkomma in je POSTs/URLs. Ik gebruik Perl en de module CGI. Blijkbaar gebruikt CGI de puntkomma op dezelfde manier als de ampersand: als scheidingsteken.

Nu kan ik ten dele die Perl-module de schuld geven, maar RFC 3986 (http://www.ietf.org/rfc/rfc3986.txt) doet ook een duit in het zakje:
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="

...

Aside from dot-segments in hierarchical paths, a path segment is
considered opaque by the generic syntax. URI producing applications
often use the reserved characters allowed in a segment to delimit
scheme-specific or dereference-handler-specific subcomponents. For
example, the semicolon (";") and equals ("=") reserved characters are
often used to delimit parameters and parameter values applicable to
that segment. The comma (",") reserved character is often used for
similar purposes. For example, one URI producer might use a segment
such as "name;v=1.1" to indicate a reference to version 1.1 of
"name", whereas another might use a segment such as "name,1.1" to
indicate the same. Parameter types may be defined by scheme-specific
semantics, but in most cases the syntax of a parameter is specific to
the implementation of the URI's dereferencing algorithm.
Vandaar de vraag: wil je een ander scheidingsteken gebruiken? Zo nee, dan ga ik lekker hacken in CGI.pm

N.B.: ook de optie -oldstyle_urls van module CGI lijkt niet te helpen.

use strict; use warnings;


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
Hmz, vervelend. Ik heb daar nog over nagedacht maar de HTTP spec verbiedt die karakters niet specifiek, dus ik ging er vanuit dat 't wel goed zou gaan.

Twee voor de hand liggende opties: protocol veranderen en alleen unreserved characters gebruiken, óf de gereserveerde karakters escapen. (In het eerste geval moet ook de komma vervangen worden.) Escapen is vervelend voor mensen die handmatig de query string willen parsen, dus misschien is het beter de scheidingstekens te veranderen.

Voorstel: stenen scheiden door punten (in plaats van komma's) en groepjes door streepjes (in plaats van puntkomma)? Een configuratie op tafel wordt dan b.v. gecodeerd als: R1.R2.R3-G4.G5.G6-R11.K11.B11

Ziet iemand daar nog problemen mee?

  • gammuts
  • Registratie: April 2001
  • Laatst online: 02-04 09:55
De hack in CGI.pm valt overigens behoorlijk mee:
sub parse_params {
my($self,$tosplit) = @_;
my(@pairs) = split(/[&;]/,$tosplit);
De puntkomma eruit fietsen en klaar.

De noodzaak voor aanpassing van het scheidingsteken is voor mij nu zwaar gedaald.

use strict; use warnings;


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
Dat is fijn, maar toch had je een goed punt. ;) Het is maar een kwestie van tijd voordat iemand anders een soortgelijk probleem constateert. (Ik zie bijvoorbeeld dat je in PHP ook arg_separator.input kunt aanpassen om alternatieve scheidingstekens te gebruiken.)

Ik ga de probleembeschrijving dus toch maar aanpassen. Done.

edit:
Let op! Voor wie al een werkende speler gebouwd had: ik heb de scheidingstekens in de invoer en uitvoer aangepast. Lees de gewijzigde opdrachtomschrijving goed door als je speler niet (meer) lijkt te werken. ;)

[ Voor 32% gewijzigd door Soultaker op 12-11-2009 20:32 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Soultaker schreef op donderdag 12 november 2009 @ 17:52:
@Woy: als de pot leeg is, eindigt het spel. Dus als je aan de beurt bent, kun je áltijd trekken (als je niet kan/wil spelen). Het is dus zaak je stenen kwijt te raken voor dat gebeurt. ;)
Ok, maar het kan dus voordelig zijn om een draw te doen als je voor staat, als dat inhoud dat het spel over is ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
In principe klopt dat ja. Ik weet niet of dat een heel slimme strategie is als je ook had kunnen spelen (en daarmee dus stenen kwijt had kunnen raken).

Misschien is het spel laten doorgaan tot alle vier de spelers achter elkaar passen beter, maar dan kan het spel ook weer langer gaan duren. Ik denk dat we even een testcompetitie moeten afwachten om te zien of dat aanpassing behoeft.

[ Voor 9% gewijzigd door Soultaker op 12-11-2009 20:33 ]


  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

leuk idee :)
ik zal eens een poging wagen mits ik snel iets aan de praat heb

-niks-


Acties:
  • 0 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
Leuk! Ik zie het nu pas, maar hopelijk kan ik vanavond iets moois in elkaar fietsen :)

edit: Normaalgesproken is het spel natuurlijk pas afgelopen als iedereen gepast heeft.

[ Voor 34% gewijzigd door winkbrace op 13-11-2009 16:09 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
Eigenlijk is dat wel logischer, en niet zo moeilijk te implementeren. Ik heb het aangepast in de opdrachtbeschrijving. (Zou voor spelers weinig uit moeten maken.)

Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:39

Onbekend

...

Is het mogelijk om in jouw test-spel een knop toe te voegen die het gehele spel automatisch af maakt en dan de eindstand laat zien? Nu moet ik ongeveer 100 keer op die knop drukken. 8)

De status van mijn programma is dat de invoer en mijn uitvoer eindelijk correct zijn. Nu kan ik eindelijk wat intelligentie toevoegen zodat ik ook wat stenen toe kan voegen. :)

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 09-09 16:54
Ik neem aan dat een pass automatisch gebeurt in het geval van een 'draw' bij een lege stapel?

Lastig trouwens dat ik nu enkele pagina's terug moet om de opdrachtbeschrijving te kunnen lezen. Misschien een idee om vanaf daar de relevante berichten af te splitsen tot een Rummikubtopic?

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • qanar
  • Registratie: Februari 2008
  • Laatst online: 21-05-2019
Wat ik nog niet gezien heb is hoe je past.

Voor het toernooi moet je dus gewoon een downloadbare php of cgi file geven?

Acties:
  • 0 Henk 'm!

Verwijderd

Ik ben ook al met een AI begonnen.
Goed idee om de competitie via HTTP te laten verlopen!

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
EdwinG schreef op vrijdag 13 november 2009 @ 20:19:
Ik neem aan dat een pass automatisch gebeurd in het geval van een 'draw' bij een lege stapel?
Klopt.
Lastig trouwens dat ik nu enkele pagina's terug moet om de opdrachtbeschrijving te kunnen lezen. Misschien een idee om vanaf daar de relevante berichten af te splitsen tot een Rummikubtopic?
Van mij mag 't. Lezen er moderators mee? :P
qanar schreef op vrijdag 13 november 2009 @ 20:44:
Wat ik nog niet gezien heb is hoe je past.
Zoals EdwinG al zei: gewoon draw teruggeven. Als er niets meer te trekken valt pas je impliciet (en dat is ook de enige situatie waarin je kunt passen).
Voor het toernooi moet je dus gewoon een downloadbare php of cgi file geven?
Het makkelijkst is als je je speler gewoon ergens online kan zetten in de tijdspanne waarin ik het toernooi uitvoer. Voor PHP scripts zou dat eenvoudig moeten kunnen. De broncode zelf hoef ik dan niet te hebben (maar het is waarschijnlijk wel leuk om die ná de competitie te delen, denk ik).

Van deelnemers die eigen hosting hebben hoef ik alleen een URL te ontvangen (per DM b.v.) en of ik GET of POST moet gebruiken. Voor mensen die niet zelf hun speler kunnen draaien (ook niet gewoon thuis b.v.) wil ik wel proberen die speler lokaal te draaien, maar dat moet je dan even met mij overleggen.

Acties:
  • 0 Henk 'm!

  • qanar
  • Registratie: Februari 2008
  • Laatst online: 21-05-2019
Soultaker schreef op vrijdag 13 november 2009 @ 20:56:
Het makkelijkst is als je je speler gewoon ergens online kan zetten in de tijdspanne waarin ik het toernooi uitvoer. Voor PHP scripts zou dat eenvoudig moeten kunnen. De broncode zelf hoef ik dan niet te hebben (maar het is waarschijnlijk wel leuk om die ná de competitie te delen, denk ik).

Van deelnemers die eigen hosting hebben hoef ik alleen een URL te ontvangen (per DM b.v.) en of ik GET of POST moet gebruiken. Voor mensen die niet zelf hun speler kunnen draaien (ook niet gewoon thuis b.v.) wil ik wel proberen die speler lokaal te draaien, maar dat moet je dan even met mij overleggen.
Ok, dus gewoon een link naar de PHP-file.

Voorlopig heb ik een speler die altijd drawt :p

Acties:
  • 0 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
qanar schreef op vrijdag 13 november 2009 @ 21:15:
[...]


Ok, dus gewoon een link naar de PHP-file.

Voorlopig heb ik een speler die altijd drawt :p
wtf! Ik heb ook al zo'n lamzak gebouwd! :+

@Soultaker: Wat betreft de test interface. Kun je de kaarten daar naast elkaar weergeven ipv onder elkaar? Zelf vind ik een table met 30 items per row wel mooi :P

Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 09-09 16:54
Elke keer 'draw' werkt voorlopig beter dan mijn idee. Brute-force blijkt niet haalbaar met deze opdracht :X
Mijn idee was eerst om met volledige tafel + alle eigen stenen een oplossing te zoeken, en als die er niet was het zoeken te herhalen met 1 van mijn stenen minder hetzelfde te proberen, om zo verder te gaan.
(Eerst alle combinaties met nog 1 steen van mij op mijn plankje aan het eind, daarna de combinaties met 2 stenen e.d.)
Zit een klein nadeel aan: in het slechtste geval namelijk 2n combinaties om te proberen (voordat een 'draw' wordt gekozen). Bij de startpositie is dat 16383 combinaties. Dat kost nogal wat tijd om door te rekenen. En als je een lijst met alle permutaties in het geheugen wilt hebben, komt een out-of-memory snel dichtbij.

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 11-09 13:16
Interessant leesvoer hierover: http://www.snl.salk.edu/~hendrik/f97/AI/Rummikub.html.

Hier wordt gesteld dat het maken van de lijst van permutaties in milliseconden gebeurd kan zijn, maar de daadwerkelijke berekening van een zet kost meer veel rekenkracht naarmate er meer dan 25 á 30 stenen op tafel liggen. In de tekst gaat het over het kaartspel, maar het idee is hetzelfde.

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
@EdwinG: het is maar wat je een "klein nadeel" noemt. :P
BazzPsychoNut schreef op vrijdag 13 november 2009 @ 22:32:
@Soultaker: Wat betreft de test interface. Kun je de kaarten daar naast elkaar weergeven ipv onder elkaar? Zelf vind ik een table met 30 items per row wel mooi :P
Ze staan al naast elkaar...? (Tenminste, in Firefox, Konqueror en Opera. Over Internet Explorer garandeer ik niets.)

Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 09-09 16:54
Soultaker schreef op vrijdag 13 november 2009 @ 23:52:
@EdwinG: het is maar wat je een "klein nadeel" noemt. :P
Ik ben dan ook maar op een andere manier gevonden. Momenteel negeer ik de tafel, maar leg wel uit als dat mogelijk is. (betekent niet dat de beste uitleg gekozen wordt)
Soultaker schreef op vrijdag 13 november 2009 @ 23:52:Ze staan al naast elkaar...? (Tenminste, in Firefox, Konqueror en Opera. Over Internet Explorer garandeer ik niets.)
In Seamonkey staat alles onder elkaar, ziet er niet uit om eerlijk te zijn. Ik zal eens kijken of ik de oorzaak kan vinden in de html.

Gevonden: Seamonkey kan niet overweg met
code:
1
display: inline-block

waardoor alles als block wordt neergezet (en elke div dus op een aparte regel komt te staan)
Als de display voor de tileR, tileK etc. op 'inline' gezet kan worden: graag.

[ Voor 15% gewijzigd door EdwinG op 14-11-2009 00:09 . Reden: probleem met html/seamonkey gevonden ]

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 09-09 16:54
Voor de testcompetitie: Mijn deelnemer (in ontwikkeling) is te vinden op:

http://typefreak.nl/rummikub/basic.php
Methode: POST

Mag ook door andere deelnemers gebruikt worden als 'sparringspartner'.

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • qanar
  • Registratie: Februari 2008
  • Laatst online: 21-05-2019
_GET of _POST maakt niet veel uit neem ik aan? _GET maakt het mij iets makkelijker om te testen :-)

Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 06-09 16:59

CoolGamer

What is it? Dragons?

Ik ga denk ook maar eens een poging wagen. >:)
qanar schreef op zaterdag 14 november 2009 @ 00:36:
_GET of _POST maakt niet veel uit neem ik aan? _GET maakt het mij iets makkelijker om te testen :-)
POST is ook niet moeilijk om te testen hoor:

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
<html>
    <head><title>Test POST</title></head>
    <body>
        <form method="POST" action="http://localhost/">
            yourTiles: <input type="text" value="R12.B12.K13.R3.R2.K4.B9.B8.K11" name="yourTiles"><br>
            table: <input type="text" value="G6.G7.G8.G9-B1.B2.B3-R5.R6.R7-R7.R8.R9.R10-R1.G1.B1-K5.K6.K7-B4.B5.B6.B7" name="table"><br>
            poolTiles: <input type="text" value="47" name="poolTiles"><br>
            opponentsTiles: <input type="text" value="5.13.6" name="opponentsTiles"><br>
            <input type="submit">       
        </form>
    </body>
</html>

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
EdwinG schreef op zaterdag 14 november 2009 @ 00:00:
Gevonden: Seamonkey kan niet overweg met
code:
1
display: inline-block

waardoor alles als block wordt neergezet (en elke div dus op een aparte regel komt te staan)
Als de display voor de tileR, tileK etc. op 'inline' gezet kan worden: graag.
Argh, ik haat HTML/CSS. :( Ik kan wel inline gebruiken maar dan kan ik de hoogte/breedte niet fixen. Weet iemand hoe dat wel moet?

En gaat deze layout ook stuk?

Acties:
  • 0 Henk 'm!

  • Memorice
  • Registratie: Maart 2006
  • Laatst online: 20-08 08:53
EdwinG schreef op vrijdag 13 november 2009 @ 23:10:
Elke keer 'draw' werkt voorlopig beter dan mijn idee. Brute-force blijkt niet haalbaar met deze opdracht :X
Mijn idee was eerst om met volledige tafel + alle eigen stenen een oplossing te zoeken, en als die er niet was het zoeken te herhalen met 1 van mijn stenen minder hetzelfde te proberen, om zo verder te gaan.
(Eerst alle combinaties met nog 1 steen van mij op mijn plankje aan het eind, daarna de combinaties met 2 stenen e.d.)
Zit een klein nadeel aan: in het slechtste geval namelijk 2n combinaties om te proberen (voordat een 'draw' wordt gekozen). Bij de startpositie is dat 16383 combinaties. Dat kost nogal wat tijd om door te rekenen. En als je een lijst met alle permutaties in het geheugen wilt hebben, komt een out-of-memory snel dichtbij.
Volgens mij is je constatering niet correct, ik heb het idee dat dit vrij snel door gerekend kan worden. In ieder geval is het vrij eenvoudig om van een hoop stenen te bepalen of je er een correcte tafel van kunt maken. Dit kan volgens mij ruim binnen de 100 ms.

Om mijn idee te testen, heb ik zelf hiervoor even een stukje code geschreven. Om een voorbeeld te geven heb ik hieronder een random input ter grote van ongeveer 75% van alle stenen:

yourTiles=R1.R1.R2.R2.R3.R4.R4.R5.R5.R6.R7.R7.R8.R9.R10.R11.R12.B1.B2.B3.B4.B5.B5.B6.B7.B8.B8.B9.B9.B10.B10.B11.B11.B12.B12.G1.G1.G2.G2.G3.G3.G4.G4.G5.G6.G7.G7.G8.G9.G10.G11.G11.G12.G12.Z1.Z1.Z2.Z3.Z3.Z4.Z4.Z5.Z5.Z6.Z7.Z8.Z9.Z10.Z11.Z11.Z12

Dit volledig door rekenen kost 15 ms en levert als resultaat:

R4.R5.R6.R7-R2.R3.R4.R5-R7.R8.R9.R10-G3.G4.G5.G6.G7-G2.G3.G4-G7.G8.G9.G10-B3.B4.B5-B8.B9.B10-B5.B6.B7.B8.B9.B10-Z1.Z2.Z3.Z4.Z5-Z3.Z4.Z5.Z6.Z7.Z8.Z9.Z10.Z11-R1.G1.Z1-R2.G2.B2-R11.G11.B11-R12.G12.B12-R1.G1.B1-G11.B11.Z11-G12.B12.Z12

Kortom brute force moet volgens mij zeer goed mogelijk zijn. Wanneer ik mijn algoritme test met random input, heb ik altijd in ongeveer 10-20 ms een antwoord (of een correcte table of dat dit niet mogelijk is).

Merk op dat ik in mijn algoritme geen onderscheid maak tussen yourtiles en table, ik gooi gewoon alle stenen op een hoop. Verder geeft mijn algoritme als output een correcte table of dat een correcte table met alle stenen niet mogelijk is. Er is een erg kleine kans dat ik mee doe met deze contest, dit omdat ik de komende weken erg druk ben (conferenties en dergelijke). Deze code wil ik na afloop uiteraard wel beschikbaar stellen.




Om jullie wat inspiratie/denkwerk te geven, mijn code is ongeveer als volgt opgebouwd:

De datastructuur is een int[8], hierin worden alle beschikbare stenen opgeslagen; voor elke kleur zijn er twee integers en van elke integer gebruik ik de laatste 13 bits om aan te geven of een steen beschikbaar is of niet. Bijv. een 1 op het 4e bit van zowel de eerste als tweede int geeft aan dat de blauwe 4 twee maal voorkomt. Met behulp van deze datastructuur kun je zeer efficient bitwise operators toepassen, om bepaalde zaken gedaan te krijgen. De union tussen twee integers van dezelfe kleur geeft bijv. al je unieke stenen van die kleur en de intersection geeft alle dubbele stenen van die kleur.

Het algoritme zelf is vervolgens zeer eenvoudig, ga er eerst vanuit dat je alleen maar rijtjes mag maken van dezelfde kleur (dus bijv. geen R1.G1.B1). Zorg er voor dat je zo weinig mogelijk stenen over houdt bij het maken van deze rijtjes. Met behulp van bit flips is de complexiteit hiervan linear.

Vervolgens komt het exponentiele gedeelte van het algoritme om de hoek kijken. Elke steen die niet in een rijtje van 3 zit kun je op maximaal 3 manieren wegwerken, namelijk in een rijtje met drie andere stenen van dezelfde kleur of in een rijtje met twee andere stenen van dezelfde kleur (hiervoor zijn twee mogelijkheden). In de praktijk blijkt dat met behulp van dynamisch programmeren en depth first search, dit exponentiele gedeelte van het algoritme vrij weinig tijd kost. Je kunt namelijk al vrij snel takken in je zoekboom prunen.

Algemene opmerking: Dit algoritme op zichzelf is geen speler, maar slechts een stuk code dat kan bepalen of je van een hoop stenen een correcte table kunt maken of niet. Het algoritme zou dus onderdeel kunnen zijn van een speler.

Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 09-09 16:54
MEMORICE schreef op zaterdag 14 november 2009 @ 04:44:
Kortom brute force moet volgens mij zeer goed mogelijk zijn. Wanneer ik mijn algoritme test met random input, heb ik altijd in ongeveer 10-20 ms een antwoord (of een correcte table of dat dit niet mogelijk is).
In dit geval weet je na die 10-20 ms of je, met alle stenen uit eigen hand, een geldige tafelcombinatie kan maken. Als dit niet het geval is zal je niets ondernemen. Het aantal keren dat je met een hand direct uit kunt zal vrij klein zijn. (Alhoewel 1x per potje natuurlijk voldoende is)

Voer je deze controle (worst-case) uit voor alle permutaties van je hand, dan zal met de openingshand (214 combinaties) al 160 seconden nodig zijn als de 10ms het gemiddelde zou zijn. Als de eerste beurt vervolgens niets oplevert zal de de tweede ruim 5 minuten bezig zijn.

Het idee met de bitwise operatoren is wel een stuk efficienter dan ik zelf in elkaar had gezet, eens kijken of ik daar wat mee kan doen.
Soultaker schreef op zaterdag 14 november 2009 @ 02:42:
Argh, ik haat HTML/CSS. :( Ik kan wel inline gebruiken maar dan kan ik de hoogte/breedte niet fixen. Weet iemand hoe dat wel moet?

En gaat deze layout ook stuk?
hoogte/breedte? Daar zijn toch de width en height attributen voor?

De testpagina geeft bij mij hetzelfde resultaat als de originele pagina.

(overigens kan ik ook firefox gebruiken, echt een probleem is er dus niet)

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
EdwinG schreef op zaterdag 14 november 2009 @ 11:41:
hoogte/breedte? Daar zijn toch de width en height attributen voor?
Ja, maar die werken alleen op block elementen. (Vandaar de inline-block.)
De testpagina geeft bij mij hetzelfde resultaat als de originele pagina. (overigens kan ik ook firefox gebruiken, echt een probleem is er dus niet)
Ik zou zeggen: gebruik voor deze contest dan maar Firefox of Opera, dat scheelt me een hoop werk. :)
(edit: Zelfs Konqueror en Chromium doen 't goed!)

Overigens genereer ik die volledige reports met XQuery vanuit XML dus als iemand een mooiere lay-out weet te produceren met XSLT/CSS hou ik me aanbevolen.

@MEMORICE: Ik heb zo mijn eigen ideeën voor een algoritme, maar die houd ik nog lekker geheim tot na de contest. ;) Let trouwens op: zwarte stenen worden gecodeerd met K niet met Z!

[ Voor 13% gewijzigd door Soultaker op 15-11-2009 01:30 ]


Acties:
  • 0 Henk 'm!

  • Memorice
  • Registratie: Maart 2006
  • Laatst online: 20-08 08:53
EdwinG schreef op zaterdag 14 november 2009 @ 11:41:
[...]
In dit geval weet je na die 10-20 ms of je, met alle stenen uit eigen hand, een geldige tafelcombinatie kan maken. Als dit niet het geval is zal je niets ondernemen. Het aantal keren dat je met een hand direct uit kunt zal vrij klein zijn. (Alhoewel 1x per potje natuurlijk voldoende is)

Voer je deze controle (worst-case) uit voor alle permutaties van je hand, dan zal met de openingshand (214 combinaties) al 160 seconden nodig zijn als de 10ms het gemiddelde zou zijn. Als de eerste beurt vervolgens niets oplevert zal de de tweede ruim 5 minuten bezig zijn.

Het idee met de bitwise operatoren is wel een stuk efficienter dan ik zelf in elkaar had gezet, eens kijken of ik daar wat mee kan doen.
Nee, je kunt alle stenen van je eigen hand en de stenen van de tafel gewoon op een hoop gooien. Dus je probeert niet een geldige tafel combinatie met alleen de stenen van je hand te maken, maar in combinatie met de stenen die al op tafel liggen. Om dit vervolgens brute force door te rekenen kost echt max 10-20 ms. Bedenk dat je met 75% van alle stenen al wel in de buurt van het maximum zit (worst case). Immers met meer stenen is het te makkelijk uitleggen en met minder stenen is het minder reken werk...

@Soultaker
Mocht ik meedoen, dan zal ik er aan denken dat zwarte stenen met een K gerepresenteerd worden :)

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
Als we aan de vier deelnemers komen ga ik morgenavond een eerste testcompetitie runnen (een week daarna nog één, en een week daarna de finale; zie de opdrachtbeschrijving voor overige competitiedata).

Als je mee wil doen, stuur me dan vóór morgenavond een URL van je speler (en of je GET of POST requests verwacht). :) (Tot nu toe heb ik EdwinG staan, en ik heb zelf gisteren/vandaag een speler in elkaar gehackt.)

Acties:
  • 0 Henk 'm!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Ik weet niet of het lukt, maar ik probeer er nog een in elkaar te hacken.

Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:39

Onbekend

...

Ik heb wel een speler die wel de eenvoudige handelingen doet, maar hij is niet slimmer dan een onervaren persoon. :)
Hij is beschikbaar op http://tweakers.awardspace.com/RummiDemo.php en maakt gebruik van GET-requests.

De definitieve speler voor de Eindcompetitie krijgt wat meer intelligentie en die zal ik t.z.t. via DM aan Soultaker doorgeven.

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • qanar
  • Registratie: Februari 2008
  • Laatst online: 21-05-2019
Mijn speler via GET. Kan voorlopig enkel stenen wegspelen, nog niet combinaties in eigen stenen zien of heel het speelveld herschikken. Eigenlijk is ie dus nog dommer dan de simpel-spelers.

Ik heb problemen met een goede datastructuur te vinden. Ook snap ik niet helemaal wat jullie bedoelen met bitwise operators. Daar moet ik me misschien eens over gaan inlezen. Leesvoer ergens?

Als andere opdracht dacht ik misschien nog aan dit. De datastructuur van mijn oplossing + link naar alle code staat hier.

[ Voor 21% gewijzigd door qanar op 14-11-2009 22:17 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Soultaker schreef op zaterdag 14 november 2009 @ 14:48:
[...]

@MEMORICE: Ik heb zo mijn eigen ideeën voor een algoritme, maar die houd ik nog lekker geheim tot na de contest. ;) Let trouwens op: zwarte stenen worden gecodeerd met K niet met Z!
Heeft dat een nut of is dat alleen maar om ons te pesten? >:)

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 11-09 13:16
Net zoals CYMK. De K staat voor 'Key'. De rest van de letters zijn hetzelfde in Nederlands en Engels, maar anders zou je de 'B' twee keer gebruiken, voor black en blue. :)

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • Osxy
  • Registratie: Januari 2005
  • Laatst online: 17:32

Osxy

Holy crap on a cracker

Verwijderd schreef op zaterdag 14 november 2009 @ 22:39:
[...]

Heeft dat een nut of is dat alleen maar om ons te pesten? >:)
CMYK? :P

"Divine Shields and Hearthstones do not make a hero heroic."


Acties:
  • 0 Henk 'm!

  • Memorice
  • Registratie: Maart 2006
  • Laatst online: 20-08 08:53
qanar schreef op zaterdag 14 november 2009 @ 21:54:
Ik heb problemen met een goede datastructuur te vinden. Ook snap ik niet helemaal wat jullie bedoelen met bitwise operators. Daar moet ik me misschien eens over gaan inlezen. Leesvoer ergens?
Een praktische datastructuur is dus bijv. een int[8], dus 8 integers, waarbij je per kleur 2 int values hebt, dit omdat elke steen twee maal voor kan komen (per kleur). Op integers kun je bitwise operators gebruiken, veel meer kennis dan hieronder heb je hiervoor niet nodig:

De computer rekent met binaire getallen in plaats van het tientallig stelsel. Als je de laatste 13 bits van een int gebruikt om te representeren of je een bepaalde steen hebt of niet. Dan is het 2^i-de bit dus 1 als je de steen hebt en anders 0. Omzetten van invoer naar deze datastructuur kan met de OR operatie, in veel talen gerepresenteerd met een enkele '|' en checken of je een steen hebt kan met een AND, in veel talen gerepresenteerd als een enkele '&'. Zoals ik in een eerdere post al zei kun je dus nog veel meer efficiente dingen doen met deze simpele bitwise operators, namelijk de union (OR) geeft alle unieke stenen en de intersection (AND) geeft al je dubbele stenen. Googlen naar bitwise operators moet je volgens mij voldoende informatie kunnen leveren...

Deze datastructuur is erg praktisch omdat alle operaties zeer efficient (zowel qua hoeveelheid code als qua rekenwerk voor de computer) kunnen gebeuren (bitwise operators) en tevens het geheugen gebruik klein is. Een ander groot voordeel is dat je bijv. heel goedkoop een state kunt kopieren en dus efficient recursie (met behulp van dynamisch programmeren) kunt toepassen.

Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:39

Onbekend

...

Zelf gebruik ik in php de >> en de << operators bijna nooit.
Ik gebruik die dingen alleen maar als ik echte binaire of hexadecimale getallen binnen krijg, maar dan gebruik ik ook de andere wiskundige berekeningen zoals MOD.

@qanar:
Zie http://php.net/manual/en/language.operators.bitwise.php voor de bitwise operatoren.
Over het algemeen gebruik je alleen de bovenste twee.

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
MEMORICE schreef op zaterdag 14 november 2009 @ 23:02:
Een ander groot voordeel is dat je bijv. heel goedkoop een state kunt kopieren en dus efficient recursie (met behulp van dynamisch programmeren) kunt toepassen.
Grappig, dat klinkt naar mijn speler. ;) Die is geschreven in C en ik gebruik momenteel voor alles een int (in PHP heb je daar weing keuze in) ook al tellen de meeste variabelen maar tot 2 of 3 en zou ik dus aan vier bits genoeg hebben. Het is i.m.o. niet heel erg de moeite waard om daar op te besparen totdat tijd echt een bottleneck wordt óf je een paar miljoen kopiën op moet slaan.

Overigens geef ik je in principe wel gelijk: compacte datastructuren kun je sneller kopieren, maar als je daarmee de complexiteit van je programma vergroot terwijl er belangrijkere dingen zijn om aan te werken, ben je i.m.o. verkeerd bezig.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
Verwijderd schreef op zaterdag 14 november 2009 @ 22:39:
Heeft dat een nut of is dat alleen maar om ons te pesten? >:)
De hele interface is Engelstalig en daar is K voor zwart gebruikelijk (als in CMYK). Zelf dacht ik altijd vanwege black maar dat blijkt dus niet juist te zijn. :+ Het is vrij arbitrair welke letters je gebruikt natuurlijk; ik neem aan dat iedereen ze gewoon naar een getal 0..3 (of 1..4) parset dus dan maakt 't weinig uit, zolang maar duidelijk is welke letters er gebruikt worden (welke letters met welke kleuren corresponderen maakt niet eens uit, als je 't maar consequent doorvoert).

Acties:
  • 0 Henk 'm!

Verwijderd

Toch maar een poging gedaan, mijne is te vinden op:
http://www.guidohendriks.nl/got/rummikub/

Werkt met zowel GET als POST.

Hij is nog wel dom, speelt alles wat hij kan en schuift nog niet met wat op tafel ligt, dus het is nog niks eigenlijk. Maar ik ga hem nog verder updaten op dezelfde url. :)

[ Voor 192% gewijzigd door Verwijderd op 15-11-2009 10:59 ]


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:39

Onbekend

...

Ik heb mijn speler iets aangepast zodat er wat meer stenen gespeeld kunnen worden.
Helaas blijf ik regelmatig met 1 of 2 stenen zitten waar mijn geprogrammeerde algoritme niets mee kan. :(

De spelers van EdwinG en qanar sparen soms veel stenen op terwijl er combinaties genoeg zijn. Hierdoor kunnen de andere spelers weinig anders dan pakken en is de pakstapel snel leeg. :)

Ik ben benieuwd naar de resultaten vanavond.

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 09-09 16:54
Onbekend schreef op zondag 15 november 2009 @ 17:49:
De spelers van EdwinG en qanar sparen soms veel stenen op terwijl er combinaties genoeg zijn. Hierdoor kunnen de andere spelers weinig anders dan pakken en is de pakstapel snel leeg. :)
Mijn speler kan inderdaad nog lang niet met alle situaties overweg. De belangrijkste is het vinden van 'beschikbare' stenen. Oftewel, als ergens 4 dezelfde cijfers liggen als groep zal mijn (huidige) speler niet proberen om hier een steen uit te pakken om een nieuwe combinatie te maken. Daar werk ik nog aan. (al denk ik niet dat dit vandaag nog gaat lukken)

Overigens, de laatste tests resulteerden bij mij wel regelmatig in een spel waar een duidelijke winnaar (leeg bord) was, ondanks 4x mijn eigen speler.

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • qanar
  • Registratie: Februari 2008
  • Laatst online: 21-05-2019
Yes, ik heb ook gezien dat mijn speler niet altijd een steen wegspeeld, terwijl hij het wel zou kunnen... Maar ik ben dankzij de hints hierboven aan een nieuwe versie bezig, dus eigenlijk is de vorige speler die ik gelinkt heb overbodig geworden.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24

Uitslagen testcompetitie 1

Aangezien we maar met vijf spelers zijn, heb ik een competitie met alle 120 mogelijke permutaties van spelers gerund. Hieronder volgen de resultaten (let op: lage scores zijn beter!) Spelers die met rood zijn aangegeven hebben minsten één zet gefaald in dat potje. Alleen EdwinG en qanar slaagden erin om de competitie foutloos te doorstaan; de anderen hebben nog wat werk te doen. ;)


RondeSpeler 1(score)Speler 2(score)Speler 3(score)Speler 4(score)Details
1EdwinG54GuidoH43Onbekend0Soultaker24html, xml
2EdwinG3GuidoH4Onbekend0qanar18html, xml
3EdwinG23GuidoH49Soultaker0Onbekend43html, xml
4EdwinG67GuidoH32Soultaker0qanar120html, xml
5EdwinG27GuidoH36qanar30Onbekend78html, xml
6EdwinG33GuidoH0qanar56Soultaker11html, xml
7EdwinG28Onbekend41GuidoH40Soultaker0html, xml
8EdwinG29Onbekend61GuidoH42qanar40html, xml
9EdwinG3Onbekend22Soultaker0GuidoH15html, xml
10EdwinG39Onbekend81Soultaker0qanar98html, xml
11EdwinG60Onbekend12qanar84GuidoH16html, xml
12EdwinG20Onbekend27qanar43Soultaker2html, xml
13EdwinG22Soultaker0GuidoH27Onbekend26html, xml
14EdwinG37Soultaker0GuidoH35qanar54html, xml
15EdwinG13Soultaker0Onbekend28GuidoH16html, xml
16EdwinG23Soultaker0Onbekend7qanar50html, xml
17EdwinG54Soultaker0qanar77GuidoH18html, xml
18EdwinG67Soultaker0qanar78Onbekend60html, xml
19EdwinG11qanar17GuidoH0Onbekend14html, xml
20EdwinG56qanar120GuidoH73Soultaker0html, xml
21EdwinG25qanar8Onbekend0GuidoH12html, xml
22EdwinG33qanar47Onbekend14Soultaker0html, xml
23EdwinG82qanar55Soultaker0GuidoH36html, xml
24EdwinG40qanar46Soultaker0Onbekend20html, xml
25GuidoH54EdwinG80Onbekend29Soultaker0html, xml
26GuidoH45EdwinG61Onbekend45qanar74html, xml
27GuidoH25EdwinG46Soultaker0Onbekend38html, xml
28GuidoH11EdwinG7Soultaker0qanar38html, xml
29GuidoH56EdwinG67qanar64Onbekend0html, xml
30GuidoH27EdwinG63qanar72Soultaker0html, xml
31GuidoH65Onbekend27EdwinG59Soultaker0html, xml
32GuidoH68Onbekend32EdwinG32qanar39html, xml
33GuidoH53Onbekend28Soultaker0EdwinG49html, xml
34GuidoH38Onbekend37Soultaker0qanar91html, xml
35GuidoH26Onbekend54qanar71EdwinG34html, xml
36GuidoH31Onbekend71qanar99Soultaker0html, xml
37GuidoH0Soultaker9EdwinG3Onbekend4html, xml
38GuidoH56Soultaker0EdwinG86qanar55html, xml
39GuidoH23Soultaker0Onbekend107EdwinG61html, xml
40GuidoH53Soultaker0Onbekend78qanar59html, xml
41GuidoH47Soultaker0qanar55EdwinG65html, xml
42GuidoH16Soultaker0qanar18Onbekend23html, xml
43GuidoH59qanar84EdwinG7Onbekend88html, xml
44GuidoH24qanar66EdwinG29Soultaker0html, xml
45GuidoH0qanar89Onbekend29EdwinG49html, xml
46GuidoH58qanar69Onbekend32Soultaker0html, xml
47GuidoH13qanar64Soultaker0EdwinG20html, xml
48GuidoH17qanar28Soultaker0Onbekend25html, xml
49Onbekend48EdwinG24GuidoH67Soultaker0html, xml
50Onbekend2EdwinG0GuidoH31qanar13html, xml
51Onbekend36EdwinG77Soultaker0GuidoH53html, xml
52Onbekend5EdwinG8Soultaker0qanar6html, xml
53Onbekend60EdwinG51qanar110GuidoH54html, xml
54Onbekend57EdwinG35qanar45Soultaker0html, xml
55Onbekend36GuidoH59EdwinG65Soultaker0html, xml
56Onbekend0GuidoH71EdwinG14qanar30html, xml
57Onbekend29GuidoH41Soultaker0EdwinG29html, xml
58Onbekend17GuidoH67Soultaker0qanar33html, xml
59Onbekend2GuidoH0qanar13EdwinG1html, xml
60Onbekend26GuidoH25qanar57Soultaker0html, xml
61Onbekend30Soultaker0EdwinG14GuidoH11html, xml
62Onbekend37Soultaker0EdwinG27qanar47html, xml
63Onbekend44Soultaker1GuidoH0EdwinG15html, xml
64Onbekend16Soultaker0GuidoH67qanar90html, xml
65Onbekend4Soultaker0qanar24EdwinG21html, xml
66Onbekend53Soultaker53qanar78GuidoH79html, xml
67Onbekend0qanar39EdwinG38GuidoH13html, xml
68Onbekend51qanar92EdwinG29Soultaker0html, xml
69Onbekend38qanar94GuidoH22EdwinG54html, xml
70Onbekend20qanar98GuidoH15Soultaker0html, xml
71Onbekend13qanar68Soultaker0EdwinG22html, xml
72Onbekend53qanar54Soultaker0GuidoH41html, xml
73Soultaker0EdwinG22GuidoH32Onbekend7html, xml
74Soultaker0EdwinG61GuidoH35qanar85html, xml
75Soultaker0EdwinG9Onbekend16GuidoH39html, xml
76Soultaker0EdwinG68Onbekend61qanar51html, xml
77Soultaker0EdwinG53qanar56GuidoH38html, xml
78Soultaker0EdwinG51qanar63Onbekend23html, xml
79Soultaker0GuidoH20EdwinG9Onbekend23html, xml
80Soultaker0GuidoH23EdwinG20qanar39html, xml

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
RondeSpeler 1(score)Speler 2(score)Speler 3(score)Speler 4(score)Details
81Soultaker0GuidoH40Onbekend29EdwinG16html, xml
82Soultaker0GuidoH16Onbekend52qanar51html, xml
83Soultaker0GuidoH24qanar87EdwinG17html, xml
84Soultaker0GuidoH27qanar47Onbekend11html, xml
85Soultaker0Onbekend20EdwinG23GuidoH67html, xml
86Soultaker0Onbekend28EdwinG14qanar45html, xml
87Soultaker0Onbekend55GuidoH65EdwinG35html, xml
88Soultaker0Onbekend16GuidoH63qanar52html, xml
89Soultaker0Onbekend70qanar113EdwinG63html, xml
90Soultaker0Onbekend54qanar52GuidoH74html, xml
91Soultaker0qanar47EdwinG4GuidoH28html, xml
92Soultaker0qanar3EdwinG4Onbekend6html, xml
93Soultaker0qanar44GuidoH41EdwinG55html, xml
94Soultaker12qanar48GuidoH16Onbekend0html, xml
95Soultaker0qanar85Onbekend116EdwinG59html, xml
96Soultaker0qanar84Onbekend65GuidoH57html, xml
97qanar42EdwinG22GuidoH0Onbekend10html, xml
98qanar62EdwinG56GuidoH48Soultaker0html, xml
99qanar146EdwinG76Onbekend48GuidoH72html, xml
100qanar77EdwinG76Onbekend79Soultaker0html, xml
101qanar27EdwinG14Soultaker0GuidoH14html, xml
102qanar54EdwinG26Soultaker0Onbekend32html, xml
103qanar27GuidoH0EdwinG23Onbekend20html, xml
104qanar71GuidoH36EdwinG45Soultaker0html, xml
105qanar54GuidoH23Onbekend39EdwinG57html, xml
106qanar19GuidoH6Onbekend16Soultaker0html, xml
107qanar65GuidoH43Soultaker0EdwinG85html, xml
108qanar46GuidoH41Soultaker0Onbekend13html, xml
109qanar95Onbekend35EdwinG17GuidoH49html, xml
110qanar74Onbekend45EdwinG24Soultaker0html, xml
111qanar50Onbekend64GuidoH42EdwinG48html, xml
112qanar79Onbekend29GuidoH31Soultaker0html, xml
113qanar135Onbekend74Soultaker0EdwinG64html, xml
114qanar5Onbekend14Soultaker0GuidoH9html, xml
115qanar97Soultaker0EdwinG73GuidoH35html, xml
116qanar92Soultaker0EdwinG50Onbekend25html, xml
117qanar97Soultaker0GuidoH30EdwinG53html, xml
118qanar64Soultaker0GuidoH20Onbekend28html, xml
119qanar84Soultaker0Onbekend24EdwinG20html, xml
120qanar32Soultaker0Onbekend23GuidoH50html, xml

Alle resultaten (html&xml): comp1.zip (625KB)

Eindklassement


PlaatsDeelnemerTotaalscoreAantal gewonnenAantal foutenTijd
TotaalGemiddeldMaximaal
1Soultaker1128915271.546s0.164s0.529s
2Onbekend322871646.659s0.369s8.795s
3GuidoH332982927.177s0.016s1.096s
4EdwinG36031064.334s0.037s1.258s
5qanar581300381.749s0.208s2.379s

[ Voor 6% gewijzigd door Soultaker op 23-11-2009 15:49 ]


Acties:
  • 0 Henk 'm!

  • qanar
  • Registratie: Februari 2008
  • Laatst online: 21-05-2019
Soultaker schreef op zondag 15 november 2009 @ 19:50:
Alleen EdwinG en qanar slaagden erin om de competitie foutloos te doorstaan; de anderen hebben nog wat werk te doen. ;)
Leuk, maar ik verlies wel :-)

Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:39

Onbekend

...

120 spellen in een uur. Dat heb je vlot gedaan. :)
1807 keer heeft mijn speler een request gehad, waarvan er 1x een ongeldige uitvoer is gekomen. Dat vind ik wel een net eindresultaat. :)

Nu die ene fout uitzoeken, en een paar uurtjes vrijmaken om het algoritme uit te breiden.

Edit: Je hebt die spellen tegelijkertijd laten draaien. Nu staat alles door elkaar in m'n logfile. :D

[ Voor 15% gewijzigd door Onbekend op 15-11-2009 20:11 ]

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
Hehe ja, parallellisatie FTW! (Dankzij spelers die lekker doorzetten was 't binnen 20 minuten gepiept.) Wist ik veel dat je aan 't loggen was. :o

Acties:
  • 0 Henk 'm!

  • qanar
  • Registratie: Februari 2008
  • Laatst online: 21-05-2019
Na een hele dag prullen met een andere datastructuur en na met mijn oude code (die in de wedstrijd gebruikt werd) ook een error tegen gekomen te zijn trek ik mij terug.

spoiler:
code staat http://www.qanar.be/programs/rummikub.txt & http://www.qanar.be/programs/rummikub2.txt. Eerste is een bruteforce manier, tweede is leren werken met bitwise operators.

Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 09-09 16:54
Wel opvallend dat de 'foutloze' spelers de slechtste score hadden uiteindelijk. :) Mooie score ook van Soultaker. (Die zal waarschijnlijk oplopen als de verschillen tussen de spelers minder worden.)

Ook ik heb een log bijgehouden. Fouten zal ik er niet mee kunnen opsporen (welke fouten), maar misschien haal ik er wel informatie uit voor betere functies.

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:39

Onbekend

...

Soultaker schreef op zondag 15 november 2009 @ 20:24:
Hehe ja, parallellisatie FTW! (Dankzij spelers die lekker doorzetten was 't binnen 20 minuten gepiept.) Wist ik veel dat je aan 't loggen was. :o
Het was eenvoudig te filteren hoor. Bij elk spel heb ik namelijk weer andere stenen op het bordje.

Ik kom alleen niet uit waarom mijn programma één keer een foute uitvoer heeft geleverd:
http://hell.student.utwen...nscripts/comp1/m0060.html
Dit komt uit mijn logfile:
code:
1
2
Input: yourTiles=R3.B3.K9.B5.B9.B10.K8.B9&table=R13.G13.B13-R13.G13.B13.K13-R12.G12.B12-K11.K12.K13-R11.G11.B11.K11-R10.G10.K10-R9.G9.K9-R8.G8.K8-R7.G7.B7.K7-R6.B6.K6-R5.R6.R7.R8-R4.B4.K4-K2.K3.K4.K5.K6-R2.G2.K2-R1.R2.R3&poolTiles=29&opponentsTiles=3.12.1
Output: K8.K9.K10.K11.K12.K13-R5.R6.R7.R8-K2.K3.K4.K5.K6.K7.K8.K9-R1.R2.R3-R13.G13.B13-R13.G13.B13.K13-R12.G12.B12-R11.G11.B11.K11-B10.G10.R10-B9.G9.R9-R8.G8.K8-B7.G7.R7-R6.B6.K6-R4.B4.K4-R2.G2.K2

Ik kan er zelf geen fout in vinden. Zou je misschien nog een keer willen kijken of mijn uitvoer een fout geeft? Als dat niet het geval is, vermoed ik dat mijn hosting wat langzamer dan 5 seconden reageerde en de uitvoer nog niet compleet op het scherm stond.

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:24
Onbekend schreef op zondag 15 november 2009 @ 21:45:
Dit komt uit mijn logfile:
code:
1
2
Input: yourTiles=R3.B3.K9.B5.B9.B10.K8.B9&table=R13.G13.B13-R13.G13.B13.K13-R12.G12.B12-K11.K12.K13-R11.G11.B11.K11-R10.G10.K10-R9.G9.K9-R8.G8.K8-R7.G7.B7.K7-R6.B6.K6-R5.R6.R7.R8-R4.B4.K4-K2.K3.K4.K5.K6-R2.G2.K2-R1.R2.R3&poolTiles=29&opponentsTiles=3.12.1
Output: K8.K9.K10.K11.K12.K13-R5.R6.R7.R8-K2.K3.K4.K5.K6.K7.K8.K9-R1.R2.R3-R13.G13.B13-R13.G13.B13.K13-R12.G12.B12-R11.G11.B11.K11-B10.G10.R10-B9.G9.R9-R8.G8.K8-B7.G7.R7-R6.B6.K6-R4.B4.K4-R2.G2.K2
Je gebruikt in je uitvoer drie keer een K8, waar komt die derde vandaan terwijl er maar twee in het hele spel voorkomen? :P (Overigens, als je de eerste K8 dropt, die je helemaal niet nodig hebt, dan is je zet wel geldig en ben je vier stenen kwijt!)

Wat voor iedereen wel handig is om te weten: alle informatie die ik heb is in de XML files te vinden. In het geval van een fout staat ook de HTTP response body erbij, en met behulp van de laatste tafelconfiguratie en je eigen stenen zou de situatie meestal wel te reproduceren moeten zijn. (Zoek naar <error> en <response> tags.) Meer informatie dan in de XML files zit heb ik zelf ook niet. :)
Onbekend schreef op zondag 15 november 2009 @ 21:45:
Als dat niet het geval is, vermoed ik dat mijn hosting wat langzamer dan 5 seconden reageerde en de uitvoer nog niet compleet op het scherm stond.
Dan zou je een andere foutmelding gekregen hebben. Er zijn drie typen:
  • RPC failed: als de HTTP request faalt, wat legio redenen kan hebben: domein niet gevonden, webserver niet bereikbaar, reageert niet snel genoeg, of de response status is geen 200 (OK). In de praktijk zijn internal server errors of timeouts het waarschijnlijkst.
  • Syntax error in request response: uitvoer is syntactisch niet in orde; is dus geen draw en voldoet ook niet aan de beschreven tafelsyntax. Dit kan kan gebeuren als PHP bijvoorbeeld warnings print, of als je script helemaal geen uitvoer produceert.
  • Invalid table configuration: als de uitvoer syntactisch geldig is, maar de opgegeven tafel niet gemaakt kan worden omdat er bijvoorbeeld ongeldige groepjes in zitten, je niet alle stenen op tafel gebruikt, je geen stenen toevoegt, of je stenen toevoegt die je niet hebt. Deze fout blijkt in de praktijk het vaakst voor te komen en bij alle gevallen die ik heb gezien ligt de fout dan echt bij de speler. ;)
EdwinG schreef op zondag 15 november 2009 @ 21:39:
Wel opvallend dat de 'foutloze' spelers de slechtste score hadden uiteindelijk. :) Mooie score ook van Soultaker. (Die zal waarschijnlijk oplopen als de verschillen tussen de spelers minder worden.)
Inderdaad, ik zag dat de foute zetten me niet zo veel kostten, omdat m'n speler een paar zetten later gewoon weer wat anders ging spelen. Maar 't is wel lelijk natuurlijk, dus ik ga het nog wel even debuggen komende week. En ik verwacht ook dat de verschillen nog wel wat kleiner worden; nu was ik vaak net als eerste uit wat in absolute zin heel goed lijkt, maar vaak zaten mijn tegenstanders ook nog maar met twee of drie stenen over...

[ Voor 14% gewijzigd door Soultaker op 15-11-2009 22:49 ]

Pagina: 1 ... 3 ... 7 Laatste