弹性弯曲


9

作为程序员,看着我们伸缩并不是很有趣。今天我们改变了!在这个挑战中,您将使用lex和flex六面体。

关于

有关视频介绍,请在flexagons上观看viharts视频

柔版是您可以弯曲以露出顶部和底部以外的其他面的形状;我们正在制作六面六面体。参见下图,了解如何从纸条上折叠六六边形。

六六边形的构造

A显示了条带的两侧。两个白色三角形粘合在一起。这是您如何调整它:

弯曲柔版

以下是可能的状态及其关系的图表:

图v6

彩色圆圈代表与第一个图像相同编号的6个三角形。每个圆圈都有两种颜色-最下面的圆圈代表背面(如果在哪里可以翻转柔印,您会看到什么),在此挑战中无需考虑。

背景中的灰色圆圈代表你如何展示你的flexagon在任何给定的状态:有4点不同的方式来弯曲它,我们称这些LeftRightUpDown。您实际上并没有朝着这些方向弯曲,重要的一点是,有些方向是相反的。
如果您在中心位置,可以使用LeftRight转到其他中心位置。要离开中心,请使用UpDown。如果您不在中心,则无法使用LeftRight

Left/Down = clockwise
Right/Up  = anti-clockwise

挑战

创建一个函数或程序,该函数或程序将柔性版的18个正面和18个背面上应有的内容,左,右,上,下弯曲的序列作为输入,并在弯曲后返回8个可见面。

详细的示例计算:

flex "hexaflexaperplexia" 
     "flexagationdevices" 
     [Right, Right, Left]

Divide a strip of paper into 18 triangles:
1/2\3/1\2/3\1/2\3/1\2/3\1/2\3/1\2/3   Front
4/4\5/5\6/6\4/4\5/5\6/6\4/4\5/5\6/6   Back

Write "hexaflexaperplexia" on the front of the paper strip:
1/2\3/1\2/3\1/2\3/1\2/3\1/2\3/1\2/3

hexaflexaperplexia
123123123123123123
h  a  e  p  p  x     Face 1, Initially the front face
 e  f  x  e  l  i    Face 2, Initially the back face
  x  l  a  r  e  a   Face 3, Initially hidden


Write "flexagationdevices" on the back of the paperstrip:
4/4\5/5\6/6\4/4\5/5\6/6\4/4\5/5\6/6

flexagationdevices
445566445566445566
fl    at    ev       Face 4, up from 3
  ex    io    ic     Face 5, up from 2
    ag    nd    es   Face 6, up from 1


Flex it [Right, Right, Left]
  The initial visible face is 1: "haeppx"
  flexing Right ..
  The current visible face is 2: "efxeli"
  flexing Right ..
  The current visible face is 3: "xlarea"
  flexing Left ..
  The current visible face is 2: "efxeli"
  flexed [Right, Right, Left]!

outputting "efxeli"

实施示例:http//jdoodle.com/a/18A

输入和预期输出:

> hexaflexaperplexia flexagationdevices RRL
= efxeli

> loremipsumdolorsit hexaflexamexicania RUU
= riuort

> abcdefghijklmnopqr stuvwxyz1234567890 UL
= I can't flex that way :(

> abcdefghijklmnopqr stuvwxyz1234567890 RRRRLLUDDUUUULDD
= uv1278

规则

  • 您可以以任何合理的方式接受输入并返回输出
  • 如果无法输入,则应以与常规输出不同的方式进行指示
  • 适用标准漏洞
  • 这是Codegolf。以字节为单位的最短代码获胜。

Answers:


2

的Haskell(Lambdabot),270个 234字节

(!)=((map(snd<$>).groupBy((.fst).(==).fst).sortOn fst).).zip.cycle
o n(a,b)|n>1||b<1=(mod(a+[-1,1,0,0]!!n)3,mod(b+[0,0,-1,1]!!n)3)
(x&y)d|(g,h)<-foldl(flip(.))id(o<$>d)(0,0)=([0,1,2]!x++[3,3,4,4,5,5]!y)!!([0,5,1,1,4,2,2,3,0]!!(3*g+h))

用法:

> (&) "hexaflexaperplexia" "flexagationdevices" [1,3]
"exioic"

[0,1,2,3] = [左,右,上,下]

感谢@Damien提供了很多字节!


1
有什么用|b/=0=[]!!1?您可以节省一些字节,以无点样式重写某些函数:\(a,_)(b,_)->a==b-> (.fst).(==).fst(!)=(q.).zip.cycle
Damien

|b/=0=[]!!1如果您尝试执行不可能的弯曲操作,@ Damien 只会引发异常
BlackCap

1
好的,您可以对此进行简化,因为它o n(a,b)|n>1||b<1=(z$a+[-1,1,0,0]!!n,z$b+[0,0,-1,1]!!n)会引发非穷举模式异常
Damien
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.