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++: #define _GLIBCXX_DEBUG
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define ALL(v) v.begin(), v.end()
typedef long long ll;

template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }

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

int n,s,cnt;

void dfs(vector<int> A){ 
  
  if(A.size()==n+1){
    int c=0;
    for(int i=1;i<n+1;i++) c+=A[i];
    if(c==s) cnt++;
  }
    
  for(int i=A.back()+1;i<=9;i++){
    A.push_back(i);
    dfs(A);
    A.pop_back();
  }
}


int main(){
  
  while(cin>>n>>s){
    
    if(n==0)break;
    
    cnt=0;
    vector<int> vec(1,-1);
    
    dfs(vec);
    cout<<cnt<<endl;
  }
      
  return 0;
}

C++: #include<iostream>
using namespace std;
int cnt=0,s;
void kumiawase(int i,int n,int ALL){
    for(;i<10;i++){
        if(n==1){
            if(s==ALL+i){
                cnt++;
            }
            continue;
        }
        kumiawase(i+1,n-1,ALL+i);
    }
}

int main()
{
    int n,i=0;
    while(cin>>n>>s){
        if(n==0&&s==0) break;
        if(i==50) break;
        kumiawase(0,n,0);
        cout<<cnt<<endl;
        cnt=0;
        i++;
    }
}

C++: #include <cstdio>

int n, s, res;

void dfs(int prev, int sum, int deep);

int main(void)
{
	while (scanf("%d %d", &n, &s)){
		if (n == 0 && s == 0) break;
		
		res = 0;
		for (int i = 0; i < 10; i++){
			dfs(i, i, 1);
		}
		
		printf("%d\n", res);
	}
	
	return (0);
}

void dfs(int prev, int sum, int deep)
{
	if (sum == s && deep == n) {
		res++;
//		printf("%d %d\n", sum, deep);
		return;
	}
	if (s < sum || n < deep) return;
	
	for (int i = prev + 1; i < 10; i++){
		dfs(i, sum + i, deep + 1);
	}
	
	return;
}

C++: #include<iostream>
using namespace std;
int n,s,o;
void rec(int d,int k,int x){
  if(d>n) return;
  else if(d==n){
    if(x==s) o++;
  }else{
    for(int i=k+1;i<=9;i++){
      rec(d+1,i,x+i);
    }
  }
}
int main(){
  cin >> n >> s;
  while(n!=0){
    o=0;
    rec(0,-1,0);
    cout << o << endl;
    cin >> n >> s;
  }
  return 0;
}

C++: #include <stdio.h>
int n, s, count = 0, digits[10]; // n 個の整数の和がsになる
void dfs(int cur) {              // cur = 0   {}
   if(cur == n) {               // cur = 1   {a}
       int sum = 0;             // cur = 2   {a, b}
       for(int i = 0; i < n; i++) { sum += digits[i]; }
       if(sum == s) { count++; }
       return;
   }
   for(int i = 0; i < 10; i++) {
       digits[cur] = i; // FIXME: 重複を避ける
       dfs(cur+1);  
   }
}
int main(void){
   n = 3; s = 6; count = 0;
   dfs(0);
   printf("%d\n", count);
 scanf("%d",&n);
    scanf("%d",&s);
    printf("%d",count);
  return 0;
}

C++: #include <iostream>
#include <vector>
using namespace std;

vector<bool> used(10, false);
int dfs(int prev, int n, int s){
	if(n==0){
		int sum=0;
		for(int i=0; i<10; i++){
			if(used[i]) sum+=i;
		}
		if(sum==s) return 1;
		else return 0;
	}
	
	int ret=0;
	for(int i=prev+1; i<10; i++){
		used[i] = true;
		ret += dfs(i, n-1, s);
		used[i] = false;
	}
	return ret;
}
int main(){
	while(1){
		int n,s;
		cin >> n >> s;
		if(n==0) break;
		cout << dfs(-1,n,s) << endl;
	}
	return 0;
}

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

int main() {
	ios :: sync_with_stdio(false);
	for(int n, s; cin >> n >> s; ) if(n && s) {
		int p[10];
		iota(p, p + 10, 0);
		int ans = 0;
		do {
			if(accumulate(p, p + n, 0) == s)
				ans ++;
		}while(next_permutation(p, p + 10));
		for(int i = 1; i <= 10 - n; i ++)
			ans /= i;
		for(int i = 1; i <= n; i ++)
			ans /= i;
		cout << ans << '\n';
	} else break;
	return 0;
}

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

#define int				long long
#define FOR( i, m, n )  for( int (i) = (m); (i) < (n); (i)++ )
#define REP( i, n )     FOR( i, 0, n )
#define REPR( i, m )	for( int (i) = (m); (i) >= 0; (i)-- )
#define REPONE( i, n )	FOR( i, 1, n + 1 )
#define ALL( a )        (a).begin(), (a).end()
#define MP				make_pair
#define X				first.first
#define Y				first.second

typedef pair<int, int> P;

template<class T>bool chmax( T& a, const T& b ) { if( a < b ) { a = b; return 1; } return 0; }
template<class T>bool chmin( T& a, const T& b ) { if( a > b ) { a = b; return 1; } return 0; }

const int INF = 1e9;
const int MOD = 1e9 + 7;

int n, s, ans;

bool dfs( int i, int sum, int cnt ) {

	if( i == 10 || cnt == n + 1 ) return false;
	if( sum == s && cnt == n && i == 9 ) return true;

	if( dfs( i + 1, sum + i, cnt + 1 ) ) ans++;
	dfs( i + 1, sum, cnt );
	
}

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

C++: #include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#include <cstdlib>
#include <stack>
#include <queue>
#include <numeric>
#include <ctime>
using namespace std;

// n の最大値
const int MAX_N = 10;
// used[i] := v[i] を選んだかどうか
bool used[MAX_N];
int s, k, ans;

// v の先頭 n 個の要素 から k 個選ぶ組合せの列挙
template<class T>
void comb(const vector<T>& v, vector<T>& c, int n, int k, int pos = 0, int last = -1){
    // 初期化
    if( pos == 0 ) fill(used, used+MAX_N, false);
    
    if( pos == k ){
        // 組合せ c に対する操作
        int sum = 0;
        for(int i=0 ; i < c.size() ; i++ ) sum += c[i];
        if( s == sum ) ans++;
        return ;
    }
    for(int i = last+1 ; i < n ; i++ ){
        if( !used[i] ){
            c.push_back( v[i] );
            used[i] = true;
            comb( v , c , n , k , pos+1 , i );
            c.pop_back();
            used[i] = false;
        }
    }
}

int main(){
    while( cin >> k >> s , k || s ){
        ans = 0;
        vector<int> v(MAX_N), c;
        for(int i=0 ; i < MAX_N ; i++ ) v[i] = i;
        comb( v , c , MAX_N , k );
        cout << ans << endl;
    }
}

C++: #include <stdio.h>
int ans=0, n, m;

void dfs(int i, int s, int sum){
    if(sum == m && s == 0){
        ans++;
        return;
    }
    if(i==10 || s == 0) return;
    dfs(i + 1, s, sum);
    dfs(i + 1, s - 1, sum + i);
}

int main() {
    while(1) {
        scanf("%d %d", &n, &m);
        if(n==m && m==0) break;
        ans=0;
        dfs(0, n, 0);
        printf("%d\n", ans)
    }
    return 0;
}

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

int dfs(int n,int s,int i){
  if(n == 0){
    if(s == 0)return 1;
    else return 0;
  }
  if(s < 0)return 0;
  if(i > 9)return 0;

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

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

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>

int sumOfIntegers(int min, int num, int sum);

int main()
{
    int num, sum;

    while (true) {
        std::cin >> num >> sum;

        if (num == 0 && sum == 0) {
            break;
        }

        std::cout << sumOfIntegers(0, num, sum) << std::endl;
    }

    return 0;
}

int sumOfIntegers(int min, int num, int sum)
{
    if (min > sum || min > 9 || num == 0) {
        return 0;
    }

    if (min == sum && num == 1) {
        return 1;
    }

    return (sumOfIntegers(min + 1, num, sum) + sumOfIntegers(min + 1, num - 1, sum - min));
}