#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <time.h>


// 게임 규칙을 정의하는 구조체

typedef struct {

    int a;

    int b;

    int rule_number;

    long long answer;

} GameQuestion;


void clear_screen() {

    // 윈도우

    #ifdef _WIN32

        system("cls");

    // 유닉스/리눅스

    #else

        system("clear");

    #endif

}


// 함수 선언

long long rule1(int a, int b);

long long rule2(int a, int b);

long long rule3(int a, int b);

long long rule4(int a, int b);

long long rule5(int a, int b);

int sum_of_digits(int num);

long long generate_rule5(int a, int b);

void shuffle(int *array, int n);

int is_duplicate_pair(int a1, int b1, int a2, int b2);


int main() {

    srand(time(NULL)); // 랜덤 시드 설정


    // 규칙 배열 섞기

    int rules[5] = {1, 2, 3, 4, 5};

    shuffle(rules, 5);


    // 문제 배열 생성

    GameQuestion questions[5];


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

        // a와 b를 랜덤하게 생성 (1 ~ 100, a != b)

        questions[i].a = rand() % 100 + 1;

        do {

            questions[i].b = rand() % 100 + 1;

        } while (questions[i].b == questions[i].a);


        questions[i].rule_number = rules[i];


        // 규칙에 따른 정답 계산

        switch (questions[i].rule_number) {

            case 1:

                questions[i].answer = rule1(questions[i].a, questions[i].b);

                break;

            case 2:

                questions[i].answer = rule2(questions[i].a, questions[i].b);

                break;

            case 3:

                questions[i].answer = rule3(questions[i].a, questions[i].b);

                break;

            case 4:

                questions[i].answer = rule4(questions[i].a, questions[i].b);

                break;

            case 5:

                questions[i].answer = rule5(questions[i].a, questions[i].b);

                break;

        }

    }

        // 문제 출력 및 사용자 입력

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

            int attempts = 0;

            int success = 0;

            char input[100];


            printf("문제 %d - %d @ %d = ?\n", i + 1, questions[i].a, questions[i].b);


            while (attempts < 5) {

                attempts++;

                printf("%d번째 시도 - 예시 정답을 원하시면 두 개의 숫자를 띄어쓰기로 구분하여 써주세요.\n", attempts);

                printf("정답을 맞추시려면 '정답'이라고 입력하세요.\n");


                // 입력 받기

                fgets(input, sizeof(input), stdin);

                input[strcspn(input, "\n")] = 0; // 개행 문자 제거


                // 입력 처리

                if (strcmp(input, "정답") == 0) {

                    printf("정답을 말해주세요\n");

                    fgets(input, sizeof(input), stdin);

                    input[strcspn(input, "\n")] = 0; // 개행 문자 제거


                    long long user_answer = atoll(input);

                    if (user_answer == questions[i].answer) {

                        printf("%d번째 시도 - 정답입니다!\n", attempts);

                        printf("3초 후 프롬프트가 초기화됩니다.\n");

                        sleep(3);

                        clear_screen();

                        success = 1;

                        break;

                    } else {

                        printf("%d번째 시도 - 오답입니다.\n", attempts);

                    }

                } else {

                    int input_a, input_b;

                    if (sscanf(input, "%d %d", &input_a, &input_b) == 2) {

                        if (is_duplicate_pair(input_a, input_b, questions[i].a, questions[i].b)) {

                            printf("같은 숫자는 쓸 수 없습니다. 다시 입력해주세요.\n");

                            --attempts;

                            continue;

                        }


                        long long example_answer;

                        switch (questions[i].rule_number) {

                            case 1:

                                example_answer = rule1(input_a, input_b);

                                break;

                            case 2:

                                example_answer = rule2(input_a, input_b);

                                break;

                            case 3:

                                example_answer = rule3(input_a, input_b);

                                break;

                            case 4:

                                example_answer = rule4(input_a, input_b);

                                break;

                            case 5:

                                example_answer = rule5(input_a, input_b);

                                break;

                        }

                        printf("%d번째 시도 - 예시 정답: %lld\n", attempts, example_answer);

                    } else {

                        printf("다시 입력하길 바랍니다.\n");

                         --attempts;

                    }

                }

            }


            if (!success) {

                printf("실패했습니다. 정답은 %lld입니다.\n", questions[i].answer);

                printf("3초 후 프롬프트가 초기화됩니다.\n");

                sleep(3);

                clear_screen();

            }

        }


        printf("게임이 종료되었습니다.\n");

        return 0;

    }

long long rule1(int a, int b) {

    return (a > b) ? (2 * a + b) : (2 * b + a);

}


long long rule2(int a, int b) {

    return (a + b) * 100 + abs(a - b);

}


long long rule3(int a, int b) {

    return (a > b) ? (a % b) : (b % a);

}


long long rule4(int a, int b) {

    return sum_of_digits(a) * sum_of_digits(b);

}


long long rule5(int a, int b) {

    return generate_rule5(a, b);

}


int sum_of_digits(int num) {

    int sum = 0;

    while (num > 0) {

        sum += num % 10;

        num /= 10;

    }

    return sum;

}


long long generate_rule5(int a, int b) {

    int count+ = {0};


    for (int temp = a; temp > 0; temp /= 10) count[temp % 10]++;

    for (int temp = b; temp > 0; temp /= 10) count[temp % 10]++;


    char result[100] = "";

    for (int i = 9; i >= 0; i--) {

        if (count[i] > 0) {

            char temp+;

            sprintf(temp, "%d%d", i, count[i]);

            strcat(result, temp);

        }

    }

    return atoll(result);

}


void shuffle(int *array, int n) {

    for (int i = n - 1; i > 0; i--) {

        int j = rand() % (i + 1);

        int temp = array[i];

        array[i] = array[j];

        array[j] = temp;

    }

}


// 중복 검사 함수

int is_duplicate_pair(int a1, int b1, int a2, int b2) {

    return (a1 == a2 && b1 == b2) || (a1 == b2 && b1 == a2);

}

이 코드로 프로그램 짤수 있는 사람