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.
  7 5845
NOOOOOOOOOOOOOOOOOO-
robhol's Avatar
Hender det blir snakket om tråder som dette, problemet blir å finne oppgaver som passer, ikke er trivielle og ikke for vanskelige.

Tema for denne gangen er terningspillet "Ti tusen". For de som ikke kjenner det, er dette et spill for 2+ spillere der man kaster 6 terninger og får poeng etter gitte regler. Grupper med terninger som gir poeng kan spares, og resten slås på nytt. Hvis man får 0 poeng på et kast, mister man alle poengene man har spart opp den runden. Hvis man har "brukt opp" terningene (alle terninger tilhører en valgt "gruppe") kan man slå alle 6 på nytt. Man kan når som helst stoppe, men må da ta alle poengene i det siste kastet.

Målet er å nå nøyaktig 10 000 - hvis man ender på over 10 000, mister man den runden. Dette gjelder "hele" den maksimale poengsummen for det kastet.

En spiller må opparbeide seg 1000 poeng på én runde (ikke ett kast) for å starte, og får ikke lov å stoppe før 1000. Dette gjelder kun rundene før spilleren har "startet".

Scoring
1: 100 poeng
5: 50 poeng
tre like: 1000 hvis 1-ere, ellers 100 * verdi
flere like: med utgangspunkt i scoren for tre like, dobles scoren for hver ekstra terning
tre par: 1500
full straight: 2000

Der det er mulig å gruppere terninger, skal de grupperes og kan ikke tolkes hver for seg; for eksempel, 1 1 1 er alltid 1000, aldri 300. De resulterende gruppene kan plukkes fritt, og resten av terningene kan slås på nytt. Unntaket er hvis summen av alle gruppene + poengsummen din overstiger 10 000, da mister du poengene du har tjent opp den runden.

Eksempelscoring
1 4 1 6 3 2 - 200
1 1 5 6 3 6 - 250
2 4 3 2 6 2 - 200
2 2 3 2 3 2 - 400
2 2 2 2 3 2 - 800
2 1 2 2 4 6 - 300
1 2 6 4 1 1 - 1000
2 3 2 3 2 3 - 500
2 2 3 3 4 4 - 1500
1 2 3 4 5 6 - 2000

NB: jeg er trøtt, og det er fare for at jeg gjør en jævla dårlig jobb med å forklare dette. Still spørsmål hvis reglene er uklare.

Oppgavene er laget for å bli progressivt vanskeligere, men forskjellen mellom dem varierer. Du gjør selvfølgelig de oppgavene du gidder.

Oppgave 1
Lag et program som regner sammen total poengsum for én terning av gangen i et kast.

Oppgave 2
Lag et program som sjekker om et kast inneholder nøyaktig 3 enere.

Oppgave 3
Lag et program som sjekker om et kast inneholder 3 eller flere av en hvilken som helst verdi.

Oppgave 4
Lag et program som sjekker om et kast består av tre par, og gir ut verdiene disse parene består av.

Oppgave 5
Lag et program som beregner maksimal poengsum for et kast (1-6 terninger)

Og for de som kjeder seg ekstra:

Oppgave 6
Lag et "single-player"-spill basert på disse reglene. Ta imot kast, finn poenggivende grupper og la spilleren velge hvilke som skal spares.

Oppgave 7
Utvid til flere spillere.
Bra initiativ robhol
Jobber med oppgave 7, men slenger ut en enlinjerløsning i python på oppgave 2 for å holde litt liv i tråden mens det kodes.

Kode

from random import randint as r
print "Suksess, 3 enere!" if len([p for p in [r(1,6) for i in range(6)] if p is 1]) is 3 else "Ikke 3 enere"
Sitat av snuskatten Vis innlegg
Bra initiativ robhol
Jobber med oppgave 7, men slenger ut en enlinjerløsning i python på oppgave 2 for å holde litt liv i tråden mens det kodes.

Kode

from random import randint as r
print "Suksess, 3 enere!" if len([p for p in [r(1,6) for i in range(6)] if p is 1]) is 3 else "Ikke 3 enere"
Vis hele sitatet...
Litt pirk: Ikke bruk is for å sjekke likhet, bruk ==. Det fungerer tilfeldigvis i dette tilfellet da tallet er mindre enn 256 (?), da alle (?) disse tallene har sin egen unike ID. Se denne tråden på SO for litt utdypning.
Sitat av steili Vis innlegg
Litt pirk: Ikke bruk is for å sjekke likhet, bruk ==. Det fungerer tilfeldigvis i dette tilfellet da tallet er mindre enn 256
Vis hele sitatet...
Takk for pirk Jeg brukte "is" her kun for syns skyld, det ble litt bedre flow i linja enn med "=="
Jeg har prøvd meg litt fram, men da jeg er ny har jeg tydeligvis ikke helt skjønt tegninga Når jeg prøver å legge sammen verdiene til kastene inn i et array så øker arrayverdien med nærmest vilkårlige mengder. Hvis noen som er litt mer erfaren hadde hatt lyst til å fortelle meg hvor feilen ligger hadde jeg virkelig satt pris på det! Er i javascript forresten da det er dette vi bruker på skolen.

https://jsfiddle.net/o5ekhund/
Sist endret av Da9gr; 21. februar 2017 kl. 16:53.
Sitat av Da9gr Vis innlegg
Jeg har prøvd meg litt fram, men da jeg er ny har jeg tydeligvis ikke helt skjønt tegninga Når jeg prøver å legge sammen verdiene til kastene inn i et array så øker arrayverdien med nærmest vilkårlige mengder. Hvis noen som er litt mer erfaren hadde hatt lyst til å fortelle meg hvor feilen ligger hadde jeg virkelig satt pris på det! Er i javascript forresten da det er dette vi bruker på skolen.

https://jsfiddle.net/o5ekhund/
Vis hele sitatet...
Tok en kjapp gjennomgang. Jeg kan ikke javascript

Kode

#Dette virker første gang, men andre gjennomkjøring vil gi deg første kast, sortert. Tredje gjennomkjøring gir 2 første kast sortert, osv.
for(i=0;i<6;i++){
    resultat.push(Number(Math.floor((Math.random()*6)+1)));
    info.innerHTML += "Du fikk "+resultat[i]+" på terningkast "+(i+1)+"<br>";
                    
#Før andre gjennomkjøring har du sortert resultat og lagt sammen verdiene.
#Her legger du sammen tidligere verdi med alle terningene på nytt. Setter du verdi til 0 først vil det være mer riktig.

for(j=0;j<resultat.length;j++){
    verdi += resultat[j];
}
resultat.sort(function(a, b){return a-b});

#her sjekker du forøvrig om det er 4 eller flere enere, siden resultat[0] er den første. 
#Og siden du sorterer og lagrer alle tidligere kast, vil du få "3 like" når du totalt har fått 4 enere på flere kast.

if(resultat[1]===1&&resultat[2]===1&&resultat[3]===1){
    terning.innerHTML = "swag";
}
Håper jeg ordla meg forståelig.
Og en siste ting, verdien skal ikke være verdien på terningen, men:
Scoring
1: 100 poeng
5: 50 poeng
tre like: 1000 hvis 1-ere, ellers 100 * verdi
flere like: med utgangspunkt i scoren for tre like, dobles scoren for hver ekstra terning
tre par: 1500
full straight: 2000
Sist endret av snuskatten; 21. februar 2017 kl. 23:11.
Sitat av snuskatten Vis innlegg
Tok en kjapp gjennomgang. Jeg kan ikke javascript

Kode

#Dette virker første gang, men andre gjennomkjøring vil gi deg første kast, sortert. Tredje gjennomkjøring gir 2 første kast sortert, osv.
for(i=0;i<6;i++){
    resultat.push(Number(Math.floor((Math.random()*6)+1)));
    info.innerHTML += "Du fikk "+resultat[i]+" på terningkast "+(i+1)+"<br>";
                    
#Før andre gjennomkjøring har du sortert resultat og lagt sammen verdiene.
#Her legger du sammen tidligere verdi med alle terningene på nytt. Setter du verdi til 0 først vil det være mer riktig.

for(j=0;j<resultat.length;j++){
    verdi += resultat[j];
}
resultat.sort(function(a, b){return a-b});

#her sjekker du forøvrig om det er 4 eller flere enere, siden resultat[0] er den første. 
#Og siden du sorterer og lagrer alle tidligere kast, vil du få "3 like" når du totalt har fått 4 enere på flere kast.

if(resultat[1]===1&&resultat[2]===1&&resultat[3]===1){
    terning.innerHTML = "swag";
}
Håper jeg ordla meg forståelig.
Og en siste ting, verdien skal ikke være verdien på terningen, men:
Scoring
1: 100 poeng
5: 50 poeng
tre like: 1000 hvis 1-ere, ellers 100 * verdi
flere like: med utgangspunkt i scoren for tre like, dobles scoren for hver ekstra terning
tre par: 1500
full straight: 2000
Vis hele sitatet...

Takk for at du tar deg tid, selvom javascript ikke er ditt programmspråk jeg skjønte litt av feilene mine nå iallefall, er litt småflau over den array feilen, da jeg burde sett at jeg starta på 1 istedenfor 0 Vet at det ikke helt var i samsvar med oppgaven, men mens jeg holdt på så virka det som en fornuftig ting å prøve å skaffe en "total verdi" og gjennomsnitt osv før jeg eventuelt prøver å legge inn ulike poengsummer. Igjen tusen takk for all hjelpen, skal se om jeg kan få det til nå
Sist endret av Da9gr; 22. februar 2017 kl. 00:35.
▼ ... over en uke senere ... ▼
Takk for et fint initiativ, jeg skal ta dette som en mulighet til å lage mitt første Node-program skrevet med ES6-syntaks! Gutta på jobben har snakket om en JavaScript-revolusjon i et par år nå, så jeg får vel prøve meg litt frem med dette jeg også. JavaScript har mildt sagt utviklet seg mye siden sist jeg holdt på med det, så vi får se hvordan dette går!

Jeg gjorde dette testdrevet, der jeg lagde en del testcaser før jeg lagde den faktiske implementasjonen. Jeg brukte testrammeverket Jasmine, i tilfelle noen lurer.

Jeg må si at jeg faktisk ikke forstår hva det spørres om i oppgave 1, så jeg gikk rett på oppgave 2. Kanskje trådstarter kan prøve å omformulere oppgave 1?

Oppgave 2, programmet:

Kode

const erGyldigListeMedTerningkast = (terningkastListe) => {
  if (!Array.isArray(terningkastListe) || terningkastListe.length !== 6) {
    return false;
  }
  return terningkastListe.every(enkeltkast => Number.isInteger(enkeltkast) && enkeltkast <= 6 && enkeltkast >= 1);
};

const harNøyaktigTreEnere = resultat => resultat[0] === 1 && resultat[1] === 1 && resultat[2] === 1 && resultat[3] !== 1;

const oppgave2 = (terningkastListe) => {
  if (!erGyldigListeMedTerningkast(terningkastListe)) {
    console.error(`Oppgave 2: Avbryter: "${terningkastListe}" er ikke en liste med seks heltall fra og med én til og med seks.`);
    return false;
  }
  const resultat = harNøyaktigTreEnere(terningkastListe.sort());
  console.info(`Oppgave 2: Er det nøyaktig tre enere i følgende liste: [${terningkastListe}]: ${resultat}`);
  return resultat;
};

exports.oppgave2 = oppgave2;
Testcaser:

Kode

const titusen = require('./titusen.js');

describe('titusen', () => {
  describe('oppgave 2: ', () => {
    it('skal retunere false hvis argumentet ikke er en array', () => {
      const terningkastListe = 'jeg er ikke en array';
      expect(titusen.oppgave2(terningkastListe)).toBe(false);
    });
    it('skal retunere false hvis argumentet ikke har nøyaktig seks elementer', () => {
      const terningkastListe = [5, 4, 3, 2, 1];
      expect(titusen.oppgave2(terningkastListe)).toBe(false);
    });
    it('skal retunere false hvis lista har minst én verdi over seks, selv om lista har nøyaktig tre enere', () => {
      const terningkastListe = [5, 1, 3, 7, 1, 1];
      expect(titusen.oppgave2(terningkastListe)).toBe(false);
    });
    it('skal retunere false hvis lista har minst én verdi under én, selv om lista har nøyaktig tre enere', () => {
      const terningkastListe = [5, 1, 0, 2, 1, 1];
      expect(titusen.oppgave2(terningkastListe)).toBe(false);
    });
    it('skal retunere false hvis lista har minst én verdi som er et flyttall', () => {
      const terningkastListe = [5, 1, 1, 4, 1, 2.2];
      expect(titusen.oppgave2(terningkastListe)).toBe(false);
    });
    it('skal retunere false hvis argumentet har tre enere, men de er strenger og ikke heltall', () => {
      const terningkastListe = ['1', '1', '1', '4', '6', '3'];
      expect(titusen.oppgave2(terningkastListe)).toBe(false);
    });
    it('skal retunere false hvis det bare er to enere i lista', () => {
      const terningkastListe = [1, 2, 5, 6, 1, 5];
      expect(titusen.oppgave2(terningkastListe)).toBe(false);
    });
    it('skal retunere false hvis det er ingen enere i lista', () => {
      const terningkastListe = [2, 2, 5, 6, 2, 5];
      expect(titusen.oppgave2(terningkastListe)).toBe(false);
    });
    it('skal retunere false hvis det er fire enere i lista', () => {
      const terningkastListe = [2, 1, 1, 1, 6, 1];
      expect(titusen.oppgave2(terningkastListe)).toBe(false);
    });
    it('skal retunere true hvis det er nøyaktig tre enere først i lista', () => {
      const terningkastListe = [1, 1, 1, 3, 2, 5];
      expect(titusen.oppgave2(terningkastListe)).toBe(true);
    });
    it('skal retunere true hvis det er nøyaktig tre enere i lista, selv om de ikke kommer i riktig rekkefølge', () => {
      const terningkastListe = [2, 1, 5, 1, 2, 1];
      expect(titusen.oppgave2(terningkastListe)).toBe(true);
    });
  });
});
Ved kjøring av testene:

Kode

F:\Code\titusen>npm test

> titusen@1.0.0 test F:\Code\titusen
> node node_modules\jasmine\bin\jasmine titusen.spec.js

Started
Oppgave 2: Avbryter: "jeg er ikke en array" er ikke en liste med seks heltall fra og med én til og med seks.
Oppgave 2: Avbryter: "5,4,3,2,1" er ikke en liste med seks heltall fra og med én til og med seks.
Oppgave 2: Avbryter: "5,1,3,7,1,1" er ikke en liste med seks heltall fra og med én til og med seks.
Oppgave 2: Avbryter: "5,1,0,2,1,1" er ikke en liste med seks heltall fra og med én til og med seks.
Oppgave 2: Avbryter: "5,4,1,1,1" er ikke en liste med seks heltall fra og med én til og med seks.
Oppgave 2: Avbryter: "1,1,1,4,6,3" er ikke en liste med seks heltall fra og med én til og med seks.
Oppgave 2: Er det nøyaktig tre enere i følgende liste: [1,1,2,5,5,6]: false
Oppgave 2: Er det nøyaktig tre enere i følgende liste: [2,2,2,5,5,6]: false
Oppgave 2: Er det nøyaktig tre enere i følgende liste: [1,1,1,1,2,6]: false
Oppgave 2: Er det nøyaktig tre enere i følgende liste: [1,1,1,2,3,5]: true
Oppgave 2: Er det nøyaktig tre enere i følgende liste: [1,1,1,2,2,5]: true


11 specs, 0 failures
Finished in 0.018 seconds