paiza×Qiita記事投稿キャンペーン「プログラミング問題をやってみて書いたコードを投稿しよう!」の参加記事になります。
mod7占いに挑戦してみました。
経緯
最近他人のコードレビューやフロントエンドのVM処理ばかり書いていて、ロジック的なコードを全く書いてないな~と思っていた矢先にイベントを目撃したので参加した次第。
たまには頭の運動をしとこうというアレです。
とりあえず、使い慣れているC#で突撃。
答案
using System;
namespace ModSevenFortune
{
public class Program
{
static void Main()
{
var n = uint.Parse(ReadLineAndTrim());
long[] numbers = new long[n];
for (int i = 0; i < n; i++)
{
numbers[i] = long.Parse(ReadLineAndTrim());
}
var count = CountLuckyCombinations(numbers);
Console.WriteLine(count);
}
private static string ReadLineAndTrim() => Console.ReadLine().Trim();
private static int CountLuckyCombinations(long[] numbers)
{
var count = 0;
if (numbers.Length < 3) return count;
for (var i = 0; i < numbers.Length - 2; i++)
{
for (var j = i + 1; j < numbers.Length - 1; j++)
{
for (var k = j + 1; k < numbers.Length; k++)
{
if ((numbers[i] + numbers[j] + numbers[k]) % 7 == 0)
{
count++;
}
}
}
}
return count;
}
}
}
反省
イキってLINQで書こうとして、タイムアウトで一敗。
入力として与えられる数字の範囲が0 <= V < 2^32
と言われてるのにint
で手を付け始めてしまい、ランタイムエラーやオーバーフローで二敗。
その後uint
でやり直すも、和でオーバーフローし三敗。
uint
では捌けない箇所をlong
に直した上記のコードで正答となりました。
ロジックとかより「メモリと型」という超初歩的なところでコケまくってしまい、自分恥ずかしいッス。
感想
完走した感想ですが、たまにはこういう頭の運動をしておくと楽しくていいですね。
この手のコーディングはゲーム感覚で取り組めるのでおもろいです。
ロジックについては、もっとスマートなやり方はきっとあるんでしょうが、無理せず愚直にやっておくが吉(経験則)。
最初は再帰とかも活用してオシャレに捌いてやろうかと思いましたが、そんなのは自己満ですからに(そしてタイムアウトで落ちる)。
そもそも、パフォーマンスを意識する必要がある文脈では、できるだけ原始的な方法であるべきですしね。可読性が求められている文脈でもないですし。