this post was submitted on 24 Dec 2025
10 points (100.0% liked)

C Programming Language

1234 readers
16 users here now

Welcome to the C community!

C is quirky, flawed, and an enormous success.
... When I read commentary about suggestions for where C should go, I often think back and give thanks that it wasn't developed under the advice of a worldwide crowd.
... The only way to learn a new programming language is by writing programs in it.

Β© Dennis Ritchie

🌐 https://en.cppreference.com/w/c

founded 2 years ago
MODERATORS
 

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!

you are viewing a single comment's thread
view the rest of the comments
[–] BB_C@programming.dev 2 points 17 hours ago (1 children)

Maybe something like this

#include <stdio.h>

// reads next 4 chars. doesn't check what's beyond that.
int get_pair() {
  int h = getchar() - 48;
  int l = getchar() - 48;

  return h * 10 + l;
}

int main(){
  int p0 = get_pair();
  int p1 = get_pair();
  if (p0 < 0 || p1 < 0 || p0 > 100 || p1 > 100) {
   // not 4 digi seq, return with failure if that's a requirement 
  }

  if ((p0 == 0 || p0 > 12) && (p1 >= 1 && p1 <= 12)) {
    printf("YYMM");
  } else if ((p1 == 0 || p1 > 12) && (p0 >= 1 && p0 <= 12)) {
    printf("MMYY");
  } else if ((p0 >= 1 && p0 <= 12) && (p1 >= 1 && p1 <= 12)) {
    printf("AMBIGUOUS");
  } else {
    printf("NA");
  }
  return 0;
}

or if you want to optimize

#include <stdio.h>
#include <stdint.h>

// reads next 4 chars. doesn't check what's beyond that.
int get_pair() {
  int h = getchar() - 48;
  int l = getchar() - 48;

  return h * 10 + l;
}

uint8_t props (int p) {
  if (p >= 1 && p <= 12) {
    return 0b10;
  } else if (p < 0 || p >= 100) {
    return 0b11;
  } else {
    return 0b00;
  }
}

int main(){
  int p0 = get_pair();
  int p1 = get_pair();

  switch (props(p0) | (props(p1) << 2)) {
    case 0b1010: printf("AMBIGUOUS"); break;
    case 0b1000: printf("YYMM"); break;
    case 0b0010: printf("MMYY"); break;
    default: printf("NA");
  }
  return 0;
}
[–] yris_latteyi@lemmy.zip 1 points 45 minutes ago

Thank you so much for your time! Holy shit you went deep there, even optimized it😭 I'm 4ever grateful, gotta go try it, be back with results!