将ruby中的数组转换为输出流

将ruby中的数组转换为输出流,ruby,Ruby,我有一个数组[2,4,6,8,3],我需要将其转换为输出流,如下所示: 2 4 6 8 3 转换成字符串并切掉逗号和引号是没有帮助的,因为如果它是字符串,它总是打印为“2 4 6 8 3” 这是给定的输入: 5 2 4 6 8 3 这是我写的代码 def insertionSort( ar) key = ar.last (ar.size-2).downto(0){ |x| if(key < ar[x])

我有一个数组
[2,4,6,8,3]
,我需要将其转换为输出流,如下所示:

2 4 6 8 3
转换成字符串并切掉逗号和引号是没有帮助的,因为如果它是字符串,它总是打印为“2 4 6 8 3”

这是给定的输入:

5
2 4 6 8 3
这是我写的代码

def  insertionSort( ar) 
    key = ar.last    
    (ar.size-2).downto(0){ 
        |x|
        if(key < ar[x])
            ar[x+1] = ar[x]
            p ar
        else
            ar[x+1] = key
            p ar
            break
        end
    }
end
# Tail starts here
count = gets.to_i
ar = gets.strip.split.map {|i| i.to_i}

insertionSort( ar )
预期产出:

2 4 6 8 8 
2 4 6 6 8 
2 4 4 6 8 
2 3 4 6 8 
测试结果:
失败

你的问题一点也不清楚,但是,也许这就是你想要的:

ary = [2, 4, 6, 8, 3]
ary.join(' ') # => "2 4 6 8 3"
ary * ' ' # => "2 4 6 8 3"

也许你不懂如何循环

ary = [2, 4, 6, 8, 3]

5.times do
  puts ary.join(' ')
end
# >> 2 4 6 8 3
# >> 2 4 6 8 3
# >> 2 4 6 8 3
# >> 2 4 6 8 3
# >> 2 4 6 8 3

或者你不明白命令行应用程序是如何读取STDIN的

在编写管道时,处理STDIN很有用:将一个小型专用应用程序链接到另一个应用程序,并让它们共同完成一项大任务是*nix系统的基本前提。尝试做所有事情的单片应用程序是编写/维护和使用的主要PITA

如果您想从标准输入或键盘读取一行输入,
get
很好。如果您想阅读一系列行,请查看Ruby的ARGF类,并非常熟悉
STDIN
$STDIN
的工作原理

编写Ruby命令行脚本很容易,但是,就像在Perl、Python或C中那样,您必须知道传入数据是如何访问的,它是什么类型的数据(总是一个字符串),以及它的结构:以新行(
“\n”
)或回车+新行(
“\r\n”
)结尾的字符


也许你不明白
to_i
是如何工作的

"2 4 6 8 3".to_i # => 2
"24683".to_i # => 24683
"2_4_6_8_3".to_i # => 24683
to_i
从第一个字符读取字符串,并继续执行,直到找到非数字。因此,在上述示例中,
2
是第一个字符串中的第一个数字,后跟一个空格。空格是非数字,因此
to_i
停止处理并仅返回
2
。在第二个示例中,没有空格,因此
to_i
处理整个字符串并将其作为单个值返回。在第三种情况下,因为Ruby和其他一些语言一样,接受
\uu
作为数字字符串的一部分,
to\u i
再次返回完整值
\uU
用于标记值中的逗号位置,如
1\u 000\u 000


当您编写更多的代码时,请花时间将其写得清晰、干净。你需要的代码可以减少视觉上的噪音,并使它更容易进入你的大脑。Ruby使编写清晰、表达力强、易于理解的代码变得容易,但糟糕的编码风格会使Ruby代码很快变得不可读,特别是对于我们这些习惯于以惯用风格编写代码的人来说

这并不是试图修复您的算法,只是为了展示您应该如何设计代码:

def insertion_sort(ar)

  key = ar.last    

  (ar.size - 2).downto(0) { |x|
    if (key < ar[x])
      ar[x + 1] = ar[x]
      p ar
    else
      ar[x + 1] = key
      p ar
      break
    end
  }

end

# Tail starts here
count = gets.to_i

ar = gets.strip.split.map { |i| i.to_i }

insertion_sort(ar)
def插入排序(ar)
key=ar.last
(ar.size-2)。下至(0){x|
if(键
  • 方法总是以snake_的形式编写,而不是CamelCase
  • 使用空格;它让你的眼睛和大脑的逻辑断裂,帮助定义发生了什么。运算符和控件结构受益于在前后、上方和下方使用空格
  • 使用空格缩进,制表位设置为2个空格。这是Ruby标准。为什么是这些?在不同编辑器之间移动代码时的一致性;如果你在一家专业的编码公司工作,你可能会发现有很多更严格的编码标准
  • 不适用于多维数组或数组中的数组

     > a = [1, 2, [3, 4, 5, 6], [7, 8, 9]]
     > puts "[#{a.join(', ')}]"
    
    => [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    但是,如果您这样做,它应该适用于多维数组:

    示例1:

     > a = [1, 2, [3, 4, 5, 6], [7, 8, 9]]
     > a.each do |sub_a|
     >   puts "[#{a.join(', ')}]"
     > end
    
    => [1, 2, [3, 4, 5, 6], [7, 8, 9]]
    
     > a = [1, [2, [3, 4, [5, 6, 7, 8], 9, 0]], 'x', 'y', 'z']
     > a.each do |sub_a|
     >   puts "[#{a.join(', ')}]"
     > end
    
    => [1, [2, [3, 4, [5, 6, 7, 8], 9, 0]], "x", "y", "z"]
    
    示例2:

     > a = [1, 2, [3, 4, 5, 6], [7, 8, 9]]
     > a.each do |sub_a|
     >   puts "[#{a.join(', ')}]"
     > end
    
    => [1, 2, [3, 4, 5, 6], [7, 8, 9]]
    
     > a = [1, [2, [3, 4, [5, 6, 7, 8], 9, 0]], 'x', 'y', 'z']
     > a.each do |sub_a|
     >   puts "[#{a.join(', ')}]"
     > end
    
    => [1, [2, [3, 4, [5, 6, 7, 8], 9, 0]], "x", "y", "z"]
    

    在阅读您引用的HackerRank之后,输入似乎来自stdin。如果您的代码包括

    s = gets
    
    它将等待您输入字符串。假设您输入
    1234
    (无引号)。然后
    s
    将保持
    “1 2 3 4\n”

    如果要将其转换为数组:

    a = s.split # => ["1","2","3","4"]
    
    如果希望
    a
    的元素是整数,而不是字符串:

    a.map! {|e| e.to_i} # => [1,2,3,4]
    
    其中(自Ruby 1.9版起)也可以编写:

    a.map!(&:to_i) # => [1,2,3,4]
    
    “Ruby方式”将是链接这些操作:

    a = gets.split.map(&:to_i) # => [1,2,3,4]
    
    请注意,我们不需要
    立即使用地图

    如果希望此数组成为某些(现有数组)的行
    i
    b

    b[i] = a
    

    如果我使用puts或print,它只打印数组。该程序需要2 4 6 8 8 2 4 6 6 8 2 4 6 8 2 3 4 6 8,我给它“2 4 6 8”“2 4 6 6 8”“2 4 6 8”“2 3 4 6 8”或[2,4,6,8,8][2,4,6,6,8][2,4,4,6,8][2,3,4,4,6,8],这是从这里开始的-听起来你对Ruby如何在IRB中显示东西和输出到STDOUT这样的输出流有些困惑。我们需要显示您所写内容的示例代码,以及您正试图使用它执行的操作。实际上,您未能满足以下要求:“有关您编写的代码问题的问题必须在问题本身中描述特定问题,并包含复制该问题的有效代码。请参阅以获取指导。”更新不足以解释您的代码。我们必须看看你写了什么。你添加的代码应该是管道的接收器吗,也就是说,它是否通过管道进入
    24688
    ?如果是这样,当
    获取时,您是否没有收到包含所有五个值的整个字符串?和/或您不明白为什么
    to_i
    只返回第一个值?因为,如果是这样,您需要了解
    to_i
    的工作原理。你不明白为什么第二个
    得到的
    没有读取管道中的其余部分吗?如果是这样,您需要阅读
    get
    是如何工作的。我了解输入是如何工作的,我不知道为什么我的打印语句不被接受为答案。谢谢,ary。join(“”)做了我想要的,我不知道如何打印它而不加引号或引号