Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  82 6713
Trigonoceps occipita
vidarlo's Avatar
Donor
Oppgava er svært enkel, og basert på spelet Master Mind, med enkelte modifiseringer.

Brettet du skal spele på har her 5 felt bortover, organisert slik:

Kode

|<tall>|<tall>|<tall>|<tall>|<tall>
I tillegg er det uendelig langt. I kvart av felta <tall> vil det vere eit tall mellom 0 og F (heksadesimalt). Det burde gi 16^5 kombinasjoner, altså 1048576. Ved vill gjetting (bruteforce) burde det ta i snitt 524288 forsøk. Imidlertid så skal det gå fint å lage ei god algoritme som løser dette på betydlig færre forsøk.

Oppgava er å lage et program som gjetter seg fram til kombinasjonen av dei 5 talla så fort som mulig, med færrast mulig forsøk. Når programmet blir starta vil det begynne med å printe ei linje med fem valgfrie tall slik:

Kode

A D 2 9 4
Deretter vil "spillet", mastermind, svare med 0, 1 eller 2 for kvart felt. 0 vil sei at tallet er heilt galt. 1 vil sei at tallet finst i koden, men er feil plassert. 2 vil sei at tallet er rett plassert. Dersom vi tenker oss at det tallet vi skal gjette oss fram til er A 0 3 2 9 så vil spillet svare med følgande:

Kode

2 0 1 1 0
som da indikerer at A er rett plassert, D ikkje finst i tallet en skal gjette seg fram til, og at 9 finst, men er feilplassert.

La oss ta et fullt eksempel fram til ferdig løst kode. Det hemmelige tallet vi skal gjette oss fram til er 1 2 3 4 5 her, for enkelheitsskuld.

Kode

$ start MasterMindSolver
M er ditt program sin utdata, S er input til ditt program.
     1 2 3 4 5
M: 9 4 8 1 4
S: 0 1 0 1 0
M: 1 0 4 5 2
S: 2 0 1 1 1
M: 1 2 5 4 3
S: 2 2 1 2 1
M: 1 2 3 4 5
S: 2 2 2 2 2
Når programmet er ferdig skal det printe kor mange forsøk det brukte på å komme fram til rett resultat.

Kjøretid er uviktig, det viktige her er tall forsøk som blir brukt.

Programmet vil bli testa med 10 ulike, tilfeldige, tallsett. Det er gjennomsnittlig tall forsøk i løpet av dei 10 rundane som teller.

Når det gjelder tillate språk så er det veldig enkelt. Eg har eit par vilkår:
  1. Eg skal kunne kjøre det uten alt for mykje bry.
  2. Du kan bruke eksterne bibliotek dersom du vil. I såfall må dei finnast til Linux
  3. Ikkje lag GUI. Eg vil ha tekst-versjon for å automatisere testinga av dei.
  4. Du må skrive ut tall forsøk du brukte på slutten
  5. Kildekoden vere tilgjengelig for meg, ellers vil det ikkje bli kjørt!
  6. Generelt blir eg glad om det blir i ett av følgande språk: c, c++, java, php, perl eller brainfuck. Gigantisk bonus til dei som gjennomfører det i BrainFuck.
Er det en deadline, og er dette en slags konkurranse?
Neither way, I'm in.
kan jeg spørre hvorfor du vil ha et slikt program?
Sitat av Hater_mordin
kan jeg spørre hvorfor du vil ha et slikt program?
Vis hele sitatet...
se på det som en konkuranse med inspirasjon fra bruteforcetråden. =)
Dette er altså forskjellig ved at du får svar som er rettet mot hvert individuelle felt?

Hater_mordin: Det er en programmeringsoppgave (det står i tittelen), og gøy for de som liker programmering og/eller konkurranser. (Vet ikke helt om dette er en konkurranse)
m0b
m0b's Avatar
DonorAdministrator
Ikke akkurat en konkurranse, mest for moro og for å se om man får til selve oppgaven. Det er ikke alltid like enkelt å finne på oppgaver selv, derfor er slike tråder glimrende til akkurat dette.

Hater_mordin: Som Grantax påpeker; det er en morooppgave for for å teste programmeringsferdigheter, ikke et program han trenger i praksis.
Virka kjekkere enn leksene, så jeg prøver meg.

Har fått skrevet selve spillet i Python. Så hvis noen lurer på hvordan det gjøres så kan de ta en titt på koden Skulle ikke være det vanskligeste språket å skrive om. Er vel selve algoritmen som finner koden som skal være "hemmelig", så jeg tror ikke det er så galt å hjelpe folk i vei.

code-taggen takla ikke python sin indentering, så go pastebin: http://www.pastebin.no/2516

Btw... er det noen spesiell grunn til å at du ikke har tatt med python på lista de over språk du foretrekker?
Sist endret av Torstein; 22. august 2007 kl. 22:36.
Sitat av Torstein
Btw... er det noen spesiell grunn til å at du ikke har tatt med python på lista de over språk du foretrekker?
Vis hele sitatet...
Fordi han er n00b.
Java = teh horror.
Jeg tror jeg har en løsning i python nå, vidarlo; irc!.
for the record: startet 22:32.

Btw, kan en "runde" ha duplikate tall?
Sist endret av TheGEEK; 22. august 2007 kl. 23:23.
Trigonoceps occipita
vidarlo's Avatar
Trådstarter Donor
Ei runde kan ha duplikate tall ja. Det er tilfeldig trekt, uavhengig av resten av serien.

Og sjølvsagt kan folk skrive i python, glømte bare å skrive det opp på lista.

Og m0b har nok rett. Det er ingen formell konkuranse, bare ei oppgave eg har tenkt litt på, og er spent på å sjå resultatet. Tenkte å sjå gjennom resultatet om ei ukes tid og kåre "vinneren" i den som har best algoritme.
King of Spooning
Acidous's Avatar
Vil vinneren da bli kåret ut fra gjennomsnittlig antall forsøk som trengs for å knekke koden?
Trigonoceps occipita
vidarlo's Avatar
Trådstarter Donor
Sitat av Acidous
Vil vinneren da bli kåret ut fra gjennomsnittlig antall forsøk som trengs for å knekke koden?
Vis hele sitatet...
Ja. Det er tal forsøk som trengst som tel.
Sitat av Torstein
Virka kjekkere enn leksene, så jeg prøver meg.

Har fått skrevet selve spillet i Python. Så hvis noen lurer på hvordan det gjøres så kan de ta en titt på koden Skulle ikke være det vanskligeste språket å skrive om. Er vel selve algoritmen som finner koden som skal være "hemmelig", så jeg tror ikke det er så galt å hjelpe folk i vei.

code-taggen takla ikke python sin indentering, så go pastebin: http://www.pastebin.no/2516

Btw... er det noen spesiell grunn til å at du ikke har tatt med python på lista de over språk du foretrekker?
Vis hele sitatet...
hm, så på kildekoden din mens jeg lagde selve spillet selv og la merke til noe jeg lurer på...

Vidarlos eksempel:
1 2 3 4 5
M: 9 4 8 1 4
S: 0 1 0 1 0

her tror jeg spillet ditt ville svart "S: 0 1 0 1 1" istedenfor "S: 0 1 0 1 0" pga. at spillet ditt bare sjekker om 4 i "M: 9 4 8 1 4" er der eller ikke. Så spillet ditt sjekker begge firerne i "M: 9 4 8 1 4" og setter 1 som respons på begge de mens vidarlo sin ikke gjør det.

Så det jeg lurer på er om spillet skal svare "S: 0 1 0 1 1" eller "S: 0 1 0 1 0" til "M: 9 4 8 1 4" der løsningen er "1 2 3 4 5".

Dette ble kanskje litt kaotisk, men håper dere skjønner spørsmålet...
Sikkerhetsklarert
jeg ville sagt s: 0 1 0 1 0 ellers vil det jo tolkes som at det skal være 2x 4 i svaret.
Trigonoceps occipita
vidarlo's Avatar
Trådstarter Donor
Pjukern si tolking er heilt rett. Eg tok med et duplikat-eksempel i håp om å få fram nettopp det.
ok, da må nok torstein endre python spille sitt tror jeg. Og jeg må endre mitt, blir jo litt mer stress å skrive det når man må ta med det og... men spillet blir bedre da selvsagt...
Sist endret av gunvar; 23. august 2007 kl. 14:10.
Han må jo ikke endre noenting. Hvis jeg ønsker ett program som tester ut alle 16^5 kombinasjoner, så har jeg jo lov til det. Det programmet kommer dog sannsynligvis ikke til å vinne.....
Limited edition
Moff's Avatar
Noe av poenget er jo å lage det jeg vil kalle AI, mye fordi jeg aldri før har kunnet bruke den sykt kule forkortelsen, slik at programmet eller scriptet lærer av feilene sine - altså oppfatter når det får tallet 1 tilbake. Og 2, for den del. Også 0 da selvsagt. Faktisk alt det som kommer tilbake.
Sist endret av Moff; 23. august 2007 kl. 23:03.
Trigonoceps occipita
vidarlo's Avatar
Trådstarter Donor
Sitat av Moff
Noe av poenget er jo å lage det jeg vil kalle AI, mye fordi jeg aldri før har kunnet bruke den sykt kule forkortelsen, slik at programmet eller scriptet lærer av feilene sine - altså oppfatter når det får tallet 1 tilbake. Og 2, for den del. Også 0 da selvsagt. Faktisk alt det som kommer tilbake.
Vis hele sitatet...
I så fall er ms office AI.

Det at programmet reagerer utifra input er ikkje det som blir kallt AI, ettersom du utmerka godt kan skrive perfekt solver for det problemet der, med statisk, enkel algoritme på få linjer, som alltid gjer predefinerte ting.

Les definisjonen på AI du
Limited edition
Moff's Avatar
The term Artificial Intelligence (AI) was first used by John McCarthy who used it to mean "the science and engineering of making intelligent machines"...
Vis hele sitatet...
Jeg ser ikke noe problem i å kalle dette AI, ettersom programmet, slik jeg ser det, bør eller må kunne lære av det som blir servert tilbake (tallene, altså). Du KAN lage et program som prøver alle kombinasjonene, men det er vel ikke det du leter etter i denne oppgaven?

Forøvrig tukler jeg med noe i PHP nå, blir morsomt å se om jeg klarer å lage noe som faktisk virker...
Sist endret av Moff; 23. august 2007 kl. 23:18.
Trigonoceps occipita
vidarlo's Avatar
Trådstarter Donor
Sitat av Moff
Jeg ser ikke noe problem i å kalle dette AI, ettersom programmet, slik jeg ser det, bør eller må kunne lære av det som blir servert tilbake (tallene, altså). Du KAN lage et program som prøver alle kombinasjonene, men det er vel ikke det du leter etter i denne oppgaven?

Forøvrig tukler jeg med noe i PHP nå, blir morsomt å se om jeg klarer å lage noe som faktisk virker...
Vis hele sitatet...
Den enklaste måten å løyse den oppgava på er med ei fastlagt algoritme, som gjer steg ut frå svaret den får tilbake. Det er ikkje det som blir omtalt som AI, all den tid den ikkje lærer av det, men berre gjer ei heilt fastlagt oppgåve, uten tilfeldige element. Då kan du lage algoritmer som garantert aldri treng meir enn y forsøk.
Er mye bedre/enklere om den kun gir 1 på alle duplikater, hvis ikke vil kompleksiteten øke betydelig.
Holder på med en ny algoritme nå, den forrige var relativt naiv, men løste likevel ofte på rundt 15 forsøk.
Sist endret av TheGEEK; 23. august 2007 kl. 23:34.
med fruktkjøtt.
Tias's Avatar
Crew
Sitat av Moff
Jeg ser ikke noe problem i å kalle dette AI, ettersom programmet, slik jeg ser det, bør eller må kunne lære av det som blir servert tilbake (tallene, altså). Du KAN lage et program som prøver alle kombinasjonene, men det er vel ikke det du leter etter i denne oppgaven?

Forøvrig tukler jeg med noe i PHP nå, blir morsomt å se om jeg klarer å lage noe som faktisk virker...
Vis hele sitatet...
Jeg studerer for tiden AI ved et universitet i Norge. De fire hoveddefinisjonene / hovedgrenene innen kunstig intelligens er for tiden maskiner som tenker som mennesker, tenker rasjonelt, handler som mennesker eller handler rasjonelt. Jeg tror det er ganske far fetched å mene at en slik algoritme som vidarlo etterlyser skal gå under kategorien AI.
Sist endret av Tias; 23. august 2007 kl. 23:46.
Sitat av Moff
Jeg ser ikke noe problem i å kalle dette AI, ettersom programmet, slik jeg ser det, bør eller må kunne lære av det som blir servert tilbake (tallene, altså). Du KAN lage et program som prøver alle kombinasjonene, men det er vel ikke det du leter etter i denne oppgaven?

Forøvrig tukler jeg med noe i PHP nå, blir morsomt å se om jeg klarer å lage noe som faktisk virker...
Vis hele sitatet...
Om man lager en algoritme som prøver alle kombinasjoner er det bruteforcing, fullt mulig men fantastisk lite effektivt. Donald Knuths algoritme (som er en av de mest kjente for å løse Mastermind på maks 5 iterasjoner) er veldig effektiv men det er ikke kunstig intelligens, algoritmen lærer ikke av tidligere oppgaver den har løst men følger et visst sett regler man gir den (som f.eks å ikke bytte ut felter den allerede har fått positiv respons på).

Man kan også implementere oppgaven som en Genetisk Algoritme, dog ser jeg ikke helt poenget (med mindre oppgaven da blir gitt spesifikt med mål om å lære mer om genetiske algoritmer og nevrale nettverk)
Limited edition
Moff's Avatar
Jeg mener fremdeles at inteligens ikke trenger å være mer avansert enn at man er i stand til å bestemme neste handling ut i fra svaret på forrige handling. Det er jo akkurat det som burde skje her.

Jeg velger å tro at en datamaskin ikke er i stand til å tenke selv. Med 'tenke' mener jeg da å komme opp med ting som ikke er basert på svar på tidligere handlinger (beregninger eller sånt).

Ved siden av veien er jeg forsåvidt ikke helt overbevist om at det finnes noen slik ting som det å tenke selv, ettersom de fleste tingene vi gjør er utløst av en slags programmering (nerdete term) vi mennesker har. Vi føler behov for å gjøre noe, og gjør det. Det kommer fra en plass, og alle gjør ulike ting i ulike situasjoner. Det ligger jo i vår personlighet, som igjen er forhåndsbestemt. Om vi velger å endre på den, så er jo det også forhåndsbestemt. Det finnes et godt ord for denne type tankegang - skjebnen.

Alternativ løsning: Du sier 'far fetched', ikke umulig.
m0b
m0b's Avatar
DonorAdministrator
Tias: Jeg mener GA burde være meget bra egnet for nøyaktig dette formålet, jeg leker litt med tanken på å implementere dette og se hvordan det går.
Etter å ha lest skummlest oppgaven så startet jeg å programmere. Problemet er at jeg missforstod oppgaven ^^ Jeg lagte et program hvor brukeren må taste inn forskjellige tallkombinasjoner, for så å prøve å gjette seg frem til svaret. Altså det ganske motsatte av selve oppgaven. Ble så demotivert når jeg så at jeg hadde gjort feil, at jeg gadd ikke lage et nytt. Uansett, legger det ut, hvis noen ønsker å spille ^^Er ikke en veldig dreven programmerer, så jeg fant ikke ut hvordan jeg skulle få skrevet inn hexa tall via scanner klassen, brukte derfor titallssystemet.

http://splaash.org/MasterMind.java

Hvis jeg får tid, så får jeg prøve på den opprinnelige oppgaven i morgen
Sist endret av elite eirik.; 24. august 2007 kl. 01:02.
Holder på med en ny algoritme nå, den forrige var relativt naiv, men løste likevel ofte på rundt 15 forsøk.
Vis hele sitatet...
Det burde vel være et minimum... er ikke det bare å teste 0 0 0 0 0, 1 1 1 1 1, osv. til man finner riktige tall? Jeg har kommet frem til en algoritme som ser ut til å trenge maks 6 forsøk, men jeg har ikke implementert den ennå.
mr_eff: skjønner ikke helt hva du mener med "bare teste .." til man finner riktige tall, som du forklarer det tror jeg nok du vil ende på veldig mange forsøk.

Er veldig mange ting som spiller inn her, hvis man f.eks skal ha en virkelig optimal algoritme må man ta hensyn til at når man har fått en "2" så må man deretter bruke den plassen til å teste utestede tall for å eliminere søkerommet videre.
I tillegg så er vanskelig å si hva som er mest effektivt; bør man teste "kjente" tall på random plasser for å prøve å finne korrekt posisjon eller bør man ha en litt mer random fremgangsmåte?
Veldig mange forsøk? Si at tallet er 0 1 2 3 4:

0 0 0 0 0
0 1 1 1 1
0 1 2 2 2
0 1 2 3 3
0 1 2 3 4

Er vel ikke verre enn det? Og selv om det hadde vært høyere tall der, så burde det vel uansett la seg gjøre på rundt 15 forsøk.
mr_eff: Jeg tror ikke du har forstått oppgaven helt, det er hexadesimale tall, altså kan du ikke gå ut i fra at du treffer rett på første forsøk. Din teori ville vært korrekt om det var 16 tall, ikke 5 man skulle frem til.
Problemet er altså at det er 16 muligheter for hvert tall, men man får kun testet 5 av de om gangen.
Og ja, som du sier så kan en "naiv" algoritme greie det på rundt 15-16 forsøk, derfor skrev jeg jo også at algoritmen jeg først skrev jo var naiv. Jeg brukte da også kun 45 minutter på den.

Jeg er nå ferdig med en algoritme jeg tror er ganske så bra, såvidt jeg kan se så løser den alltid innen 7, som regel 5 eller 6.
Jeg går ut i fra at man får "1" på alle tall som er i svaret, uavhengig av posisjon.
Hvis man skal få "1" og så "0" for duplikater så øker kompleksiteten en god del.

Python-fila (med kun algoritme og endel debugstuff) er forøvrig på rundt 200 linjer, noe som sier endel om kompleksiteten (200 er endel for en ren algoritme skrevet i python)
Sist endret av TheGEEK; 24. august 2007 kl. 08:22.
Trigonoceps occipita
vidarlo's Avatar
Trådstarter Donor
Sitat av Moff
Jeg mener fremdeles at inteligens ikke trenger å være mer avansert enn at man er i stand til å bestemme neste handling ut i fra svaret på forrige handling. Det er jo akkurat det som burde skje her.
Vis hele sitatet...
Well, no er jo AI eit definert faguttrykk og din bruk faller ikkje inn under det folk tenker som på AI.

Å bestemme ei handling ut fra ei anna vil ikkje sei at maskina kan tenke, det vil bare sei at maskina har ei algoritme som tar hensyn til tilbakemelding/input.

AI vil sei at i to kliss like situasjoner kan maskina gjere ulike ting. Dersom den følger samme algoritme kvar gong vil responsen alltid vere lik ved lik input.
Moff: AI er vel at maskina skal kunne _lære_.
En maskin lærer ikke fordi den greier å utføre en algoritme.

Her er da min så langt beste versjon:
http://ninjarape.net/nff1/solve6.py
Tar forbehold om bugs osv(koden er resultatet av nattkoding..;P)
Sist endret av TheGEEK; 24. august 2007 kl. 09:41.
King of Spooning
Acidous's Avatar
Om programmet hadde tatt utgangspunkt i en algoritme man selv har laget, og så endret den til noe programmet selv mener er bedre så kunne jeg nok gått med på at det er AI.
Men slik det er her følger jo bare programmet fastsatte linjer, hvor hvert svar den får tilbake gir et fast reaksjon.
Programmet velger altså ikke selv hva det vil gjøre, det er det programmerer som har gjort.

EDIT: Satt forretsen og prøvde meg litt på detta her i går Klarte å lage det så det gikk på mellom 5-8 forsøk Men så klart er det jo stappfullt i bugs, og ikke spesielt glad i duplikate tall...
Sist endret av Acidous; 24. august 2007 kl. 09:40.
Trigonoceps occipita
vidarlo's Avatar
Trådstarter Donor
No har eg og TheGEEK diskutert litt på IRC om behandling av duplikate tall. I has algoritme var det stor forenkling å anta at tall vil gi 1 uansett om dei forekjem fleire ganger.

Eg er tilbøyelig til å vere einig med han i at det er den realistiske løysinga.

Eksempel
Tallet vi tenker på er 24985
Tallet datamaskina gjetter er 24204
Svaret fra spillet blir då 22101

Håper dette klargjorde ting.
Limited edition
Moff's Avatar
Sitat av vidarlo
AI vil sei at i to kliss like situasjoner kan maskina gjere ulike ting.
Vis hele sitatet...
Høm. Når den gjør ulike handlinger så vil det jo komme av at den allerede har utført forrige handling, og da tydeligvis funnet ut at det ikke var en god ide. Derfor utfører den fremdeles neste handling basert på tidligere erfaringer.

Men for all del; Jeg forstår at AI er et fagutrykk som egentlig ikke er opp til den enkelte å tolke. Jeg gjorde det denne gangen, og som jeg prøver å poengtere; jeg ser ikke noe galt i det.
Sist endret av Moff; 24. august 2007 kl. 10:43.
Trigonoceps occipita
vidarlo's Avatar
Trådstarter Donor
Joda, men gitt samme input vil samme handling bli gjort om du kjører programmet 3000 ganger. I et AI-program vil det vere element av tilfeldigheit.
Sitat av TheGEEK
Jeg går ut i fra at man får "1" på alle tall som er i svaret, uavhengig av posisjon.
Hvis man skal få "1" og så "0" for duplikater så øker kompleksiteten en god del.
Vis hele sitatet...
Egentlig er spørsmålet da hvilken som skal få tallet 1, og hvorfor.
Men er fortsatt ikke enig med deg at man burde ha "1" for alle tall som er i svaret, det blir jo helt feil.

I min kode laget jeg det sånn at den tar den første fra venstre, også lar resten være 0.
Limited edition
Moff's Avatar
I følge vanlige MasterMind-regler er det jo slik det skal gjøres. Det blir mer riktig enn å villede koden med å reagere på flere eksemplarer av samme tall.
mr_eff: Jeg tror ikke du har forstått oppgaven helt, det er hexadesimale tall, altså kan du ikke gå ut i fra at du treffer rett på første forsøk. Din teori ville vært korrekt om det var 16 tall, ikke 5 man skulle frem til.
Vis hele sitatet...
Hva er det du mener jeg ikke har forstått? Jeg er selvfølgelig klar over at det er snakk om hexadesimale tall, derav 15 forsøk (man tester 0 til E, og antar F om man ikke har fått noen treff). Hvor mange tall man skal finne spiller vel ingen rolle, så lenge men kan teste alle samtidig? Jeg går selvfølgelig heller ikke ut i fra at jeg treffer rett på første forsøk, men selv om man begynner med 0 og så inkrementerer hvert tall med én for hvert forsøk, så bør det uansett ikke ta mer enn 15 forsøk for å finne alle tallene.

Nå vet jeg ikke om jeg har tid til å implementere den algoritmen jeg har kommet frem til med det første, men jeg kan jo gi en beskrivelse av den her, i form av et eksempel...

Kode

|    A 0 3 2 9 <-- tallet vi skal frem til
|    ---------
| M: 0 1 2 3 4 | 56789ABCDEF <-- tall som gjenstår å prøve
| S: 1 0 1 1 0 | 023         <-- tall man vet er med i koden
|    - - - - - <-- tallene som er funnet
|
| M: 0 0 0 0 0 | 56789ABCDEF
| S: 1 2 1 1 1 | 23
|    - 0 - - -
|
| M: 2 5 2 2 2 | 6789ABCDEF
| S: 1 0 1 2 1 | 3
|    - 0 - 2 -
|
| M: 3 6 3 7 3 | 89ABCDEF
| S: 1 0 2 0 1
|    - 0 3 2 -
|
| M: 8 9 A B C | DEF
| S: 0 1 1 0 0 | 9A
|    - 0 3 2 -
|
| M: 9 D E F 9
| S: 1 0 0 0 2 | A
|    - 0 3 2 9
|
| M: A 0 3 2 9
| S: 2 2 2 2 2
Jeg vet ikke om det siste der bør telle som ett forsøk, siden det mangler bare ett siffer, og gjenstår bare ett tall, så spillet vet hva koden er uten å måtte teste den.

Hvis spillet treffer rett på ett tall (får "2" første gangen tallet prøves) legges dette tallet til igjen på slutten av rekken med tall som gjenstår å prøve, siden tallet kan dukke opp flere ganger:

Kode

|    0 4 6 0 0
|    ---------
| M: 0 1 2 3 4 | 56789ABCDEF0
| S: 2 0 0 0 1 | 4
|    0 - - - -
|
| M: 5 4 4 4 4 | 6789ABCDEF0
| S: 0 2 1 1 1
|    0 4 - - -
|
| M: 6 7 8 9 A | BCDEF0
| S: 1 0 0 0 0 | 6
|    0 4 - - -
|
| M: B C 6 6 6 | DEF0
| S: 0 0 2 1 1
|    0 4 6 - -
|
| M: D E F 0 0
| S: 0 0 0 2 2
|    0 4 6 0 0
mr_eff:
Ja, som du forklarere det der så ser det greit ut, mulig vi snakket litt forbi hverandre.

Litt av trikset med en optimal algoritme her er dog at man må passe på at man ikke tester et tall på samme plass..

Etter å ha kodet om litt på løsningen min og laget et automatisert system for å genere og teste løsninger så får jeg gjennomsnlittlig 5.93843 forsøk for å få korrekt løsning (100 000 runs).

kodekode: http://ninjarape.net/nff1/solve7.py
Sist endret av TheGEEK; 24. august 2007 kl. 18:15.
Litt av trikset med en optimal algoritme her er dog at man må passe på at man ikke tester et tall på samme plass..
Vis hele sitatet...
Jeg hadde tenkt å bruke en klasse som holder styr på alle de 16 tallene, med ett objekt for hver posisjon, dvs. hvert av de fem tallene. 0 som resultat fjerner det testede tallet fra alle posisjonene, 1 fjerner tallet fra posisjonen hvor tallet ble testet, men legger det til som det første tallet som blir testet i alle andre posisjoner (hvor svaret ikke allerede er funnet), 2 gjør det samme som 1, bortsett fra at det legger til tallet som det siste som blir testet. Eksemplene jeg postet tidligere var en litt forenklet versjon av dette.

Kan du gi en forklaring av hvordan du gjør det? Har ikke peiling på Python, og vil helst slippe å prøve å tyde disse scriptene.
Ja, du tenker iallefall veldig likt meg, jeg og gjorde det på den måten der først, men fant ut at det er enklere/raskere å heller holde styr på hvilke tall som er kjent og hvilke posisjoner man har testet de i. Så genererer man bare alle tall/posisjoner fra tall som ikke er prøvd og trekker så fra alle de tallene/posisjonene man har testet. Da ender man opp med en liste over alle utestede tall/posisjoner.
Så er det bare å prøve.
Er nok mange mulige strategier, men jeg velger å prøve alle "ubekreftede" tall _før_ jeg begynner å prøve mulige posisjoner for kjente tall.
Begynte på det i dag, og er nesten ferdig. Jeg vet ikke om jeg har den beste algoritmen i verden, men jeg gidder ikke være lame å google det.

Siden jeg ikke klarer å takke nei til en utfordring så skal du ikke se langt etter brainfuck versjonen, den kommer faktisk til å bli veldig enkel å omskrive fra programmet jeg har vil jeg tro.
Interessant oppgave!

Noe jeg egentlig har hatt litt i bahodet en stund, men aldri somlet meg til å gjøre.

Er ganske rusten på C++ og php er gresk. Kikket på Brainfuck nå nylig, som jeg aldri har vært borti før, og DET var et treffende navn på programmeringsspråk ja!
Uten at jeg vil love noe, så skal jeg se om jeg og kan hoste opp noe. (IKKE i brainfuck nei)

(Oops, klarte å gi en feil KP her, menmen det var ikke så verst det innlegget heller. Vidarlo's var deaktivert for KP? er litt ny ang KP's..)
Jeg har også begynt. Løsningen min fungerer forsåvidt greit nok allerede, men tror jeg skal fine tune gjetningsalgoritmen min litt før jeg leverer.
Hmm, dersom testinga di skal gå så smertefritt som mulig, har du andre villkår som input via argv, eller antall forsøk til en spesiell output stream?

Jeg har et greit antall forsøk, men programmet trenger en siste touch som jeg tror vil gjøre det ganske mye bedre.
m0b
m0b's Avatar
DonorAdministrator
Grantax: Applikasjonet skal avvente input fra "bruker" som sier 1 2 0 1 0 1 osv - så du trenger kun å avvente input pr iterasjon og tolke det deretter.
Etter å ha lagt inn enda en liten tweak så havner jeg på gjennomsnittlig 5.7787 forsøk ved 10000 runs.
Finnes nok sikkert enda mer å fikse på, men jeg tror ikke jeg gidder legge så mye mer tid i dette nå;P
Sist endret av TheGEEK; 25. august 2007 kl. 15:16.
Ops, nå har jeg misforstått mye, jeg har skrevet delen som gir input til programmet mitt også. :/ Jaja. Blir litt omskriving nå.