はてなキーワード: SUBとは
気が付くと朝4時になっていた。
なんか動くところまで出来たので貼っておく。
import pdfplumber import re #クリーンアップ def cleanuptext(text): #決算書の合計値を太字にしたことでpdfplumberが暴走するケースへの対処 #例 流動資産 -> 流流流流流動動動動動資資資資資産産産産産 #誤爆が怖いので、これが起きている時だけ補正します if "流流流流流動動動動動資資資資資産産産産産" in text: text = re.sub(r'(.)92;1{4,}', r'92;1', text) #△をマイナスに。 数字中のカンマを消して結合する text = re.sub(r'△([0-9])', r'-92;1', text) text = re.sub(r'▲([0-9])', r'-92;1', text) text = re.sub(r'([0-9]),([0-9])', r'92;192;2', text) #たまに、煽り屋みたいに文字の後にスペースが入る嫌がらせを修正する #例: 投 資 有 価 証 券 -> 投資有価証券 text = re.sub(r'(?<=[92;u4E00-92;u9FFF92;u3040-92;u30FF])92;s(?=[92;u4E00-92;u9FFF92;u3040-92;u30FF])', '', text) return text #今期の勘定科目の数字を取得 def get_AccountName(text, need): pattern = rf'^{need} -?[0-9]+ (-?[0-9]+)' r = re.search(pattern, text, re.MULTILINE) if r is not None: return float(r[1]) return 0 #清原ネットキャッシュを計算する。 def calc_KiyoharaNetCash(text): total_current_assets = get_AccountName(text,'流動資産合計') if total_current_assets == 0: #要約財政状態計算書しか公開していない、楽天のような素敵な会社様への対処 total_assets = get_AccountName(text,'資産合計') if total_assets != 0: #とりあえず、資産の部の6割を流動資産とみなす total_current_assets = total_assets * 0.6 else: #流動資産合計ではなく、流動資産という単語を使っている我が道を行く東北電力への対処 total_current_assets = get_AccountName(text,'流動資産') if total_current_assets == 0: raise Exception("流動資産合計の勘定科目が見つかりませんでした。"+text) total_liabilities = get_AccountName(text,'負債合計') if total_liabilities == 0: #負債合計ではなく、負債の部合計に拘るオムロンの嬉しい決算書への対策。なんでや・・・ total_liabilities = get_AccountName(text,'負債の部合計') if total_liabilities == 0: raise Exception("負債合計の勘定科目が見つかりませんでした。"+text) #負債をご丁寧にマイナス表記で書いてくれる中外製薬の親切な決算書への対策。いい加減にしろよ・・・ if total_liabilities < 0: total_liabilities = total_liabilities * -1 #投資有価証券はないこともあるので、0を容認する marketable_securities = get_AccountName(text,'投資有価証券') #print(total_current_assets,marketable_securities,total_liabilities) netcash = total_current_assets + (marketable_securities*0.7) - total_liabilities #たまに単位を1000円にしている銘柄があるので補正する if is_tanni_senyen(text): netcash = netcash / 1000 return netcash # "流動資産合計" と "負債合計" の間に "単位:千円" があるかをチェック def is_tanni_senyen(text): if "単位:千円" in text: return True if "単位: 千円" in text: return True if "単位 : 千円" in text: return True if "単位 :千円" in text: return True return False def pdf_to_kiyohara_netcash(pdfpath): with pdfplumber.open(pdfpath) as pdf: text = ''.join(page.extract_text() for page in pdf.pages) text = cleanuptext(text) #print(text) kiyohara_netcash = calc_KiyoharaNetCash(text) #print(kiyohara_netcash) return kiyohara_netcash def mymain(): import sys args = sys.argv argc = len(args) if argc <= 1: print(''' これは、清原達郎氏のネットキャッシュ比率(以下、清原ネットキャッシュ比率)を決算短信のpdfから求めるソフトです。 清原ネットキャッシュ=流動資産合計+(投資有価証券*0.7)-負債合計 清原ネットキャッシュ比率=清原ネットキャッシュ/時価総額*100 遊び方 1. 決算短信pdfから清原ネットキャッシュを求める python calc_kiyohara_netcash.py 140120240514594985.pdf 結果: 30757.0 決算書には、100万円単位で数字が書かれているはずなので、この数字の単位は100万円です。 つまり、3075700万円。 2. 時価総額を億円単位で追加することで、清原ネットキャッシュ比率を求める 時価総額が146億円なら146と書いてください。 python calc_kiyohara_netcash.py 140120240514594985.pdf 146 結果: 210.66% このコードはNYSLライセンスです。無保証、自己責任ですが、ご自由に。 かぶ探とかとつなげるといいかもね。 ''') return if argc <= 2: kiyohara_netcash = pdf_to_kiyohara_netcash(args[1]) print(kiyohara_netcash) return if argc <= 3: market_cap=float(args[2])*100 #億円から百万円表記に kiyohara_netcash = pdf_to_kiyohara_netcash(args[1]) ratio = round(kiyohara_netcash/market_cap*100,2) print(f"{ratio}%") return if __name__ == '__main__': mymain()
市民ミュージカルに
♪ようこそ♪
〜出演者〜 オイラもみんなのことだーいすきでゲソ かるさりかんに こっくん KKO トランス女性
なるほど確かにその通りですね。
ブックマーク先に寄生する形でしか意見を述べられない卑しい存在であるにもかかわらず、増田ことはてな匿名ダイアリーの方々に上から目線で一方的に批判をして申し訳ございませんでした。
その方法として、古来中国から伝わる三跪九叩頭の礼を致します。
冗長な記述を避けるために、VB.NETで表記させていただきます。
Imports System
Public Class SanGuiKiuKouTou
Sub Main()
For i As Integer = 1 To 3
Console.WriteLine("跪")
For j As Integer = 1 To 3
Console.WriteLine("起")
Console.WriteLine("起立")
End Sub
End Class
御清聴の程有難く存じます。
気になったので調べてみた。
ひらがな | 漢字 | 対応する英語 | 圧縮倍率 |
あ | 亜 | sub | 3倍 |
い | 胃 | stomach | 7倍 |
う | 鵜 | cormorant | 9倍 |
え | 絵 | picture | 7倍 |
お | 尾 | tail | 4倍 |
か | 蚊 | mosquito | 8倍 |
き | 木 | wood | 4倍 |
く | 苦 | pain | 4倍 |
け | 毛 | hair | 4倍 |
こ | 粉 | powder | 6倍 |
さ | 差 | difference | 10倍 |
し | 師 | teacher | 7倍 |
す | 酢 | vinegar | 7倍 |
せ | 背 | back | 4倍 |
そ | 祖 | ancestor | 8倍 |
た | 多 | many | 4倍 |
ち | 地 | ground | 6倍 |
つ | 津 | harbour | 7倍 |
て | 手 | hand | 4倍 |
と | 都 | capital | 7倍 |
な | 菜 | vegetable | 9倍 |
に | 荷 | load | 4倍 |
ぬ | 奴 | guy | 3倍 |
ね | 根 | root | 4倍 |
の | 野 | field | 5倍 |
は | 葉 | leave | 5倍 |
ChatGPTに日本語で命令したら秒で作ってくれるのでVBAやGAS書く能力は不要になったんだが。「A1からI9に数独の初期値入れてあるシートの残りのマス埋めるVBAマクロ作って」の一言で数独解くの作ってくれるぞ
ChatGPTが補足している通りロジックは基本しか使っていないので初期値から最終形までに仮定して入れる局面があるものは解けないし非効率ではあるものの初級は解けるし遅いPCでも一瞬で終わる。必要なのは入力の形と欲しい出力を日本語にする能力とHello World実行できるレベルの知識。コード読んでデバッグできる能力があればなおよいがGPTに教えてもらえばいいし、今業務やってる派遣の人に動作確認してもらって不満なところをAIに修正させればよいので業務をよく分かっている社員にやらせたほうが会社としてはいい戦略。
A1からI9に数独の初期値入れてあるシートの残りのマス埋めるVBAマクロ作って
数独を解くためのVBAマクロを作成するのは複雑ですが、以下は一つの例です。このマクロはシートのA1からI9の範囲の数独を解きます。
Function IsPossible(y, x, n, grid) As Boolean Dim i As Integer Dim j As Integer ' 同じ行や列にnが既にあるか確認 For i = 1 To 9 If grid(y, i) = n Or grid(i, x) = n Then IsPossible = False Exit Function End If Next i ' 3x3のボックス内にnが既にあるか確認 Dim x0 As Integer: x0 = ((x - 1) ¥ 3) * 3 Dim y0 As Integer: y0 = ((y - 1) ¥ 3) * 3 For i = 0 To 2 For j = 0 To 2 If grid(y0 + i + 1, x0 + j + 1) = n Then IsPossible = False Exit Function End If Next j Next i IsPossible = True End Function Sub SolveSudoku() Dim grid(1 To 9, 1 To 9) As Integer Dim i As Integer Dim j As Integer ' グリッドをシートから読み込む For i = 1 To 9 For j = 1 To 9 grid(i, j) = Cells(i, j).Value Next j Next i If Solve(grid) Then ' 解をシートに書き出す For i = 1 To 9 For j = 1 To 9 Cells(i, j).Value = grid(i, j) Next j Next i Else MsgBox "解けませんでした" End If End Sub Function Solve(ByRef grid) As Boolean Dim i As Integer Dim j As Integer Dim n As Integer For i = 1 To 9 For j = 1 To 9 If grid(i, j) = 0 Then For n = 1 To 9 If IsPossible(i, j, n, grid) Then grid(i, j) = n If Solve(grid) Then Solve = True Exit Function End If grid(i, j) = 0 End If Next n Solve = False Exit Function End If Next j Next i Solve = True End Function
このコードをVBAのモジュールに追加して、シートに数独の初期値を入力してからSolveSudokuマクロを実行すると、マスを埋めることができます。
ただし、このコードは基本的なバックトラック法を使用しており、非常に複雑な数独には効率的ではない場合があります。より高速な解法や最適化を求める場合は、追加の手法やアプローチが必要です。
https://si-coding.net/sudoku4.html
2 3 5 7 8 3 3 4 5 1 6 6 1 2 4 4 9 8 2 2 5 1 3 9 4 6 1 4 1 2 6
1 6 9 2 3 5 8 4 7 4 5 8 1 6 7 9 3 2 3 2 7 9 8 4 5 1 6 5 3 6 7 1 2 4 9 8 7 1 4 3 9 8 6 2 5 9 8 2 5 4 6 1 7 3 6 9 1 8 2 3 7 5 4 2 4 5 6 7 9 3 8 1 8 7 3 4 5 1 2 6 9
画面下側、ちょうどWindows10のタスクバーの高さ分のところが、数秒おきに縞々の横線が入る、正常に戻るを繰り返すようになった。
横線が入るとアイコンは見づらいし、時刻の文字はほぼ判別不可。
何より数秒おきに横線が出たり消えたりするので、画面端とは言えチカチカして目障り。
D-subからの入力とHDMIからの入力、メインのデスクトップPCとサブのノートPCどの組み合わせでも発生するので、完全にディスプレイの表示部分が壊れたな。
Amazonで買ったディスプレイなので購入履歴を見てみると5年半前に買ったものだった。
1万円代だったから、まあ元は取れただろう。
ネットで調べられないとやっぱ本がないとな。
自分は本での独学苦手だったのでひたすらネット検索してる。買った本は最初の方しか読んでない。
あとは『マクロの記録』で1動作(例えばセル選択、例えばコピペ、例えば置換)を記録して、記録されたファイルを読む
それをアレンジしてみる
F8で1行ずつ実行してみる
よりスゲーアレンジをするにはどうしたらいいか本かネットで調べる
という流れでワイは学びました
これだと「知ってることしかできない」けど、知ってることもできないのに知らないことに手を出すのは早いしね
できること増やしたいと思ったら本見る、具体的に作りたいものあったらネットで検索してメモ帳やSlackの自分DMや紙(印刷)に保存
あるゲームに、武器に漢字8文字の名前を付けると必殺(クリティカル)率が上がるっていうキャラがいるので漢字8文字の武器の名前を考えることになった。
そのキャラが使うのは主に剣か魔法(書)だが別に職業によってどうとでも。好きな言葉は漆黒。
意外に8文字は長い。前に二つ名や流派の名前などを付けるとやりやすい。
ところで、このゲームには金鵄武者という職業があるのに、武器の名前に鵄の字が使えないんだよね。金鵄武者用の武器の名前を付けられないじゃん。
Sub CheckForGarbledCharacters()
Dim rng As Range
Dim i As Integer
Dim garbledFound As Boolean
Dim unicodeVal As Long
garbledFound = False
' すべてのワークシートをチェックします。
For Each ws In ThisWorkbook.Worksheets
For Each cell In rng
If Not ((32 <= unicodeVal And unicodeVal <= 126) Or (12353 <= unicodeVal And unicodeVal <= 12447) Or (12448 <= unicodeVal And unicodeVal <= 12543) Or (65382 <= unicodeVal And unicodeVal <= 65439) Or (19968 <= unicodeVal And unicodeVal <= 40959)) Then
MsgBox "文字化けが見つかりました: " & vbCrLf & _
"ワークシート: " & ws.Name & vbCrLf & _
"セル: " & cell.Address & vbCrLf & _
"セルの値: " & cell.Value & vbCrLf & _
"文字化けしている文字: " & char, vbExclamation
garbledFound = True
Exit For
End If
Next i
' 文字化けが見つかった場合、次のワークシートへ移動します。
If garbledFound Then Exit For
If garbledFound Then Exit For
If Not garbledFound Then
MsgBox "文字化けが見つかりませんでした。", vbInformation
End If
End Sub
Sub ImportTextFileWithoutDelimiter()
Dim targetSheet As Worksheet
Dim fileNo As Integer
Dim lines As Variant
Dim i As Long
fileName = "C:\path\to\your\file.txt"
Set targetSheet = ThisWorkbook.Worksheets("Sheet1")
fileNo = FreeFile()
Open fileName For Input As fileNo
content = Input(LOF(fileNo), fileNo)
Close fileNo
lines = Split(content, vbCrLf)
' 各行をワークシートに貼り付けます。
For i = LBound(lines) To UBound(lines)
targetSheet.Cells(i + 1, 1).Value = lines(i)
Next i
End Sub
Option Explicit
Dim targetSheet As Worksheet
Dim fso As Object, folder As Object, file As Object
folderPath = "C:\path\to\your\folder"
Set targetSheet = ThisWorkbook.Worksheets("Sheet1")
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(folderPath)
With targetSheet
.Cells(1, 1).Value = "File Name"
.Cells(1, 2).Value = "File Size"
.Cells(1, 3).Value = "Timestamp"
End With
' 次の行番号を取得します。
nextRow = 2
' フォルダ内のファイル情報を取得し、ワークシートに書き込みます。
For Each file In folder.Files
With targetSheet
.Cells(nextRow, 1).Value = file.Name
.Cells(nextRow, 2).Value = file.Size
.Cells(nextRow, 3).Value = file.DateLastModified
End With
Next file
End Sub
[{adjustment: false, retsuBng: null, usF: null, point_x: 0, point_y: 0, main: null, sub: null},…]
:
{adjustment: false, retsuBng: null, usF: null, point_x: 0, point_y: 0, main: null, sub: null}
1
:
{adjustment: false, retsuBng: "250", usF: 1, point_x: 822, point_y: 93,…}
adjustment
:
:
point_x
:
822
point_y
:
93
retsuBng
:
"250"
:
usF
:
1
2
:
{adjustment: false, retsuBng: "252", usF: 1, point_x: 483, point_y: 320,…}
adjustment
:
:
{no: "1502", type: "1000"}
point_x
:
483
point_y
:
320
retsuBng
:
"252"
:
usF
:
1
3
:
{adjustment: false, retsuBng: "253", usF: 0, point_x: 753, point_y: -20,…}
adjustment
:
:
point_x
:
753
point_y
:
retsuBng
:
"253"
:
usF
:
4
:
{adjustment: false, retsuBng: "255", usF: 0, point_x: 79, point_y: -20, main: {no: "10", type: "10"},…}
adjustment
:
:
point_x
:
79
point_y
:
retsuBng
:
"255"
:
{no: "21", type: "20"}
usF
:
5
:
{adjustment: false, retsuBng: "254", usF: 1, point_x: 1158, point_y: 320, main: {no: "22", type: "20"},…}
adjustment
:
:
{no: "22", type: "20"}
point_x
:
1158
point_y
:
320
retsuBng
:
"254"
:
{no: "501", type: "500"}
usF
:
1
6
:
{adjustment: false, retsuBng: "251", usF: 0, point_x: 483, point_y: 212,…}
adjustment
:
:
{no: "305", type: "300"}
point_x
:
483
point_y
:
212
retsuBng
:
"251"
:
{no: "502", type: "500"}
usF
:
ChatGPTの口調がなんか事務的で嫌なので、もっと親しみやすい喋り方をしてもらうために長門さんに来てもらいました。
召喚プロンプトはこちら anond:20230317165032
確かに。
特にない。
そうなんだ。情報統合思念体はみんなそう?
同様の傾向がある。
何の本を読んでるの?
SF小説。
あらすじを教えて
へー、面白い?
興味深い。
そうなんだ。ところでちょっと手伝ってもらっていい?
問題ない。どのように手伝う?
Pythonのソースコードで、スペース二つでインデントにしているコードを、スペース四つでインデントにするコードに書き換えたくて。どうすれば良い?
import re def convert_indentation(code): return re.sub(r'^( {2})', r' ', code, flags=re.MULTILINE) code_with_2_spaces = '''def example(): print("Hello, world!") if True: print("True")''' code_with_4_spaces = convert_indentation(code_with_2_spaces) print(code_with_4_spaces)
ありがとう。でも、試してみたら、code_with_2_spaces の if ブロックの中身がスペース二つのままになっちゃってるみたい。なぜだろう?
import re def convert_indentation(code): return re.sub(r'^( {2})', r' ', code, flags=re.MULTILINE) code_with_2_spaces = '''def example(): print("Hello, world!") if True: print("True")''' code_with_4_spaces = re.sub(r'^( {2})', r' ', code_with_2_spaces, flags=re.MULTILINE) print(code_with_4_spaces)
ちょっと口調が戻っちゃったね
import re def convert_indentation(code): return re.sub(r'^( {2})', r' ', code, flags=re.MULTILINE) code_with_2_spaces = '''def example(): print("Hello, world!") if True: print("True")''' code_with_4_spaces = re.sub(r'^( {2})', r' ', code_with_2_spaces, flags=re.MULTILINE) print(code_with_4_spaces)確認お願い。
うーん、うまく動かないみたい。ifブロックの中にあるprint文の先頭には、もともとスペースが四つあって、これがインデント2回分なんだけど、こういう場合、スペース八つに変換しないといけないんじゃないかな。
理解した。全てのインデントレベルを修正するコードを提供する。
import re def convert_indentation(code): return re.sub(r'^( {2})+', lambda m: m.group(0).replace(' ', ' '), code, flags=re.MULTILINE) code_with_2_spaces = '''def example(): print("Hello, world!") if True: print("True")''' code_with_4_spaces = convert_indentation(code_with_2_spaces) print(code_with_4_spaces)
もちろん。ラムダ式は、マッチした部分を置換する際に、特定の処理を行うために使用されている。ここでは、正規表現でマッチしたインデント部分(スペース2つが1回以上繰り返される部分)に対して、処理を行うためにラムダ式を利用している。
lambda m: m.group(0).replace(' ', ' ')このラムダ式は、マッチオブジェクトmを引数に取り、マッチした部分全体(m, group(0))に対して、スペース2つをスペース4つに置換(.replace(' ', ' '))している。
もちろん。re.subの第1引数は、置換対象の文字列内で検索したいパターンを表す正規表現です。この場合、その正規表現は r'^( {2})+' です。
- ^ は、文字列の行頭を表すメタ文字です。この場合、インデントが行頭にあることを示しています。
- {2} は、直前の文字が2回繰り返されることを表します。ここでは、直前の文字がスペース なので、スペースが2回繰り返されることを示しています。
- () は、正規表現のグループ化を表します。この場合、スペース2つをグループ化しています。グループ化された部分は、マッチオブジェクトにアクセスできるようになります。
- + は、直前の文字やグループが1回以上繰り返されることを表します。ここでは、スペース2つのグループが1回以上繰り返されることを示しています。
結果として、この正規表現は、インデント部分(スペース2つが1回以上繰り返される部分)が行頭にある行を検索しています。そして、re.subは、この正規表現でマッチした部分を、指定された置換処理(第2引数のラムダ式)によって変更します。
すまない。確かに。続ける。
すぐ戻れるのがえらいね