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>ありがとうございます。追記しておきました。