パズルが面白そうだったのでVBとC#で書いてみた

数学パズル

3桁の数値とその数値を2乗した値の各数字が1から9までの数字で構成されるような3桁の数値をすべて求めるプログラムを作成せよ。

例えば 763*763=582169 となるが、これは、1,2,3,5,6,7,8,9 からなり、4が抜けているからダメ。

窓際プログラマーの独り言 -C#の話題を中心に:[Haskell

C#

var list = from x in Enumerable.Range(100,900)
where
(
from z in ((x * x).ToString() + x.ToString()).ToCharArray().Distinct() where z != '0'  select z
).Distinct().Count() == 9
select x;

VB

Dim list = From x In Enumerable.Range(100, 900) _
Where _
( _
From z In ((x * x).ToString() & x.ToString()).ToCharArray().Distinct() Where z <> "0"c Select z _
).Count = 9 _
Select x

最終的に生成される文字列が0を含んでいなくて、重複していなくて、9桁なら、問題の条件を満たすというロジックです。

追記:NyaRuRuさんに教えてもらったので、toCharArrayをなくすついでにいろいろといじったバージョン(C#のみ)

var list = from x in Enumerable.Range(100, 900)
where (x*1000000+x*x).ToString().Distinct().Where(s => s != '0').Count() == 9
select x;
Share

またまた、パズルが面白そうだったのでC#で書いてみた

問題

4桁の数値を順序を逆転させた数値(例えば、5432の場合は2345が逆転させた数値)で割ったときに、割り切れる4桁の数を求めよ。

(つまり、5432 / 2345 が割り切れればよい)

ただし、商が1のものや、割る数が4桁でないものは除外する。

窓際プログラマーの独り言 -C#の話題を中心に:[Haskell

var list = from x in Enumerable.Range(1000, 9000)
let y = Convert.ToInt32(new string(x.ToString().ToCharArray().Reverse().ToArray()))
where y >= 1000 && (x % y) == 0 && (x / y) != 1
select x;
Share

センセーショナルな犯罪と報道が現状を見誤らせる

昔に比べて、犯罪の発生率は横ばいか低いし、そもそも年齢分布も違う。

昔の大事件は記憶だけど、今の事件は自分が生きている今起きている事なので、どうしてもセンセーショナルに見えるし、その1件だけを見て、規制しようとか考えたくなる気持ちも分かるけど、もうちょっと冷静に考えていただけたらと思う。

また、犯罪者の属性を見て判断するのは早計だ。

似たような属性を持った人はそこら中にいるだろうが、普通にがんばって生きているのでは?

今まで犯罪を犯してきた人の属性を集めたら普通の社会ができあがるのでは?

特例を一般的な例として捉えていては、現状を見誤るだけだ。

ところで、いつも思うけど、「昔の方が良かった。」という人の昔っていったいどの時代の事だろう。

まだ、人では無かった時代のこと?

Share

今年もやります。「こみゅぷらす Community Launch 2008」

私も参加しているコミュニティ「こみゅぷらす」が今年もCommunity Launchイベントを開催します。

50名様限定ですので、早めの登録をお勧めします。

私もデモ中心でなんかやる予定です。

Windows Server 2008、Visual Studio 2008、SQL Server 2008 をはじめるとする技術セッションが盛りだくさん。

酒あり食べ物あり。参加者も入り乱れた楽しいイベントにしたいと思います。

ぜひ一緒に楽しく有意義なときを過ごしましょう!

開催概要

※ 50名様限定です。 (登録無しでの参加は出来ません)

会場:英国風パブ HUB 新宿駅近く

日時:2008 年 6 月 14 日 12:00 ~ 16:00

12:00 ~ 14:00 スクリーン セッション

プラズマ スクリーンを使用したセッションを行います。

お食事とお酒とともにお楽しみください。

お食事とお酒は、スポンサー様から提供されます。

14:00 ~ 16:00 テーブル セッション

各テーブルに分かれてセッションを行います。

追加のお食事はお客さまのご負担となりますが、必要に応じてオーダーしてください。

16:00~

お店の通常営業が開始されますが、会場にそのまま残っていただくことが可能です。

ただし、食べ物と飲み物はいったん撤去いたします。

参加費:1,000円

(当日、受付にて集金いたします)

今回 Culminis 様や、アイネタジャパン様、株式会社東京紙工様よりご支援をいただき、低い参加費を実現しました!

・食事は12時にご提供を開始いたします。食事の補充はありません。

・喫煙コーナーを設けますので、それ以外の場所での喫煙はご遠慮ください。

こみゅぷらす Community Launch 2008

Share

tomorrow never knows

大阪府の職員が人件費削減について

「2180万円のアパートを買ったのに、計算が狂った。」

と言った。

個人的には、人件費を削減すれば良いというものではないと思う。

むしろ、冷遇しすぎると有能な人材が集まらないし。

でも、大阪府は民間企業であれば、「継続に疑義」と言われるくらい財政状態が悪いわけだから、人数を削られたくなければ甘受するしか無いのでは。

(まぁ、個人的には、こういう時こそ少数精鋭が好ましいと思っているんだけど。)

まぁ、どんな人でも、なんらかの計算違いを繰り返しながら生活しているのでは。

私なんか計算違いの毎日ですよ。

未来なんて誰にもわからない。

Share

ユーザ数制限が無くなったと思ったら・・・

auにはSMSが送信できませんでした。

最初、躍起になって、3,4回送信して、届かなくて、知り合いのソフトバンクに代理で送信しようとしたら、

君、SMS送信しすぎ。

とエラーメッセージが出てしまった・・・。

んー。とはいえ、特にアプリケーションも無いので、SDKで遊んでいるだけでも良いんだけれども。

Share

ATOK2008 for Mac 7月発売

発売日:2008年7月18日(金) Just MyShop予約開始日:2008年6月24日(火)

ATOK 2008 for Macは最新のMac OS X v10.5 Leopardに、より最適化し、スピード、快適さ、安心を追求しました。

さらにATOK 2008 for Windowsで話題になった新機能や、Macでは新登場の「ATOKダイレクト」を搭載し、変換精度がさらに進化しています。

日本語入力の新しいスタンダードになる、ATOK 2008 for Macで快適な入力環境を。

日本語入力システム ATOK 2008 for Mac

買ったばっかなのに・・・。

Share

カスタムコントロールのプロパティの型をコントロールにしたい時に必要なTypeConverterの実装

以前に、.NET Framework1.1を利用している時に下記のエントリをしました。

カスタムコントロールのプロパティの型をコントロールにしたい時に必要なTypeConverterの抽象クラスです。

各、コントロール毎にTypeConverterを一から作るのはめんどくさいので、抽象クラスを作っておいて、継承先で型を指定するプロパティをオーバライドする事で指定の型のTypeConverterを作成しています。

バージョンは1.1:カスタムコントロールのプロパティの型をコントロールにしたい時に必要なTypeConverterの抽象クラス – NAL-6295の舌先三寸

今回、ジェネリックを利用する事で、抽象クラスである必要が無くなり、継承する必要がなくなりました。

利用するときに、その型を指定すればよいだけです。

using System;
using System.Drawing;
using System.Reflection;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
namespace NAL6295.Web.UI.Controls
{
/// <summary>
/// コントロールの型情報と型名の相互変換
/// </summary>
/// <typeparam name="T">System.Web.UI.Controlを継承したクラスのみ指定可能</typeparam>
public class ControlConverter<T> : System.ComponentModel.StringConverter where T:System.Web.UI.Control    {
private ArrayList _values;
/// <summary>
///		値リストのサポートを許可する
/// </summary>
/// <param name="context"></param>
/// <returns></returns>		
public override bool GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context)
{
return true;
}
/// <summary>
///		値リストの作成
/// </summary>
/// <param name="context"></param>
/// <returns>デザイン画面に存在するControlTypeプロパティで指定されたコントロールのリストを取得しそのIDリストを返す</returns>
public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(System.ComponentModel.ITypeDescriptorContext context)
{
_values = new ArrayList();
foreach (System.Web.UI.Control item in GetControlList(context))
{
_values.Add(item.ID);
}
return new System.ComponentModel.TypeConverter.StandardValuesCollection(_values);
}
/// <summary>
///		文字列型から指定された型への変換
///		選択リストに無い文字列が指定されていたときは、String.Emptyを返す
/// </summary>
/// <param name="context"></param>
/// <param name="culture"></param>
/// <param name="value"></param>
/// <returns></returns>
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
foreach (System.Web.UI.Control item in GetControlList(context))
{
if (item.ID == (string)value)
{
return base.ConvertFrom(context, culture, value);
}
}
return string.Empty;
}
return base.ConvertFrom(context, culture, value);
}
/// <summary>
///		指定された型のリストを返す
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
private object[] GetControlList(ITypeDescriptorContext context)
{
IReferenceService serv = (IReferenceService)context.GetService(typeof(IReferenceService));
return serv.GetReferences(typeof(T));
}
}
}

利用例:

public class カスタムコントロール : Control
{
//いろんな処理
private _hintControlName = "";
[TypeConverter(typeof(ControlConverter<Label>))
,DefaultValue("")
,Description("このコントロールのヒントを表示するラベルを選択するプロパティです。")]
public string Hint
{
get
{
return _hintControlName;
}
set
{
_hintControlName = value;
}
}
//いろんな処理
}
Share

全員負け組

負け組だと思っている人も、勝ち組だと思っている人も、その枠組みにいる間は、全員負け組である。

Share

超今更な話だけどGenericの型パラメータの制約は便利だ

最近、Genericを利用したクラスを作成する機会があった。

もともと、以下のような感じのGenericを利用していないクラスがあったのをGenericに対応した。

public abstract class ほにゃAbstract
{
public ほにゃAbstract()
{
}
public abstract DataTable TableData
{get;}
}
public class ふが :ほにゃabstract
{
private 型のついたテーブル型 _data = new 型のついたテーブル型();
public override DataTable TableData
{
get
{
return _data;
}
}
}

というクラスがあったとして、Dataプロパティを利用するときは、常にDataTable型なので、型付DataSetで定義したテーブルを返す時は

ふが ふがインスタンス = インスタンス作成();
型のついたテーブル型 データ = (型のついたテーブル型)ふがインスタンス.TableData;

といった感じにいちいちキャストする必要があったが

public abstract class ほにゃAbstract<T> where T:DataTable,new()
{
public abstract ほにゃAbstract()
{
}
private T _data = new T();
public abstract T TableData
{
get
{
return _data;
}
}
}
public class ふが :ほにゃabstract<型のついたテーブル型>
{
}

とすることで、

ふが ふがインスタンス = インスタンス作成();
型のついたテーブル型 データ = ふがインスタンス.TableData;

とキャストしなくて良くなった。

ここで、重要だと思ったのが、

public abstract class ほにゃAbstract<T> where T:DataTable,new()

のwhere以降の部分で、Tに設定できる型の条件を指定できる。

T:DataTable

で、DataTableを基本型に持つクラスのみ指定可能なので、DataTableを継承した型である事という条件がクリアできる。

次に

new()

とつけることで、

private T _data = new T();

といったように抽象クラス側でインスタンスの生成ができるようになったので、いちいちサブクラス側でメンバを設定する必要が無くなった。

今更だし、凄い簡単な話なんだけど、便利だと思った。

そういえば、MSDNライブラリの型パラメータの制約ページの構文を説明している箇所で

http://msdn.microsoft.com/ja-jp/library/d5x73970.aspx

where T:struct

where T:class

のままで良いのに、

where T:構造体

where T:クラス

になっていた。

翻訳されすぎ。

Share