I implement the same code (the number of ways to use my hand in blackjack without exhaustive search) in different languages and implementations. One oddity I noticed is that the Python implementation that calls the C partition function is actually a little faster than the entire program written in C. The same is true for other languages (Ada vs Python calling Ada, Nim vs Python call Nim). It seems uninteresting to me - any idea how this is possible?
The code in my GitHub repository is here:
https://github.com/octonion/puzzles/tree/master/blackjack
Here's the C code compiled using 'gcc -O3 results.c'.
#include <stdio.h>
int partitions(int cards[10], int subtotal)
{
int m = 0;
int total;
for (int i = 0; i < 10; i++)
{
if (cards[i] > 0)
{
total = subtotal + i + 1;
if (total < 21)
{
m += 1;
cards[i] -= 1;
m += partitions(cards, total);
cards[i] += 1;
}
else if (total == 21)
{
m += 1;
}
}
}
return m;
}
int main(void)
{
int deck[] =
{ 4, 4, 4, 4, 4, 4, 4, 4, 4, 16 };
int d = 0;
for (int i = 0; i < 10; i++)
{
deck[i] -= 1;
int p = 0;
for (int j = 0; j < 10; j++)
{
deck[j] -= 1;
int n = partitions(deck, j + 1);
deck[j] += 1;
p += n;
}
printf("Dealer showing %i partitions = %i\n", i, p);
d += p;
deck[i] += 1;
}
printf("Total partitions = %i\n", d);
return 0;
}
Here's the C function compiled using 'gcc -O3 -fPIC -shared -o libpartitions.so partitions.c'.
int partitions(int cards[10], int subtotal)
{
int m = 0;
int total;
for (int i = 0; i < 10; i++)
{
if (cards[i] > 0)
{
total = subtotal + i + 1;
if (total < 21)
{
cards[i] -= 1;
m += 1;
m += partitions(cards, total);
cards[i] += 1;
}
else if (total == 21)
{
m += 1;
}
}
}
return m;
}
Python C:
from ctypes import *
import os
test_lib = cdll.LoadLibrary(os.path.abspath("libpartitions.so"))
test_lib.partitions.argtypes = [POINTER(c_int), c_int]
test_lib.partitions.restype = c_int
deck = ([4]*9)
deck.append(16)
d = 0
for i in xrange(10):
deck[i] -= 1
p = 0
for j in xrange(10):
deck[j] -= 1
nums_arr = (c_int*len(deck))(*deck)
n = test_lib.partitions(nums_arr, c_int(j+1))
deck[j] += 1
p += n
print('Dealer showing ', i,' partitions =',p)
d += p
deck[i] += 1
print('Total partitions =',d)