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

时间:2013-10-28 18:18:51

标签: 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])
            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]

预期输出:

2 4 6 8 8 
2 4 6 6 8 
2 4 4 6 8 
2 3 4 6 8 

测试结果: 失败

3 个答案:

答案 0 :(得分:2)

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

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。

如果您想从STDIN或键盘读取单行输入,gets是好的。如果您想阅读一系列内容,请查看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像其他语言一样接受_作为数字字符串的一部分,to_i会再次返回完整值。 _用于标记值中的逗号位置,例如1_000_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)
  1. 方法总是用snake_case编写,而不是CamelCase。
  2. 使用空格;它为您的眼睛和大脑提供逻辑中断,帮助定义正在发生的事情。操作员和控制结构受益于前后空白以及上下空白。
  3. 使用空格缩进,制表位设置为2个空格。这是Ruby标准。为什么那些?人们在不同编辑之间移动代码时的一致性;如果您在专业编码室工作,您可能会发现更严格的编码标准。

答案 1 :(得分:0)

 > a = [1, 2, 3, 4]
 > puts "[#{a.join(', ')}]"

=> [1, 2, 3, 4]

不适用于多维数组或数组中的数组。

 > 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]]

示例2:

 > 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 :(得分:0)

在阅读您引用的HackerRank "Insertion Point" question后,输入似乎来自stdin。如果您的代码包含

s = gets

它会等你输入一个字符串。假设您输入1 2 3 4(无引号)。然后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