虽然涉及魔法方块的挑战在这个网站上比比皆是,但到目前为止,我还没有发现要求高尔夫球手打印/输出一定大小的所有普通魔方的挑战。要明确的是,n的一个正常的幻方是:
你的挑战是写一个最短的程序,打印所有3阶的法线幻方。有8个这样的方块。为了解决这个问题,允许在许多语言中围绕输出数组的字符(例如大括号或括号)。有关python中的非优化示例,请参见这里。高尔夫快乐!
发布于 2021-09-01 23:03:36
输出每个幻方,每一行以逗号分隔,形式为:XXX,XXX,XXX。
for c in'\zÁßİĺ':print(f'{ord(c)*1780218+275171220:,}')只有八个魔方,每一个都是彼此的旋转/反射。在它们扁平的十进制表示中,它们是:
276951438, 294753618, 438951276, 492357816, 618753294, 672159834, 816357492, 834159672这些数字值得注意的是,它们都与1017648 (mod 1780218)一致,这意味着它们可以用x*1780218+1017648形式表示。在代码中,我们实际上使用x*1780218+275171220作为公式,因为它在字符串中所占的字节较少。然后,用f'{x:,}'对数字进行逗号格式化,以显示行的分隔。
相同的方法但不包含unicode字符,长度(恼人的是)相同。
n=50863752
for c in b'~ PFP ':n-=~c*1780218;print(f'{n:,}')发布于 2021-09-01 15:38:21
_=>(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链接,发现有人想出了一个非常简单的公式。尽管如此,我张贴我的答案是因为我认为它提供了一种比简单的硬编码更有创造性的方法。我愿意接受关于缩短长度的建议。
发布于 2021-09-01 17:24:02
9Lœε3ô}ʒ4.DÅ\ªsÅ/ªsÅ|ªO˜Ë蛮力,在TIO上运行需要42秒。
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个字节:
9Lœʒ3ô4.DÅ\ªsÅ/ªsÅ|ªO˜Ëhttps://codegolf.stackexchange.com/questions/233921
复制相似问题