Hi! I’ve recently started learning C and I’ve been getting stuck on the basic tasks cuz I keep overcomplicating them T-T Could anyone please help me with this specific task?

Problem Statement

You have a digit sequence S of length 4. You are wondering which of the following formats S is in:

  • YYMM format: the last two digits of the year and the two-digit representation of the month (example: 01 for January), concatenated in this order
  • MMYY format: the two-digit representation of the month and the last two digits of the year, concatenated in this order

If S is valid in only YYMM format, print YYMM; if S is valid in only MMYY format, print MMYY; if S is valid in both formats, print AMBIGUOUS; if S is valid in neither format, print NA.

Constraints
- S is a digit sequence of length 4.

Sample Input 1
1905

Sample Output 1
YYMM
May XX19 is a valid date, but 19 is not valid as a month. Thus, this string is only valid in YYMM format.

Sample Input 2
0112

Sample 2
AMBIGUOUS
Both December XX01 and January XX12 are valid dates. Thus, this string is valid in both formats.

Sample Input 3
1700

Sample Output 3
NA
Neither 0 nor 17 is valid as a month. Thus, this string is valid in neither format.

The code I wrote for this is:

#include <stdio.h>

int main(){
    int S;
    scanf("%d", &S);
    int p1 = S/100;
    int p2 = S%100;
    if (p1!=0 && p1<=12){
        if(p2!=0 && p2<=12){
            printf("AMBIGUOUS");
        }
        else if (p2>=13){
            printf("MMYY");
        }
        else{
            printf("NA");
        }
    }
    else if (p1>=13){
        
        if(p2!=0 && p2<=12){
            printf("YYMM");
        }
        else {
            printf("NA");
        }
    }
   return 0;
}

It passed the 7 checks in the system, but failed on the 8th and I have no idea what kind of values are on the 8th check… Thanks to anyone for reading this far!

  • yris@lemmy.zipOP
    link
    fedilink
    English
    arrow-up
    1
    ·
    1 month ago

    Yeah, it worked, thanks a lot!! Could you explain what deducing 48 out of h and l does? I don’t want to just copy and forget abt this(no pressure, you already helped a lot!!!)

    • BB_C@programming.dev
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      1 month ago

      '0'..'9' (characters in ASCII) are (0+48)..(9+48) when read as integer values.

      For readability you can do:

        unsigned char zero = '0';
        int h = getchar() - zero;
        int l = getchar() - zero;
      

      And as I mentioned in another comment, if this was serious code, you would check that both h and l are between 0 and 9.

      Note that one of the stupid quirks about C is that char is not guaranteed to be unsigned in certain implementations/architectures. So it’s better to be explicit about expecting unsigned values. This is also why man 3 getchar states:

      fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.

      getchar() is equivalent to fgetc(stdin).