logoSQLug.se Challenge officiell hemsida

Start | Tävlingsuppgift 2017 | Skicka in svar | Resultat | Tidigare resultat

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.

CardIDRankSuitStatus
16S
28C
35SS
47H
512HS
611C
72D
811DL
911H
106H
118SL

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
RankSuitStatusKommentar
1DGivaren får ruter ess, för en poängsumma på 1 eller 11
4CGivaren får klöver fyra, för en poängsumma på 5 eller 15
1HGivaren får hjärter ess, för en poängsumma på 6, 16 eller 26. Alternativet 26 avfärdas.
3CSGivaren 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
RankSuitStatusKommentar
11HGivaren får hjärter knekt, för en poängsumma på 10
6HGivaren får hjärter sex, för en poängsumma på 16
8SLGivaren får spader åtta, för en poängsumma på 24 och blir tjock
Exempel på Win
RankSuitStatusKommentar
2HGivaren får hjärter två, för en poängsumma på 2
9SGivaren får spader nio, för en poängsumma på 11
11SWGivaren får spader knekt, för en poängsumma på 21 och vinner på tre kort
Exempel på Black Jack
RankSuitStatusKommentar
13CGivaren får klöver kung, för en poängsumma på 10
1SBGivaren 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:

StatusDeals
B16033
L97229
S204668
W24757

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

CardIDInt, identity(1,1) klustrad primärnyckel
RankTinyint not null
SuitChar(1) not null
StatusChar(1) not null

Tabell: dbo.DealerStatus

StatusChar(1), klustrad primärnyckel
DealsInt 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