轉自老趙部落格:http://www.cnblogs.com/JeffreyZhao/archive/2009/02/01/1381867.html
引文參見:從CSDN的趣味題學Python
兩道演算法趣味題:
- 要求算一任意長度字串中不同的字元以及它的個數。
- 把一段字串用“右起豎排”的古文格式輸出。
引文用了Python來解這種趣味題,很有意思,Python也很適合。不過我看了看似乎這篇文章沒有真正理解如今的C#可以怎麼用,老趙一時興起,也來設法做了一下。
第1題
Python版:
dic = {}for s in "abcdefgabc": dic[s] = 1 if s not in dic else (dic[s]+1)print '\n'.join('%s,%s' % (k, v) for k, v in dic.items())
C# 3.0版
var values = "abcdefgabc" .GroupBy(c => c) .Select(g => String.Format("{0}, {1}", g.Key, g.Count())) .ToArray();Array.ForEach(values, v => Console.WriteLine(v));
如果加上一個擴充——不寫出來了,大家應該一看便知,老趙強烈推薦大家在項目中都要加上合適的擴充——再減少點行數:
"abcdefgabc" .GroupBy(c => c) .ForEach(v => Console.WriteLine(g.Key + ", " + g.Count()));
或者用上“狹義”LINQ?
string text = "abcdefgabc";var result = from c in text group c by c into g select g;foreach g in result Console.WriteLine(g.Key + "," + g.Count());
第2題
Python版:
def main(offset=6): string = u'靜夜思 李白床前明月光,疑似地上霜。舉頭望明月,低頭思故鄉。090131' a = [[' ']*offset for row in xrange(offset)] for i in xrange(offset): for j in xrange(offset): a[i][j] = string[j + i*offset] b = [[r[col] for r in a[::-1]] for col in xrange(len(a[0]))] print '\n'.join([u'┊'.join(unicode(c) for c in row)for row in b])
C# 3.0版:
static void Print(string text, int offset){ var matrix = text .Select((c, i) => new { Char = c, Index = i }) .GroupBy(c => c.Index % offset, c => c.Char.ToString()); Array.ForEach( matrix.ToArray(), a => Console.WriteLine(String.Join("|", a.Reverse().ToArray())));}
C# 3.0擴充版:
static void Print(string text, int offset){ text .Select((c, i) => new { Char = c, Index = i }) .GroupBy(c => c.Index % offset, c => c) .ForEach(g => Console.WriteLine(g.Reverse().Join("|")));}
調用一下:
Print("床前明月光疑似地上霜舉頭望明月低頭思故鄉", 5);
結果:
低|舉|疑|床頭|頭|似|前思|望|地|明故|明|上|月鄉|月|霜|光
最後聲明一下,本文並非為了挑起語言之爭。Python是一門強大靈活的語言,學習Python有百利而無一害。Python還有一個好處,那就是 代碼格式,至少縮排會非常的規範——沒辦法,在Python中縮排是文法的一部分,縮排不對直接導致代碼運行不通過。代碼格式一直不佳的朋友們可以嘗試一 下。
希望大家在掌握一門工具時把它用活,用好。C# 3.0中的進階特性更是大大提高開發效率的重要工具。其實這種“趣味編程”最關鍵的是“語言特性”,“文法”而不是其中包含的類庫功能。其實Java也有 內聯寫法,可以寫的很短,說Java要20行以上——那隻是不知道怎麼“活用”Java而已。