以随机顺序迭代文件

时间:2017-11-05 06:05:00

标签: swift linux random

我正在研究swift的教育脚本。目的是促进大学班级同学之间在统计方面的合作。每个学生都需要(匿名)向同事的工作提出建议。我编写的脚本可以使目录中的所有markdown文件都匿名化(即删除作者和电子邮件yaml键),并创建包含内容的新文件并使用电子邮件地址重命名。

到目前为止,我能够从每个文件中删除author:email: yaml键,并且我还能够重命名目录中的文件。但是,我正在努力创建一种随机化文件和电子邮件的方法。关键是原始文件应该传递给另一个学生,但没有最后一个知道作者。接收学生应该随机决定。这种随机化是我正在努力的方法。

MWE

这是一个linux项目,我发现创建MWE的最简单方法是使用优秀的John Sundell's marathon script structure编写脚本。以下是代码:

import Yaml // marathon: https://github.com/behrang/YamlSwift.git
import Files // marathon:https://github.com/JohnSundell/Files.git
import Foundation

var email: String = ""
var document: String = ""


for file in Folder.current.files {
    guard file.extension == "md" else {
        continue
    }

    let content = try file.readAsString()
    let pattern = "(?s)(?<=---).*(?=---)"
    if let range = content.range(of: pattern, options: .regularExpression) {
        let text = String(content[range])
        let value = try! Yaml.load(text)
        email = value["email"].string!
        let author = value["author"].string!
        let emailline = "email: " + email
        let authorline = "author: " + author
        document = content.replacingOccurrences(of: "\n\(emailline)", with: "")
        document = content.replacingOccurrences(of: "\n\(authorline)", with: "")
    }  

    // Creating new file with name from email and copying contents into it
    //let folder = try Folder()
    let file = try Folder.current.createFile(named: email)
    try file.write(string: document)
}

示例md文件:

---
# Metadata
title: hum
author: jecatatu
email: email@gmail.com
---
This is more text outside the yaml block

email: zwe@gmail.com

第二个档案:

# Metadata
title: My essay
author: brauser
email: brauser@gmail.com
---
Extra text

第三个档案:

# Metadata
title: My third essay
author: bestuser
email: bestuser@gmail.com
---
Extra text

问题

首先,我不需要代码。但代码是受欢迎的。请注意,可以运行以上示例(前提是您有马拉松installed):

marathon run lf-araujo/collab
  • 我想我可以通过以随机顺序迭代目录中的文件来解决这个问题。怎么办?我的第一个想法是创建一个带有电子邮件和文件名的字典,并加扰这两个。

1 个答案:

答案 0 :(得分:1)

您需要的是将一个评论者分配给一个同伴的确定性方法。您可以通过创建两个(random - &gt;文章)地图来实现这一目标。按随机键对它们进行排序,并按索引匹配文章。伪代码中的一个例子:

/* Note that you may want to be sure that random keys are unique */
map reviewers = [random_integer(): article_one,
                 random_integer(): article_two,
                 ...]
map articles = [random_integer(): article_one,
                random_integer(): article_two,
                ...]
sort reviewers by key
sort articles by key
for (index in 0..length(reviewers)) {
     assign_reviewer(author_from: reviewers[index], to: articles[index])
}