确定长方体的类型


17

介绍:

我是一个曲折的难题收藏家。在这里,您可以看到我目前收藏的±300个拼图。

我想每个人都知道常规的魔方(3x3x3多维数据集),它是一个NxNxN多维数据集。还有长方体(块状拼图),它们以不同的形式出现,也许SuperAntionioVivaldi可以在这里更好地解释一下

  • 常规Domino 长方体(例如2x2x32x3x33x3x4等)-它们以NxNx(N + O)Nx(N + O)x(N + O)的形式出现,具有两个奇数维,并且一个偶数或偶数或奇数两个。
  • 变形者长方体(例如2x2x4 ; 3x3x5; 3x3x9 ; 4x4x6 ;等) -它们有形式NxNx(N + P) ,其顾名思义,shapeshifts(在所有方向上)。这三个维度都是奇数或偶数。
  • 软盘长方体(例如1x3x32x4x4等)-它们以Nx(N + P)x(N + P)的形式出现,与Shapeshifter几乎相同,但是具有所谓的Floppy Parity。
  • 砖块长方体(例如2x3x43x4x5; 2x3x5等)-以Nx(N + O)x(N + P)的形式出现,就像常规的Domino长方体具有两个奇数维和一个偶数,或两个偶数和一个奇数;但没有相同的尺寸。
  • 终极Shapeshifter(例如2x4x6、3x5x7、2x4x10等)-它们以Nx(N + O)x(N + R)的形式出现,并且可以在任何方向上变形。这三个维度都是奇数或偶数。但没有相同的尺寸。

挑战:

输入:

具有以下限制的正整数n:8 <= n <= 125.
n可以唯一地解码为三个值(维度)的乘积,每个值在2到5之间(含2和5)。

我将其限制为2-5的原因是为了防止重复输入(例如1x2x4 = 82x2x2 = 8),即使那里有许多低/高阶长方体。这也意味着没有Ultimate Shapeshifter的测试用例。

输出/测试用例:

这些是程序/函数应支持的所有情况,在每种可能的三维配置中,其边长为2到5。

Input   Cuboid/Cube   Type/Output
8       2x2x2         Cube
12      2x2x3         Regular Domino Cuboid
16      2x2x4         Shapeshifter Cuboid
20      2x2x5         Regular Domino Cuboid
18      2x3x3         Regular Domino Cuboid
24      2x3x4         Brick Cuboid
30      2x3x5         Brick Cuboid
32      2x4x4         Floppy Cuboid
40      2x4x5         Brick Cuboid
50      2x5x5         Regular Domino Cuboid
27      3x3x3         Cube
36      3x3x4         Regular Domino Cuboid
45      3x3x5         Shapeshifter Cuboid
48      3x4x4         Regular Domino Cuboid
60      3x4x5         Brick Cuboid
75      3x5x5         Floppy Cuboid
64      4x4x4         Cube
80      4x4x5         Regular Domino Cuboid
100     4x5x5         Regular Domino Cuboid
125     5x5x5         Cube

挑战规则:

  • 8-125范围内的任何非立方体/非立方体输入均应导致输出为“无”。
  • 输出格式是您自己的选择。我认为最合理的是整数,例如0='none'; 1=多维数据集;2=常规Domino Cuboid;3= Shapeshifter长方体;4=软盘长方体;5=砖长方体。只要指定使用哪种输出格式,其他任何输出格式都可以。

通用规则:

  • 这是,因此最短答案以字节为单位。
    不要让代码高尔夫球语言阻止您发布使用非代码高尔夫球语言的答案。尝试针对“任何”编程语言提出尽可能短的答案。
  • 标准规则适用于您的答案,因此允许您使用STDIN / STDOUT,具有正确参数的函数/方法,完整程序。你的来电。
  • 默认漏洞是禁止的。(注意:由于我不知道输入到输出转换是否存在智能公式,因此可以根据输入对答案进行硬编码。
  • 如果可能的话,请添加一个带有测试代码的链接。
  • 另外,如有必要,请添加说明。


1
您的收藏中没有直升机立方吗?
GB

@GB不行。我有一个弯曲的直升机,弯曲的直升机Plus,弯曲的直升机III,弯曲的剁碎立方体,直升机十二面体和定制的超级截头弯曲的直升机III,但没有直升机立方体。:)它与“弯曲直升机”有点相似,但有一天我可能会得到它。
凯文·克鲁伊森

输入是否排序?还是我们必须手动排序?
马修·罗

@MatthewRoh输入是一个整数(即24),所以我不知道您要对它进行排序吗?
凯文·克鲁伊森

Answers:


6

05AB1E26 21字节

None: 0 Cube: 1 Regular Domino Cuboid: 2 Shapeshifter Cuboid: 3 Brick Cuboid: 4 Floppy Cuboid: 5

•S3X@I¨%÷'•5L¦3ãPÙIkè

在线尝试! 或作为测试套件

说明

•S3X@I¨%÷'•            # push base-214 compression of the number 123224454212324512210
           5L¦         # push the list [2,3,4,5]
              3ã       # cartesian product with repetion of size 3
                P      # product of each sublist
                 Ù     # remove duplicates
                  Ik   # get the index of input in that list (-1 if non-existant)
                    è  # get the element at this index in the above number

我唯一可以在此处保存字节的地方是找到一种生成数字123224454212324512210210的更好方法

它与质数只有1倍,因此可能的节省方法是找到该质数的索引并在不到9个字节的情况下生成索引。
我不知道pi函数在21位素数上的工作情况如何,但这是有可能的。


很好,我很想知道这个解释,以了解您用来确定多维数据集/长方体的公式/怪癖/模式。+1
Kevin Cruijssen '17

1
@KevinCruijssen:我也许还能保存一两个字节。尝试一下后,我将添加说明。我想找到一个素数(但我在网上找不到任何东西可以帮助我解决这个问题,而且我正在工作,所以我真的没有时间自己实现一些东西:)
Emigna

@Emigna jeebus疯狂,已经k存在多久了?!
魔术章鱼缸

@carusocomputing自2015
Adnan

3

JavaScript(ES6),97 92 86字节

此函数首先检查输入的有效性,然后从查找表中选择正确的值。

令人惊讶地,最长的部分是有效性检查(被Ñ形式的X * Y * ZXÿž[2,3,4,5] ?)。一定有更短的方法可以做到,但是到目前为止我还不能弄清楚。

n=>'NBBF..CRCC.BRR..SFRRRRR.B..C'[[34707324,0x80000800,4240,262208][n&3]>>n/4&1&&n%29]

返回一个字符:

  • N:无
  • C:立方体
  • R:常规Domino长方体
  • S:变形者长方体
  • B:长方体
  • F:软盘长方体

测试


1

Ruby,106 98 96字节

->n{[[x=25,2421],[15,53],[9,21],[4,1232504350200510002]].any?{|a,b|n%a<1&&x="00#{b}"[n/a]}?x:?0}

因为,为什么不硬编码。

如指定,0 ='none'; 1 =多维数据集;2 =常规Domino Cuboid;3 = Shapeshifter长方体;4 =软盘长方体;5 =砖长方体


1

Perl 6的69 58个字节

{%(unique([X*] (2..5)xx 3)Z=>:32<AM0K21IHN61H5>.comb){$_}}

使用任务描述中建议的整数输出格式,除了它返回未初始化的值(Any)而不是0在输入未形成有效的多维数据集/立方体的情况下。

怎么运行的

  1. unique([X*] (2..5)xx 3)

    生成列表8 12 16 20 18 24 30 32 40 50 27 36 45 48 60 75 64 80 100 125

  2. :32<AM0K21IHN61H5>.comb

    生成列表1 2 3 2 2 5 5 4 5 2 1 2 3 2 5 4 1 2 2 1(从基数为32的文字开始)。

  3. %(   Z=>   )

    生成一个Hash(关联映射),其中第一个列表为键,第二个列表为值。

  4.    {$_}

    用输入数字索引哈希。


嘿,我现在看到的是与@Emigna的05AB1E答案相同的方法。但是,老实说,我是独立提出的!:)
smls

1

批次,163字节

@set/as=0,c=29948521
@for /l %%i in (2,1,5)do @for /l %%j in (%%i,1,5)do @for /l %%k in (%%j,1,5)do @set/as+=c%%6*!(%%i*%%j*%%k-%1),c/=6,c+=14081593*!c
@echo %s%

使用建议的输出格式。说明:基本思想是遍历问题中定义的多维数据集列表。对于每个多维数据集,我们进行计算以查看其体积是否为输入整数,如果是,则从查找表计算多维数据集的类型。

原始的查找表是一串字母,但是在for循环中进行字符串操作比较棘手,因此我切换到可以算术提取的数字。遗憾的是Batch仅限于32位整数,因此我无法将所有数字都放入一个变量中(即使在以5为基数的情况下,您也只能获得13个数字),因此我将变量分为两部分,以6为基数进行编码为了方便。以6 299485212545522321底,以相反的顺序编码10个最小的长方体;当它运行的数字了,我们添加14081593这是1221452321以10基数的10个最大的长方体。

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.