start(i=2 to max) --> 如果任何测试对为 T-6ren">
gpt4 book ai didi

R 编程,使用自定义脚本(针对每个 i)进行逐行数据帧计算以解决 "bridge game"

转载 作者:行者123 更新时间:2023-12-03 23:33:38 25 4
gpt4 key购买 nike

我有一个指定“桥牌游戏”的数据框(每一行都是一个独立的游戏),请参阅下面的 4 个游戏的最小示例:

start <- list(c("10","15","5"), c("5") ,c("11","6"),c("6","11"))
end <- list(c("7","17","11"), c("10"), c("8","12"),c("8","12"))
ascending <- c("+","-","+","-")
position <- c(11,6,9,8)
desired_output <- c(5,5,"disqualified",3)

bridge_game <- data.frame(start = I(start), end = I(end), ascending = ascending, position = position, desired_output = desired_output)

bridge_game

桥牌游戏如何运作?全世界的考生都参加了桥牌比赛挑战,我们在数据框中收集了每场桥牌比赛的数据。每座桥都由编号的木板(不一定必须从 1 开始的正整数)和 splinter 板的“间隙”组成。候选人可以选择从桥的哪一侧开始步行(升序 = 面板编号随着步行的进行而增加;或下降 = 面板的编号随着步行的进行而减少)。

可以在此处找到用于更好理解桥牌游戏的图形(以数据框中的第一行为例): click here

对于每个桥牌游戏(= 数据框中的行),我们有以下信息(= 列):

  • bridge_game$start:整 block 木板的所有起始位置面板(随机顺序)
  • bridge_game$end:整 block 木头的所有结束位置面板(随机顺序)
  • bridge_game$ascending:以上升 (+) 或面板的降序 (-) 顺序
  • bridge_game$位置:候选人最终出现在指定的小组中

挑战是什么?我需要编写一个脚本,我可以在整个数据帧上逐行运行以获得以下输出:

  • bridge_game$desired_output:测试候选人是否掉入河中(最终落到一 block splinter 的面板上并被“取消资格”)。如果他没有被取消资格,我需要计算候选人步行所覆盖的整 block 木板的数量(破损的木板不算在内)。

重要的是,它应该适用于任意数量的i整片木板。

更准确地说,我在下面给出了请求的 R 脚本应该如何操作的分步说明:

0) 已解决

a) 将字符列表转换为 bridge_game$start 和 bridge_game$end 列的数字列表。

b) 计算i(整 block 木板的条数;i1i=max 为每一行)并对开始和结束位置进行排序以获得每个 i 的正确开始和结束值。

1) 测试位置是否在 splinter 面板:end(i=1 to max-1) > position > start(i=2 to max) --> 如果任何测试对为 TRUE --> “不合格”

2) 如果否,则测试给定位置位于整个面板的哪个区域 (i = n):start(i=1 to max) <= position <= end(i=1 to max) --> 如果 TRUE 则返回 i (= n)

3)

a) 应用此公式(如果方向为升序“+”且 n = 1):输出 = 位置 - 开始 (i=1) + 1

b) 应用这个公式(如果方向是下降的“-”并且 n = i max):output = end(i=max) - position + 1

c)应用这个公式(如果方向是升序“+”并且 n > 1):输出 = 位置 - 开始(i=1)+ 1 -(开始(i=2 到 n) - 结束( i=1 到 n-1) - 1x[n-1])

d) 应用这个公式(如果方向是下降的“-”并且 n < i max):output = end(i=max) - position + 1 - (start(i=n+1 to max) - end(i=n to max-1) - 1x[i=max - n])

我希望我在那里得到了数学。为了检查正确的输出,我在“bridge_game”数据框中创建了一个“desired_output”列。

感谢您的帮助!

最佳答案

你把这个问题复杂化了。考虑以下实现

parse_pos <- function(x) sort(as.integer(x))

construct_bridge <- function(starts, ends) {
starts <- parse_pos(starts); ends <- parse_pos(ends)
bridge <- logical(tail(ends, 1L))
whole_panels <- sequence(ends - starts + 1L, starts)
bridge[whole_panels] <- TRUE
bridge
}

count_steps <- function(bridge, direction, stop_pos) {
if (isFALSE(bridge[[stop_pos]]))
return("disqualified")
start_pos = c("+" = 1L, "-" = length(bridge))[[direction]]
sum(bridge[start_pos:stop_pos])
}

play_games <- function(starts, ends, direction, stop_pos) {
mapply(function(s, e, d, sp) {
bridge <- construct_bridge(s, e)
count_steps(bridge, d, sp)
}, starts, ends, direction, stop_pos)
}

输出

> with(bridge_game, play_games(start, end, ascending, position))
[1] "5" "5" "disqualified" "3"

这里的关键是我们可以使用一个逻辑向量来表示一个桥,其中一个损坏的/整个面板由 F/T 索引。然后我们只是测试停止位置是否在整个面板上。如果是,则返回从开始位置到结束位置的面板总和(损坏的面板不会影响总和,因为它们只是零),否则返回“不合格”。

关于R 编程,使用自定义脚本(针对每个 i)进行逐行数据帧计算以解决 "bridge game",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65003498/

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