岸原オカルト研究部

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

ABC60~ABC100 ~C問題用競プロライブラリ

素敵な夜ですね。

ABC60~ABC100を解く中で必要になったメソッドを纏めたクラスを作りました。
C#で競プロを始める皆さん、お使いください!!


使い方

var a = new LittleMethods();
a.hogehoge();


コード

    class LittleMethods
    {
    	//整数二つを受け入れ、最大公約数を出す
        public long GreatestCommonDivisor(long a, long b)
        {
            // https://qiita.com/Jane35416555/items/0d9d6dd088049ce64e3d

            long x = 0;

            while (1 == 1)
            {
                if (a % b == 0)
                {
                    return b;
                }
                else
                {
                    x = a % b;
                    a = b;
                    b = x;
                }

            }

        }

		//整数二つを入れ、最小公倍数を出す
        public long LeastCommonMultipul(long a, long b)
        {
            // https://qiita.com/Jane35416555/items/0d9d6dd088049ce64e3d

            long x = GreatestCommonDivisor(a, b);
            return a * b / x;
        }

		//整数一つを入れ、素数ならtrueを返す
        public bool PrimeNumberOrNot(long x)
        {

            if (x == 1) { return false; }
            for (long i = 2; i * i <= x; i++)
            {
                if (x % i == 0) { return false; }
            }

            return true;
        }

		//整数一つを入れ、全ての約数をListで返す
        public List<long> DivisorAll(long x)
        {
            List<long> y = new List<long>();

            if (x == 1) { y.Add(1); return y; }

            for (long i = 1; i * i <= x; i++)
            {
                if (x % i == 0)
                {
                    y.Add(i);
                    if (x / i != i) { y.Add(x / i); }

                }

            }

            y.Sort();

            return y;

        }

        //https://stackoverflow.com/questions/4124189/
        //sqrtの精度に問題があると聞いたのでいざという時使えるよう調べた。decimalを入れるとルートしてdecimalで返す。
        public decimal SuperSqrt(decimal x,decimal epsilon = 0.0M)
        {
            decimal cur = (decimal)Math.Sqrt((double)x), prev;

            do
            {
                prev = cur;
                if (prev == 0.0M) return 0;
                cur = (prev + x / prev) / 2;

            } while (Math.Abs(prev - cur) > epsilon);

            return cur;


        }
        
        //階乗して返す
        public long Multipul_Fuctrial(long x)
        {
            long a = 1;

            for (int i = 2; i <= x; i++)
            {
                a *= i;
            }

            return a;

        }

		//特定の数で毎回割りながら階乗する。
        public long Multipul_FuctrialRemainderer(long x)
        {
            long a = 1;
            long b = (long)Math.Pow(10, 9) + 7 //ここは問題に寄る

            for (int i = 2; i <= x; i++)
            {
                a *= i;
                a = a % b;
            }

            return a;

        }
        
        //順列総当り用 戻り値:1 2 3,1 3 2,などなど各順列のリストのリスト
        //本番中に作ったので参考URLを紛失。申し訳ございません。
        public static IEnumerable<T[]> Make_PermutationList<T>(IEnumerable<T> col)
    	{

	        if (col.Count() == 1) yield return new T[] { col.First() };

    	    foreach(var x in col)
        	{
            	var selected = new T[] { x };
            	var unused = col.Except(selected);

            foreach (var y in Make_PermutationList(unused))
            {
                yield return selected.Concat(y).ToArray();
            }
        }

        
    }




現在岸原オカルト研究部では、黒魔術(C#、競プロ)を研究しています。
twitter:@kisihara_c

他の黒魔術研究↓
自分用 C#のLINQ周り全部書く - 岸原オカルト研究部
超インスタント競プロ環境構築 C# - 岸原オカルト研究部

競プロ初学ログ(C#)

素敵な夜ですね。

競技プログラミングの勉強を始めてから少し時間が経ったので競プロの初学についてのログを書きます。 Atcoderを使っています。 対象読者は未経験~灰です。私も灰です。

これを読んだ貴方はC#で競プロを始めてください。同志がいません。 ただし、解説が大体C++です。

競プロとは? Atcoderとは?

競技プログラミングの事で、競技としてプログラミングの問題を解く事です。 Atcoderとは、そのコンテストサービスです。

現代のAtcoderについて

やっている限り、人口の流入が激化しています。 良いことだと思いますが、なんだか高速で3完(3問完答)するか、4完しないと茶色になれないイメージを受けます。

学習の基本方針

  • まず実戦、無理でも時間を測って疑似コンテスト、そして間違えたものを直す
  • 過去問(や教本)

の2パターンがあると思います。 ただ前者はC問題まである程度解けてD、Eが解けたり解けなかったりする人向けだと思います。 素人なので後者を選びました。

過去問をどこから追うか

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

問題傾向が固まった(※ただしレベルは固まっていない)ABC40~ 色々な記事でよく例問に上がり始めるABC80~ 以降全テストケースが公開されているABC100~ 現在の六問制になり始めるABC126~ 以上の四つが区切りとして目立ちます。

一番「こうしておけばよかったな」と思うのはABC080~090の後ABC126~に進む流れです。 特に~ABC125とABC126~ではC問題の難易度や立ち位置が違いすぎるので、ABCのC問題全部解くぜ~とやっていた際、先にABC126~をやったほうが良かったです。

いつ受験を始めるか?

10回受けるまでは正しいレートが出ないとの事で、回数稼いでおいたほうがいいという気持ちもあります。 ただ、勉強で後から実力を上げると、後から結局の所もう10回受験する必要が出ます。

周りを見渡すとバッチリ時間が取れるなら緑パフォまではレートが上がる速度よりも実力が上がる速度が早い気がするので、緑パフォまではABC本番はほっとくのが最適解です。 この限界利益は人によって異なる事になります。

教本について

茶色レベルまでは教本は不要と思われます。ただ各教本の所感は書きます。 逆にAtcoderProblemで茶色レベル表記の問題まである程度解けるようになったら読んだほうが良いと思われます。

チーター本

中級者向け。前半は初心者でも有用。連載記事の纏めなので解説が最低限。C#のコードが有るのは嬉しい!!

ピラミッド本

中級者向け。前半は初心者でも有用。非常にわかりやすい記述だが記述内容が中級者向け。

螺旋本

初心者向け……に見える中級者向け。数学でいうと公式の証明を載せている本で、平易だが初心者向けではない。 もちろん、数学をやるなら自分で公式を証明できたほうが良いのと同様そのうち勉強したいが、どう考えても今ではない。

蟻本

難易度に対して解説が簡単すぎる!!!!!

茶色になる為によく使う/欲しいもの カッコは優先度低

・小学算数、中学数学 ・計算量の概念 オーダーキツイっすよ… O>109からが危険と言われても109という数字が覚えられない

・配列に記録して添字で呼び出して計算量を減らす例のやり方 よく見る ・List、Sort 特に地図の作り方 よく見る ・階乗 作っておくと楽できる ・最小公倍数、最大公約数 本番で必要になった時一から作ると遅い ・素数判定、全約数 本番で必要になった時一から作ると遅い ・全探索 よく見る ・ビット全探索 まれによく見る

(・順列総当たり 頻度は低いがたまに出る 順列を出す関数さえ持っておけば楽だがその分差をつけられる様子) (・いもす法 同じく低頻度ながら、原理が簡単なのに緑問題へのラッキーパンチが期待できる)

(・DP 優先度極低だが、公式解説がトンチの末の離れ業みたいなC問題をDPで強引に解いた他の方の解答もあったりしたので そもそもダイクストラ法とかもDPの応用らしくなるべく早いうちに概念だけは知っておいたほうが後から得する気がした フィボナッチ数列への適用とか単純にクールでかっこいいし)

深さ優先探索幅優先探索はあんまり見ないし学習が面倒くさいので後回しにした(勿論D問題からは頻出と思われる) 二分探索もいもす法と同じくラッキーパンチが期待できると思うがヒネった形でしか見たことがなく知識が役に立ったことはない(勿論D問題からは頻出と思われる)

茶色の範囲での対計算量対処(想定O>109時の対処)については、配列添字呼び出し、算数・数学を使ったO(1)化、二分探索、いもす法等を見た。

ちまちま作ったライブラリはこちら

kisihara-c.hatenablog.com

現在岸原オカルト研究部では、黒魔術(C#、競プロ)を研究しています。 twitter:@kisihara_c

他の黒魔術研究↓

超インスタント競プロ環境構築 C# - 岸原オカルト研究部

自分用 C#のLINQ周り全部書く

自分用 C#LINQ周り全部書く

素敵な夜ですね。
C#勉強中なので自分用にLINQを纏めました。

LINQとは

デリゲード

まずデリゲードという記法について記述する。

配列arrayと数字nを受け取り、arrayで値がnとなっている要素の個数を調べるメソッドを考える。

public long Count(long[] array,long n){
	long x = 0;
	foreach(long y in arr){if(y==n※1) x++;}
	return y;}

全角※1の部分を引数にしたい。これを可能とするのがデリゲード。

public delegate bool Del(long n){return n==42;};

public long Count(long[] array,long n){
	long x = 0;
	foreach(long y in arr){if(del(y) == true) x++;}
	return y;}

このDelとCountを

Judgement judge = Del;
var c = Count(array,judge);

だったり

var c = Count(array,Del);

と使う。

匿名メソッド

C#2.0から、Delメソッドを省略できるようになった。

public long Count(long[] arr,Predicate<long> predi){
	long x = 0;
	foreach(long y in array){if(predi(y) == true) x++;}
	return y;}
public void Main(){
	var c = Count(array,delegate(int x){return x == 42;});
}

Predicateは、任意の数の引数を取りBooleanを返すメソッド(へのデリゲード)を表す型。

ラムダ式

C#3.0で、匿名メソッドと似た記述を更に進化・簡略化して行えるようになった。

Predicate<int> predi = (int x) => {if(x == 42){return true;}else{return false;}};
var c = Count(array,predi);

上記コードの一行目がラムダ式。引数宣言の後、その後で評価を行う一種のメソッド。

そしてこれを更に簡略化する。言語機能上、わざわざ変数宣言する必要がない。

var c = Count(array,(int x) => {if(x == 42){return true;}else{return false;});

そしてこれを更に簡略化する。式はそれ自体がbool型の値とみなせる。

var c = Count(array,(int x) => { return x == 42;});

そしてこれを更に簡略化する。一つのラムダ式に一つの文しかない時は、中括弧とreturnとセミコロンが不要。

var c = Count(array,(int x) => x == 42);

そしてこれを更に簡略化する。型を推論してくれる為型の明示不要。引数が一つの場合は括弧の省略可。

var c = Count(array,x => x == 42);

つまり、ラムダ式の(左辺) => (右辺)は(引数宣言) => (returnを省略した評価値)である。

LINQ

そして、LINQとはLanguage Integrated Queryの略で、言語に統合されたデータ集合へのアクセス方法の事。
それ単体ではラムダ式とは全く関係がない概念。ラムダ式と一緒に使うと便利というだけ。

newlist = list.Where(x => x == 2); //便利

TIPS

ラムダ式でたまに見る気がするメソッド

・Exists
・FindAll 戻り値はList
・RemoveAll
・ConvertAll

LINQでたまに見る気がするメソッド

・Where(遅延)
・Select(遅延)
・Join(遅延)
・OrderBy/OrderByDecending(遅延)
・Reverse(遅延)
・First/FirstorDefault,Last/LastOrDefault(即時)
・Max,Min,Sum(即時)
・ToArray,ToDicitonary,ToList,ToLookup(即時)

戻り値について

遅延とカッコ書きされたLINQメソッドの戻り値はIEnumerable
一言でいうと特殊な状態となる。Foreachならそのまま使える。

即時実行、遅延実行について

LINQのメソッドは(言わば)値ではなく式を代入する遅延実行と呼ばれる挙動を示すものが多い。
恐らく、要素全体を変化させたりして再度返すものは遅延実行、要素から特定要素を取り出したり一意の値を導き出して返すものは即時実行に見える。
言い換えると、特定のLINQメソッドは毎回再評価される。

string[] array = {"a","b","c","ab","bc","ac"}
var li = array.Where(s => s.Length>1);

foreach(var s in li){Console.WriteLine(s);}

array[0] = "abc"

foreach(var s in li){Console.WriteLine(s);}

多分実行結果はab,bc,acとabc,ab,bc,acになる。

これを避けるにはToArray等で固定する。

string[] array = {"a","b","c","ab","bc","ac"}
var li = array.Where(s => s.Length>1).ToArray;

foreach(var s in li){Console.WriteLine(s);}

array[0] = "abc"

foreach(var s in li){Console.WriteLine(s);}

多分実行結果はab,bc,acとab,bc,acになる。


メリットがわからない。なぜ即時実行、遅延実行という概念が存在するのか? => ネットに発見できず

indexの値を引っ張るLINQ
long sumOfOdd = a.Where((b, index) => index % 2 != 0).Sum();
別言語でのLINQライブラリ

qiita.com


Ruby……LINQないですか? => なさそう

qiita.com




参考文献 アフィはありません

実戦で役立つC#プログラミングの定石&パターン
www.amazon.co.jp



現在岸原オカルト研究部では、黒魔術(C#)を研究しています。
twitter:@kisihara_c

他のオカルト研究↓
超インスタント競プロ環境構築 C# - 岸原オカルト研究部

都内天然温泉ログ(23区内、5件)


素敵な夜ですね。
私は温泉が好きです。都内天然温泉をまわったのでログを残します。

前提として、都内の温泉はほとんど塩系です。
ぽかぽかする代わりに、乾かしたら、汗をかいたあとほったらかしで乾かした時みたいにべとつきます。


志村坂上 さやの湯処

www.timesclub.jp


人口密度:中(ただし背中合わせのシャワー等狭い部分も)
泉質:普通の塩系
雰囲気:純和風で良し
フルーツ牛乳

駐車場はいっぱいでした。恐らく北東京の車ユーザーが遊びに来ているんだと思います。
若い層が非常に多かったです。
源泉かけ流しの湯船があり非常に温まらせてもらいました。

巣鴨 SAKURA

www.fashionsnap.com


人口密度:高(シャワーが混んでいるが、立って浴びるシャワーブースがあるなど数は多い)
泉質:普通の塩系 ぬる湯あり、いいです! 非常にいいです。ぬる湯はだいぶ前に味わったきりです。
雰囲気:和洋折衷の高級
おいしい飲むヨーグルト

若い層が非常に多かったです。
入浴料がとにかく高いです。


武蔵小山 清水湯

tokyosento.com


人口密度:激高 死ぬかと思いました
泉質:重炭酸ソーダ、ヨードの2種
シャワー:非常に貧弱
フルーツ牛乳

都内で温泉、しかも天然2種類は最高です。有馬温泉みたいです。
ただ狭くはないのに激混んでいます。
客層は地元のおっちゃんが多いです。


麻布 黒美水温泉 竹の湯

welcome-kitasenju.com


人口密度:高
泉質:塩系
シャワー:ちゃんと出るのと出ないのがある

狭く、小さな銭湯という感じです。
こっちも客層は地元のおっちゃんが多いです。

亀有 大谷田温泉 明神の湯

tokyoonsen.com


人口密度:中 広いです
泉質:強い塩系
雰囲気:和風で良好。霞外籠逗留記って感じです。

曜日割引あるようですが割引の日は混雑しているようです。
客層はいろいろでした。



この中だと明神の湯が各要素よく、リピートしたいです。
今回は23区近くを探索しましたが、山手線外にも数件興味があるので、今度またブログにします。



現在岸原オカルト研究部では、オカルト(温泉)を研究しています。
twitter:@kisihara_c

Console.WriteLineって書いてくれるスニペット


素敵な夜ですね。

VisualStudioでcswlって打ってTabを2回押すとConsole.WriteLineって書いてくれるスニペット
<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>cswl</Title>
      <Shortcut>cswl</Shortcut>
      <Description>Code snippet for Console.WriteLine</Description>
      <Author></Author>
    </Header>
    <Snippet>
      <Declarations>
        <Literal><ID>value</ID><Default>answer</Default></Literal>
      </Declarations>
      <Code Language="csharp"><![CDATA[Console.WriteLine($value$);$end$]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

.snippetファイルにしてツール→コードスニペットマネージャーで突っ込んで下さい。

参考文献

qiita.com



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

他のオカルト研究↓
超インスタント競プロ環境構築 C# - 岸原オカルト研究部

超インスタント競プロ環境構築 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#)を研究しています。

本・論文レビュー(四冊、心理学、発達障碍関連)


 素敵な夜ですね。

 先日知人からの依頼があり発達障碍・発達障碍傾向が改善されうるのか数冊の本で調べました。
 せっかくなので記事にします。このブログは秘された事象ならどんな事でも探求します。
 結論から言えば、よくわかりませんでした。
 まず本をまとめ、その後に考察します。

 なお、病気でも故障でもないと考えているので治る・直るという漢字は使っていません。


自閉症スペクトラム 10人に一人が抱える生きづらさの正体(SB新書)

・「こだわり保存の法則」を提唱している。
 自閉症スペクトラムの方はこだわりの対象が薄くなっても、常に何かに対してこだわる。
 コンディションが悪ければ悪いほど、そのコダワリは狭くきつくなっていく。

・二次障碍への対策面から、「トップダウン」(独自の用法と思われる)の教育方針をオススメしている。
 トップダウンとは、「できないことはできないままでいい」という教育法。

・どんなに努力しても自閉症スペクトラムの症状がゼロになった自閉症スペクトラム持ちはゼロと主張している。
 IQの上昇も無関係。

・世間には「問題が発生しないと自閉症スペクトラムと診断できない」という医師もいるが、
 「華々しく問題(含むトラウマ)を解決しないと見栄えが悪い」という良くない意識の現れなのではないか。

「発達と脳(医学書院)」記載の論文

・脳のニューロンは報酬とドーパミンで強化される。
 幼少期に応用行動分析さえあれば、発達障碍保持者の欠点部分が、一般者とほぼ互角になる事もありうる。
 今後の動物実験の進歩を期待する、との事。

アスペルガーの人はなぜ生きづらいのか?(講談社

・「逆耐性現象」を提唱している。挫折によって弱くなる現象。二次障碍の事か?

アスペルガーの人は強迫性障碍を負いやすい。次に抑うつ。人格障碍との併存も有りえ正確な病名の特定は困難。
 アスペルガーの人と境界性人格障碍者との見分けがつかないことを「重ね着症候群」と言い、
 また極めて厄介なことに本当に併発している存在もいる。

・さまざまな形式の不適応とその対策について語られている。
 特に、「常識で考えれば当然の行為に対し、なぜこんなことをしなければならないのか」疑問に思う患者に対し、
 「これはこういった慣習である」と説明する等。

・「能力によるカバーを諦めるべきではない」という論調が強い。
 特に、「想像力の質が健常者と異なる」の欄。
 一般者だって、無人島に放り込まれたときや、複雑な概念を与えられた時(不得意分野に触れた時)、その想像力は硬くなるだろうと指摘。
 アスペルガー者も想像力を働かせることを諦めるべきではないとしている。
 また、「心」とは、他人の要求に答えることができた成功体験の繰り返しによってできる幻想に過ぎないと論じ、
 人類学者が精霊信仰の民の中に混じりいつしか精霊が見える事に例え、
 アスペルガー者も心を理解しようとする戦略を取れるという立場を取る。

・そして、「アスペルガー文化の確立」という、ある意味逆転的な提言も行っている。


広汎性発達障碍児への応用行動分析(二瓶社)

・応用行動分析とは発達障碍の軽快を狙う手法。

・あくまで応用行動分析は科学でなく手法・知恵とし、発達障碍はナオるか等の記述は見られない

・ただ、夜に起こしての排尿など、努力と工夫で発達障碍チリョウを行う実践的なノウハウが記述されている。
 あまりにうまくいく例ばかりなので、ひょっとしたら発達障碍は生後数年の教育でなんとでもなるのではないか、
 そんな気分になるが、きっとそうではないのだろうし、そういう内容の本でもない。

本のまとめ

 総合して考えれば、発達障碍は最新の科学ではナオる事もあるというのが正しいのではないのかと思われる。
 少なくとも、幼少期の脳が発達し続ける時期、
 人と触れ合い、その事で報酬を得続ければ、ナオるのではないかという見方はたしかにある。

 大人になってからはわからない。


最終的な謎

 また、最終的な謎がある。

「一般者が自閉系スペクトラムを持つ事はありうるのか?」。

 自閉系スペクトラム者が応用行動分析とドーパミンと報酬によって一般者と同様の神経回路を手に入れるのなら、
 一般者がドーパミンと報酬によって自閉系スペクトラム者と同じような神経回路を手に入れる事もありうるはずだ。
 そういった症状を示す方をここで仮に偽自閉系スペクトラム者と呼ぶ。

 偽自閉系スペクトラム者は自閉系スペクトラム者とも一般者とも馴染めず社会に溶け込めない。
 だが、訓練によって一般者と変わらない脳の能力を得ることができる。

 「自閉系スペクトラムは白黒ではなくグレー」とはよく言われるが、
 生来のグレーだけでなく、黒を塗りつけることで生まれるグレーはあり得るのだろうか、
 各者の対応のためにそこそこ重要な視点ではないかと思うがどうか。

 アルコール不耐症と同じだ。
 アルコールに弱いが克服可能な者にとっては、自分がそうであると理解できることは希望となる。
 逆に、本物のアルコールの不耐症者は、アルコールに弱いが克服可能な者によって被害を受ける。
 彼らは克服できてしまうからだ。

 アルコールの耐性の知識すら行き届いていない以上、
 自閉系スペクトラムについての知識が人口に膾炙する事はないだろうが。


まとめ


 結局大人がどうかについては謎な上、別の話が出てきて困りました。
 「最終的な謎」については、人体実験が必要になるはずですので、未来永劫判明することはないでしょう。

 「広汎性発達障碍児への応用行動分析」には、スペクトラム者に対し、
 体系だった手法でのふれあいを重ねた事で傾向が和らいだ症例が載っています。

 全て、大人になってからも間に合うのかどうか、識者に質問したいところです。



現在岸原オカルト研究部では、オカルト(心理学)を研究しています。
twitter:@kisihara_c