POH5を現在進行形やっているので1個ずつ追記する予定。
なお、C#は全てのケースで4秒リミットになっている。相性が悪いパターンだとオーバーして失敗するし、相性いいと最速で見つかる。
なお、100手程度でいいなら0.01秒で解答が求められる。
###POH5+
あらかじめ計算しておいて必要手数の推定を行うのが正しいやり方だったらしい。
残念ながら最短手を求められなかったので回答を直接入力した。最短手のチェックに使えるかもしれない。
あまりにあれなので、正当と思えるアルゴリズム版をいずれ作ってUPしたい。
using System;
using System.Linq;
using System.Collections.Generic;
public class fifpzl
{
static byte[] pzl = new byte[16];
static void Main(string[] args)
{
int index = 0;
for (int i = 0; i < 4; i++)
{
var j=System.Console.ReadLine().Split(' ').Select(k => k == "*" ? 0 : int.Parse(k));
foreach (var m in j)
{
pzl[index++] = (byte)m;
}
}
List<byte> answer;
switch(pzl[4])
{
case 5: // CASE1
Console.WriteLine("12");
return;
case 1: // CASE2
answer = new List<byte>() {1, 5, 6, 10, 11, 12};
break;
case 2: // CASE3
answer = new List<byte>() { 1,2,3,6,8,
4,6,3,10,8,
4,11,12,15,7,
4,8,9,4,8,
3,10,9,1,5,
4,14,13,4,5,
1,14,13,7,8,
3,14,13,3,12,
11,14,13,1,5,
3,7,8,12,11,
14,13,10,6,13,
10,6,9,1,5,
2,1,5,6,10,
14,15 };
break;
case 8: // CASE4
answer = new List<byte>() { 1,2,3,4,8,
6,7,9,14,15,
9,14,13,5,15,
13,14,11,12,9,
13,14,11,12,9,
13,14,11,12,7,
10,1,5,12,7,
10,1,5,2,3,
4,8,6,1,5,
4,3,2,4,3,
8,6,1,5,3,
8,2,4,8,3,
6,2,3,7,11,
15 };
break;
case 15: // CASE5
answer = new List<byte>() { 15,5,6,4,5,
6,4,3,2,5,
6,15,1,4,3,
2,14,9,13,11,
10,12,4,3,2,
14,9,13,11,8,
12,10,7,4,3,
2,15,6,5,9,
13,12,10,15,6,
5,9,13,14,10,
15,7,8,11,12,
15,11,12 };
break;
default:
return;
}
Console.WriteLine(string.Join<byte>("\n", answer));
}
}
###3-M問目
ラムダ式を無理矢理使ったが可読性がない。こんなコード書く奴が居たら頭おかしい。
アルゴリズムは以下
入力時に縦に1ではない数値の個数をカウントする。
出力時は行番号と個数を比較して0か1にSelectで置き換え、String.Joinでスペース繋ぎで連結している。3項演算子の結果を直接stringにして置くべきであった。
String.Joinで2重ループせずに2次元的なリストを出力できるのは良かった。
そして違う問題なのにクエリは問2と1文字しか変わっていない省エネ設計。
2015/4/16/00:10追記
迂闊なことにクエリ式をループで呼んでいるので毎回クエリが実行されてしまうことに気付いた。qの最後にToList()を付加すべきだろう。
using System.Linq;
using System.Collections.Generic;
public class Hello{
public static void Main(){
string[] num = System.Console.ReadLine().Split(' ');
int x = int.Parse(num[0]);
int y = int.Parse(num[1]);
List<int> s = new List<int>();
for (var i = 0; i < y; i++)
{
s.AddRange(System.Console.ReadLine().Split(' ').Select(a => (a != "1" ? 1 : 0)));
}
//var q = s.Select((i, j) => new { i, k = j % x }).GroupBy(v => v.k, v => v.i).Select(w => w.Sum());
var q = s.Select((i, j) => new { i, k = j % x }).GroupBy(v => v.k, v => v.i).Select(w => w.Sum()).ToList();
for (var i = 0; i < y; i++)
{
System.Console.WriteLine(string.Join<int>(" ", q.Select(b => i < b ? 0 : 1)));
}
}
}
###2問目
(クエリ部分が)1行と言う苦しい言い訳・・・。
どうにか曜日列を作らずに出力する方法を探したが良く分からなかったため、Select2回することになってしまった。
誰か中間結果を作らずにLinqでやる方法を誰か教えてください。
なお、入出力最適化はやる気がない模様。
using System.Linq;
using System.Collections.Generic;
public class Hello{
public static void Main(){
int n = int.Parse(System.Console.ReadLine());
List<int> s = new List<int>();
for(var i=0;i<n;i++){
s.Add(int.Parse(System.Console.ReadLine()));
}
var q = s.Select((i, j) => new { i, k = j % 7 }).GroupBy(v => v.k, v => v.i).Select(w => w.Sum());
foreach(var z in q){
System.Console.WriteLine(z);
}
}
}
###1問目
処理を1行で書くことをコンセプトに考える。usingが入って微妙な結果に終わった。
using System.Linq;
public class Hello{
public static void Main(){
System.Console.Write(System.Console.ReadLine().Where((c, n) => n % 2 == 0).ToArray());
}
}