# Basic

Basic

The programming language Ada has integer constants that look like this: 123, 8#123#, 16#abc#. These constants represent the integers 123, 83 (123 base 8) and 2739 (abc base 16). More precisely, an integer may be a decimal integer given as a sequence of one or more digits less than 10, or it may be an integer to some specific base, given as the base followed by a sequence of one or more digits less than the base enclosed by # symbols. Lower case letters from a through f are used as the digits representing 10 through 15. In Ada, the base, if specified, must be a sequence of decimal digits. For this problem, however, the base may be of any form described above so long as it represents an integer between 2 and 16 inclusive.

The first line of input contains a positive integer n. n lines follow. For each line of input, output a line "yes" if it is a valid integer constant according to the above rules; otherwise output a line containing "no". Input lines contain no spaces and are between 1 and 80 characters in length.

``````5
2#101#
2#101##123#
17#abc#
16#123456789abcdef#
16#123456789abcdef#123456789abcdef#
``````

``````yes
yes
no
yes
no
``````

``````#include <stdio.h>

int i,j,k,m,n;
char buf;

int state;
double base, val;

int v;

#define check(x) if (!(x)) {printf("no\n");goto bad;}

#define DSTART 1
#define DEC 2
#define BSTART 3
#define BASE 4
#define BDONE 5

main(){
for (i=0;i<255;i++) v[i] = -1;
for (i=0;i<=9;i++) v[i+'0'] = i;
for (i=0;i<=5;i++) v[i+'a'] = i+10;
scanf("%d",&n);
gets(buf);
while (n--) {
if (!gets(buf)) {
printf("Error - short input!\n");
exit(1);
}
state = DSTART;
val = base = 0;
for (i=0;buf[i];i++) {
char c = buf[i];
switch(state) {
case DSTART: {
check(v[c] >=0 && v[c] <= 9);
val = v[c];
state = DEC;
break;
}
case DEC: {
if (c == '#') {
check(val >= 2 && val <= 16);
base = val;
val = 0;
state = BSTART;
break;
}
check (v[c] >= 0 && v[c] <= 9);
val = val * 10 + v[c];
break;
}
case BSTART: {
check (v[c] >= 0 && v[c] < base);
val = v[c];
state = BASE;
break;
}
case BASE: {
if (c == '#') {
state = BDONE;
break;
}
check (v[c] >= 0 && v[c] < base);
val = val * base + v[c];
break;
}
case BDONE: {
check (c == '#');
check (val >=2 && val <= 16);
base = val;
val = 0;
state = BSTART;
break;
}
}
}
check(state == DEC || state == BDONE);
printf("yes\n");
}
if (gets(buf)) printf("Error - excessinput!\n");
}``````

``````#include <stdio.h>

int i,j,k,m,n;
char buf;

int state;
double base, val;

int v;

#define check(x) if (!(x)) {printf("no\n");goto bad;}

#define DSTART 1
#define DEC 2
#define BSTART 3
#define BASE 4
#define BDONE 5

main(){
for (i=0;i<255;i++) v[i] = -1;
for (i=0;i<=9;i++) v[i+'0'] = i;
for (i=0;i<=5;i++) v[i+'a'] = i+10;
scanf("%d",&n);
gets(buf);
while (n--) {
if (!gets(buf)) {
printf("Error - short input!\n");
exit(1);
}
state = DSTART;
val = base = 0;
for (i=0;buf[i];i++) {
char c = buf[i];
switch(state) {
case DSTART: {
check(v[c] >=0 && v[c] <= 9);
val = v[c];
state = DEC;
break;
}
case DEC: {
if (c == '#') {
check(val >= 2 && val <= 16);
base = val;
val = 0;
state = BSTART;
break;
}
check (v[c] >= 0 && v[c] <= 9);
val = val * 10 + v[c];
break;
}
case BSTART: {
check (v[c] >= 0 && v[c] < base);
val = v[c];
state = BASE;
break;
}
case BASE: {
if (c == '#') {
state = BDONE;
break;
}
check (v[c] >= 0 && v[c] < base);
val = val * base + v[c];
break;
}
case BDONE: {
check (c == '#');
check (val >=2 && val <= 16);
base = val;
val = 0;
state = BSTART;
break;
}
}
}
check(state == DEC || state == BDONE);
printf("yes\n");