C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: 以下について教えてください


(過去ログ 64 を表示中)

[トピック内 24 記事 (1 - 20 表示)]  << 0 | 1 >>

■36939 / inTopicNo.1)  以下について教えてください
  
□投稿者/ 田中 (1回)-(2009/06/10(Wed) 11:50:35)

分類:[.NET 全般] 

例
String f3(String s){
 StringBuilder sb = new StringBuilder();
 for(int i=0; i<s.length(); i++){
  char c = s.charAt(i);
  
  if('a' <= c && c <= 'z'){
   c = (char)('A' + (c - 'a'));
  }
  
  else if('A' <= c && c <= 'Z'){
   c = (char)('a' + (c - 'A'));
  }
  
  if(i != 0){sb.append(".");}
  sb.append(c);
  
 }
 return sb.toString();
}



上のはヒントです
以下の仕様になるように
・大文字は小文字に、数字は'0','1','2'...を'9','8','7'...と反転させる。
・ただし、'#'以降の文字は変換しない。
・例として "Abc012_59F_#012Gh"を渡した場合の戻り値は "abc987_40f_#012Gh"となる。
 
String f3(String s){
 StringBuilder sb = new StringBuilder();
 
 -------ここから-------
 
 
 -------ここまで-------
 
 for(int i=0; i<s.length(); i++){
  char c = s.charAt(i);
  
 -------ここから-------
 
 
 -------ここまで-------
 
 }
 return sb.toString();
}
わかりますか?

引用返信 編集キー/
■36940 / inTopicNo.2)  Re[1]: 以下について教えてください
□投稿者/ 774RR (361回)-(2009/06/10(Wed) 11:57:44)
それは宿題か課題か何かで、で、俺たちに解いてくれと言っているわけ?
おことわり。
宿題なら自分でやらんと力にならんだろう。
自力で解決できない課題を他人に解決してもらってばかりいると、どつぼにはまるぞ。

ちなみに「わかりますか」という質問に対する答えは「わかります」「わかりません」のどっちかだ。

引用返信 編集キー/
■36941 / inTopicNo.3)  Re[2]: 以下について教えてください
□投稿者/ すがり (35回)-(2009/06/10(Wed) 12:00:14)
情報共有
http://www.javaroad.jp/bbs/answer.jsp?q_id=20090610112049248

自分でやる気がないなら某巨大掲示板の宿題丸投げ回答してくれる板にでもどうぞ。
引用返信 編集キー/
■36942 / inTopicNo.4)  Re[3]: 以下について教えてください
□投稿者/ .SHO (866回)-(2009/06/10(Wed) 12:23:56)
とりあえず「タイトル」がダメ!
何が問題かもわからんからタイトルすら書けない?
引用返信 編集キー/
■36946 / inTopicNo.5)  Re[4]: 以下について教えてください
□投稿者/ みきぬ (461回)-(2009/06/10(Wed) 13:00:24)
2009/06/10(Wed) 13:15:25 編集(投稿者)
暇つぶしに書いてみたけど、もうちょっとこう、エレガントにならないものか…うーむ。

    Private through As Boolean = False

    Public Function Convert(ByVal input As String) As String
        Return New String(New List(Of Char)(input).ConvertAll(Of Char)(AddressOf convertChar).ToArray())
    End Function

    Private Function convertChar(ByVal c As Char) As Char
        If through Then Return c

        Select Case c
            Case "0"c To "9"c
                Return CStr(9 - Val(c))(0)
            Case "#"c
                through = True
                Return c
            Case Else
                Return CStr(c).ToLower()(0)
        End Select
    End Function

# VB.NET で書き直し

引用返信 編集キー/
■36949 / inTopicNo.6)  Re[1]: 以下について教えてください
□投稿者/ よねKEN (350回)-(2009/06/10(Wed) 13:32:49)
仕様とコードの間に存在するムジュンを明らかにし、
それぞれのロジックのつながりを追うことで真実が見えてきます。

No36939 (田中 さん) に返信
> ・大文字は小文字に、数字は'0','1','2'...を'9','8','7'...と反転させる。
> ・ただし、'#'以降の文字は変換しない。
> ・例として "Abc012_59F_#012Gh"を渡した場合の戻り値は "abc987_40f_#012Gh"となる。

これらの仕様を便宜上、上から(1)(2)(3)と呼ぶことにします。

★1
提示のコードより:
> if('a' <= c && c <= 'z'){
> c = (char)('A' + (c - 'a'));
> }

この実装は(1)と一見関係するように見えますが、
(1)で規定しているのは大文字→小文字の仕様だけです。ムジュンしています。

★2
提示のコードより:
> if(i != 0){sb.append(".");}

この実装は(1)〜(3)のどの仕様にも該当するものがありません。ムジュンしています。

★3
(2)の仕様に該当するコードは提示コード中には存在しません。

★1〜3のロジックの流れを追うとわかりますが、
これらに対応すれば、期待通りの結果が得られます。
引用返信 編集キー/
■36957 / inTopicNo.7)  Re[2]: 以下について教えてください
□投稿者/ 倉田 有大 (631回)-(2009/06/10(Wed) 14:39:35)
こういう場合はフローチャートを進めればいいのかな。

うーん、フローチャートは、PC6601のBASICいらい書いてないな。

>わかりますか

実装するだけなら鼻血が出るほど楽勝ですが、エレガントに実装しようとすると悩みます。
引用返信 編集キー/
■36960 / inTopicNo.8)  Re[3]: 以下について教えてください
□投稿者/ すがり (37回)-(2009/06/10(Wed) 15:17:31)
No36957 (倉田 有大 さん) に返信

Yahoo知恵袋に回答貼ってありました。(多分質問してるのも同じ人なんだろうな)

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1127100811

ifの入れ子よりはCASE文でまとめてるほうが好み。

引用返信 編集キー/
■36961 / inTopicNo.9)  Re[4]: 以下について教えてください
□投稿者/ .SHO (869回)-(2009/06/10(Wed) 15:30:52)
> http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1127100811
 ↑
あっちは、最初に
「大文字と小文字を反転させ、文字の間に '.' を加える関数の例です」
の1行があるから、宿題丸投げの姿勢はともかく、まだましだなぁ。

こっちはそれすら抜けてるから、当然ムジュンを指摘されるわ。

引用返信 編集キー/
■36963 / inTopicNo.10)  Re[5]: 以下について教えてください
□投稿者/ επιστημη (1958回)-(2009/06/10(Wed) 15:50:57)
επιστημη さんの Web サイト
2009/06/10(Wed) 15:56:52 編集(投稿者)
悪ノリ。

宿題だか課題だか知らんけども、このまま提出したらおもしろいことになりそう♪

public static string f3(string s) {
  return s.Length == 0 || s[0] == '#' ? s : (new string("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".IndexOf(s[0]) < 0 ? s[0] : "9876543210abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"["0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".IndexOf(s[0])],1) + f3(s.Substring(1)));
}

引用返信 編集キー/
■36965 / inTopicNo.11)  Re[6]: 以下について教えてください
□投稿者/ .SHO (870回)-(2009/06/10(Wed) 16:02:38)
No36963 (επιστημη さん) に返信

> 宿題だか課題だか知らんけども、このまま提出したらおもしろいことになりそう♪

エレガントだわ!
このリエントラントは、スレ主は説明できないだろうなぁ。

ちなみに、小文字は小文字のままでいいみたいだから、もう少しだけ短くできそう。

引用返信 編集キー/
■36966 / inTopicNo.12)  Re[7]: 以下について教えてください
□投稿者/ επιστημη (1959回)-(2009/06/10(Wed) 16:06:04)
επιστημη さんの Web サイト
2009/06/10(Wed) 16:33:12 編集(投稿者)
> ちなみに、小文字は小文字のままでいいみたいだから、もう少しだけ短くできそう。

あらホント。78文字も短くなりましたわ。

class Program {

  public static string f3(string s) {
     return s.Length == 0 || s[0] == '#' ? s : (new string("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".IndexOf(s[0]) < 0 ? s[0] : "9876543210abcdefghijklmnopqrstuvwxyz"["0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".IndexOf(s[0])],1) + f3(s.Substring(1)));
  }
  
  public static void Main() {
    string input = "Abc012_59F_#012Gh";
    string output = f3(input);
    System.Console.WriteLine("[{0}]\n[{1}]",input,output);
  }
}

引用返信 編集キー/
■36983 / inTopicNo.13)  Re[8]: 以下について教えてください
□投稿者/ 倉田 有大 (632回)-(2009/06/10(Wed) 23:10:08)
ちょw3項演算子の嵐w
しかも再起!
俺もよめねえw
引用返信 編集キー/
■36985 / inTopicNo.14)  Re[9]: 以下について教えてください
□投稿者/ 倉田 有大 (633回)-(2009/06/10(Wed) 23:16:29)
あー、ようやく理解w

こういうの見ると、昔のMSXの雑誌の一画面プログラムとかおもいだしちゃう(古

来週のタイトルは「2バイトコードも要求!文字コードはShiftJS!」

悪乗りすいませんーorz
引用返信 編集キー/
■36991 / inTopicNo.15)  Re[10]: 以下について教えてください
□投稿者/ VBAやろう (1回)-(2009/06/11(Thu) 01:44:50)
2009/06/11(Thu) 01:54:23 編集(投稿者)
試しにVBAで書いてみましたが、短く出来ませんでした。
(IIfを使うために変換後の文字列の仕様がちと変則的になっています)

Option Explicit

Public Sub Test()
    Dim str_in      As String
    Dim str_out     As String
    
    str_in = "Abc012_59F_#012Gh"
    str_out = f3(str_in)
    Debug.Print str_in
    Debug.Print str_out
End Sub

Public Function f3(ByVal s As String) As String
    If s <> "" Then f3 = IIf(Left(s, 1) = "#", s, IIf(InStr("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", Left(s, 1)) > 0, Mid(" 9876543210abcdefghijklmnopqrstuvwxyz", InStr("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", Left(s, 1)) + 1, 1), Left(s, 1)) & f3(Mid(s, 2)))
End Function

引用返信 編集キー/
■36996 / inTopicNo.16)  Re[11]: 以下について教えてください
□投稿者/ Algol (1回)-(2009/06/11(Thu) 07:55:27)
こんなのはどうですかねぇ?
エレガントかどうかは微妙ですが(汗

Trace.WriteLine(new string("Abc012_59F_#012Gh".Split('#').SelectMany((s, i) => i == 0 ? s.ToCharArray().Select(c => (char)((c >= 0x41 && c <= 0x5a) ? (c + 0x20) : ((c >= 0x30 && c <= 0x39) ? ((0x39 - c) + 0x30) : (int)c))) : ("#" + s).ToCharArray()).ToArray()));
引用返信 編集キー/
■36997 / inTopicNo.17)  Re[12]: 以下について教えてください
□投稿者/ Q3 (17回)-(2009/06/11(Thu) 08:22:40)
タイトル見て、これは見ても自分のためにならなそうだな〜
なんて思いながら見てみたら逆に勉強になりました^^;
単純な仕様だからこそエレガントさにこだわるってのも
職人気質っぽくてかっこいいと思いました。

と感想だけ書くのもあれなので、主さんに回答。

宿題ですね、わかります。
引用返信 編集キー/
■37000 / inTopicNo.18)  Re[13]: 以下について教えてください
□投稿者/ επιστημη (1961回)-(2009/06/11(Thu) 09:14:05)
επιστημη さんの Web サイト
> 単純な仕様だからこそエレガントさにこだわるってのも
> 職人気質っぽくてかっこいいと思いました。

実際にやっちゃダメよ > 再帰
いや、無条件に再帰がダメなんじゃなく、
単純なループに置き換え可能なものを安易に再帰でやるなってことで。
僕が挙げた例は典型的な末尾再帰だからさっくりループ化できます。

# 一行で実装したいがために再帰を使ったってーことで

引用返信 編集キー/
■37001 / inTopicNo.19)  Re[14]: 以下について教えてください
□投稿者/ .SHO (872回)-(2009/06/11(Thu) 09:17:46)
> 僕が挙げた例は典型的な末尾再帰だからさっくりループ化できます。

そりゃそうですよね。
もともとループでいいものをムリクリ再帰してるわけだから(笑)

引用返信 編集キー/
■37010 / inTopicNo.20)  Re[8]: 以下について教えてください
 
□投稿者/ みきぬ (465回)-(2009/06/11(Thu) 12:26:49)
> public static string f3(string s) {
> return s.Length == 0 || s[0] == '#' ? s : (new string("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".IndexOf(s[0]) < 0 ? s[0] : "9876543210abcdefghijklmnopqrstuvwxyz"["0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".IndexOf(s[0])],1) + f3(s.Substring(1)));
> }
>
1文字短くなったー。

return s.IndexOf('#') < 0 ? new String(new List<char>(s).ConvertAll<char>(delegate(char c) { return c < '0' || c > '9' ? Char.ToLower(c) : (char)('i' - c); }).ToArray()) : f3(s.Substring(0, s.IndexOf('#'))) + s.Substring(s.IndexOf('#'));


# 疲れた... orz
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -