URAL 2027 2028 两个有趣的题

这两个题,讲的是有一种奇怪的语言,代码是一种二维的矩阵。

前一个题,是根据所给的要求,写一个简单的解释器。

后一个题,是用那种语言写一个简单的小程序。

挺有意思的,所以在这里纪念一下。顺便那个语言的原型是一种叫做Befunge的语言。真实存在的哟。

代码:

  简单的解释器:  

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <functional>
#include <cctype>
#include <time.h>

using namespace std;

const int INF = 1<<30;
const int MAXN = 105;
const int MAXM = 1e5+5;
const int MAXSTEP = 1e6;
const int MAX_NUM = 1e5;
const int dir[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };

int H, W;
char G[MAXN][MAXN];
int num[MAXM], n, curNum;
int pointer[2], d;
int stepCnt;

int cur, memory[30];

bool check() {
    if (!(-MAX_NUM<=cur&&cur<=MAX_NUM)) {
    //溢出错误
        puts("OVERFLOW ERROR");
        return false;
    }
    stepCnt++;
    if (stepCnt>=MAXSTEP) {
    //超时
        puts("TIME LIMIT EXCEEDED");
        return false;
    }
    pointer[0] += dir[d][0]; pointer[1] += dir[d][1];
    if (!(0<=pointer[0]&&pointer[0]<H && 0<=pointer[1]&&pointer[1]<W)) {
    //指针越界
        puts("RUNTIME ERROR");
        return false;
    }
    if (curNum>=n) curNum = n-1;
    return true;
}

void init() {
    //初始化寄存器
    cur = 0;
    memset(memory, 0, sizeof(memory));
    //初始化指针
    pointer[0] = pointer[1] = 0;
    d = 0;
    //初始化计数器
    stepCnt = 0;
    curNum = 0;
}

void run() {
    init();
    while (true) {
        char c = G[pointer[0]][pointer[1]];
        if (‘#‘==c)
            break;
        else if (‘^‘==c)
            d = 3;
        else if (‘v‘==c)
            d = 1;
        else if (‘<‘==c)
            d = 2;
        else if (‘>‘==c)
            d = 0;
        else if (‘@‘==c)
            if (cur!=0) d = (d+1)%4;
            else d = (d+3)%4;
        else if (‘A‘<=c&&c<=‘Z‘)
            swap(cur, memory[c-‘A‘]);
        else if (‘?‘==c) {
            cur = num[curNum++];
        } else if (‘!‘==c) {
            printf("%d\n", cur);
            cur = 0;
        } else if (‘+‘==c)
            cur++;
        else if (‘-‘==c)
            cur--;
        else if (‘.‘==c)
            ;
        if (!check()) break;
    }
}

int main() {
    #ifdef Phantom01
        freopen("URAL2027.txt", "r", stdin);
    #endif //Phantom01

    while (scanf("%d%d", &H, &W)!=EOF) {
        for (int i = 0; i < H; i++)
            scanf("%s", G[i]);
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
            scanf("%d", &num[i]);
        run();
    }

    return 0;
}

解释器

  小程序:

 1 9 12
 2 ?..........v
 3 >.>v>>Tv>>v.
 4 .>.>@..>@^I.
 5 .-..I..^A.-.
 6 .^..+..^+.v<
 7 .T..I..-A...
 8 .^+T<..^<...
 9 ^[email protected]
10 ........#!A<

小程序

时间: 2024-11-10 14:45:03

URAL 2027 2028 两个有趣的题的相关文章

[笔试题] 两个有趣的问题

有n瓶粉末,一瓶有毒.有毒的粉末融在水里一小时后水会变蓝.你有一些试管,问最少需要多少时间和多少试管就能确定毒粉末呢?不考虑粉末导入试管的时间. 这道题最基本的想法就是时间换空间或者空间换时间,即n个试管用1小时的时间,或者1个试管用n小时依次试验过来.在实际生产中应该偏向于空间换时间,因为硬性资源可以增加,而程序如果找不到好的优化方法运行时间基本也就定了,所以时间比空间重要的多.但是这两个显然都不是什么好办法.另外一个比较好的解决办法就是二分,把瓶子分两组,花一个小时排除掉一半的瓶子,再花一个

【实践】js六道有趣的题

1.找出数字数组中最大的元素(使用Math.max函数) 2.转化一个数字数组为function数组(每个function都弹出相应的数字) 3.给object数组进行排序(排序条件是每个元素对象的属性个数) var arr=[{a:1,b:3},{a:2},{a:3,b:4,c:5,d:3},{a:4,b:3,c:4}]; function compare(o1,o2){ var strLen=function(obj){ var num=0; for(var k in obj){ num++

URAL 1039 Anniversary Party 树形DP 水题

1039. Anniversary Party Time limit: 0.5 secondMemory limit: 8 MB Background The president of the Ural State University is going to make an 80'th Anniversary party. The university has a hierarchical structure of employees; that is, the supervisor rela

两个有趣的小软件——小鱼和眼镜

我发现在中兴新支点操作系统上有一些很有趣的软件,在这里给大家一起分享. 在任务栏单击右键后点击添加到面板,在列表里面有一个程序的名字叫Eyes,如下图所示. 把它添加到面板后,你就会发现你的面板上多了一双眼球,是的就是这个. 这个眼睛也是很魔性的,他会盯着你的鼠标,两个眼球死死的盯着...我个人觉得真的是非常诡异...而且无论角度多么奇葩,多不符合人体科学,他都会无比准确的盯着!就像这样 我很好奇谁家眼珠子能瞪成这个样子... 不过他的功能实用性却是无可非议的.当你无论怎么移动鼠标都找不到桌面的

bestcoder两周年前三题hdu5718,5719,5720

一周多上山实习只学了一些python,做题的手感差了好多QAQ,昨天晚上最开始电脑还更新重启折腾了好久,换成台式机做的,只做了一个题居然rating还涨了168,始料未及 前三个都是乱搞(第三个有一点贪心的意思 hdu5718Oracle Accepts: 599 Submissions: 2576 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) 问题描述 曾经有一位国王,统治着

奇妙JS代码系列(三)一道有趣的题(创建一个长度为x数组)

原题描述: 不使用loop循环,创建一个长度为100的数组,并且每个元素的值等于它的下标 这个问题的一些变种例如给一个长度length和value,返回长度为length值全为value的数组等. 误区 最容易掉入陷阱的: var arr = new Array(100); arr = arr.map(function(item, index) { return index; }); 如果你的答案是这个,恭喜你成功掉入出题人的坑了. 解释 坑在Array(100),可以看看MDN的规范, new

一道cf水题再加两道紫薯题的感悟

1. 遇到一个很大的数除以另一个数时,可以尝试把这个很大的数进行,素数因子分解. 2. 遇到多个数的乘积与另一个数的除法时,求是否能整除,可以先求每一个数与分母的最大公约数,最后若分母数字为1,则证明可整除.或者把分子上的每个数进行素数因子分解,分母上的数也进行素数因子分解,若分子上的与分母上相同素数因子进行比较,分子上的素数因子指数大于分母位置上的,则证明可整除. 3. 遇到乘法的时候注意越界问题. 4. 遇到求某一个区间内,满足某一特征的数的个数,而这个特征与因子,约数有关,尝试用埃筛的方法

leetcode中的两数之和(第一题:简单)

描述:给定一个整数数组和一个目标值,找出数组中和为目标值的 两个 数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用.示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 题意:给一个整形的数,这个数在会在给定数组的两个位置数相加的和!这个和是指值的相加,不是数组的索引相加:如果在数组中有这样的两个数,要求返回两个数的索引(也就是数组的下标): 解法一:暴力方法:应用

URAL 1244 Gentlement DP +记录路径 好题

1244. Gentlemen Time limit: 0.5 secondMemory limit: 64 MB Let's remember one old joke: Once a gentleman said to another gentleman:— What if we play cards?— You know, I haven't played cards for ten years…— And I haven't played for fifteen years…So, li