Go: package main

import (
	"bufio"
	"os"
	"strconv"
	"fmt"
)

func solve(a, b, c int) int {
	if a == 1 && b >= c && b < 10 {
		return 1
	}
	if a == 1 {
		return 0
	}
	ret := 0
	for i := c; i < 10 && i < b; i++ {
		ret += solve(a-1, b-i, i+1)
	}
	return ret
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	for {
		scanner.Scan()
		a, _ := strconv.Atoi(scanner.Text())
		if a == 0 {
			break
		}
		scanner.Scan()
		b, _ := strconv.Atoi(scanner.Text())
		fmt.Println(solve(a, b, 0))
	}
}

C++: #include<bits/stdc++.h>
#include<vector>
#include<list>
#include<stack>
#include<queue>
#include<algorithm>
#include<map>
using namespace std;

int main(){
    int mod=1000000007;
    int n,s,ans;
    for (;;) {
        scanf("%d %d",&n,&s);
        ans=0;
        if (n==0) break;
        for (int a=0;a<10-n+1;a++) {
            if (n==1 && a==s) ans++;
            if (n>1){
                for (int b=a+1;b<10-n+2;b++) {
                    if (n==2 && a+b==s) ans++;
                    if (n>2) {
                        for (int c=b+1;c<10-n+3;c++) {
                            if (n==3 && a+b+c==s) ans++;
                            if (n>3) {
                                for (int d=c+1;d<10-n+4;d++) {
                                    if (n==4 && a+b+c+d==s) ans++;
                                    if (n>4) {
                                        for (int e=d+1;e<10-n+5;e++) {
                                            if (n==5 && a+b+c+d+e==s) ans++;
                                            if (n>5) {
                                                for (int f=e+1;e<10-n+6;f++) {
                                                    if (n==6 && a+b+c+d+e+f==s) ans++;
                                                    if (n>6) {
                                                        for (int g=f+1;e<10-n+7;g++) {
                                                            if (n==7 && a+b+c+d+e+f+g==s) ans++;
                                                            if (n>7) {
                                                                for (int h=g+1;e<10-n+8;h++) {
                                                                    if (n==8 && a+b+c+d+e+f+g+h==s) ans++;
                                                                    if (n>8) {
                                                                        for (int i=h+1;e<10-n+9;i++) {
                                                                            if (n==9 && a+b+c+d+e+f+g+h+i==s) ans++;
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }

                                }
                            }
                        }
                    }
                }
            }
        }
        printf("%d\n",ans);    
    }
    return 0;
}

C++: #define _USE_MATH_DEFINES
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdio>
#include<deque>
#include<list>
#include<set>
#include<stack>
#include<string>
#include<sstream>
#include<map>
#include<queue>
#include<vector>
using namespace std;

/*
0 1 2 3 4 5 6 7 8 9

*/

//int a(int n, int s, int f) {
//	int cnt = 0;
//	if (n > 2)
//		for (int i = f; i <= 9; i++) {
//			if (s - i > i)cnt += a(n - 1, s - i, i + 1);
//			else break;
//		}
//	else if (n == 2)
//		for (int i = f; i <= 9; i++) {
//			if (s - i <= 9 && s - i > i)cnt++;
//			else break;
//		}
//	else
//		cnt = 1;
//
//	return cnt;
//}

int a, S;

void dfs(int i, int s, int n) {
	//cout << i << " " << s << " " << n << endl;
	if (s == S&&n == 0) {
		a++;
		return;
	}
	if (i == 10 || n == 0)
		return;

	dfs(i + 1, s + i, n - 1);
	dfs(i + 1, s, n);
}

int main() {
	for (int n; cin >> n >> S && (n || S);) {
		a = 0;
		dfs(0, 0, n);
		cout << a << endl;
	}

	return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;

typedef complex<double> P;

int main(){
	int n,s;
	while(cin >> n >> s and (n or s) ){
		int ans = 0;
		for(int i = 0 ; i < (1<<10) ; i++){
			int c = 0;
			int k = 0;
			for(int j = 0 ; j < 10 ; j++)
				if( i >> j & 1 ) c++, k += j;
			if( c == n and s == k ){
				ans++;
			}
		}	
		cout << ans << endl;	
	}
			
}

C++: // class point	の練習（クラスの高度な実装）
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cmath>
#include <vector>
#include <queue>


typedef long long llong;
using namespace std;

int bitDP[10][110] = { 0 };

int main() {
	for (int i = 0; i < 1024; i++) {
		int present_num = 0;
		int present_i = i;
		int present_cnt = 0;
		int present_sum = 0;
		while (present_num != 10) {
			if (present_i % 2) {
				present_sum += present_num;
				present_cnt++;
			}
			present_num++;
			present_i = present_i >> 1;
		}
		bitDP[present_cnt][present_sum]++;
	}
	int n, s;
	while (1) {
		cin >> n >> s;
		if (n == 0)break;
		cout << bitDP[n][s] << endl;
		
	}
	
	return 0;
}

C++: #include<iostream>

using namespace std;

int dfs(int x,int n,int s){
  
  if(n==0){
    return (s==0);
  }
    
  if(x==10)
    return 0;
  
  int res=0;
  
  for(int i=x;i<=9;++i){
    res+=dfs(i+1,n-1,s-i);
  }
  return res;
}

int main(){
  int n,s;

  while(cin>>n>>s,n,s){
    cout<<dfs(0,n,s)<<endl;
  }
}

C++: #include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <utility>
#include <stack>
#include <functional>
#include <queue>
#include <cmath>

#define rep(i,j,k) for(int i=j;i<k;i++)
#define drep(n,m) for(int i=0;i<n;i++)for(int j=0;j<m;j++)
#define fi first
#define se second
#define vi vector<int>
#define INF 1000000000
#define MOD 1000000009
#define pb push_back
#define mp make_pair
typedef long long ll;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};

using namespace std;

ll gcd(ll a,ll b){
    if(a<b){
        int t=a;a=b;b=t;
    }
    int c=a%b;
    while(c!=0){
        a=b;
        b=c;
        c=a%b;
    }
    return b;
}

ll lcm(ll a,ll b){
    return a*b/gcd(a,b);
}

bool isPrime(int x){
    if(x==1)return false;
    if(x==2)return true;
    if(x%2==0)return false;
    for(int i=3;i<=sqrt(x);i+=2){
        if(x%i==0)return false;
    }
    return true;
}

int kaizyo(int x){
    if(x==1)return x;
    else return x*kaizyo(x-1);
}

vector<int> v(10);
int n,s;
int ans=0;
void dfs(int sum,int ct,int i){
    if(i==10)return;
    if(ct==n && sum==s){
        ans++;
        return;
    }
    dfs(sum+v[i],ct+1,i+1);
    dfs(sum,ct,i+1);
    return;
}
int main() {
    rep(i,0,10)v[i]=i;
    while(1){
        ans=0;
        cin>>n>>s;
        if(n==0&&s==0)break;
        dfs(0,0,0);
        cout<<ans<<endl;
    }
  
    return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;
struct cww{cww(){ios::sync_with_stdio(false);cin.tie(0);}}star;
// i --> 0 - 9までの数字
// sum --> 合計値
// cnt --> 和がSとなる組み合わせの数
// total --> 足す数(N個まで足す)
int N, S, cnt;
void dfs( int i, int sum, int total )
{
    //N回を満たしている 且つ 合計がSに達したものをcountする
    if( total == N && sum == S )
    {
        cnt++;
        return;
    }
    //0-9まで探索したら or 足す回数がN回に達したら 終わり
    if( i == 10 || total == N ) return;
    
    //合計に i を足す場合 -> 足す回数を +1 する
    dfs( i + 1, sum + i, total + 1 );
    //合計に i を足さない場合
    dfs( i + 1, sum, total );
}
int main()
{
    while( cin >> N >> S )
    {
        if( N == 0 && S == 0 ) break;
        //合計値の初期化
        cnt = 0;
        //dfs( 数字の0から, 合計値0から, 足す数字0から)
        dfs( 0, 0, 0 );
        cout << cnt << endl;
    }
    return 0;
}