Vinícius Oliveira

I love coding.

Tijolo Java Game

Pequeno joguinho que eu fiz utilizando a biblioteca gráfica 2D do Java.

Demonstração

"Imagem 1"

Código Fonte

Clique aqui

Hermes

O que é ?

É a implementação de um aplicativo com interface específica que funciona como intermediário na comunicação entre portadores de necessidades especiais verbal e auditiva e pessoas ouvintes e falantes.

O projeto

O logotipo do aplicativo representa a letra H feita em libras.

"Imagem 1"

O aplicativo Hermes tem a proposta de auxiliar a comunicação entre pessoas com necessidades especiais, para isso o sistema esta dividido em três módulos: libras,texto e imagens. Na tela inicial, exibem-se botões grandes e com ícones de forma gráfica, para facilitar o entendimento dos usuários que possuem necessidades especiais. Na imagem a seguir, mostra-se a tela inicial do aplicativo.

"Imagem 2"

O primeiro botão da tela inicial direciona para a tela correspondente ao módulo Áudio para Libras , que exibe uma tela com a opção de capturar o áudio. O usuário, ao selecionar o botão localizado no centro da tela deve dizer claramente e próximo ao microfone do dispositivo utilizado, a palavra ou a sentença que deseja que seja convertida para Libras. Na figura a seguir, é mostrado o módulo Áudio para Libras.

"Imagem 3"

O áudio é enviado via Stream para o serviço da API de áudio do Google®. e o retorno dessa chamada é um objeto do tipo String, que será tratado dentro do aplicativo. As letras desse retorno são tratadas individualmente e para cada uma,é exibida a libra correspondente, as imagens ficam localizadas no banco de dados local do próprio aplicativo, como mostra a figura a seguir.

"Imagem 4"

Quando a palavra obtida do retorno tiver um vídeo, ele será exibido no canto inferior direito. Ao selecionar o botão com o ícone de vídeo, o usuário entrará no aplicativo do YouTube© e o vídeo relacionado será exibido, como mostra a figura a seguir.

"Imagem 5"

O segundo botão da tela inicial, direciona o usuário para o módulo Texto para Áudio.Esse módulo contém uma simples caixa de texto, na qual, utilizando o teclado do dispositivo, o usuário informa uma palavra ou sentença e, ao selecionar o botão de reprodução de áudio, a API de áudio do Google® envia um objeto do tipo String e recebe como retorno uma stream com o áudio, que é reproduzida pelo dispositivo utilizando as caixas de som internas. Caso o dispositivo esteja conectado a uma fonte de som externa, o áudio será reproduzido no dispositivo externo. Na a seguir, é mostrado tela do módulo Texto para Áudio.

"Imagem 6"

O segundo botão da tela inicial, direciona o usuário para o módulo Texto para Áudio. Esse módulo contém uma simples caixa de texto, na qual, utilizando o teclado do dispositivo, o usuário informa uma palavra ou sentença e, ao selecionar o botão de reprodução de áudio, a API de áudio do Google® envia um objeto do tipo String e recebe como retorno uma stream com o áudio, que é reproduzida pelo dispositivo utilizando as caixas de som internas. Caso o dispositivo esteja conectado a uma fonte de som externa, o áudio será reproduzido no dispositivo externo. Na imagem a seguir, é mostrado tela do módulo Texto para Áudio.

"Imagem 7"

Ao selecionar o pronome, é reproduzido um áudio referente ao pronome selecionado. O próximo passo é selecionar um verbo entre os três disponíveis:vou, quero e estou, e assim como na tela anterior, o áudio do verbo selecionado é reproduzido instantaneamente. Na imagem a seguir, são mostrados os verbos do módulo Imagem para Áudio.

"Imagem 8"

No último passo do módulo, o usuário escolhe a ação concluindo a frase desejada.Essas ações são obtidas utilizando o Web Service implementado no Hermes,ou seja, para inserir novas ações neste módulo, a aplicação não necessita ser atualizada ou recompilada: ao abrir o aplicativo essa tela é automaticamente atualizada caso exista uma conexão com a internet ativa. Na imagem a seguir, é mostrada a ação que o usuário escolheu.

"Imagem 9"

Com base nas informações de acessibilidade digital para pessoas especiais, o projeto de interface do aplicativo Hermes busca atender e facilitar a interação entre usuário e máquina.

Código Fonte e documentação

Toda a documentação e código fonte do projeto é encontrada aqui.

Programming Challenges - LCD Display

Problem LCD Display

A friend of yours has just bought a new computer. Before this, the most powerful
machine he ever used was a pocket calculator. He is a little disappointed because he
liked the LCD display of his calculator more than the screen on his new computer! To
make him happy, write a program that prints numbers in LCD display style.

Input

The input file contains several lines, one for each number to be displayed. Each line
contains integers s and n, where n is the number to be displayed (0 ≤ n ≤ 99, 999, 999)
and s is the size in which it shall be displayed (1 ≤ s ≤ 10). The input will be terminated
by a line containing two zeros, which should not be processed.

Output

Print the numbers specified in the input file in an LCD display-style using s “-” signs
for the horizontal segments and s “|” signs for the vertical ones. Each digit occupies
exactly s + 2 columns and 2s + 3 rows. Be sure to fill all the white space occupied by
the digits with blanks, including the last digit. There must be exactly one column of
blanks between two digits.
Output a blank line after each number. You will find an example of each digit in the
sample output below.

Solution

(lcd_display.cpp) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <stdio.h>
#include <string.h>

char data_of_numbers[10][5][3];

void init_data_of_numbers();
void print_char_with_count (int, char);
void print_specific_char_for_number(int, char);
void print_char_formatted_lcd(int, char *, int);
void print_space_between_number(int, char *);

int main (){
  init_data_of_numbers();
  int s;
  char number[100];
  while (1){
      scanf (" %d %s",&s,number);
      if (s == 0 && number[0] == '0') break;
      for (int j = 0; j < 5; j++){
          if (j == 0 || j == 2 || j == 4){
              print_char_formatted_lcd(s,number, j);
              printf("\n");
          }else{
              for (int k = 0; k < s; k++){
                  print_char_formatted_lcd(s,number,j);
                 printf("\n");
              }
          }
      }
      printf("\n");
  }

  return 0;
}

void print_char_formatted_lcd(int count , char * number, int j){
  for (int i = 0; i < strlen(number); i++){
      int pos_number = number[i] - '0';
      for (int x = 0; x < 3; x++){
          char choose = data_of_numbers[pos_number][j][x];
          print_specific_char_for_number(count,choose);
      }
      print_space_between_number(i, number);
  }
}

void print_space_between_number(int i , char * number){
  if (i + 1 != strlen(number)){
      printf(" ");
  }
}

void print_specific_char_for_number(int count , char c){
  switch(c){
      case 'S':
          print_char_with_count(1,' ');
          break;
      case 'Y':
          print_char_with_count(count,' ');
          break;
      case '-':
          print_char_with_count(count,'-');
          break;
      case '|':
          print_char_with_count(1,'|');
          break;
  }
}

void print_char_with_count (int count , char c){
  for (int i = 0; i < count; i++){
      printf("%c",c);
  }
}
void init_data_of_numbers(){
  //0
  data_of_numbers[0][0][0] = 'S';data_of_numbers[0][0][1] = '-';data_of_numbers[0][0][2] = 'S';
  data_of_numbers[0][1][0] = '|';data_of_numbers[0][1][1] = 'Y';data_of_numbers[0][1][2] = '|';
  data_of_numbers[0][2][0] = 'S';data_of_numbers[0][2][1] = 'Y';data_of_numbers[0][2][2] = 'S';
  data_of_numbers[0][3][0] = '|';data_of_numbers[0][3][1] = 'Y';data_of_numbers[0][3][2] = '|';
  data_of_numbers[0][4][0] = 'S';data_of_numbers[0][4][1] = '-';data_of_numbers[0][4][2] = 'S';
  //end 0

  //1
  data_of_numbers[1][0][0] = 'S';data_of_numbers[1][0][1] = 'Y';data_of_numbers[1][0][2] = 'S';
  data_of_numbers[1][1][0] = 'S';data_of_numbers[1][1][1] = 'Y';data_of_numbers[1][1][2] = '|';
  data_of_numbers[1][2][0] = 'S';data_of_numbers[1][2][1] = 'Y';data_of_numbers[1][2][2] = 'S';
  data_of_numbers[1][3][0] = 'S';data_of_numbers[1][3][1] = 'Y';data_of_numbers[1][3][2] = '|';
  data_of_numbers[1][4][0] = 'S';data_of_numbers[1][4][1] = 'Y';data_of_numbers[1][4][2] = 'S';
  //end 1

  //2
  data_of_numbers[2][0][0] = 'S';data_of_numbers[2][0][1] = '-';data_of_numbers[2][0][2] = 'S';
  data_of_numbers[2][1][0] = 'S';data_of_numbers[2][1][1] = 'Y';data_of_numbers[2][1][2] = '|';
  data_of_numbers[2][2][0] = 'S';data_of_numbers[2][2][1] = '-';data_of_numbers[2][2][2] = 'S';
  data_of_numbers[2][3][0] = '|';data_of_numbers[2][3][1] = 'Y';data_of_numbers[2][3][2] = 'S';
  data_of_numbers[2][4][0] = 'S';data_of_numbers[2][4][1] = '-';data_of_numbers[2][4][2] = 'S';
  //end2

  //3
  data_of_numbers[3][0][0] = 'S';data_of_numbers[3][0][1] = '-';data_of_numbers[3][0][2] = 'S';
  data_of_numbers[3][1][0] = 'S';data_of_numbers[3][1][1] = 'Y';data_of_numbers[3][1][2] = '|';
  data_of_numbers[3][2][0] = 'S';data_of_numbers[3][2][1] = '-';data_of_numbers[3][2][2] = 'S';
  data_of_numbers[3][3][0] = 'S';data_of_numbers[3][3][1] = 'Y';data_of_numbers[3][3][2] = '|';
  data_of_numbers[3][4][0] = 'S';data_of_numbers[3][4][1] = '-';data_of_numbers[3][4][2] = 'S';
  //end3

  //4
  data_of_numbers[4][0][0] = 'S';data_of_numbers[4][0][1] = 'Y';data_of_numbers[4][0][2] = 'S';
  data_of_numbers[4][1][0] = '|';data_of_numbers[4][1][1] = 'Y';data_of_numbers[4][1][2] = '|';
  data_of_numbers[4][2][0] = 'S';data_of_numbers[4][2][1] = '-';data_of_numbers[4][2][2] = 'S';
  data_of_numbers[4][3][0] = 'S';data_of_numbers[4][3][1] = 'Y';data_of_numbers[4][3][2] = '|';
  data_of_numbers[4][4][0] = 'S';data_of_numbers[4][4][1] = 'Y';data_of_numbers[4][4][2] = 'S';
  //end4

  //5
  data_of_numbers[5][0][0] = 'S';data_of_numbers[5][0][1] = '-';data_of_numbers[5][0][2] = 'S';
  data_of_numbers[5][1][0] = '|';data_of_numbers[5][1][1] = 'Y';data_of_numbers[5][1][2] = 'S';
  data_of_numbers[5][2][0] = 'S';data_of_numbers[5][2][1] = '-';data_of_numbers[5][2][2] = 'S';
  data_of_numbers[5][3][0] = 'S';data_of_numbers[5][3][1] = 'Y';data_of_numbers[5][3][2] = '|';
  data_of_numbers[5][4][0] = 'S';data_of_numbers[5][4][1] = '-';data_of_numbers[5][4][2] = 'S';
  //end5

  //6
  data_of_numbers[6][0][0] = 'S';data_of_numbers[6][0][1] = '-';data_of_numbers[6][0][2] = 'S';
  data_of_numbers[6][1][0] = '|';data_of_numbers[6][1][1] = 'Y';data_of_numbers[6][1][2] = 'S';
  data_of_numbers[6][2][0] = 'S';data_of_numbers[6][2][1] = '-';data_of_numbers[6][2][2] = 'S';
  data_of_numbers[6][3][0] = '|';data_of_numbers[6][3][1] = 'Y';data_of_numbers[6][3][2] = '|';
  data_of_numbers[6][4][0] = 'S';data_of_numbers[6][4][1] = '-';data_of_numbers[6][4][2] = 'S';
  //end6

  //7
  data_of_numbers[7][0][0] = 'S';data_of_numbers[7][0][1] = '-';data_of_numbers[7][0][2] = 'S';
  data_of_numbers[7][1][0] = 'S';data_of_numbers[7][1][1] = 'Y';data_of_numbers[7][1][2] = '|';
  data_of_numbers[7][2][0] = 'S';data_of_numbers[7][2][1] = 'Y';data_of_numbers[7][2][2] = 'S';
  data_of_numbers[7][3][0] = 'S';data_of_numbers[7][3][1] = 'Y';data_of_numbers[7][3][2] = '|';
  data_of_numbers[7][4][0] = 'S';data_of_numbers[7][4][1] = 'Y';data_of_numbers[7][4][2] = 'S';
  //end7

  //8
  data_of_numbers[8][0][0] = 'S';data_of_numbers[8][0][1] = '-';data_of_numbers[8][0][2] = 'S';
  data_of_numbers[8][1][0] = '|';data_of_numbers[8][1][1] = 'Y';data_of_numbers[8][1][2] = '|';
  data_of_numbers[8][2][0] = 'S';data_of_numbers[8][2][1] = '-';data_of_numbers[8][2][2] = 'S';
  data_of_numbers[8][3][0] = '|';data_of_numbers[8][3][1] = 'Y';data_of_numbers[8][3][2] = '|';
  data_of_numbers[8][4][0] = 'S';data_of_numbers[8][4][1] = '-';data_of_numbers[8][4][2] = 'S';
  //end8

  //9
  data_of_numbers[9][0][0] = 'S';data_of_numbers[9][0][1] = '-';data_of_numbers[9][0][2] = 'S';
  data_of_numbers[9][1][0] = '|';data_of_numbers[9][1][1] = 'Y';data_of_numbers[9][1][2] = '|';
  data_of_numbers[9][2][0] = 'S';data_of_numbers[9][2][1] = '-';data_of_numbers[9][2][2] = 'S';
  data_of_numbers[9][3][0] = 'S';data_of_numbers[9][3][1] = 'Y';data_of_numbers[9][3][2] = '|';
  data_of_numbers[9][4][0] = 'S';data_of_numbers[9][4][1] = '-';data_of_numbers[9][4][2] = 'S';
  //end9
}

Programming Challenges - the Trip

Problem The Trip

A group of students are members of a club that travels annually to different lo- cations. Their destinations in the past have included Indianapolis, Phoenix, Nashville, Philadelphia, San Jose, and Atlanta. This spring they are planning a trip to Eindhoven.
The group agrees in advance to share expenses equally, but it is not practical to share every expense as it occurs.
Thus individuals in the group pay for particular things, such as meals, hotels, taxi rides, and plane tickets. After the trip, each student’s expenses are tallied and money is exchanged so that the net cost to each is the same, to within one cent. In the past, this money exchange has been tedious and time consuming.
Your job is to compute, from a list of expenses, the minimum amount of money that must change hands in order to equalize (within one cent) all the students’ costs.

Input

Standard input will contain the information for several trips. Each trip consists of a
line containing a positive integer n denoting the number of students on the trip. This is
followed by n lines of input, each containing the amount spent by a student in dollars
and cents. There are no more than 1000 students and no student spent more than
$10,000.00. A single line containing 0 follows the information for the last trip.

Output

For each trip, output a line stating the total amount of money, in dollars and cents,
that must be exchanged to equalize the students’ costs.

Solution

(the_trip.cpp) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <math.h>

using namespace std;

#define MAX_STUDENT 1000

double student_spent[MAX_STUDENT];
double total_high = 0.0;
double total_low = 0.0;

double sum (int n){
  double result = 0;
  for (int i = 0; i < n; i++){
      result += student_spent[i];
  }
  return result;
}

int main (){
  int  n;
  while (scanf ("%d",&n) != EOF  && n!=0){
      for (int i = 0; i < n; i++){
          scanf ("%lf",&student_spent[i]);
      }
      double avg = sum(n)/n;
      for (int i = 0; i < n; i++){
          double result = student_spent[i] - avg;
          if (result >= 0) total_high+= floor(result*100)/100;
          else total_low -= ceil(result*100)/100;
      }
      printf("$%.2f\n",max(total_low,total_high));
      total_high = 0;
      total_low = 0;
  }
  return 0;
}  

Programming Challenges - Minesweeper

Problem Minesweeper

Have you ever played Minesweeper? This cute little game comes with a certain op- erating system whose name we can’t remember. The goal of the game is to find where all the mines are located within a M × N field.
The game shows a number in a square which tells you how many mines there are adjacent to that square. Each square has at most eight adjacent squares. The 4 × 4 field on the left contains two mines, each represented by a “*” character. If we represent the same field by the hint numbers described above, we end up with the field on the right:

        *...    *100  
        ....    2210  
        .*..    1*10   
        ....    1110  

Input

The input will consist of an arbitrary number of fields. The first line of each field contains two integers n and m (0 < n, m ≤ 100) which stand for the number of lines and columns of the field, respectively. Each of the next n lines contains exactly m characters, representing the field.
Safe squares are denoted by “.” and mine squares by “*,” both without the quotes. The first field line where n = m = 0 represents the end of input and should not be processed.

Output

For each field, print the message Field #x: on a line alone, where x stands for the number of the field starting from 1. The next n lines should contain the field with the “.” characters replaced by the number of mines adjacent to that square. There must be an empty line between field outputs.

Solution

[++] (minesweeper.cpp) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdio.h>
#include <stdlib.h>

using namespace std;

#define M 10000
#define N 10000

char mine[M][N];
int size_m;
int size_n;
int test = 1;

int count_adjacent_mine(int pos_m,int pos_n){
  int count = 0;

  if (pos_m+1 < size_m && mine[pos_m+1][pos_n] == '*'){//0X0
      count++;
  }
  if (pos_m-1 >=0 && mine[pos_m-1][pos_n] == '*'){//0X0
      count++;
  }
  if (pos_m+1 < size_m && pos_n+1 < size_n &&  mine[pos_m+1][pos_n+1] == '*'){ //00X
      count++;
  }
  if (pos_m+1 < size_m && pos_n-1 >=0 &&  mine[pos_m+1][pos_n-1] == '*'){ //00X
      count++;
  }
  if (pos_m-1 >=0  && pos_n+1 < size_n &&  mine[pos_m-1][pos_n+1] == '*'){ //00X
      count++;
  }
  if (pos_m-1 >=0  && pos_n-1 >= 0 && mine[pos_m-1][pos_n-1] == '*'){//X00
      count++;
  }
  if (pos_n+1 < size_n && mine[pos_m][pos_n+1] == '*'){//00X
      count++;
  }
  if (pos_n-1 >=0 && mine[pos_m][pos_n-1] == '*'){//X00
      count++;
  }
  return count;
}

void print_all_count_adjacent_mine(){
   if (test > 1)    printf ("\n");

  printf ("Field #%d:\n",test++);
  for (int i = 0; i < size_m; i++){
      for (int j = 0; j < size_n; j++){
          if (mine[i][j] == '*'){
              printf ("*");
          }else{
              int total = count_adjacent_mine(i,j);
              printf ("%d",total);
          }    
      }
      printf ("\n");
  }
}

int main(){

  while (1){
      scanf ("%d%d",&size_m,&size_n);
      if (size_m == 0 && size_n == 0) break;
      for (int i = 0; i < size_m; i++){
          for (int j = 0; j < size_n; j++){
              scanf (" %c",&mine[i][j]);
          }
      }    
      print_all_count_adjacent_mine();
  }
  return 0;
}

Programming Challenges - the 3n + 1 Problem

Problem The 3n + 1

Consider the following algorithm to generate a sequence of numbers. Start with an integer n. If n is even, divide by 2. If n is odd, multiply by 3 and add 1.Repeat this process with the new value of n, terminating when n = 1. For example, the following sequence of numbers will be generated for n = 22:

22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

It is conjectured (but not yet proven) that this algorithm will terminate at n = 1 for every integer n. Still, the conjecture holds for all integers up to at least 1, 000, 000.
For an input n, the cycle-length of n is the number of numbers generated up to and including the 1. In the example above, the cycle length of 22 is 16. Given any two numbers i and j, you are to determine the maximum cycle length over all numbers between i and j, including both endpoints.

Input

The input will consist of a series of pairs of integers i and j, one pair of integers per line. All integers will be less than 1,000,000 and greater than 0.

Output

For each pair of input integers i and j, output i, j in the same order in which they appeared in the input and then the maximum cycle length for integers between and including i and j. These three numbers should be separated by one space, with all three numbers on one line and with one line of output for each line of input.

Solution

(the_3n_+_1.cpp) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>

using namespace std;

int count_cycle_lenght( int );
int max_cycle_lenght_between(int,int);

int main(){
  int n1;
  int n2;
  while ( (scanf ("%d%d",&n1,&n2))  != EOF){
      int max_cycle = max_cycle_lenght_between(n1,n2);
      printf ("%d %d %d\n",n1,n2,max_cycle);
  }
  return 0;
}

int max_cycle_lenght_between(int n1,int n2){
  int a = min (n1,n2);
  int b = max (n1,n2);
  int max_cycle = 0;

  for ( int i = a; i <= b; i++){
      int result = count_cycle_lenght(i);
      max_cycle = max(result,max_cycle);
  }
  return max_cycle;
}

int  count_cycle_lenght( int n1){
  int count_cycle = 0;
  while (n1 != 1 ){
      if ( (n1 % 2)  == 0){
          n1 /= 2;
      }else{
          n1 *=3;
          n1++;
      }
      count_cycle++;
  }
  count_cycle++; 
  return count_cycle;
}