【问题标题】:Hackerrank Sock Merchant Challenge - STDIN and STDOUT with RHackerrank Sock Merchant Challenge - STDIN 和 STDOUT 与 R
【发布时间】:2020-08-04 19:36:41
【问题描述】:

我花了相当多的时间试图尝试一下,但收效甚微。我基本上是在尝试解决来自 Hackerrank 在 R 上的袜子商人挑战。挑战本身非常简单,但我真的很难接受 STDIN 和 STDOUT。 可用的大多数帮助都与Python,所以我会非常感谢任何帮助。

以下是挑战的描述:

约翰在一家服装店工作。他有一大堆袜子,必须按颜色配对才能出售。给定一个代表每只袜子颜色的整数数组,确定有多少双颜色匹配的袜子。例如,有 n=7 种袜子的颜色 ar = [1,2,1,2,1,3,2]强> 。有一对颜色 1 和一个颜色 2。剩下三只奇怪的袜子,每种颜色一只。对数为 2

功能说明:在下方编辑器中完成sockMerchant功能。它必须返回一个整数,表示可用的匹配袜子对的数量。 sockMerchant 具有以下参数:

  • n: 袜子的数量
  • ar:每只袜子的颜色

输入格式: 第一行包含一个整数,表示袜子的数量。 第二行包含以空格分隔的整数,描述堆中袜子的颜色。

输出格式:返回 John 可以销售的匹配袜子的总数。

这是我的简单尝试,它在 RStudio 上运行良好

sockmerchant <- function(n,ar){
  unique.values <- unique(ar)
  count <- rep(0, length(unique.values))
  for (i in 1:length(unique.values)){
    count[i] <- sum(ar == unique.values[i])
  }
  temp <- count/2
  pairs <- floor(temp)
  return(sum(pairs))
}

但是,我不确定如何使该代码符合 Hackerrank 要求的标准输入/标准输出。我的主要挑战是如何让这个函数在 Hackerrank 上可解释。我应该如何修改代码,以便它从 STDIN 读取输入并将输出打印到 STDOUT。

【问题讨论】:

  • readLines 将返回一个字符向量。 as.numeric 会将其转换为数字向量(并将任何非数字值转换为 NA)。

标签: r function stdout stdin


【解决方案1】:

readLines 的每个输入都被解释为文本,因此您需要转换为数值进行计算。第二行需要用空格分隔以返回一个整数向量,然后将其转换为数字。

sockmerchant <- function() {
  cat("Enter total number of socks: ")
  n <- as.numeric(readLines(n = 1))
  cat("\nEnter colors of socks as integers separated by spaces: ")
  ar  <- as.numeric(strsplit(readLines(n = 1), " +")[[1]])
  if (length(ar) != n) stop("The number of socks doesn't match the color list!")
  unique.values <- unique(ar)
  count <- rep(0, length(unique.values))
  for (i in 1:length(unique.values)){
    count[i] <- sum(ar == unique.values[i])
  }
  temp <- count/2
  pairs <- floor(temp)
  return(sum(pairs))
}

它会像这样工作:

> sockmerchant()
Enter total number of socks: 
7

Enter colors of socks as integers separated by spaces: 
3 5 7 3 5 7 9
[1] 3

【讨论】:

  • 感谢您的回复。但是,我的挑战是如何从 STDIN 读取输入并将输出打印到 STDOUT 以实现上述功能。我希望我现在让自己更清楚。
  • @ObaidRehman 这确实从 STDIN 读取。它从readLines 读取,默认情况下从 STDIN 读取。如果你想输出到 STDOUT 你可以 catprint 结果而不是 return ing它。我展示的使用该函数的示例是通过 STDIN 输入数字
  • 再次感谢!我一定是在这里误解了一些东西,因为我对 Hackerrank 平台还很陌生。我基本上复制了你在hackerrank编辑器上建议的代码,当它处理测试数据上的代码时,我得到了以下消息。错误 (stderr) strsplit(readLines(n = 1), "+")[[1]] 中的错误:下标越界调用:sockmerchant 执行暂停
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
相关资源
最近更新 更多