トップ «前の日記(2007-04-05) 最新 次の日記(2007-04-10)» 編集

Route 477



2007-04-08

[web] ll.jus.or.jpのサイトが酷い

どうしちゃったんだぜ…?

[prog] 0から99までのランダムな数値を、指定した数だけ小さい順に並べて表示する

(人力検索はてなの回答を書いていた…んですが、途中で誤読に気付いてボツに。)

プログラミングの基本的な要素を含んだ例題として、「0から99までのランダムな数値を、指定した数だけ小さい順に並べて表示する」 という問題を考えてみました。

  • 入出力
  • 文字列と数値の変換
  • 乱数
  • 配列(リスト)
  • ソート

あたりがポイントでしょうか。

○○はもっと簡潔に書けるよ!というのがあればお教えください。

Ruby (ポイント:ブロック)

puts Array.new(ARGF.read.to_i){ rand(100) }.sort

Python (ポイント:リスト内包表現)

import sys
import random

count = int(sys.stdin.read())
for n in [random.randint(0,99) for x in range(count)]:
  print n

Haskell (ポイント:IOモナド)

import System.Random
import List

main = do input <- getContents
          let count = read input
          ran <- randomNumbers 0 99
          putStr $ unlines $ map show $ take count ran

randomNumbers :: Int -> Int -> IO [Int]
randomNumbers from to = do gen <- newStdGen
                           return $ randomRs (from,to) gen

Scheme(Gauche) (ポイント:再帰)

(use srfi-27)
(define (random-numbers size n)
  (if (= n 0)
    '()
    (cons (random-integer size) (random-numbers size (- n 1)))))

(define (main argv)
  (let ((count (read)))
    (for-each print (sort (random-numbers 100 count)))))

(4/13追記:コメント欄で教えて頂いたのですが、srfi-42のリスト内包表記を使うとより簡潔に書けるそうです。)

C++ (ポイント:データが大きくなっても安心)

#include <iostream>
#include <vector>
#include <stdlib.h>
using namespace std;

int main()
{
        int count;
        vector<int> nums;

        srand(time(NULL));

        cin >> count;
        for(int i=0; i<count; i++)
                nums.push_back(rand() % 100);

        sort(nums.begin(), nums.end());

        for(int i=0; i<nums.size(); i++)
                cout << nums[i] << endl;

        return 0;
}

OCaml (ポイント:パターンマッチ)

Random.self_init ();;

let rec random_numbers = function
        0 -> []
      | n -> Random.int(100) :: random_numbers (n-1)
;;

let println n = print_int n; print_newline ();;

List.iter println (List.sort compare (random_numbers (read_int ())));;

おまけ:Befunge (ソートなし)

&>: #v_@
 -   :  v  <
 1   >#v?1+^
 ^,*52.<

Befungeでソートってどうやるんだろう…。p/gで頑張るんかなぁ。

本日のツッコミ(全2件) [ツッコミを入れる]
shiro (2007-04-12 14:37)

Schemeでもsrfi-42で内包表記が使え、簡潔になることが多いです。<br><br>(use srfi-27)<br>(use srfi-42)<br><br>(define (main args)<br> (let1 count (read)<br> (for-each print (sort (list-ec (: i count) (random-integer 100)))))<br> 0)

yhara (2007-04-13 01:21)

おお、list-ecというのがあるのですね。<br>ありがとうございます。追記しておきました。