U E D R , A S I H C RSS

Code Race/2016/답안

6번 문제
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

const int TRUE = 1;
const int FALSE = 0;

int equ = 0;
int reg00 = 0, reg01 = 0, reg10 = 0, reg11 = 0;
int mem00 = 0, mem01 = 0, mem10 = 0, mem11 = 0;

void initialize(); // 레지스터와 메모리 값 초기화
void fetch_command(); // 명령어 읽기
int execute_command(int, int, int, int, int, int, int, int); // 명령어 실행

int get_reg(int, int); // 해당되는 레지스터 값 얻기
int get_mem(int, int); // 해당되는 메모리 값 얻기
int get_bin4(int, int, int, int); // 해당되는 4자리 이진수 얻기
void set_reg(int, int, int); // 해당되는 레지스터에 값 넣기
void set_mem(int, int, int); // 해당되는 메모리에 값 넣기

void load(int, int, int, int); // 메모리에서 레지스터로 값 불러오기
void add(int, int, int, int); // 두 레지스터의 값 더하기
void mul(int, int, int, int); // 두 레지스터의 값 곱하기
void save(int, int, int, int); // 레지스터에서 메모리로 값 저장하기
void equal(int, int, int, int); // 두 레지스터 값이 같은지 비교
void beq(int, int, int, int); // 명령어 분기

int main()
{
	printf("2016 새싹교실 CodeRace\n");
	initialize();
	fetch_command();
	printf("%d %d %d %d %d %d %d %d\n", reg00, reg01, reg10, reg11, mem00, mem01, mem10, mem11);
	return 0;
}

void initialize()
{
	// 처음 레지스터와 메모리 값 초기화
	scanf("%d %d %d %d %d %d %d %d",
		&reg00, &reg01, &reg10, &reg11, &mem00, &mem01, &mem10, &mem11);
}

void fetch_command()
{
	// 명령어 입력
	int bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7;
	do
	{
		scanf("%d %d %d %d %d %d %d %d",
			&bit0, &bit1, &bit2, &bit3, &bit4, &bit5, &bit6, &bit7);
		// 명령어 실행

	} while (!execute_command(bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7));
}

int execute_command(int bit0, int bit1, int bit2, int bit3, int bit4, int bit5, int bit6, int bit7)
{
	if (bit0 == TRUE)
	{
		if (bit1 == TRUE)
		{
			if (bit2 == TRUE)
			{
				if (bit3 == TRUE) // 1111
				{
					return 1; // exit
				}
				else { // 1110

				}
			}
			else
			{
				if (bit3 == TRUE) // 1101
				{

				}
				else { // 1100

				}
			}
		}
		else {
			if (bit2 == TRUE)
			{
				if (bit3 == TRUE) // 1011
				{

				}
				else {	// 1010

				}
			}
			else
			{
				if (bit3 == TRUE) // 1001
				{

				}
				else { // 1000
					beq(bit4, bit5, bit6, bit7);
				}
			}
		}
	}
	else {
		if (bit1 == TRUE)
		{
			if (bit2 == TRUE)
			{
				if (bit3 == TRUE) // 0111
				{

				}
				else { // 0110

				}
			}
			else
			{
				if (bit3 == TRUE) // 0101
				{

				}
				else { // 0100
					equal(bit4, bit5, bit6, bit7);
				}
			}
		}
		else {
			if (bit2 == TRUE)
			{
				if (bit3 == TRUE) // 0011
				{
					mul(bit4, bit5, bit6, bit7);
				}
				else {	// 0010
					add(bit4, bit5, bit6, bit7);
				}
			}
			else
			{
				if (bit3 == TRUE) // 0001
				{
					save(bit4, bit5, bit6, bit7);
				}
				else { // 0000
					load(bit4, bit5, bit6, bit7);
				}
			}
		}
	}
	return 0;
}

int get_reg(int bit0, int bit1)
{
	if (bit0 == TRUE)
	{
		if (bit1 == TRUE)
		{
			return reg11;
		}
		else
		{
			return reg10;
		}
	}
	else
	{
		if (bit1 == TRUE)
		{
			return reg01;
		}
		else
		{
			return reg00;
		}
	}
}

int get_mem(int bit0, int bit1)
{
	if (bit0 == TRUE)
	{
		if (bit1 == TRUE)
		{
			return mem11;
		}
		else
		{
			return mem10;
		}
	}
	else
	{
		if (bit1 == TRUE)
		{
			return mem01;
		}
		else
		{
			return mem00;
		}
	}
}

int get_bin4(int bit0, int bit1, int bit2, int bit3)
{
	return 8 * bit0 + 4 * bit1 + 2 * bit2 + bit3;
}

void set_reg(int bit0, int bit1, int val)
{
	if (bit0 == TRUE)
	{
		if (bit1 == TRUE)
		{
			reg11 = val;
		}
		else
		{
			reg10 = val;
		}
	}
	else
	{
		if (bit1 == TRUE)
		{
			reg01 = val;
		}
		else
		{
			reg00 = val;
		}
	}
}

void set_mem(int bit0, int bit1, int val)
{
	if (bit0 == TRUE)
	{
		if (bit1 == TRUE)
		{
			mem11 = val;
		}
		else
		{
			mem10 = val;
		}
	}
	else
	{
		if (bit1 == TRUE)
		{
			mem01 = val;
		}
		else
		{
			mem00 = val;
		}
	}
}

void load(int mem_bit0, int mem_bit1, int reg_bit0, int reg_bit1)
{
	set_reg(reg_bit0, reg_bit1, get_mem(mem_bit0, mem_bit1));
}

void add(int reg0_bit0, int reg0_bit1, int reg1_bit0, int reg1_bit1)
{
	set_reg(reg1_bit0, reg1_bit1, get_reg(reg0_bit0, reg0_bit1) + get_reg(reg1_bit0, reg1_bit1));
}

void mul(int reg0_bit0, int reg0_bit1, int reg1_bit0, int reg1_bit1)
{
	set_reg(reg1_bit0, reg1_bit1, get_reg(reg0_bit0, reg0_bit1) * get_reg(reg1_bit0, reg1_bit1));
}

void save(int reg_bit0, int reg_bit1, int mem_bit0, int mem_bit1)
{
	set_mem(mem_bit0, mem_bit1, get_reg(reg_bit0, reg_bit1));
}

void equal(int reg0_bit0, int reg0_bit1, int reg1_bit0, int reg1_bit1)
{
	if (get_reg(reg0_bit0, reg0_bit1) == get_reg(reg1_bit0, reg1_bit1)) {
		printf("1\n");
		equ = TRUE;
	}
	else {
		printf("0\n");
		equ = FALSE;
	}
}

void beq(int bit0, int bit1, int bit2, int bit3)
{
	int num_skipped_command = get_bin4(bit0, bit1, bit2, bit3);
	int count;
	for (count = 0; count < num_skipped_command; count++)
	{
		scanf("%*d %*d %*d %*d %*d %*d %*d %*d");
	}
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:56
Processing time 0.0131 sec