如果您曾经接触过日本或东亚文化,那么您肯定会遇到过Amidakuji游戏:
正如Wikipedia解释的那样,这是一种抽签在纸上的彩票,用于随机选择N个项目的排列。
例如,它可以用于将开始顺序随机分配给N个人,或者将N个奖赏分配给N个人,依此类推。
了解游戏为何代表排列的诀窍是要意识到每个水平笔划(称为“腿”)都会将其两个项目交换到位。
同一Wikipedia页面还解释了N个项的每个排列P对应于无数个Amidakuji图。水平笔画(腿)最少的那个被称为那个特定排列P的“素数”。
您的任务是使用以下格式(减去字母)接收带有2条或更多垂直线(在本示例中为6条)的Amidakuji图:
A B C D E F
| | | | | |
|-| |-| |-|
| |-| |-| |
| | | | |-|
| |-| |-| |
| | |-| |-|
| | |-| | |
|-| | |-| |
|-| |-| | |
| |-| | |-|
| | | | | |
B C A D F E
并产生其素数之一(再次减去字母):
A B C D E F
| | | | | |
|-| | | |-|
| |-| | | |
| | | | | |
B C A D F E
带有字母的第一行和最后一行不是该格式的一部分。我在这里添加了它们以显示排列。它也没有要求在第一个或最后行包含没有腿|-|
,也不使输出是尽可能紧凑。
这个特定的输入示例是Wikipedia页面顶部的Amidakuji图的(无限)ASCII表示之一。
关于这些ASCII图,有一个非显而易见的规则:禁止相邻的边。
|-|-| <- NO, this does not represent a single swap!
Wikipedia解释了一种从图表中获取素数的标准过程,称为“起泡”,该过程包括一遍又一遍地应用以下简化:
1)右叉到左叉:
| |-| |-| |
|-| | -> | |-|
| |-| |-| |
2)消除双打:
|-| | |
|-| -> | |
我不确定这种解释是否明确。您的代码可以使用该技术或产生所需素数的任何其他算法。
最短的代码获胜。
适用标准规则和标准津贴。(如果输入无效,则程序可能会着火。输入/输出格式可能是stdin / stdout,字符串参数,行列表,字符矩阵,最适合您的方法等)