2007-04-08
■ [web] ll.jus.or.jpのサイトが酷い
- 2006 LL Ring: 403 Forbidden
- 2005 LLDN: 激しく文字化け(utf8らしい)
- 2004 LL Weekend: 激しく文字化け(eucらしい)
- 2003 LL Saturday: DirectryIndexが見えてる
どうしちゃったんだぜ…?
■ [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で頑張るんかなぁ。
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)
おお、list-ecというのがあるのですね。<br>ありがとうございます。追記しておきました。