-2

以下のように、配列[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 

テスト結果: 不合格

4

3 に答える 3

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 の処理は、パイプを作成するときに役立ちます。1 つの小さな特殊なアプリケーションを別のアプリケーションにチェーンし、それらをまとめて大きなタスクを実行させることは、*nix システムの基本的な前提です。すべてを実行しようとするモノリシック アプリは、作成/維持および使用する主要な PITA です。

STDIN またはキーボードから 1 行の入力を読み取りたい場合に適して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。2 番目の例ではスペースがないためto_i、文字列全体を処理して単一の値として返します。3 番目では、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標準です。なぜそれら?人々が異なるエディター間でコードを移動する際の一貫性。プロのコーディング ハウスで作業している場合は、より厳格なコーディング標準が適用されていることに気付くでしょう。
于 2013-10-28T18:29:44.677 に答える
0

あなたが参照したHackerRankの「挿入ポイント」の質問を読んだ後、入力は標準入力から来ているようです。コードに含まれる場合

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]

!今は with mapは必要ないことに注意してください。

この配列をいくつかの行iにしたい場合(既存の配列)b

b[i] = a
于 2013-10-28T19:02:36.257 に答える