2009-08-24 7 views
5

偶数および奇数の桁に数字を整数で追加する必要があります。言って、 としましょう。number = 1234567。奇数場所偶数桁の場所桁の 合計= 2+4+6 = 12 合計= 1+3+5+7 = 16偶数および奇数の場所に数字を追加する(C#)

待ちは、回答にジャンプしないでください!

私は最小限の行、好ましくは1行のコードを探しています。 'chaowman'がスレッドSum of digits in C#に投稿したのと同様です。

誰かがクールなコードを持っていますか?おかげさまで

+2

ちょうど1つの質問、私たちは奇数/左からも右から数え始めますか?数字の桁数が偶数であれば、これは違いになります。 – erelender

答えて

9
bool odd = false; 

    int oddSum = 1234567.ToString().Sum(c => (odd = !odd) ? c - '0' : 0); 

    odd = false; 

    int evenSum = 1234567.ToString().Sum(c => (odd = !odd) ? 0 : c - '0'); 
+0

おいしいコードです。 ありがとうございました 私はこのコードを取っています :-) – abhilashca

2

それはワンライナーではありませんが、次の作品:

int oddSum = 0, evenSum = 0; 
bool odd = true; 
while (n != 0) { 
    if (odd) 
     oddSum += n % 10; 
    else 
     evenSum += n % 10; 
    n /= 10; 
    odd = !odd; 
} 

編集:私は本当に知らない

int oddSum = 0, evenSum = 0; bool odd = true; while (n != 0) { if (odd) oddSum += n % 10; else evenSum += n % 10; n /= 10; odd = !odd; } 
+0

@ ThePower:あなたは誤解していると思います。 OPは、偶数と奇数ではなく、偶数と奇数の数字の合計を求めます。 – erelender

+0

Damn、Patrick、あなたの投稿から改行を取り除くのに私が長くかかりました。私の投稿が上がった頃にはあなたはすでにあなたのものを編集していました。 : – Imagist

+1

私はあなたの1ライナーユーモアセンスが好きです ありがとう。 – abhilashca

0

:あなたは1行でそれをしたい場合は

C#ではなく、パトリック・マクドナルドにはおなじみの1ライナーがあります:

int oddSum = 0, evenSum = 0; bool odd = true; while (n != 0) { if (odd) oddSum += n % 10; else evenSum += n % 10; n /= 10; odd = !odd; } 
あなたが避けられない愚かなLINQのトリックのバージョンを探しているなら
+1

すべてのC#プログラムは、次のように1行で記述することができます:P –

+0

すべての改行を削除するだけでは、 ://en.wikipedia.org/wiki/One-liner_program –

1

、ここでは一つだ:

var result = 1234567 
    .ToString() 
    .Select((c, index) => new { IndexIsOdd = index % 2 == 1, ValueOfDigit = Char.GetNumericValue(c) }) 
    .GroupBy(d => d.IndexIsOdd) 
    .Select(g => new { OddColumns = g.Key, sum = g.Sum(item => item.ValueOfDigit) }); 
foreach(var r in result) 
    Console.WriteLine(r); 

私はそれが退屈誰かによってワンライナーに突然変異させることができると確信している(と、それを変換削除数字を生成する方法としての文字列に変換します)。

EDIT:あなたが他の質問へのchaowmansソリューションを好きなら

var result = 1234567 
    .ToString() 
    .Select((c, index) => Tuple.Create(index % 2 == 1, Char.GetNumericValue(c)) 
    .GroupBy(d=>d.Item1) 
    .Select(g => new { OddColumns = g.Key, Sum = g.Sum(item => item.Item2) }); 
foreach(var r in result) 
    Console.WriteLine(r); 
2

それが短い(しかし、より混乱)にするためにタプルを使用して、これは論理的な拡張になると偶数/奇数:

int even = 17463.ToString().Where((c, i) => i%2==1).Sum(c => c - '0'); 
int odd = 17463.ToString().Where((c, i) => i%2==0).Sum(c => c - '0'); 

for (odd = even = 0; n != 0; n /= 10) { 
    tmp = odd; 
    odd = even*10 + n%10; 
    even = tmp; 
} 

そしてそれはまた、レアではありません。

ループは、しかし、よりシンプルで効率的かもしれませんlly長いか複雑です。どちらのバージョンも、数字の左側から「奇妙さ」を判断します。

0
int evenSum = 1234567.ToString().ToCharArray().Where((c, i) => (i % 2 == 0)).Sum(c => c - '0'); 
int oddSum = 1234567.ToString().ToCharArray().Where((c, i) => (i % 2 == 1)).Sum(c => c - '0'); 
0
int number = 1234567; 
int oddSum = 0; 
int evenSum = 0; 
while(number!=0) 
{ 
    if (n%2 == 0) evenSum += number % 10; 
    else oddSum += number % 10; 
    number /= 10; 
} 
2
"1234567".Where((ch, i) => i % 2 == 0).Sum(ch => ch - '0') 
0
int n = 1234567; 
int[] c = new int[2]; 
int p = 0; 
n.ToString().Select(ch => (int)ch - '0').ToList().ForEach(d => { c[p] += d; p ^= 1; }); 
Console.WriteLine("even sum = {0}, odd sum = {1}", c[0], c[1]);

短い方:

int n = 1234567, p = 0; 
int[] c = new int[2]; 
while (n > 0) { c[p] += n % 10; n /= 10; p ^= 1; }; 
Console.WriteLine("even sum = {0}, odd sum = {1}", c[p^1], c[p]);
0

あなたが右から開始している場合、これは動作します。少なくとも、C++で動作します。私は言ったように、私はC#を知らない。私は彼らがC#でこのナンセンスのいくつかを削除したと思っています。

それはワンライナーではありませんが、あなたは(私は公正だと思う)宣言割り引く場合、それは1つの文です:

int oddSum, evenSum; 
for(bool odd = ((oddSum = evenSum = 0) == 0); 
    n != 0; 
    odd = (!odd || (n /= 10) == n + (oddSum += (odd ? n % 10 : 0) - evenSum + (evenSum += (!odd ? n % 10 : 0))))) 
; 

として、余分なクレジットが、ここではすべてオンになります1行のPythonスクリプトですあなたのC#ソリューションをワンライナーに変換します。

one_liner.py 
open(__import__('sys').argv[2]','w').write(open(__import__('sys').argv[1],'r').read().replace('\n','')) 

使用方法:修正グループロジックと

python one_liner.py infile outfile 
1

ルーベンのバージョン:

bool isOdd = false; 
var sums = 1234567 
    .ToString() 
    .Select(x => Char.GetNumericValue(x)) 
    .GroupBy(x => isOdd = !isOdd) 
    .Select(x => new { IsOdd = x.Key, Sum = x.Sum() }); 

foreach (var x in sums) 
    Console.WriteLine("Sum of {0} is {1}", x.IsOdd ? "odd" : "even", x.Sum); 
+1

いいですが、私は本当にファンではありません[バージョンの中で]突然変異フラグのトリック - 各ループは列挙型の上の状態に頼ります[そして、インターリーブされたバージョンの存在などを排除します]。しかし、私たちが愚かなコーディングトリックをしようとしている限り、それはすべて素晴らしいとダンディです。 –

1

はここ(a)のは奇数と偶数を計算することをLINQを使用して、私の一長期ライナーです(b)は、元の番号を中間の数字に変換しません。string、そして(c)はは、任意の副作用を持っていない。

var totals = Enumerable.Range(0, 10) 
    .Select(x => (number/(int)Math.Pow(10, x)) % 10) 
    .Where(x => x > 0) 
    .Reverse() 
    .Select((x, i) => new { Even = x * (i % 2), Odd = x * ((i + 1) % 2) }) 
    .Aggregate((a, x) => new { Even = a.Even + x.Even, Odd = a.Odd + x.Odd }); 

Console.WriteLine(number);   // 1234567 
Console.WriteLine(totals.Even); // 12 
Console.WriteLine(totals.Odd);  // 16 

(上記のコードは、左から右から奇数/偶数の位置をカウントします。代わりに右から左に数えるには、Reverseへの呼び出しを削除してください。 numberの桁数が偶数の場合は、LからRへの計算ではR-to-Lと異なる結果になります)。

+0

私はこの方法を推奨していないことに注意してください。標準的なループは、より短く、より速く、理解しやすくなります。これは質問の「できれば1行」の要求に答えるためにフープを飛び越えているだけです! – LukeH

0

これはLINQなしで動作します。

var r = new int[]{0,0}; for (int i=0; i<7; i++) r[i%2]+="1234567"[i]-48; 
System.Console.WriteLine("{0} {1}",r[0],r[1]); 
関連する問題