2

この形式の (ゲームのスコア) データがあります。

ホットスパーズ ジャイアンツ 356 6 275 4 442 3

フィアース ライオンズ クラブ 371 3 2520 5 0 4

マウンテン タイガース 2519 2 291 6 342 1

シューティングスタークラブ 2430 5 339 1 2472 2

ガントゥーターズ 329 4 2512 2 2470 6

バンシーウルブズ 301 1 2436 3 412 5

最初の 2 つまたは 3 つの単語はクラブの名前を表し、その後、クラブのラウンドごとのスコアと対戦相手のインデックス (1 から始まる) を表す 1 行あたり 6 ブロックのデータが続きます。上記のデータでは、各チームが 3 ラウンドずつプレーしています。ホットスパーズ ジャイアンツ(インデックス 1) は第 1 ラウンドでバンシー ウルブズ(6) と対戦し、356 からバンシーの 301 を獲得し、ラウンド 2 でホットスパー ジャイアンツシューティング スターズ クラブ(4) と対戦し、275 - 339 を獲得し、ラウンド 3 ではマウンテン タイガース(3) と対戦し、442 を獲得しました。タイガース342へ

私の質問は、クラブの名前が 2 つ以上の単語で構成される可能性があることを考慮して、各クラブのデータが以下の形式になるように、可能な限り最も効率的な方法でこのデータ ブロックを解析する方法です。

ビズ

[クラブラウンドスコア対戦相手 - スコア] クラブごと

4

2 に答える 2

3

これがどのように行われるかを示す一例 (Rebol 3 を使用) を次に示します。

club-data: map []  ; store data in hash map is one option

foreach line read/lines %games-scores.txt [
    fields: split line space

    ; lets take last 6 cols of data
    scores: reverse collect [loop 6 [keep to-integer take/last fields]]

    ; and whats left is the club name
    club-name: form fields

    ; build club data
    club-data/(club-name): scores
]

上記は、データがファイルにあると仮定しgames-scores.txt、MAP を返します。(ハッシュ マップ) を呼び出すとclub-data、クラブ データは次のようになります。

make map! [
    "Hotspurs Giants" [356 6 275 4 442 3]
    "Fierce Lions Club" [371 3 2520 5 0 4]
    "Mountain Tigers" [2519 2 291 6 342 1]
    "Shooting Stars Club" [2430 5 339 1 2472 2]
    "Gun Tooters" [329 4 2512 2 2470 6]
    "Banshee Wolves" [301 1 2436 3 412 5]
]

1 つの注意点... READ/LINES はファイル全体をメモリにロードします。したがって、games-scores.txtが大きい場合は、代わりに OPEN を使用して、一度に 1 行ずつ読み取る必要があります。

更新- 再: あなたのコメントは Rebol 2 と同じ例です [REBOL/Core 2.7.8.2.5 (2-Jan-2011) でテスト済み]:

club-data: make hash! []  ; of course doesn't have to be hash!

foreach line read/lines %games-scores.txt [
    fields:    parse line none
    scores:    reverse collect [loop 6 [keep to-integer take/last fields]]
    club-name: form fields
    append club-data reduce [club-name scores]
]
于 2013-08-13T16:20:25.360 に答える