实施立体立方体


10

立体地,这是一种相当新的神秘语言,能够为非常具体的问题子集提供类似于高尔夫球的简短答案。它的独特之处在于它以3x3的Rubik多维数据集的形式存储内存,从而使计算远不如大多数语言简单。在Cubically中,程序员必须旋转内部多维数据集才能操作存储在面上的值,然后在计算中使用这些值。对存储在称为“记事本”的假想面上的单个32位整数执行计算。此外,Cubically可以请求用户输入并将其存储在仅包含一个整数值的输入缓冲区中。

魔方

立方体的面为U p,D own,L eft,R ight,F ront和B ack:

   UUU
   UUU
   UUU
LLLFFFRRRBBB
LLLFFFRRRBBB
LLLFFFRRRBBB
   DDD
   DDD
   DDD

程序启动时,将初始化多维数据集,以使该面上的每个正方形都等于该面上基于0的索引:

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

每当旋转脸部时,总是将其顺时针旋转:

Cubically> F1

   000
   000
   111
115222033444
115222033444
115222033444
   333
   555
   555

面的值定义为该面上每个平方的和。例如,在上面的多维数据集中,face的0值为3。

句法

通过首先将命令加载到内存中,然后将参数传递给它来执行命令来执行命令。例如,该命令F1会将命令加载F到内存中,然后使用参数调用它1。另外,F13将命令加载F到内存中,然后使用参数1调用它,然后使用参数调用3。任何非数字字符均被视为命令,而任何数字均被视为参数。

你的任务

您的任务是以您选择的语言实现Cubically的内部存储多维数据集。您的代码应该能够执行该语言的很小一部分。

指令

  • R -顺时针旋转多维数据集的右面指定次数。
  • L -顺时针旋转立方体的左表面指定次数。
  • U -顺时针旋转立方体的顶面指定次数。
  • D -顺时针旋转立方体的底面指定次数。
  • F -顺时针旋转立方体的正面指定次数。
  • B -顺时针旋转立方体的背面指定次数。
  • %-在给定的面上输出值。面的值定义为该面上所有平方的和。

规则

  • 您可以使用在发布此挑战之前或之后创建的任何语言来编写能够解决此挑战的程序或函数。
  • 输入将通过STDIN作为字符串或字符数组(您选择,请指定)传递。
  • 输出必须传递给STDOUT或作为函数的输出,并且它必须是整数,仅包含数字的字符串或数字数组。如果您的语言要求您输出尾随换行符,则可以这样做。
  • 输入将始终采用以下格式:([UDLRFB]\d*)*%[0-5]。输入中将没有空格字符。
  • 的输入%将始终使用基于0的索引。

这是,因此最短答案以字节为单位。

测试用例

%0 -> 0
%1 -> 9
%2 -> 18
%3 -> 27
%4 -> 36
%5 -> 45
R1%2 -> 27
RD3F2%5 -> 32
L1R23F1B5U9D2%3 -> 17

有关更多测试案例,请查看TIO解释器。如果TIO无法正常工作,则可以改用Lua解释器


3
这是问题的一个重复这个
TehPers


@TehPers我认为这非常相似。对于将来的挑战,我建议将它们放在沙盒中至少24小时,如果仍然有疑问,则可以保留更长的时间。(我必须努力学习这一点;我的第一个挑战根本没有被很好地接受。这还没有结束或被否决,所以还不错,但是如果将其保留在沙箱中更长的时间,其他用户可能会发现了我没有发现的缺陷。)
MD XF

@MDXF我下次会记住这一点。谢谢!
TehPers '17

您是否错过了示例中和4之间的倍数?RDRD3F2%5 -> 30
乔纳森·艾伦

Answers:


8

Python 2,476字节

import re
c=[[i]*9for i in range(6)]
r=lambda f:[f[a+b]for a in(0,1,2)for b in(6,3,0)]
U=lambda c:[r(c[0])]+[c[j+1][:3]+c[j or 4][3:]for j in(1,2,3,0)]+[c[5]]
y=lambda c:[r(c[0])]+c[2:5]+[c[1],r(r(r(c[5])))]
z=lambda c:[c[2],r(r(r(c[1]))),c[5],r(c[3]),c[0][::-1],c[4][::-1]]
s=input()
exec("c="+"(c);c=".join("".join("zzzUz U zzUzz yyyzUzzzy zUzzz yzUzzzyyy".split()[ord(t)%11%7]*sum(map(int,n))for t,n in re.findall("([BUDLFR])(\d*)",s[:-2])))+"(c)")
print sum(c[int(s[-1])])

在线尝试!

我的“ 模拟魔方”答案中的端口。重新访问促使我打高尔夫球了47个字节。


0

大概是1个字节

不竞争的原因是la脚。不接受这个。

¶  Read a line from stdin and evaluate

我今天下午补充说:P


2
好吧,我认为您的代码最短。
TehPers

2
@TehPers我知道,但是就像我说的那样,la脚。借助此内置功能,立方可以赢得其他魔方挑战,而无需赢得这一挑战。
MD XF
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.