岸原オカルト研究部

プログラミングを勉強していくブログです

超インスタント競プロ環境構築 C#

 素敵な夜ですね。

 C#の環境構築について、導入かつちょっとは戦える状態を検討しました。記述していきます。
 自分で見直す用の記事なので、書くことを選ばず導入知識全般書いて進行していきます。
 より具体的な勉強法や問題・手法等は後日の競プロ初学ログにて。


前提条件

 俺はAtCoderで緑になりたいです。
 長期的にはそれ以上にもなってみたいですが、現状それ以上は見ていません。
 諸事情・自身の興味によりC#を使います。


考えなければならないC#の弱点について



>・優先度付きキューが存在しない
>・ソートがすぐO(n^2)になって死ぬ
>・平衡二分木についていないとほぼ意味がないlowerbound等の機能がない



rian.hatenablog.jp


>long double
>UpperBound/LowerBound
>swap
>Priority Queue
>deque
>set/map の upperbound/lowerbound
>next_permutation
>pair
>#define
>数値であることを表す interface
ICPCで使えない
>AOJで使えない
>配列などの初期化がつらい
>実行時間がつらい
>使っている人があまりいない

 多すぎる!!!!!
 ただ、おそらく緑には関係ないので無視しました。


Visual Studioを導入

 VSCodeのほうがかっこいいので好きですが各種楽なのでVisual studioを使いました。




 こんなものを見つけました。最悪これで。
https://try.dot.net/
 by qiita.com



Atcoderに登録

 省略


Atcoder problemを利用

https://kenkoooo.com/atcoder#/table/

 問題方針が固まったのはABC41~との事。それ以前は無視しました。


テンプレート

 毎回ベタ打ちは辛いです。
 C#erの方のコードを継ぎ接ぎさせていただいた、オリジナル度0のテンプレートを用意しました。
 プロジェクトを作りProgram.csをすべて書き換えて使えます。


// ABC999999999999

    using System;using System.Collections.Generic;
    using System.IO;using System.Linq;
    using static System.Math;using System.Text;
    using System.Threading;using System.Globalization;
    using System.Runtime.CompilerServices;using Lib.Util;
    using System.Numerics;
     
    public class Program
    {

        //1の時だけ文字入力待ちが発生。VSのデバッグ用にたまに使う。
        const int DEBUG = 0;
        ////////////////解いている問題を入れる↓
        public static void Problem() { ProblemA(); }
    
    
        //各問題のコード
    
        public static void ProblemA()
        {
            var sc = new Scanner();
            char c = sc.NextChar();
            
            Console.WriteLine(answer);
        }

        public static void ProblemB(){
            var sc = new Scanner();

        }

        public static void ProblemC(){
            var sc = new Scanner();
            
        }
     
        
        public static void Main(string[] args){

            //出力速度UP①
            var sw = new System.IO.StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false };
            Console.SetOut(sw);

            //冒頭の定義に従い各問の関数呼び出し
            Problem();

            //出力速度UPConsole.Out.Flush();
                
                
            //Visual Studio上のデバッグ用。DEBUG定数が1の時のみ動作。
            if (DEBUG == 1){
                Console.ReadKey();
            }
            
            if (args.Any())
                Console.ReadKey();

        }
        
    }
    

    namespace Lib.Util{
     
        //以下全て借り物
        class Scanner
        {
            private string[] _line;
            private int _index;
            private const char Separator = ' ';
     
     		//コンストラクタでindexを0に、lineを配列に初期化
            public Scanner()
            {
                _line = new string[0];
                _index = 0;
            }
     
     		
            public string Next()
            {
                while (_index >= _line.Length)
                {
                    _line = Console.ReadLine().Split(Separator);
                    _index = 0;
                }
     
                return _line[_index++];
            }
     
            public int NextInt() => int.Parse(Next());
            public long NextLong() => long.Parse(Next());
            public double NextDouble() => double.Parse(Next());
            public decimal NextDecimal() => decimal.Parse(Next());
            public char NextChar() => Next()[0];
            public char[] NextChars() => Next().ToCharArray();
     
     		
            public string[] Array()
            {
                _line = Console.ReadLine().Split(Separator);
                _index = _line.Length;
                return _line;
            }
     
            public int[] Ints() => Array().Select(int.Parse).ToArray();
            public long[] Longs() => Array().Select(long.Parse).ToArray();
            public double[] Doubles() => Array().Select(double.Parse).ToArray();
            public decimal[] Decimals() => Array().Select(decimal.Parse).ToArray();
        }
        

        // 付け足していく
        class LittleMethods{
        
        
        
        }
        
        
        
    }



// thanks
// https://atcoder.jp/contests/abc171/submissions/14526247
// https://atcoder.jp/contests/abc171/submissions/14526315
// https://atcoder.jp/contests/abc171/submissions/14527040
// https://atcoder.jp/contests/abc171/submissions/14527118




 自分のソースではLib部分にちょこちょこ付け加える予定で、
 完成の暁はComproSimarmLibと名付ける予定です。
 Simarmはしまーむと読みます。可愛いですね。


www.pixiv.net
www.pixiv.net


 usingが多い? よくわからないんです

蓄積する

 その1。解いた問題には一行ずつコメントを付けていっています。
 コードを再利用しやすくするため。



 その2。使い回しが効きそうな部分は取り出して保存しようと思っています。

Visual Studio のスニペットを自作する方法 │ Web備忘録
VSCode でスニペットを自作する方法 │ Web備忘録

kisihara-c.hatenablog.com


 先述のC#の弱点についてはAtcoderProblemを解いていて必要な問題が出たら他の人の回答を拝見し拝借。
 え? 楽をするな? うるせ~知らね~
 FINAL FANT
 ASY


本文に書いていない参考文献 心よりお礼申し上げます。

rian.hatenablog.jp

qiita.com

qiita.com

他沢山




現在岸原オカルト研究部では、黒魔術(競技プログラミングC#)を研究しています。