文字を中央に表示する

30分プログラム、その623。Cの宿題/文字列操作 - C/C++の宿題を片付けます@wiki - アットウィキをやってみた。

一定の文字からなる列sを読み込み、以下の条件を満たす同じ個数の文字からなる列tを出力するプログラムを作りなさい。
ただし、以下での単語とは空白以外の文字からなる列のこととする。
1,s中の単語は同じ順番で t に現われる
2,t中では単語は一つの空白に区切られる
3,t中に最初の単語の最初の文字から最後の単語の文字までは列全体の中央に位置し、前後は空白である
例えば文字の列
_This___is__a____good___program___
を入力すると
______This_is_a_good_program______
が出力される。ここで、_は空白を表すものとする。

正直、問題文の意味がよく分からないけれど、出力例から想像するに

  • 文字列を入力されたら、それを中央に表示する
  • 単語間のスペースは1個にまとめる
  • 入力文字列の幅と、出力文字列の幅は同じ

ってことだろう、たぶん。

使い方

$ echo ' This   is  a    good   program   ' | sed 's/ /_/g'
_This___is__a____good___program___
$ perl center.pl ' This   is  a    good   program   ' | sed 's/ /_/g'
______This_is_a_good_program______

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# center.pl -
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/07/20 21:21:53
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

use strict;
use warnings;
use Data::Dumper;

sub center($$){
    my ($n,$s) = @_;
    my $m = $n - length($s);
    my $left = $m / 2;
    my $right = $m - $left;

    ' ' x $left . $s . ' ' x $right;
}

sub strip($){
    my ($s) = @_;
    $s =~ s/\A +| +\Z//g;
    $s;
}
sub remove_sep($){
    my ($s) = @_;
    join ' ',split / +/,strip $s;
}

foreach my $x (@ARGV) {
    my $n = length $x;
    my $s = remove_sep ' This   is  a    good   program   ';
    print center($n,$s),"\n";
}

GAE/JでOCamlを動かそうとして挫折した

GAE/JThe website has movedを組み合わせたら、OCamlでWebアプリが作れるんじゃね?と思ったのでチャレンジしてみたけど、うまくいかなかった。
ocaml-java(Cadnium)はThreadを使っているけど、GAE/JはThreadを作れないらしい。(参考:http://code.google.com/intl/ja/appengine/docs/java/runtime.html)
こりゃ、無理だ。

Makefile

OPTIONS=-java-package testserv \
	-classpath  ~/tmp/java-ocaml/ocamljava-bin-1.2/lib/ocamlrun-servlet.jar \
	-I +cadmium \
	-provider fr.x9c.cadmium.primitives.cadmiumservlet.Servlets

OCAMLJAVA=java -jar ~/tmp/java-ocaml/ocamljava-bin-1.2/bin/ocamljava.jar
compile:
	$(OCAMLJAVA) $(OPTIONS) -c -I +cadmium hello.ml
link:
	$(OCAMLJAVA) $(OPTIONS) -o native.war -standalone \
		-additional-jar ~/tmp/java-ocaml/ocamljava-bin-1.2/lib/ocamlrun-servlet.jar \
		-servlet web.xml cadmiumLibrary.cmja cadmiumServletLibrary.cmja hello.cmj

hello.ml

open CadmiumServlet
let handle_get srv req resp =
  let out = Response.get_output_stream resp in
    output_string out "<html><head><title>ERROR</title></head><body>";
    output_string out "<b>UNHANDLED REQUEST</b>";
    output_string out "</body></html>"

let () =
  Servlet.register { Servlet.destroy = ignore;
		     Servlet.init = ignore;
		     Servlet.info = "my first servlet";
		     Servlet.do_delete = None;
		     Servlet.do_get = Some handle_get;
		     Servlet.do_head = None;
		     Servlet.do_options = None;
		     Servlet.do_post = None;
		     Servlet.do_put = None;
		     Servlet.do_trace = None;
		     Servlet.get_last_modified = None; }

web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app
   xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">
  <display-name>New Project Template</display-name>

  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>testserv.Hello</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

簡単なWebサーバ

ローカルに置いてあるときと、Webサーバで動いてるときで挙動が違うプログラムってありますよね。
例えば、

  • ローカルにあるSwfはネットワーク通信できないけど、Webサーバ上にあるSwfはできる*1
  • ローカルにあるHTMLは相対パスしか使えないけど、Webサーバ上にあるやつは絶対パスも使える
  • ローカルではCGIは動かないけど、Webサーバ上にあるやつは動く

というわけで、WEBrickで簡単なWebサーバを作ってみました。

#!/usr/bin/env ruby
require 'webrick'
include WEBrick

s = HTTPServer.new(:Port=>8000,:DocumentRoot=> Dir::pwd)
trap("INT"){ s.shutdown }
s.start

使い方は、

# カレントディレクトリが、DocumentRootになる
$ ./min_server

*1:より正確にはuse_network=1のswfファイルの場合