gpt4 book ai didi

swift - 需要一种算法来洗牌 5 个数组的元素,每个数组具有相同的 5 个元素,这样没有两个数组在相同的索引处具有相同的元素

转载 作者:搜寻专家 更新时间:2023-10-31 08:15:31 25 4
gpt4 key购买 nike

This is the image我有以下五个数组

var E1 = ["A", "B", "C", "D", "E"]
var E2 = ["A", "B", "C", "D", "E"]
var E3 = ["A", "B", "C", "D", "E"]
var E4 = ["A", "B", "C", "D", "E"]
var E5 = ["A", "B", "C", "D", "E"]

每个数组都有相同的五个元素,即“A”、“B”、“C”、“D”和“E”。我想编写一个算法来对所有数组中的元素进行排序,使得没有两个数组在同一索引处具有相同的元素(假设为“A”)。

一种对我有用的示例输出如下:

var E1 = ["A", "B", "C", "D", "E"]
var E2 = ["B", "C", "D", "E", "A"]
var E3 = ["C", "D", "E", "A", "B"]
var E4 = ["D", "E", "A", "B", "C"]
var E5 = ["E", "A", "B", "C", "D"]

我已尝试解决此问题但无法完成。我刚刚编写了一个洗牌函数,用于对两个数组(E1 和 E2)的元素进行排序。

var E1 = ["A", "B", "C", "D", "E"]
var E2 = ["A", "B", "C", "D", "E"]
var E3 = ["A", "B", "C", "D", "E"]
var E4 = ["A", "B", "C", "D", "E"]
var E5 = ["A", "B", "C", "D", "E"]

func shuffledArrays(var array1: [String],var array2: [String]) {


if array1[0] == array2[0] || array1[1] == array2[1] || array1[2] == array2[2] || array1[3] == array2[3] || array1[4] == array2[4] {

shuffled1 = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(array1)
shuffled2 = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(array2)

var array3 = shuffled1 as! [String]
var array4 = shuffled2 as! [String]

} else {
var array3 = array1
var array4 = array2
}

array1 = array3
array2 = array4
}

// Now calling the function on arrays E1 and E2
shuffledArrays(E1, array2: E2)
print(E1)
print(E2)

使用此代码,我在 Xcode Playground 上收到以下错误。虽然有时错误被删除并且输出在第 102 和 103 行是正确的,但我仍然无法提取该输出并将其分别永久保存到 E1 和 E2 中。请帮助我完成排列五个数组元素的整个算法。

谢谢

最佳答案

既然你知道数组 E1, ..., E5 保存相同的条目(以相同的顺序),你不需要显式保存数组 E2 E5(因为您知道这些值等于 E1)。

因此,您可以简单地定义一个移位函数,并通过重复移位先前的数组来创建 E2E5

import GameplayKit

func shiftByOne (arr: [String]) -> [String] {
var shiftedArr = arr
shiftedArr.insert(shiftedArr.popLast()!, atIndex: 0)
return shiftedArr
}

var E1 = ["A", "B", "C", "D", "E"]
E1 = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(E1) as! [String]
var E2 = shiftByOne(E1)
var E3 = shiftByOne(E2)
var E4 = shiftByOne(E3)
var E5 = shiftByOne(E4)

/** Result without initial shuffle:
E1 = ["A", "B", "C", "D", "E"]
E2 = ["B", "C", "D", "E", "A"]
E3 = ["C", "D", "E", "A", "B"]
E4 = ["D", "E", "A", "B", "C"]
E5 = ["E", "A", "B", "C", "D"] */

此方法以 E1 开始(可能仅混洗此数组),并保证 E2E5构造的 所有人都不同,w.r.t.相互订购。

正如下面 R Menke 所指出的,如果您打乱数组 E1,相同的行为将保持不变(但是对于打乱的初始数组)。在这里,我使用了与您示例中相同的洗牌器,但对于更 Swifty 的方法,请参见例如:

关于swift - 需要一种算法来洗牌 5 个数组的元素,每个数组具有相同的 5 个元素,这样没有两个数组在相同的索引处具有相同的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34464841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com