首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解魔方钟

解魔方钟
EN

Code Golf用户
提问于 2022-02-03 08:24:59
回答 1查看 1.2K关注 0票数 17

魔兽世界的钟是一个圆形的、两面扁平的拼图。在每一边,前面和后面,有9个时钟面,排列在一个3x3网格上。此外,在时钟表面之间有4个插销(开关),它们可以设置为从前面或后面突出。最后,在拼图的边缘有4个刻度盘。你可以旋转他们来操纵四个时钟在角落,在前面和背面同时。这是一个示意图。

每个开关周围都有4个时钟,它们作为这4个时钟的锁。如果按下开关,周围任何时钟的任何移动都与其他三个时钟同步。如果没有按下开关,它们就会独立移动。然而,在这种情况下,它可以被看作是从另一边按压进来的。因此,在另一边的开关周围的4个时钟是同步的。因此,开关总是把4个时钟锁在一起,要么在前面,要么在后面。

为了保持顺时针和开关设置的一致性,我们将一边定义为正面,另一面定义为背面。如前面所示,如果按下开关,则设置为1;如果没有按下,则设置为0。

四个角时钟在前部和背面之间反向同步。如果你顺时针转动一个刻度盘,在同一位置的背面的时钟会逆时针旋转。因此,总共有14个独立时钟:4个角,5个独立在前面和5个独立在背面。

考虑一个示例,其中所有时钟设置为0 (或12),开关0设置为1,其他开关设置为0。如果我们将拨号0转到位置2,就会发生以下情况:

  • 前时钟1、3和4与时钟0同步,并全部移至位置2。
  • 反向时钟0与时钟0同步,并移动到位置10 (= -2 mod 12)

现在考虑相同的例子,但是这两个开关0和3被设置为1,而开关1和2被设置为0。如果我们再次将拨号0转到第2位置,则会发生以下情况:

  • 前时钟1、3和4与时钟0同步,并全部移至位置2。
  • 前时钟5、7和8与时钟4同步,并全部移至位置2。
  • 后时钟0与时钟0反向同步,并移动到位置10 (= -2 mod 12)
  • 后时钟8与时钟8反向同步,并移动到位置10 (= -2 mod 12)

这个谜题的目的是把所有的时钟都设为0。你可以通过翻转开关和适当地转动刻度盘来做到这一点。这也是挑战的任务。

挑战

给定前后时钟的有效设置,输出一系列开关设置和拨号匝数,将所有时钟设置为0。

规则

  • 输入和输出在默认规则允许的范围内是灵活的,只要它们明确地描述时钟和所需的顺序。
    • 您可以重新定义索引。
    • 如果方便的话,您可以只使用14个独特的时钟面作为输入。
    • 在前面的时钟必须始终直接(积极)响应拨号转盘。
    • 背面的时钟必须总是对转盘作出相反的反应。

  • 考虑在解决方案开始时将所有开关设置为0。
  • 只要解决了所有时钟问题,最终的开关设置就可以是非零的。
  • 你的程序必须在合理的时间内完成:不要蛮横。

示例

代码语言:javascript
运行
复制
Example input: [9, 9, 0, 9, 9, 0, 9, 9, 0], [3, 0, 0, 0, 0, 0, 3, 0, 0]
Example output: [0, 2, (2, 3)]
                 |  |     +---- Dial turn
                 +--+---------- Switch flips
Step-by-step:

Current state
Switches: 0 0 0 0
Front:      Back:
 9  9  0  |  3  0  0
 9  9  0  |  0  0  0
 9  9  0  |  3  0  0

Flipping switch 0
Flipping switch 2
Turning dial 2; 3 times

Current state
Switches: 1 0 1 0
Front:      Back:
 0  0  0  |  0  0  0
 0  0  0  |  0  0  0
 0  0  0  |  0  0  0
代码语言:javascript
运行
复制
Example input: [11, 0, 11, 8, 8, 8, 8, 8, 8], [1, 1, 1, 1, 1, 1, 4, 0, 4]
Example output: [2, 3, (2, 4), (1, 1)]

Step-by-step:

Current state
Switches: 0 0 0 0
Front:      Back:
11  0 11  |  1  1  1
 8  8  8  |  1  1  1
 8  8  8  |  4  0  4

Flipping switch 2
Flipping switch 3
Turning dial 2; 4 times

Current state
Switches: 0 0 1 1
Front:      Back:
11  0 11  |  1  1  1
 0  0  0  |  1  1  1
 0  0  0  |  0  0  0

Turning dial 1; 1 times

Current state
Switches: 0 0 1 1
Front:      Back:
 0  0  0  |  0  0  0
 0  0  0  |  0  0  0
 0  0  0  |  0  0  0
代码语言:javascript
运行
复制
Example input: [3, 11, 0, 11, 11, 5, 2, 11, 1], [9, 8, 0, 8, 8, 4, 10, 8, 11]
Example output: [1, 3, (2, 9), (0, 7), 0, 1, 2, 3, (0, 6), 2, 3, (3, 7), 0, 1, 2, 3, (0, 4)]

Step-by-step:

Current state
Switches: 0 0 0 0
Front:      Back:
 3 11  0  |  9  8  0
11 11  5  |  8  8  4
 2 11  1  | 10  8 11

Flipping switch 1
Flipping switch 3
Turning dial 2; 9 times

Current state
Switches: 0 1 0 1
Front:      Back:
 0 11  0  |  0 11  0
11 11  5  | 11 11  4
11 11  1  |  1 11 11

Turning dial 0; 7 times

Current state
Switches: 0 1 0 1
Front:      Back:
 7 11  0  |  5  4  0
11 11  5  |  4  4  4
 6 11  1  |  6  4 11

Flipping switch 0
Flipping switch 1
Flipping switch 2
Flipping switch 3
Turning dial 0; 6 times

Current state
Switches: 1 0 1 0
Front:      Back:
 1  5  0  | 11  4  0
 5  5  5  |  4  4  4
 0  5  1  |  0  4 11

Flipping switch 2
Flipping switch 3
Turning dial 3; 7 times

Current state
Switches: 1 0 0 1
Front:      Back:
 8  0  0  |  4  4  0
 0  0  0  |  4  4  4
 0  0  8  |  0  4  4

Flipping switch 0
Flipping switch 1
Flipping switch 2
Flipping switch 3
Turning dial 0; 4 times

Current state
Switches: 0 1 1 0
Front:      Back:
 0  0  0  |  0  0  0
 0  0  0  |  0  0  0
 0  0  0  |  0  0  0
EN

回答 1

Code Golf用户

发布于 2022-02-04 14:19:51

木炭,117个字节

代码语言:javascript
运行
复制
§≔θ⁰⁺§θ⁰↨§θ⁴±¹F⁴«≔§θI§5731ιζ≔⁺§θI§2860ι↨ζ±¹εF²«IE⁴∧κ⁼¹﹪⁻λι⁴I⟦⟦ι﹪⎇κε±ε¹²⟧⟧F²«IE⁴⁼‹λ﹪⁻μι⁴κI⟦⟦ι﹪×∨κ±¹⎇λ§ζκ⁻∧¬ι§§θ⁴κ§ζκ¹²

在网上试试!链接是详细的代码版本。将输入作为一个由9个时钟组成的数组,其中一个为角时钟的单个值,另一个为其他时钟的两个值的数组,并输出六个整数的列表:前四个是从左上角顺时针方向旋转的指针状态,第五个是以整数形式旋转的刻度盘(按顺时针方向计数,左上角为0),第六个是(顺时针方向的)值,从0 (不移除不必要的移动)到11。解释:

代码语言:javascript
运行
复制
§≔θ⁰⁺§θ⁰↨§θ⁴±¹

第一组旋转将通过旋转左上角时钟来纠正中心时钟,所以在这里修正它的值。

代码语言:javascript
运行
复制
F⁴«

在每个拨号盘上循环。

代码语言:javascript
运行
复制
≔§θI§5731ιζ

把这对钟按顺时针方向从那个刻度盘上取下来。

代码语言:javascript
运行
复制
≔⁺§θI§2860ι↨ζ±¹ε

时钟两个时钟顺时针方向(即下一个刻度盘的时钟)将被这些时钟的差旋转,因此在这里得到最后的值。

代码语言:javascript
运行
复制
F²«

( a)旋转其他时钟以与下一个角相匹配,或将所有时钟转回正午,或( b)按顺时针方向或其相反方向固定时钟。

代码语言:javascript
运行
复制
IE⁴∧κ⁼¹﹪⁻λι⁴I⟦⟦ι﹪⎇κε±ε¹²⟧⟧

启用除下一个角或所有钉外的所有挂钩,然后适当地旋转当前刻度盘。这两次旋转固定了那个时钟。

代码语言:javascript
运行
复制
F²«

顺时针旋转三个时钟,并逆时针旋转。

代码语言:javascript
运行
复制
IE⁴⁼‹λ﹪⁻μι⁴κI⟦⟦ι﹪×∨κ±¹⎇λ§ζκ⁻∧¬ι§§θ⁴κ§ζκ¹²

要么只启用表盘的挂钩,要么使刻度盘的指针和下一个刻度盘的挂钩同时启用,要么为倒转时钟启用除这些挂钩以外的所有挂钩,然后适当地旋转当前刻度盘,包括在第一次旋转时调整中心刻度盘。

该解决方案基本上依赖于两种组合:

  • 如果你旋转一个表盘,只是它的指针切换,然后反向旋转它的指针和下一个指针切换,你结束只旋转第二和第三个时钟顺时针从刻度盘。(对于第一次旋转,也要利用这个机会来修复中心时钟,尽管这也会使左上角时钟旋转。)
  • 如果你转动任何一个刻度盘,没有固定的按钮,那么倒转任何其他的刻度盘,而一个表盘有它的指针切换,你只旋转那个刻度盘的时钟。

通过按自定义顺序接受时钟,可以将字节数减少到105:

代码语言:javascript
运行
复制
≔⊟θη⊞θ⁺⊟θ↨η±¹F⁴«≔§θ⊗ιζ≔⁺§θ⊕⊗ι↨ζ±¹εF²«IE⁴∧κ⁼¹﹪⁻λι⁴I⟦⟦ι﹪⎇κε±ε¹²⟧⟧F²«IE⁴⁼‹λ﹪⁻μι⁴κI⟦⟦ι﹪×∨κ±¹⎇λ§ζκ⁻∧¬ι§ηκ§ζκ¹²

在网上试试!链接是详细的代码版本。取顺序为右、右上、下、右、左、左、上、左、中的时钟。

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

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

复制
相关文章

相似问题

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