5

次の Int リストがあります。

t1 = [1000, 1001, 1002, 1003, 1004]
t2 = [2000, 2001, 2002]
t3 = [3000, 3001, 3002, 3003]

リストのサイズは可変で、この例のように 3 つだけではありません。それらは 1 つ以上の要素を持つことができます。それから私はこれを持っています:

tAll = [t1, t2, t3]

tAllを次のようなものに「変える」関数が必要です。

[[1, 1000, 2000, 3000],
[2, 1001, 2001, 3001],
[3, 1002, 2002, 3002],
[4, 1003, 0, 3003], 
[5, 1004, 0, 0]]

これを行う簡単な方法はありますか?

編集: 申し訳ありませんが、急いでこれを投稿しましたが、私が望んでいたものとはまったく異なりました。上記のコードを更新しました...

4

4 に答える 4

9

まだ興味がある場合は、ここにワンライナーがあります。

zipWith (:) [1..] $ take (maximum $ map length tAll) 
                         (transpose (map (++repeat 0) tAll))

編集:OK、2行で書くほうがいいです:)

于 2008-12-21T19:31:01.097 に答える
2

まあ、これはハスケルの初心者の書き方ですが、明示的な再帰を行っているので、おそらくもっと良い方法があります。:-)

head0 [] = 0
head0 xs = head xs

tail0 [] = []
tail0 xs = tail xs

nreorder n ts
  | all null ts = []
  | otherwise   = (n : map head0 ts) : nreorder (n+1) (map tail0 ts)

そしてnreorder 1 tAll、必要なリストを印刷します。代わりに次のようにすることで、これらのインデックスを回避できます。

reorder ts
  | all null ts = []
  | otherwise   = (map head0 ts) : reorder (map tail0 ts)

そのためreorder tAll = [[1000,2000,3000],[1001,2001,3001],[1002,2002,3002],[1003,0,3003],[1004,0,0]]、そして(mattiastのおかげで少しクリーンアップされました):

nreorder ts = zipWith (:) [1..] (reorder tAll)

必要nreorder tAllなリストを印刷します。

于 2008-12-18T20:38:12.637 に答える
2

宿題のようなにおいがするので、コードは示しませんが、いくつかのヒント
を示します。-結果のリストの長さはすべて同じで、リストの最大値です。その最大値を見つけて、他のすべてのリストをゼロで埋めます(怠惰を使用すると、すべてのリストを無限のゼロのリストで埋めることができます)。
-最終的な回答の最初の列を出力するだけの中間バージョンを機能させます
...-それが機能するようになったら、2番目の列を取得します....残りは肉汁になります。

編集:コメントはそれが宿題ではないことを示しているので、:

リスト=[[1000、1001、1002、1003、1004]、[2000、2001、2002]、[3000、3001、3002、3003]]

main = do mapM_(putStrLn.show)(ローテーションリスト) リストの回転=[(i + 1):map(!! i)paddedlist | i <-[0 ..(len-1)]] ここで、len=最大$マップ長リスト paddedlist = map(++ repeat 0)リスト

于 2008-12-18T20:39:37.563 に答える
1

zip33 つのリストをトリプルの単一のリストに変換します。代わりに長さ 3 のリストが必要な場合は、次を使用できますzipWith3 (\a b c -> [a,b,c])

(更新されたリクエストのように) 詳細に異なるものが必要な場合は、独自のロールを作成する必要があります。最初に終了条件を設定してから、一般的なケースに対処してください。2 つの補助関数が必要です。1 つは希望どおりに値を修正するためのもの (例: "head_or_zero") で、もう 1 つは終了した入力リストを処理するための関数 (例: "tail_or_nil") です。


fix _ [] [] [] = []
fix i as bs cs = [i, hoz as, hoz bs, hoz cs]:fix (i+1) (ton as) (ton bs) (ton cs) where
    hoz [] = 0
    hoz x:xs = x
    ton [] = []
    ton x:xs = xs
于 2008-12-18T19:59:03.150 に答える