ことのはじまり
WSL2でLinux GUIを使いたくなった直接起動するのではなく、リモートデスクトップ経由でデスクトップに接続したい
apt-get update && apt-get upgrade -y
apt-get install sudo-y
apt-get install xfce4
apt-get install ibus-mozc
ibus start
//classは巻き上げられないので最初に書く
class inputClass{
constructor(){
this.inputCounter = 0;
this.list = [];
this.len = 0
}
append (value){
this.list.push(value);
this.len++;
}
input(){
if (this.inputCounter < this.list.length){
return this.list[this.inputCounter++];
}else{
return '';
}
}
}
let data = new inputClass();
let reader = require("readline").createInterface({
input: process.stdin,
output: process.stdout
});
reader.on("line", (line) => {
data.append(line.split(' '));
})
reader.on("close", () => {
//読み込み行数を保持するlenプロパティで末尾まで取り出し
for (let i=0; i < data.len; i++){
console.log(data.input());
}
});
入力
1 1
2 2
a
c
f g h
出力
[ '1', '1' ]
[ '2', '2' ]
[ 'a' ]
[ 'c' ]
[ 'f', 'g', 'h' ]
Paizaの問題の解説がさっぱりしすぎてて頭を悩ませているのでメモ程度に自分なりの解説を作ってみる。
今回の問題
2-近似によるTSP (paizaランク A 相当)
https://paiza.jp/works/mondai/tsp_problems/tsp_problems__tsp_approx
Python 3で解答に従い書いたコードはこんな感じ
import math
n = int(input())
cities = [list(map(int, input().split())) for _ in range(n)]
routes = []
mst = [[] for _ in range(n)] #隣接行列
tour = []
def calc_dist(a, b):
return math.sqrt(math.pow(a[0] - b[0], 2.0) + math.pow(a[1] - b[1], 2.0))
class UnionFind:
def __init__(self, n):
self.n = n
self.parent = [i for i in range(n)]
def get_parent(self, a):
a = self.parent[a]
while a != self.parent[a]:
a = self.parent[a]
return a
def unite(self, a, b):
a = self.get_parent(a)
b = self.get_parent(b)
self.parent[b] = a
def same(self, a, b):
return self.get_parent(a) == self.get_parent(b)
def dfs(mst, tour, now, before):
tour.append(now)
if now != before:
for nxt in mst[now]:
if nxt in tour:
continue
dfs(mst, tour, nxt, now)
for i in range(n):
for k in range(n):
tmp = calc_dist(cities[i], cities[k])
routes.append((tmp, i, k))
routes.sort()
uf = UnionFind(n)
for d, i, k in routes:
if uf.same(i, k):
continue
mst[i].append(k)
mst[k].append(i)
uf.unite(i, k)
dfs(mst, tour, 0, -1)
print(*tour)
問題を分割して考えていくと答えまでは3ステップ
for i in range(n):
for k in range(n):
tmp = calc_dist(cities[i], cities[k])
routes.append((tmp, i, k))
routes.sort()
このままだと、最小全域木はつくれないので、Union Findを使って同じ親を持つルートを排除していく。つまり、(0,0)→(0,0)といったものを消す。また、(0,0)→(0,1)及び(0,0)→(0,2)のうちユークリッド距離の短い方だけを残していく、(0,0) → (0,1)及び(0,1) → (0,0)の一方を消す。そうすることで、mstリストは、最小全域木の隣接リストとなる。
該当部分は以下の通り。
uf = UnionFind(n)
for d, i, k in routes:
if uf.same(i, k):
continue
mst[i].append(k)
mst[k].append(i)
uf.unite(i, k)
親が同じならループの先頭に戻り、そうでなければ、隣接リストに情報を記録して、その後に親の情報をufインスタンスに格納していく。
そうすることで親がことなるノードだけの隣接リストが作られる。
隣接リストをたどっていく。スタートはどこでもいいが、ここでは0をスタートとしている。
そして出力して終了。
Pythonで「巡回セールスマン問題」を解いてみよう!8つの解法を例題で解説
Colaboratoryで自然言語処理の基本みたいなワードクラウドを生成することができるので使ってみた。
ワードクライドを作成するライブラリのWordCloudを使うだけならこう。
#Colabで使ってDriveに出力する場合
from wordcloud import WordCloud
txt = "The quick brown fox jumps over the lazy dog"
a = WordCloud()
a.generate(text=txt)
#to_fileメソッドで書き出し
a.to_file("/content/drive/MyDrive/tmp/new.png")
生成例1 |
#Colabで実行する場合
#ビルドインのSTOPWORDSをインポートする
from wordcloud import WordCloud, STOPWORDS
txt = "The quick brown fox jumps over the lazy dog"
#brownをstopwordsに加える
stop = set(STOPWORDS)
stop.add("brown")
a = WordCloud(stopwords=stop)
a.generate(text=txt)
a.to_file("/content/drive/MyDrive/tmp/newst.png")
生成例2 |
relative_scaling=0.5 |
relative_scaling=1.0 |
from janome.tokenizer import Tokenizer
txt = """
日本国民は正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、諸国民と協和による成果と、わが国全土にわたって自由のもたらす恵沢を確保し、政府の行為によって再び戦争の惨禍が起こることのないようにすることを決意し、ここに主権が国民に存することを宣言し、この憲法を確定する。そもそも国政は国民の厳粛な信託によるものであって、その権威は国民に由来し、その権力は国民の代表者がこれを行使し、その福利は国民がこれを享受する。これは人類普遍の原理であり、この憲法は、かかる原理に基づくものである。われらはこれに反する一切の憲法、法令及び詔勅を排除する。
日本国民は、恒久の平和を念願し、人間相互の関係を支配する崇高な理想を深く自覚するのであって、平和を愛する諸国民の公正と信義を信頼して、われらの安全と生存を保持しようと決意した。われらは平和を維持し、専制と隷従、圧迫と偏狭を地上から永遠に除去しようと努めている国際社会において、名誉ある地位を占めたいと思う。われらは全世界の国民が、ひとしく恐怖と欠乏から免れ、平和の内に生存する権利を有することを確認する。
われらは、いずれの国家も、自国のことのみに専念して他国を無視してはならないのであって、政治道徳の法則は、普遍的なものであり、この法則に従うことは、自国の主権を維持し、他国と対等関係に立とうとする各国の責務であると信ずる。
日本国民は、国家の名誉にかけて、全力をあげて崇高な理想と目的を達成することを誓う。
"""
txt = txt.replace('\n', '')
t = Tokenizer()
for token in t.tokenize(txt):
print(token)
###出力###
"""
日本 名詞,固有名詞,地域,国,*,*,日本,ニッポン,ニッポン
国民 名詞,一般,*,*,*,*,国民,コクミン,コクミン
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
正当 名詞,形容動詞語幹,*,*,*,*,正当,セイトウ,セイトー
に 助詞,副詞化,*,*,*,*,に,ニ,ニ
選挙 名詞,サ変接続,*,*,*,*,選挙,センキョ,センキョ
さ 動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
れ 動詞,接尾,*,*,一段,連用形,れる,レ,レ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
国会 名詞,一般,*,*,*,*,国会,コッカイ,コッカイ
における 助詞,格助詞,連語,*,*,*,における,ニオケル,ニオケル
代表 名詞,サ変接続,*,*,*,*,代表,ダイヒョウ,ダイヒョー
者 名詞,接尾,一般,*,*,*,者,シャ,シャ
を通じて 助詞,格助詞,連語,*,*,*,を通じて,ヲツウジテ,ヲツージテ
行動 名詞,サ変接続,*,*,*,*,行動,コウドウ,コードー
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
、 記号,読点,*,*,*,*,、,、,、
われ 名詞,代名詞,一般,*,*,*,われ,ワレ,ワレ
ら 名詞,接尾,一般,*,*,*,ら,ラ,ラ
と 助詞,並立助詞,*,*,*,*,と,ト,ト
われ 名詞,代名詞,一般,*,*,*,われ,ワレ,ワレ
ら 名詞,接尾,一般,*,*,*,ら,ラ,ラ
"""
from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.tokenfilter import *
txt = """
日本国民は正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、諸国民と協和による成果と、わが国全土にわたって自由のもたらす恵沢を確保し、政府の行為によって再び戦争の惨禍が起こることのないようにすることを決意し、ここに主権が国民に存することを宣言し、この憲法を確定する。そもそも国政は国民の厳粛な信託によるものであって、その権威は国民に由来し、その権力は国民の代表者がこれを行使し、その福利は国民がこれを享受する。これは人類普遍の原理であり、この憲法は、かかる原理に基づくものである。われらはこれに反する一切の憲法、法令及び詔勅を排除する。
日本国民は、恒久の平和を念願し、人間相互の関係を支配する崇高な理想を深く自覚するのであって、平和を愛する諸国民の公正と信義を信頼して、われらの安全と生存を保持しようと決意した。われらは平和を維持し、専制と隷従、圧迫と偏狭を地上から永遠に除去しようと努めている国際社会において、名誉ある地位を占めたいと思う。われらは全世界の国民が、ひとしく恐怖と欠乏から免れ、平和の内に生存する権利を有することを確認する。
われらは、いずれの国家も、自国のことのみに専念して他国を無視してはならないのであって、政治道徳の法則は、普遍的なものであり、この法則に従うことは、自国の主権を維持し、他国と対等関係に立とうとする各国の責務であると信ずる。
日本国民は、国家の名誉にかけて、全力をあげて崇高な理想と目的を達成することを誓う。
"""
txt = txt.replace('\n', '')
t = Tokenizer()
filters = [CompoundNounFilter(), POSKeepFilter('名詞'), POSStopFilter(['非自立','代名詞'])]
NG = ['非自立', '代名詞']
analyzer = Analyzer(tokenizer=t, token_filters=filters)
for token in analyzer.analyze(txt):
#POSStopFilterがうまく機能しない部分があるので二重にフィルタリングする
ex = token.extra[0].split(',')
if all(x not in ex for x in NG):
print(token)
###出力###
'''
日本国民 名詞,複合,*,*,*,*,日本国民,ニッポンコクミン,ニッポンコクミン
正当 名詞,形容動詞語幹,*,*,*,*,正当,セイトウ,セイトー
選挙 名詞,サ変接続,*,*,*,*,選挙,センキョ,センキョ
国会 名詞,一般,*,*,*,*,国会,コッカイ,コッカイ
代表者 名詞,複合,*,*,*,*,代表者,ダイヒョウシャ,ダイヒョーシャ
行動 名詞,サ変接続,*,*,*,*,行動,コウドウ,コードー
子孫 名詞,一般,*,*,*,*,子孫,シソン,シソン
国民 名詞,一般,*,*,*,*,国民,コクミン,コクミン
協和 名詞,サ変接続,*,*,*,*,協和,キョウワ,キョーワ
成果 名詞,一般,*,*,*,*,成果,セイカ,セイカ
わが国全土 名詞,複合,*,*,*,*,わが国全土,ワガクニゼンド,ワガクニゼンド
自由 名詞,形容動詞語幹,*,*,*,*,自由,ジユウ,ジユー
恵沢 名詞,一般,*,*,*,*,恵沢,ケイタク,ケイタク
確保 名詞,サ変接続,*,*,*,*,確保,カクホ,カクホ
政府 名詞,一般,*,*,*,*,政府,セイフ,セイフ
行為 名詞,サ変接続,*,*,*,*,行為,コウイ,コーイ
戦争 名詞,サ変接続,*,*,*,*,戦争,センソウ,センソー
惨禍 名詞,一般,*,*,*,*,惨禍,サンカ,サンカ
決意 名詞,サ変接続,*,*,*,*,決意,ケツイ,ケツイ
'''
from pyparsing.helpers import Word
from wordcloud import WordCloud
from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.tokenfilter import *
txt = """
日本国民は正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、諸国民と協和による成果と、わが国全土にわたって自由のもたらす恵沢を確保し、政府の行為によって再び戦争の惨禍が起こることのないようにすることを決意し、ここに主権が国民に存することを宣言し、この憲法を確定する。そもそも国政は国民の厳粛な信託によるものであって、その権威は国民に由来し、その権力は国民の代表者がこれを行使し、その福利は国民がこれを享受する。これは人類普遍の原理であり、この憲法は、かかる原理に基づくものである。われらはこれに反する一切の憲法、法令及び詔勅を排除する。
日本国民は、恒久の平和を念願し、人間相互の関係を支配する崇高な理想を深く自覚するのであって、平和を愛する諸国民の公正と信義を信頼して、われらの安全と生存を保持しようと決意した。われらは平和を維持し、専制と隷従、圧迫と偏狭を地上から永遠に除去しようと努めている国際社会において、名誉ある地位を占めたいと思う。われらは全世界の国民が、ひとしく恐怖と欠乏から免れ、平和の内に生存する権利を有することを確認する。
われらは、いずれの国家も、自国のことのみに専念して他国を無視してはならないのであって、政治道徳の法則は、普遍的なものであり、この法則に従うことは、自国の主権を維持し、他国と対等関係に立とうとする各国の責務であると信ずる。
日本国民は、国家の名誉にかけて、全力をあげて崇高な理想と目的を達成することを誓う。
"""
cloud_text = '' #出力用
font_path = '/content/drive/MyDrive/tmp/ipaexm.ttf'
output_path = '/content/drive/MyDrive/tmp/constitution.png'
txt = txt.replace('\n', '')
t = Tokenizer()
filters = [CompoundNounFilter(), POSKeepFilter('名詞'), POSStopFilter(['非自立','代名詞'])]
NG = ['非自立', '代名詞']
analyzer = Analyzer(tokenizer=t, token_filters=filters)
for token in analyzer.analyze(txt):
#POSStopFilterがうまく機能しない部分があるので二重にフィルタリングする
ex = token.extra[0].split(',')
if all(x not in ex for x in NG):
#スペース区切りで単語を連結
cloud_text += ' '+ token.surface
wc = WordCloud(font_path = font_path, width=1980, height=1080)
wc.generate(text=cloud_text)
wc.to_file(output_path)
JavaScriptの非同期処理がよくわからない、PromiseってなんぞってなったのでPromiseについてまとめてみた。
//Fetch APIを使う場合
fetch(url) //urlにアクセスして
.then(response => response.json()) //responseを解釈し
.then(data => console.log(data)); //データを表示する
(https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetchから引用)// funcAは処理を実行、funcBはエラーを処理
fetch(url).then(funcA, funcB)
//または
fetch(url)
.then(funcA)
.catch(funcB)
//HTTPリクエストを行い、最初にPromiseを返し、
//リクエストが返ってきたら、Promiseはresponseオブジェクトで満たされる
fetch(url)
//HTTPリクエストのPromiseが満たされるまで
//fetch()から返ってきたPromiseで解決される
//HTTPリクエストのPromiseが満たされると
//response.jsonが返すPromiseは満たされる
.then(response => response.json())
//response.json()の受け取ったPromiseが満たされるまで
//最初のthen()が返すPromiseで解決される
.then(data => displayData(data));
//durationを引数として受け取り
//durationミリ秒後にPromiseをduratoinで満たす
function wait(duration){
return new Promise((resolve, reject)=>{
setTimeout(() => {resolve(duration)}, duration);
})
}
//start→4000→setTimeoutの順でコンソールに表示される
console.log("Start");
setTimeout(() => {console.log("setTimeout")}, 5000);
wait(4000).then(time => {console.log(time)});
//start→setTimeout→4000の順でコンソールに表示される
console.log("Start");
setTimeout(() => {console.log("setTimeout")}, 3000);
wait(4000).then(time => {console.log(time)});