首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成所有\$3\乘以3\$魔术方块

生成所有\$3\乘以3\$魔术方块
EN

Code Golf用户
提问于 2021-09-01 13:43:34
回答 11查看 1.2K关注 0票数 13

虽然涉及魔法方块的挑战在这个网站上比比皆是,但到目前为止,我还没有发现要求高尔夫球手打印/输出一定大小的所有普通魔方的挑战。要明确的是,n的一个正常的幻方是:

  1. 一个数字的n\times n数组。
  2. 直到并包括n^2的每个正整数都出现在数组中的一个位置,并且
  3. 数组的每一行、每列以及主对角和反对角线之和都是相同的“幻数”。

你的挑战是写一个最短的程序,打印所有3阶的法线幻方。有8个这样的方块。为了解决这个问题,允许在许多语言中围绕输出数组的字符(例如大括号或括号)。有关python中的非优化示例,请参见这里。高尔夫快乐!

EN

回答 11

Code Golf用户

发布于 2021-09-01 23:03:36

Python 3,61字节

输出每个幻方,每一行以逗号分隔,形式为:XXX,XXX,XXX

代码语言:javascript
复制
for c in'\zÁßİĺ':print(f'{ord(c)*1780218+275171220:,}')

在网上试试!

解释

只有八个魔方,每一个都是彼此的旋转/反射。在它们扁平的十进制表示中,它们是:

代码语言:javascript
复制
276951438, 294753618, 438951276, 492357816, 618753294, 672159834, 816357492, 834159672

这些数字值得注意的是,它们都与1017648 (mod 1780218)一致,这意味着它们可以用x*1780218+1017648形式表示。在代码中,我们实际上使用x*1780218+275171220作为公式,因为它在字符串中所占的字节较少。然后,用f'{x:,}'对数字进行逗号格式化,以显示行的分隔。

Python 3,61字节

相同的方法但不包含unicode字符,长度(恼人的是)相同。

代码语言:javascript
复制
n=50863752
for c in b'~	PFP	':n-=~c*1780218;print(f'{n:,}')

在网上试试!

票数 13
EN

Code Golf用户

发布于 2021-09-01 15:38:21

JavaScript (Node.js),201个字节

代码语言:javascript
复制
_=>(h=S=>S[1]?S.flatMap(e=>h(S.filter(a=>a!=e)).map(a=>[e,...a])):[S])([1,2,3,4,5,6,7,8,9]).filter(e=>[[0,3],[0,1],[3,1],[6,1],[1,3],[2,3],[0,4],[2,2]].every(l=>e[l[0]]+e[l[0]+=l[1]]+e[l[0]+l[1]]==15))

在网上试试!

解释

整数1到9应该在幻方中出现一次,所以所有元素的和都是\frac{9(9+1)}{2}=45,使用一个相对简单的公式。

因此,由于每一行构成幻方的三分之一,每一行的和应该等于15 (根据定义,列和以及三长对角之和也必须等于15)。

我的代码所做的第一件事是创建[1,2,3,4,5,6,7,8,9]的所有排列(确切地说是362880),并检查那些符合规范的排列。这是使用我在帕克广场挑战中使用的一个特殊过程来完成的。

行、列和对角线以[b, i]格式编码:

  • b是起始索引
  • i是要添加的索引数。

为这样一个数组[b, i]获得的子数组将是(如果原始数组是l) l[b], l[b+i], l[b+i+i]。这是使用一种轻微的高尔夫方法。

我们检查每个数组对应的子数组(通过简单的索引方法获得)是否有15的和。

原来只有8个3阶的魔方。在写完我的解决方案(并打高尔夫球)之后,我回到了这个问题,点击了math.se链接,发现有人想出了一个非常简单的公式。尽管如此,我张贴我的答案是因为我认为它提供了一种比简单的硬编码更有创造性的方法。我愿意接受关于缩短长度的建议。

票数 3
EN

Code Golf用户

发布于 2021-09-01 17:24:02

05AB1E,25字节

代码语言:javascript
复制
9Lœε3ô}ʒ4.DÅ\ªsÅ/ªsÅ|ªO˜Ë

在网上试试!

蛮力,在TIO上运行需要42秒。

试图解释

代码语言:javascript
复制
9Lœε3ô}                      # All possible 3×3 squares (1..9 permutations, chunk in 3 pieces)
       ʒ4.D                  # Filter by (Create 4 copies of the current square first to get the parts)
           Å\ªsÅ/ªsÅ|ª       # Take the rows, cols and diagonals in a list (Through builtins and appending into one another)
                      O˜Ë    # Flattened sums are equal? Determines magic square (filter) 

或者,如果幻方的平面列表是可接受的,则为23个字节:

代码语言:javascript
复制
9Lœʒ3ô4.DÅ\ªsÅ/ªsÅ|ªO˜Ë

在网上试试!

票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/233921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档