QOJ.ac

QOJ

時間限制: 1 s 記憶體限制: 1024 MB 總分: 100 可 Hack ✓

#17929. 巧克力编程语言

统计

Chocolate 是一种二维编程语言。以下是 Chocolate 语言的运行定义。

在 Chocolate 程序中,上下左右相邻的相同字符组成的连通块是执行单位。空格(ASCII 32)不会被执行。最先执行的块是包含左上角字符的块,如果左上角字符是空格,则程序不会运行。

块间移动

为了决定从当前块移动到下一个执行的块,存在 $DP$ 和 $CC$ 两个值。程序开始时,$DP$ 初始化为向右,$CC$ 初始化为向左。简单来说,$DP$ 表示程序的进行方向(右、下、左、上),而 $CC$ 表示朝向该方向时选择哪一侧(最左侧或最右侧)的块。给定 $DP$ 和 $CC$ 时,下一个要执行的块按如下方式决定:

  1. 在当前块的所有字符中,找出沿 $DP$ 方向最远处的字符。
  2. 在这些字符中,选择沿 $CC$ 方向最边缘的字符。
  3. 从该字符向 $DP$ 方向移动一格。

此时,如果移动到的格子是空格或超出了程序区域,则无法移动,此时将按如下方式改变 $DP$ 和 $CC$ 并尝试寻找可移动的格子:

  1. 将 $CC$ 取反(左变右,右变左)并重试。
  2. 如果仍然无法移动,将 $DP$ 顺时针旋转 $90$ 度并重试。
  3. 继续交替尝试改变 $CC$ 和 $DP$,直到找到可以移动的方向,或者尝试了全部 $8$ 种组合。

如果尝试了全部 $8$ 种组合后仍无法移动,程序将终止。这是程序终止的唯一方式。(不存在运行时错误。)

命令列表

在 Chocolate 语言中,所有数据都存储在一个栈中,栈中的元素是有符号 64 位整数。

Chocolate 语言有多种命令,每当进入一个块时,就会执行该块字符对应的命令。以下是命令列表。对于所有命令,如果无法执行(例如栈中整数不足、除以 0、没有可读入的字符等),则什么都不会发生,程序继续执行。

  • I:从 stdin 读入 1 个字符,并将其 ASCII 码压入栈中。如果没有可读入的字符,则忽略。
  • O:从栈顶弹出一个整数,将其模 $256$ 的余数($0$ 以上 $255$ 以下的值)作为 ASCII 码对应的字符输出到 stdout
  • P:将当前块的面积(包含的字符数)压入栈中。
  • p:从栈顶弹出一个整数并丢弃。
  • +:从栈顶弹出两个整数 $x$ 和 $y$,将 $y+x$ 压入栈中。
  • -:从栈顶弹出两个整数 $x$ 和 $y$,将 $y-x$ 压入栈中。
  • *:从栈顶弹出两个整数 $x$ 和 $y$,将 $y \times x$ 压入栈中。
  • /:从栈顶弹出两个整数 $x$ 和 $y$,将 $\lfloor y/x \rfloor$ 压入栈中。
  • %:从栈顶弹出两个整数 $x$ 和 $y$,将 $y\%x$ 压入栈中。该值满足 $\lfloor y/x \rfloor \times x + y\%x = y$。
  • !:从栈顶弹出一个整数 $x$,如果 $x$ 为 $0$ 则将 $1$ 压入栈中,否则将 $0$ 压入栈中。
  • >:从栈顶弹出两个整数 $x$ 和 $y$,如果 $y>x$ 则将 $1$ 压入栈中,否则将 $0$ 压入栈中。
  • D:从栈顶弹出一个整数 $x$,将 $DP$ 顺时针旋转 $90$ 度的 $x$ 倍。如果 $x$ 为负数,则逆时针旋转 $-x$ 倍。
  • C:从栈顶弹出一个整数 $x$,将 $CC$ 取反 $|x|$ 次。
  • d:从栈顶弹出一个整数 $x$,将 $x$ 复制一份,即在栈中压入两个 $x$。
  • r:从栈顶弹出两个整数 $x$ 和 $y$,然后将栈顶的 $y$ 个元素“旋转” $x$ 次。这里的旋转是指,将最顶端的元素移动到最底端(这 $y$ 个元素的底部),其余元素向上移动一格。如果 $x$ 为负数,则进行相反的操作 $-x$ 次。如果 $y \le 0$,或者 $y$ 大于弹出 $x$ 和 $y$ 后的栈深度,则不进行旋转操作,并将 $y$ 和 $x$ 原样压回栈中。

以下是输出 Hello World! 的 Chocolate 语言代码示例。

PPPPPPdP+*d
PP        dO
  Ppd+PPd* Od
 dd    P -- dP
OO dOPPd+ ++ P
d ++  P +- P /
* P PP/O d p +
+ P P OO O P d
P P O   PP p P
PPO d-+dPP dPP
P d+  P   POPP
dP +*+PdPPP PP
 PP  P     --
  PO+PPOdOdO

现在,请用 Chocolate 语言解决以下问题。

输入格式

输入一个整数 $N$($1 \le N \le 100$)。输入末尾有一个换行符(ASCII 码 10)。

输出格式

输出共 $N$ 行星号(ASCII 码 42)。第 $i$ 行输出 $i$ 个星号,中间无空格。请注意,行与行之间需要输出换行符(ASCII 码 10)。

样例

输入样例 1

5

输出样例 1

*
**
***
****
*****

说明

可提交的语言:Text

代码长度不能超过 524,288B。如果代码的宽度与高度的乘积超过 1,000,000,或者对于单个输入,代码在执行 1,000,000 条命令后仍未结束,则会被判定为“答案错误”(Wrong Answer)。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.