// Jeffrey Lu

// Holmdel High School

// Senior 3 Division

// 2012-2013 Contest #4

 

import java.io.*;

import java.util.*;

 

//2S 2C 3C 4C 5C 6C 9D

 

// 4H 5H 6H 8C 8S JD JC

// 3H 7H JS 3C AH

// AH 3D JS QH 2C

// 7H 8H JS 8D AS

// 2C 5D 7S 9H TC

// 3H 7H 8D JS AH

 

class Rummy

{

      public static void main(String[] args) throws IOException

      {

            BufferedReader kb = new BufferedReader(new InputStreamReader(System.in));

            ArrayList<Integer> values = new ArrayList<Integer>();

            ArrayList<Integer> suits = new ArrayList<Integer>();

 

            final int row = 4;

            final int col = 13;

 

            int[][] hand = new int[row][col];

 

 

            System.out.println("Please enter the 7 cards in the player's hand: ");

            StringTokenizer str1 = new StringTokenizer(kb.readLine(), ", ");

            while (str1.hasMoreTokens())

            {

                  String card = str1.nextToken();

                  hand[valueOf(card.charAt(1))][valueOf(card.charAt(0))] = 1;

            }

 

            for (int l = 0; l < 5; l++)

            {

                  int[][] deck = new int[row][col];

                  for (int i = 0; i < row; i++)

                        for (int j = 0; j < col; j++)

                              deck[i][j] = hand[i][j];

 

                  System.out.println("Please enter the 5 remaining cards in the deck: ");

                  StringTokenizer str2 = new StringTokenizer(kb.readLine(), ", ");

                  boolean flag = false;

                  for (int i = 0; i < 5; i++)

                  {

                        if (shouldTerminate(deck, row, col))

                        {

                              flag = true;

                              break;

                        }

 

                        //terminating condition

                        String card = str2.nextToken();

                        int r = valueOf(card.charAt(1));

                        int c = valueOf(card.charAt(0));

 

                        deck[r][c] = 1;

                        if (makeSet(deck, row, col, c) || makeRun(deck, row, col, r, c))

                        {

                              // remove minimal card

                              RemoveMin(deck, row, col);

                        }

                        else

                        {

                              // don't add

                              deck[r][c] = 0;

                        }

                  }

 

                  if (!flag)

                        PrintAll(deck, row, col);

            }

 

      }

 

 

 

      public static void printDeck(int[][] deck, int row, int col)

      {

            for (int i = 0; i < row; i++)

                  for (int j = 0; j < col; j++)

                        if (deck[i][j] == 1)

                              System.out.print(CharOf(j, false) + "" + CharOf(i, true) + " ");

 

            System.out.println();

      }

 

 

 

      public static boolean makeSet(int[][] deck, int row, int col, int c)

      {

            int count = 0;

            for (int i = 0; i < row; i++)

            {

                  if (deck[i][c] == 1)

                        count++;

            }

 

            return (count == 3 || count == 4);

      }

 

 

      public static boolean makeRun(int[][] deck, int row, int col, int r, int c)

      {

 

            int count = 0;

            int max = 0;

            int min = 100;

            for (int x = 0; x < col; x++)

            {

                  if ((deck[r][x] == 1) && !makeSet(deck, row, col, x))

                  {

                        count++;

                        if (x < min)

                        {

                              min = x;

                        }

                        if (x > max)

                        {

                              max = x;

                        }

                  }

            }

 

            //printDeck(deck, row, col);

            //System.out.println("min = " + min + " max = " + max);

            return ((count == 3 || count == 4) && (count == (max - min + 1)));

 

 

 

 

            /*

            int l = c;

            while (l >= 0 && deck[r][l] != 0) l--;

 

            int count = 0;

            for (int i = l + 1; i < col && deck[r][i] != 0; i++)

            {

                  count++;

            }

 

            return (count == 3 || count == 4);

            */

      }

 

 

      public static void RemoveMin(int[][] deck, int row, int col)

      {

            boolean found = false;

            for (int c = 0; c < col; c++)

            {

                  for (int i = row - 1; i >= 0; i--)

                  {

                        if (deck[i][c] == 1)

                        {

                              if (!makeSet(deck, row, col, c) && !makeRun(deck, row, col, i, c))

                              {

                                    deck[i][c] = 0;

                                    return;

                              }

                        }

                  }

            }

 

            if (!found)

            {

                  for (int c = 0; c < col; c++)

                  {

                        for (int i = row - 1; i > 0; i--)

                        {

                              if (deck[i][c] == 1)

                              {

                                    deck[i][c] = 0;

                                    return;

                              }

                        }

                  }

            }

      }

 

 

      public static boolean shouldTerminate(int[][] deck, int row, int col)

      {

            ArrayList<String> handArray = new ArrayList<String>();

            for (int c = 0; c < col; c++)

            {

                  for (int r = row - 1; r >= 0; r--)

                  {

                        if (deck[r][c] == 1)

                        {

                              handArray.add(CharOf(c, false) + "" + CharOf(r, true));

                        }

                  }

            }

 

            outer: for (int x = 0; x < 7; x++)

            {

                  for (int y = x + 1; y < 7; y++)

                  {

                        for (int z = y + 1; z < 7; z++)

                        {

                              ArrayList<String> handArrayTemp = new ArrayList<String>();

                              ArrayList<String> temp = new ArrayList<String>();

                              for (int i = 0; i < handArray.size(); i++)

                              {

                                    handArrayTemp.add(handArray.get(i));

                              }

                              temp.add(handArrayTemp.get(x));

                              temp.add(handArrayTemp.get(y));

                              temp.add(handArrayTemp.get(z));

                              handArrayTemp.remove(z);

                              handArrayTemp.remove(y);

                              handArrayTemp.remove(x);

                              if ((isSet(temp) || isRun(temp)) && (isSet(handArrayTemp) || isRun(handArrayTemp)))

                              {

                                    if (isSet(handArrayTemp))

                                    {

                                          for (int m = handArrayTemp.size() - 1; m >= 0; m--)

                                          {

                                                System.out.print(handArrayTemp.get(m) + " ");

                                          }

                                    }

                                    else

                                    {

                                          for (int m = 0; m < handArrayTemp.size(); m++)

                                          {

                                                System.out.print(handArrayTemp.get(m) + " ");

                                          }

                                    }

 

                                    if (isSet(temp))

                                    {

                                          for (int m = temp.size() - 1; m >= 0; m--)

                                          {

                                                System.out.print(temp.get(m) + " ");

                                          }

                                    }

                                    else

                                    {

                                          for (int m = 0; m < temp.size(); m++)

                                          {

                                                System.out.print(temp.get(m) + " ");

                                          }

                                    }

 

                                    System.out.println();

                                    return true;

                              }

                        }

                  }

            }

            return false;

      }

 

 

      public static boolean isSet (ArrayList<String> a)

      {

            char value = a.get(0).charAt(0);

            for (String s: a)

            {

                  if (s.charAt(0) != value)

                  {

                        return false;

                  }

            }

            return true;

      }

 

 

      public static boolean isRun (ArrayList<String> a)

      {

            char suit = a.get(0).charAt(1);

            int counter = 0;

            int max = valueOf(a.get(0).charAt(0));

            int min = valueOf(a.get(0).charAt(0));

            for (String s: a)

            {

                  if (s.charAt(1) == suit)

                  {

                        counter++;

                  }

                  if (valueOf(s.charAt(0)) > max)

                  {

                        max = valueOf(s.charAt(0));

                  }

                  if (valueOf(s.charAt(0)) < min)

                  {

                        min = valueOf(s.charAt(0));

                  }

            }

            if (counter == a.size() && a.size() == max - min + 1)

            {

                  return true;

            }

            return false;

      }

 

 

      public static void PrintAll(int[][] deck, int row, int col)

      {

            Print4Run(deck, row, col);

            Print4Set(deck, row, col);

            Print3Run(deck, row, col);

            Print3Set(deck, row, col);

            PrintOthers(deck, row, col);

            System.out.println();

      }

 

 

      public static void Print4Run(int[][] deck, int row, int col)

      {

            for (int r = 0; r < row; r++)

            {

                  int count = 0;

                  int start = -1;

                  for (int c = 0; c < col; c++)

                  {

                        if (deck[r][c] == 1)

                        {

                              if (start == -1)

                                    start = c;

                              count++;

                        }

                        else

                        {

                              start = -1;

                              count = 0;

                        }

 

                        if (count == 4)

                        {

                              for (int i = start; i < start + count; i++)

                              {

                                    System.out.print(CharOf(i, false) + "" + CharOf(r, true) + " ");

                                    deck[r][i] = 0;

                              }

                              return;

                        }

                  }

            }

      }

 

 

      public static void Print3Run(int[][] deck, int row, int col)

      {

            for (int r = 0; r < row; r++)

            {

                  int count = 0;

                  int start = -1;

                  for (int c = 0; c < col; c++)

                  {

                        if (deck[r][c] == 1)

                        {

                              if (start == -1)

                                    start = c;

                              count++;

                        }

                        else

                        {

                              start = -1;

                              count = 0;

                        }

 

                        if (count == 3)

                        {

                              for (int i = start; i < start + count; i++)

                              {

                                    System.out.print(CharOf(i, false) + "" + CharOf(r, true) + " ");

                                    deck[r][i] = 0;

                              }

 

                              // continue to see if there is another run

                              start = -1;

                              count = 0;

                        }

                  }

            }

      }

 

 

      public static void Print4Set(int[][] deck, int row, int col)

      {

            for (int c = 0; c < col; c++)

            {

                  int count = 0;

                  for (int r = 0; r < row; r++)

                  {

                        if (deck[r][c] == 1)

                        {

                              count++;

                        }

                  }

 

                  if (count == 4)

                  {

                        for (int i = 0; i < count; i++)

                        {

                              System.out.print(CharOf(c, false) + "" + CharOf(i, true) + " ");

                              deck[i][c] = 0;

                        }

                        return;

                  }

            }

      }

 

 

      public static void Print3Set(int[][] deck, int row, int col)

      {

            for (int c = 0; c < col; c++)

            {

                  int count = 0;

                  for (int r = 0; r < row; r++)

                  {

                        if (deck[r][c] == 1)

                        {

                              count++;

                        }

                  }

 

                  if (count == 3)

                  {

                        for (int r = 0; r < row; r++)

                        {

                              if (deck[r][c] == 1)

                              {

                                    System.out.print(CharOf(c, false) + "" + CharOf(r, true) + " ");

                                    deck[r][c] = 0;

                              }

                        }

                  }

            }

      }

 

 

      public static void PrintOthers(int[][] deck, int row, int col)

      {

            for (int c = col - 1; c > 0; c--)

            {

                  for (int r = 0; r < row; r++)

                  {

                        if (deck[r][c] == 1)

                        {

                              System.out.print(CharOf(c, false) + "" + CharOf(r, true) + " ");

                              deck[r][c] = 0;

                        }

                  }

            }

      }

 

 

      public static int valueOf(char c)

      {

            int v = 0;

            switch (c)

            {

                  case 'A':

                        v = 1;

                        break;

                  case 'T':

                        v = 10;

                        break;

                  case 'J':

                        v = 11;

                        break;

                  case 'Q':

                        v = 12;

                        break;

                  case 'K':

                        v = 13;

                        break;

                  case 'S':

                        v = 1;

                        break;

                  case 'H':

                        v = 2;

                        break;

                  case 'C':

                        v = 3;

                        break;

                  case 'D':

                        v = 4;

                        break;

                  default:

                        v = c - '0';

                        break;

            }

            return (v - 1);

      }

 

      public static char CharOf(int v, boolean isSuit)

      {

            char c = '0';

            v++;

            if (isSuit)

            {

                  switch (v)

                  {

 

                        case 1:

                              c = 'S';

                              break;

                        case 2:

                              c = 'H';

                              break;

                        case 3:

                              c = 'C';

                              break;

                        case 4:

                              c = 'D';

                              break;

                        default:

                              break;

                  }

            }

            else

            {

                  switch (v)

                  {

                        case 1:

                              c = 'A';

                              break;

                        case 10:

                              c = 'T';

                              break;

                        case 11:

                              c = 'J';

                              break;

                        case 12:

                              c = 'Q';

                              break;

                        case 13:

                              c = 'K';

                              break;

 

                        default:

                              c = (char)(v + '0');

                              break;

                  }

            }

            return c;

      }

}