Tävlingsuppgift 2015

Kortspelet Black Jack går ut på att komma så nära talet 21 som möjligt utan att bli ”tjock”, det vill säga få över 21. Man måste dessutom ha bättre kort än dealern. Alla större kasinon lagrar alla kort för senare analyser. I årets tävlingsuppgift redovisas bara givarens kort. I tabellen dbo.CardHistory finns alla kort för cirka 2500 blandningar om vardera 8 kortlekar. CardID börjar med 1 och har inga missade värden.

CardID Rank Suit Status
1 6 S
2 8 C
3 5 S S
4 7 H
5 12 H S
6 11 C
7 2 D
8 11 D L
9 11 H
10 6 H
11 8 S L

Reglerna är enkla. Ess räknas som antingen 1 eller 11. Knektar, damer och kungar räknas som 10. Övriga kort räknas som vanligt.

Givaren måste stanna/hålla när poängsumman visar 17, 18, 19 eller 20. Om det finns flera möjliga poängsummor (på grund av ess) så måste givaren stanna om någon av poängsummorna hamnar i intervallet 17-20 (eller 21 eftersom det då blir vinst). I given är det åtta hela kortlekar som används för att dels slippa blanda lekarna så ofta och dels för att försvåra korträkning för spelarna.

Rank

  • 1 – Ess (värt 1 eller 11)
  • 2 – Tvåa (Värt 2)
  • 3 – Trea (Värt 3)
  • 4 – Fyra (Värt 4)
  • 5 – Femma (Värt 5)
  • 6 – Sexa (Värt 6)
  • 7 – Sjua (Värt 7)
  • 8 – Åtta (Värt 8)
  • 9 – Nio (Värt 9)
  • 10 – Tio (Värt 10)
  • 11 – Knekt (Värt 10)
  • 12 – Dam (Värt 10)
  • 13 – Kung (Värt 10)

Suit

  • H – Heart (Hjärter)
  • S – Spades (Spader)
  • D – Diamond (Ruter)
  • C – Club (Klöver)

Status

Uppgiften går ut på att uppdatera kolumnen Status med följande koder:

  • S – Stand (Stanna/håll)
  • L – Loss (Tjock)
  • W – Vinst (kortsumma 21)
  • B – Blackjack (kortsumma 21 på två kort).
Exempel på Stand
Rank Suit Status Kommentar
1 D Givaren får ruter ess, för en poängsumma på 1 eller 11
4 C Givaren får klöver fyra, för en poängsumma på 5 eller 15
1 H Givaren får hjärter ess, för en poängsumma på 6, 16 eller 26. Alternativet 26 avfärdas.
3 C S Givaren får klöver tre, för en poängsumma på 9 eller 19 och måste stanna. Detta eftersom 19 innebär obligatoriskt stopp.
Exempel på Loss
Rank Suit Status Kommentar
11 H Givaren får hjärter knekt, för en poängsumma på 10
6 H Givaren får hjärter sex, för en poängsumma på 16
8 S L Givaren får spader åtta, för en poängsumma på 24 och blir tjock
Exempel på Win
Rank Suit Status Kommentar
2 H Givaren får hjärter två, för en poängsumma på 2
9 S Givaren får spader nio, för en poängsumma på 11
11 S W Givaren får spader knekt, för en poängsumma på 21 och vinner på tre kort
Exempel på Black Jack
Rank Suit Status Kommentar
13 C Givaren får klöver kung, för en poängsumma på 10
1 S B Givaren får spader ess, för en poängsumma på 21 och vinner på två kort

Uppgift

Klicka här för att ladda ned SQL-script så att du kan komma igång med tävlingen.

Du skall skriva en lösning för att beräkna alla utgångar enligt tabellen och i den ordning som CardID visar. Tabellen dbo.CardHistory ska uppdateras enligt beräkningsgrunderna ovan. Dessutom ska tabellen dbo.DealerStatus uppdateras med resultatet av din kod:

Status Deals
B 16033
L 97229
S 204668
W 24757

Tänk på att dbo.DealerStatus kan innehålla andra statuskoder än de som du ska använda.

Collation

Collation på databasen är Finnish_Swedish_100_BIN2. Collation på servern är Finnish_Swedish_CI_AS.

Tabell: dbo.CardHistory

CardID Int, identity(1,1) klustrad primärnyckel
Rank Tinyint not null
Suit Char(1) not null
Status Char(1) not null

Tabell: dbo.DealerStatus

Status Char(1), klustrad primärnyckel
Deals Int not null

Problemkonstruktör

Årets tävlingsuppgift är konstruerad av Peter Larsson.

Utvärdering

Vinnare är det tävlingsbidrag som ger rätt resultat och är snabbast, d v s har lägst exekveringstid (”duration”). Högsta tillåtna antal tävlingsbidrag per deltagare är tre. Tävlingsbidragen testkörs på SQL Server 2016 med senaste officiella CTP på en dator med SSD-disk, 4-kärnig CPU, hyperthreading och 16 GB RAM (varav 12 GB är maxgränsen för SQL Server). Databasen är förberedd för att köra med memory optimized tables, samt tillåter delayed durability.

Tävlingsbidrag består av två delar:

  • Setup-script. I setup-scriptet är det tillåtet att skapa tabeller, index, vyer, funktioner och procedurer. Det är inte tillåtet att göra några som helst förändringar i befintliga tabellerna eller skapa en indexerad vy mot dem. Det är heller inte tillåtet att läsa från befintliga tabeller i setup-scriptet.
  • Lösnings-script. I lösnings-scriptet skall tabellerna uppdateras.

Exekveringstiden mäts endast på Lösnings-scriptet. Setup-scriptet mäts ej.

Obs att mängden testdata kan ökas för att göra tävlingen utslagsgivande.

Klicka här för att lämna ditt tävlingsbidrag