はてなキーワード: charとは
単位変換
光速 = 299792458m/s =9.46 x 10e15 m/year
ご飯 100g = コロッケ小=パン1枚 = 150kcal
銀1匁 = 70文
天保通宝最終レート.008円
1里 =3927.2727m = 36丁
1間 = 1.81818m = 6尺
1尺 = .30303m = 10寸
1寸 = .030303m
1斗 = 18L = 10升
1升= 1.8L = 10合
1合 = .18L
1m = 39.37inch = 3.2808feet = .00062137119miles
1inch = .0254m
1feet = .3048m = 12inch
1yard = .9144m = 3feet
1hectare = 2.47105acre = 10,000m2 = 1町歩
1acre = 4046.86m2
東京ドーム面積 = 4.6755ha = 122 x 122m x 3.14
1L = 1,000cm3 = .2642 US gallon = .22 UK gallon = 1kg(water) = 2.20462pounds
US gallon = 3.785L
UK gallon = 4.5L
1pound = 453.5929g
ling yi er san si wu liu qi ba jiu shi bai qian wan
lim h->0 (1+h)1/h = e = 2.7182818284 = 1.64872127 x 1.64872127
ln2 = .69314718
ln 3 = 1.09861228866
ln 4 = 1.38629 = 2 ln2
1/e = (e)-1 = .3678794411
(e)2 = 7.38905609
pi/ 2 = 1.57079
2 = 1.259921 x 1.259921 x 1.259921 = 1.414213562 x 1.414213562
3 = 1.44224957 x 1.44224757 x 1.44224957 = 1.7320508 x 1.7320508
4 = 1.5874010519 x 1.5874010519 x 1.5874010519
5 = 1.7099759x 1.7099759 x 1.7099759 = 2.2360679 x 2.236079
11 = 3.31662479 x 3.31662479 ← 修正: 旧「3.1662479 x 3.31662479」
13 = 3.6055512751 x 3.605551275
golden ratio = 1 : 1.6180339 = (1 + (5)1/2) / 2
1 + tan2 x = 1 / cos2 x
sphere volume = 4/3 pi r3, surface area = 4 pi r 2
cone volume = 1/3 pi r2 H, surface area = pi r (r + L) = pi r2 + pi r L
日本の川長い順
1信濃川367
2利根川322
3石狩川268
4天塩川256
5北上川249
6阿武隈川239
7最上川229
7木曽川229
1富士山3776
2北岳3193
3奥穗高岳3190
3間ノ岳3190
5槍ヶ岳3180
6悪沢岳3141
7赤石岳3120
9塩見岳3052
10仙丈ヶ岳3033
11乗鞍岳3026
12立山3015
13聖岳3013
14剱岳2999
15水晶岳2986
16甲斐駒ヶ岳2967
17木曽駒ヶ岳2956
18白馬岳2932
19薬師岳2926
20鷲羽岳2924
21赤岳2899
22笠ヶ岳2897
23鹿島槍ヶ岳2889
24空木岳2864
25常念岳2857
26黒部五郎岳2840
26鳳凰山2840
28五竜岳2814
29白山2702
30金峰山2599
31光岳2591
32日光白根山2578
33浅間山2568
34蓼科山2530
35男体山2486
36甲武信ヶ岳2475
37火打山2462
38焼岳2455
39妙高山2454
40燧ヶ岳2356
41四阿山2354
42高妻山2353
43大雪山2291
44鳥海山2236
45瑞牆山2230
46至仏山2228
47恵那山2191
48草津白根山2171
49武尊山2158
50苗場山2145
51皇海山2144
52トムラウシ2141
52平ヶ岳2141
55飯豊山2105
56十勝岳2077
57大菩薩嶺2057
58幌尻岳2052
0日本橋2里
1品川2里半
2川崎2里半
3神奈川1里9丁
4保土ヶ谷2里9丁
5戸塚1里30丁
6藤沢3里半
7平塚27丁
8大磯4里
9小田原4里8丁
10箱根3里28丁
11三島1里半
12沼津1里半
13原3里6丁
14吉原2里30丁
15蒲原1里
16由比2里12丁
17興津1里3丁
18江尻2里29丁
19府中1里半
20丸子1里29丁
21岡部1里29丁
22藤枝2里8丁
23島田1里
24金谷1里24丁
25日坂1里19丁
26掛川2里16丁
27袋井1里半
28見附4里7丁
29浜松2里30丁
30舞阪1里
31新居1里24丁
32白須賀2里16丁
33二川1里20丁
34吉田2里22丁
35御油16丁
36赤坂2里9丁
37藤川1里25丁
38岡崎3里30丁
39池鯉鮒2里30丁
40鳴海1里半
41宮7里
42桑名3里8丁
43四日市2里27丁
44石薬師27丁
45庄野2里
46亀山1里半
47関1里24丁
48坂下2里半
49土山2里25丁
50水口3里12丁
51石部2里25丁
52草津3里24丁
53大津3里
54三条大橋
1368 174応安8
1379 176康暦3
1381 177永徳4
1384 178至徳4
1387 179嘉慶3
1389 180康応2
1390 181明徳5
1394 182応永35
1428 183正長2
1429 184永享13
1441 185嘉吉4
1444 186文安6
1449 187宝徳4
1452 188享徳4
1455 189康正3
1457 190長禄4(5)
1461 191寛正7(6)
1466 192文正2
1467 193応仁3
1469 194文明19
1487 195長享3
1489 196延徳4
1492 197明応10
1501 198文亀4
1504 199永正18
1521 200大永8
1528 201享禄5
1555 203弘治4
1558 204永禄13
1570 205元亀4
1593 207文禄5(4)
1645 211正保5(4)
1648 212慶安5
1652 213承応4
1655 214明暦4
1658 215万治4
1661 216寛文13
1673 217延宝9
1684 219貞享5
1704 221宝永8
1741 225寛保4
1801 233享和4
1804 234文化15
1818 235文政13(14)
1845 237弘化5(4)
1848 238嘉永7(8)
1855 239安政7(6)
5億年前 カンブリア紀
7.4万年前 eruption of mount Toba ← 修正: 旧「7万年前」
2570 BC 縄文時代 pyramid of Khufu constructed, 231 x 231 x height probably 146.5m, 138.5m now ← 修正: 旧「163.34m, 147m now」
79 eruption of mount Vesuvius
113 Trajan's Column
199 呂布眠
6th century 古墳時代 eruption of 榛名山
794 平安京
1499 明応8年 Pieta by Michelangelo ← 修正: 旧「1500 明応9年」
1505 永正2年 Mona Lisa by Leonardo da Vinci
1582 天正10年 October 4->15 Gregorian calendar
1616 元和2年 William Shakespeare died
1653 承応2年 Bentheim castle by Jacob van Ruisdael
1666 寛文7年 great fire of London
1687 貞享4年 Philosophiae Naturalis Principia Mathematica by Isaac Newton
1689 元禄2年 Montesquieu born
1707 宝永4年 eruption of 富士山, Carl Linnaeus born
1768 明和5年 Mars and Venus surprised by Vulcan, by Lewis Jean Francois Lagrenee the elder, 258 years ago
1776 安永5年 United states declaration of independence
1780 安永9年 Jean Dominique Ingres born
1789 寛政元年 French revolution
1797 寛政9年 Franz Schubert born
1814 文化11年 Jean Francois Millet born
1826-1827 文政9-10年 oldest photograph 'View from the Window at Le Gras' by Nicephore Niepce ← 修正: 旧「1825 'Boy and his horse'」
1833 天保3年 東海道五十三次歌川広重 北斎漫画葛飾北斎
1863 文久3年 emancipation proclamation
1866 Romain Rolland born
1867 Jean Dominique Ingres died, 夏目漱石生 ← 修正: 「1875 Jean Dominique Ingres died」の行を削除
1874 Lucy Maud Montgomery born
1875 高橋由一 ← 修正: Ingres died(誤記)を削除
1885 Adventures of Huckleberry Finn by Mark Twain
1888 十五少年漂流記 by Jules Verne, eruption of 磐梯山
1890 Harland David Sanders born
1898 The war of the worlds by H. G. Wells, Lewis Carroll died, 井伏鱒二生 四芸術 by Alphonse Mucha
1903 John von Neumann born
1904 Salvador Dali born
1908 Anne of Green Gables by L. M. Montgomery
1908 松本清張生
1919 Auguste Renoir died
1923 関東大震災
1969 moon landing, 57 years ago
1970 三島由紀夫眠45才
1980 Harland David Sanders died, 90 years old
1988 辻井伸行生
1989 Salvador Dali 手塚治虫昭和天皇眠GBテトリス発売
1993 Audrey Hepburn 井伏鱒二眠
1995 阪神淡路大震災
2197.1 s
00:36:37.1
start 13:35:06
stop 14:11:43
4.825 t/s
10601 types
2.713 c/s
type - char
4640
ん?
dorawiiより
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 https://anond.hatelabo.jp/20251122165106# -----BEGIN PGP SIGNATURE----- iHUEARYKAB0WIQTEe8eLwpVRSViDKR5wMdsubs4+SAUCaSFrawAKCRBwMdsubs4+ SKtvAP9Yamn744APD9x+sXjjxbwJI2R8G2CU9MfQn5vhcUgckQD/Us2TWovKE/Eu CHAR+h3VuJ9bY6ab2wgxv4WmqOfBsAg= =+AGb -----END PGP SIGNATURE-----
utf8の文字コードで構成されたバイナリーファイルがある。このファイルの改行の数を数えよ。改行はCRのみとする。このファイルにはCR が必ず含まれており、CRで分割すればマルチスレッドで処理できる。
size_t count_cr_in_file(const std::string& path) {
std::ifstream fs(path, std::ios::binary);
size_t size = fs.tellg();
fs.seekg(0);
const size_t thread_count = std::thread::hardware_concurrency();
const size_t chunk_size = size / thread_count;
std::vector<std::future<size_t>> futures;
for (size_t t = 0; t < thread_count; t++) {
size_t start = t * chunk_size;
size_t end = (t == thread_count - 1 ? size : (t + 1) * chunk_size);
futures.push_back(std::async(std::launch::async, [start, end, &path]() {
std::ifstream fs(path, std::ios::binary);
fs.seekg(start);
size_t count = 0;
for (size_t i = start; i < end; i++) {
char c;
if (c == '\r') count++;
}
return count;
}));
}
size_t total = 0;
for (auto& f : futures) total += f.get();
return total;
}
import mmap
mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
return mm.count(b'\r')
c#で書けと指示したところ、
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
{
public static long CountCRInFile(string path)
{
using var mmf = MemoryMappedFile.CreateFromFile(path, FileMode.Open, null);
using var accessor = mmf.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read);
long fileSize = accessor.Capacity;
int processorCount = Environment.ProcessorCount;
long chunkSize = fileSize / processorCount;
long total = 0;
object lockObj = new object();
Parallel.For(0, processorCount, i =>
{
long start = i * chunkSize;
long end = (i == processorCount - 1) ? fileSize : (i + 1) * chunkSize;
long localCount = 0;
byte b;
for (long pos = start; pos < end; pos++)
{
if (b == 0x0D) // CR
localCount++;
}
lock (lockObj)
{
total += localCount;
}
});
return total;
}
static void Main(string[] args)
{
long count = CountCRInFile(path);
Console.WriteLine($"CR count = {count}");
}
}
というコードが出てきた。
実際はcrlf,lfもあり得るんだが、そこは考慮しなくてもよく、そう考えるとaiはすごいとしか言いようがない。
確かに使ってた。使ってはいるけど解凍を使ってるのは自己解凍のところだけで、e,xオプションのところでは「ファイルを取り出す」表記。凍結表記もaオプションのところだけ。
(LHAになる前のバージョンだけど)LHarcソースコード内の日本語版の使い方
char use[] =
"LHarc version 1.13c Copyright(c) H.Yoshizaki(吉崎栄泰), 1988-89.\n"
"============================================================= 1989 - 5 - 21 ===\n"
" <<< 高圧縮書庫管理プログラム >>>\n"
"===============================================================================\n"
" 使用法:LHarc [<命令>] [{/|-}{<スイッチ>[-|+|2|<オプション>]}...] <書庫名>\n"
" [<ドライブ名>:|<基準ディレクトリ名>\\] [<パス名> ...]\n"
"-------------------------------------------------------------------------------\n"
" 《命令》\n"
" a: 書庫にファイルを追加 u: 書庫にファイルを追加(日時照合付)\n"
" f: 書庫のファイルを更新 m: 書庫にファイルを移動(日時照合付)\n"
" d: 書庫内のファイルの削除 e,x: 書庫からファイルを取り出す\n"
" p: 書庫内のファイルの閲覧 l,v: 書庫の一覧表示\n"
" s: 自己解凍書庫の作成 t: 書庫内のファイルの CRC チェック\n"
" 《スイッチ》\n"
" r: 再帰的収集を行う w: ワークディレクトリの指定\n"
" x: ディレクトリ名を有効にする m: 問い合わせを行わない\n"
" p: 名前の比較を厳密に行う c: 日時照合を行わない\n"
" a: 全属性を凍結の対象とする v: 他のユーティリティでファイルを閲覧\n"
" n: 経過表示をしない k: 自動実行のキーワードの設定\n"
"===============================================================================\n"
" 転載・再配布などは自由です。 Nifty-Serve PFF00253\n"
英語版の使い方
char use[] =
"LHarc version 1.13c Copyright (c) Haruyasu Yoshizaki, 1988-89.\n"
"================================================================ 05/21/89 ===\n"
" <<< High-Performance File-Compression Program >>>\n"
"===============================================================================\n"
"usage: LHarc [<command>] [{{/|-}{<switch>[-|+|2|<option>]}}...] <archive_name>\n"
" [{<drive_name>:}|{<home_directory_name>\\}] [<path_name> ...]\n"
"-------------------------------------------------------------------------------\n"
" a: Add files to archive u: Update files to archive\n"
" f: Freshen files in archive m: Move new files into archive\n"
" d: Delete files from archive e,x: EXtract files from archive\n"
" p: disPlay files in archive l,v: View List of files in archive\n"
" s: make a Self-extracting archive t: Test integrity of archive\n"
" r: Recursively collect files w: assign Work directory\n"
" x: allow eXtended file names m: no Message for query\n"
" p: distinguish full Path names c: skip time-stamp Check\n"
" a: allow any Attributes of files v: View files by another utility\n"
" n: display No indicator k: Key word for AUTOLARC.BAT\n"
" t: archive's Time-stamp option\n"
"===============================================================================\n"
" You may copy or distribute without any donation to me. Nifty-Serve PFF00253\n"
" (See the User's Manual for detailed descriptions.) ASCII-pcs pcs02846";
https://www.vector.co.jp/soft/dl/dos/util/se002340.html から
ワイらみたいなガンキチは初代ガンダムのセリフの一句一句まで覚えてるんやから、
「親父にも打たれたことないのに」→「I've never even been hit by my dad.」
みたいな感じで覚えてけばええんや。
初代だけやなくて逆シャアとかも、ほぼ丸暗記しとるやろ?
→「I, Char Aznable, am going to purge it, Amuro!」
→「That's ego!」
おお、ええ感じやん!
「You know, Lara could have been the one who would have been my mother!」
これやこれ!
main( ){
}
C言語で別のプログラムを作成し、system 関数などを使って最初のプログラムを実行し、その出力を読み取って比較する方法です。
int main() {
char expected_output[] = "hello, world\n";
char actual_output[100]; // 十分なバッファサイズを確保
// hello プログラムを実行し、出力を actual_output にリダイレクト(環境依存)
// これは非常に簡略化された概念であり、実際にはパイプ処理などが必要になります
#ifdef _WIN32
sprintf(command, "hello.exe > temp_output.txt");
#else
sprintf(command, "./hello > temp_output.txt");
#endif
system(command);
FILE *fp = fopen("temp_output.txt", "r");
if (fp != NULL) {
fgets(actual_output, sizeof(actual_output), fp);
fclose(fp);
remove("temp_output.txt"); // 一時ファイルを削除
} else {
printf("エラー:一時ファイルのオープンに失敗しました\n");
return 1;
}
if (strcmp(actual_output, expected_output) == 0) {
return 0;
} else {
printf("テスト失敗: 期待された出力 '%s'、実際の出力 '%s'\n", expected_output, actual_output);
return 1;
}
}
投稿の属性(部分ツイート、読書感想文、マウント、音楽、男女分断、投資勧誘、数年前のネタの掘り返し等々)のみを表示して、実際の投稿内容本文は個人間でひっそりやりとり
やりとりを要ポイントにするとか
ああすべての文章を載せられるサイトは悪意あるコード置き場になりうる。特にrawが落とせたりすると便利すぎる。rentryとか(今はrawは単なるGETでは取ってきにくいように規制された。なんかトークンがいるみたいな)。
"たぬGきOさん".split("GO")で[たぬ, き, さん]を作ったりして難読化(splitの仕様キモすぎ)。さらにそれを16進数としてintにして、さらにその整数をcharとして表現するとコードになる。そいつで本命のコードを取ってきて(fetch)、そいつを実行
こういう疑問こそ、生成AIに回答を作ってもらうのが良いと思うよ。
Perplexity PROに聞いてみたよ。
「大学の入学定員のアファーマティブアクションとして女子枠が設定されているのは日本だけですか?海外で女子枠が一般的にある国を列挙してください。特にEU諸国での考え方が気になっています」
大学入学定員における女子枠の設定は、日本に限らず世界の多くの国で実施されています。ただし、その形態や規模は国によって異なります。以下に、女子枠が比較的一般的な国々を列挙し、特にEU諸国の状況について説明します。
1. インド
2. パキスタン
3. バングラデシュ
4. マレーシア
5. 韓国
EUでは、高等教育における性別による直接的な割当制(クオータ制)は一般的ではありません。しかし、ジェンダー平等を促進するための様々な取り組みが行われています[1][6]。
1. 法的枠組み:EUの基本条約では、男女平等の促進が重要な価値として位置づけられています[28]。
2. ポジティブ・アクション:EUは、形式的な平等だけでなく、実質的な平等の実現を目指しています。これには、一時的な特別措置(ポジティブ・アクション)の実施も含まれます[6][31]。
3. 分野別アプローチ:特に理工系(STEM分野)における女性の参画を促進するための取り組みが行われています[28]。
1. ソフトロー:法的拘束力のない指針や勧告を通じて、ジェンダー平等を推進しています[11]。
2. 財政的支援:女性の参画を促進するためのプログラムに資金を提供しています[11]。
3. データ収集と分析:European Institute for Gender Equalityなどの機関を通じて、ジェンダー平等の進捗状況を継続的に監視しています[28]。
4. 企業の取締役会におけるクオータ制:一部のEU加盟国(フランス、ドイツ、イタリアなど)では、上場企業の取締役会における女性比率の目標を設定しています[10]。
日本の大学入試における「女子枠」の設定は、EUの一般的なアプローチとは異なります。日本の取り組みは、特定の分野(主に理工系)における女性の参画を直接的に促進することを目的としています[15][18]。
一方、EUでは、教育システム全体を通じてジェンダー平等を促進する包括的なアプローチを採用しています。これには、早期教育からのステレオタイプの排除、キャリア指導の改善、ロールモデルの提示などが含まれます[28]。
結論として、大学入学定員における明示的な「女子枠」の設定は、日本を含むアジアの一部の国々でより一般的であり、EUでは直接的なクオータ制よりも、包括的かつ長期的なアプローチが採用されていると言えます。
[1] spaceshipearth.jp/affirmative-action/
[2] univ-journal.jp/column/2024249156/
[3] feminist.org/news/european-court-of-justice-strikes-down-affirmative-action-law/
[4] mainichi.jp/univ/articles/20240925/ddm/010/100/018000c
[5] note.com/yourchoice_ycp/n/n644ad1296281
[6] www.jil.go.jp/institute/zassi/backnumber/2014/07/pdf/060-069.pdf
[7] eur-lex.europa.eu/legal-content/EN/TXT/?uri=legissum%3Ac10935
[8] jbpress.ismedia.jp/articles/-/80117
[9] www.kaonavi.jp/dictionary/affirmative-action/
[10] ja.wikipedia.org/wiki/%E3%82%A2%E3%83%95%E3%82%A1%E3%83%BC%E3%83%9E%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3
[11] ehne.fr/en/encyclopedia/themes/gender-and-europe/gender-citizenship-in-europe/european-union-gender-equality-policies-1957
[12] www.keinet.ne.jp/teacher/media/guideline/backnumber/23/0203/shiten3.pdf
[13] www.gender.go.jp/kaigi/kento/positive/siryo/pdf/po02-2.pdf
[14] revistaidees.cat/en/la-unio-europea-a-lavantguarda-de-les-politiques-digualtat/?pdf=12310
[15] www.yomiuri.co.jp/kyoiku/kyoiku/daigakunyushi/20240308-OYT1T50053/
[16] waseda.repo.nii.ac.jp/record/10032/files/Honbun-7017.pdf
[17] www.nytimes.com/1997/11/12/world/european-union-court-upholds-affirmative-action-for-women.html
[18] www.nikkei.com/article/DGXZQOCD17DER0X10C24A7000000/
[19] journals.sagepub.com/doi/10.1177/00016993231163416?icid=int.sj-abstract.citing-articles.34
[20] news.tv-asahi.co.jp/news_society/articles/000341947.html
[21] www.eigo-net.jp/easy_readings/easy_readings-3403
[22] note.com/wakari_te/n/n8e298c2e524c
[23] eic.obunsha.co.jp/file/exam_info/2024/1108.pdf
[25] www.gender.go.jp/policy/positive_act/pdf/positive_action_011.pdf
[26] www.gender.go.jp/research/kenkyu/ishiki/kekka53.html
[27] corp.miidas.jp/assessment/10794/
[28] commission.europa.eu/document/download/965ed6c9-3983-4299-8581-046bf0735702_en
[29] mainichi.jp/articles/20240426/k00/00m/040/090000c
[30] www.hosei.ac.jp/diversity/publication/newsletter/vol3-1/?auth=9abbb458a78210eb174f4bdd385bcf54
[31] www.era-comm.eu/oldoku/SNLLaw/04_Positive_action/116DV06_Selanec_EN.pdf
[32] admissions.titech.ac.jp/admissions/admission/admission/international
アメリカの大学における女子枠の状況は、日本とは大きく異なります。
アメリカでは、1972年の平等機会法(Equal Opportunities Act)以降、人種間の不平等是正を目的としたアファーマティブ・アクションが実施されてきました[4]。しかし、近年では性別に基づく優遇措置に対して批判が高まっています。
1. 法的問題:性別に基づく入学枠の設定は、教育改正法第9編(タイトル・ナイン)に違反する可能性があるとして、多くの苦情が申し立てられています[3]。
2. 男性への不利益:現在の大学では、むしろ男性が不利な状況にあるという主張があります[3]。
3. 違憲判断:2023年6月、最高裁判所がハーバード大学とノースカロライナ大学のアファーマティブ・アクションを違憲と判断しました[5]。
多くの大学が、性別に基づく優遇措置を廃止する動きを見せています:
アメリカの大学、特にトップスクールでは、男女比がほぼ半々になっています。例えば、スタンフォード大学のコンピュータサイエンス専攻では、3人に1人が女子学生です[2]。
このように、アメリカでは明示的な「女子枠」ではなく、長期的かつ包括的なアプローチによってジェンダーバランスの改善を図ってきた結果、現在の状況に至っています。
[1] note.com/wakari_te/n/n8e298c2e524c
[3] forbesjapan.com/articles/detail/47454
[4] ipdi.w3.kanazawa-u.ac.jp/cdl/houkoku/doc/090317ppt.pdf
[5] x.com/LazyWorkz/status/1816616538717454751
[6] www.jstage.jst.go.jp/article/kyoiku/89/4/89_683/_pdf/-char/ja
試しに98文字の追加と3文字削除して3文字挿入、3文字削除して4文字挿入をそれぞれ10万行繰り返してみた。
ADD:1984ms
REPLACE(3 char):8942ms
自作のBPlusTreeをListとして使えるようにしたやつよりも文字数が増えるパターンでは遅い。
GapBufferくそ強い。
viviエディターの作者が提唱した局所的行更新のやり方を使うと大体の場面ではO(1)で済ませられる。
ただ、C#だとNaitiveMemoryArrayがstructとcharなど一部の型に限定されるので、クラス設計をどうするのかという問題が出てくる。
メモリーに入りきらないような巨大ファイルだとBPlusTreeに放り込んでうまいことやったほうがここら辺は楽だが、キー(テキストエディターの場合は1-64みたい範囲であることが多い)に何かしらの値を足さないといけないので、遅くなる。
https://www.geonames.org から取れる、人口500人以上の都市の名前に限定すると、
Santa Maria Magdalena Cahuacan
import logging import tempfile import zipfile from collections import Counter import httpx FILE_NAME_BASE = 'cities500' GEONAME_FIELDS = ( 'geoname_id', 'name', 'ascii_name', 'alternate_names', 'latitude', 'longitude', 'feature_class', 'feature_code', 'country_code', 'cc2', 'admin1_code', 'admin2_code', 'admin3_code', 'admin4_code', 'population', 'elevation', 'dem', 'timezone', 'modification_date', ) def retrieve_cities(): """Retrieve city names from a remote server.""" response = httpx.get(f'https://download.geonames.org/export/dump/{FILE_NAME_BASE}.zip') response.raise_for_status() tmpdir = tempfile.TemporaryDirectory() with open(tmpdir.name + f'/{FILE_NAME_BASE}.zip', 'wb') as f: f.write(response.content) with zipfile.ZipFile(tmpdir.name + f'/{FILE_NAME_BASE}.zip', 'r') as z: z.extractall(tmpdir.name) with open(tmpdir.name + f'/{FILE_NAME_BASE}.txt', 'r') as f: for line in f: yield line.split('\t') def count_characters(to_check='ascii_name', filter_func=lambda _: True): """Count characters in city names.""" cities = {} for city_fields in retrieve_cities(): city = dict(zip(GEONAME_FIELDS, city_fields)) if not filter_func(city): continue counter = Counter() for c in city[to_check]: counter[c] += 1 cities[city['geoname_id']] = {'characters': counter, 'city': city} return cities def count_chars_of_city_names(cities, char=None): """Find the city with the most occurrences of a given character.""" cities_by_char_count = {} max_count = 0 max_count_char = None for city_id, data in cities.items(): if 'characters' not in data or not data['characters']: logging.debug(f'No characters found for city {city_id}', data) continue count = 0 if char and char in data['characters']: count = data['characters'][char] cities_by_char_count.setdefault(count, []).append(data) elif char is None: most_common = data['characters'].most_common(1)[0] char, count = most_common cities_by_char_count.setdefault(count, []).append(data) if count > max_count: max_count = count max_count_char = char cities_by_char_count.setdefault(count, []).append(data) return cities_by_char_count.get(max_count, []), max_count_char def not_contain_invalid_chars(city): return ( '(' not in city.get('ascii_name', '') and '/' not in city.get('ascii_name', '') ) def main(): cities = count_characters(filter_func=not_contain_invalid_chars) for char in 'abcdefghijklmnopqrstuvwxyz': cities_counted, char = count_chars_of_city_names(cities, char) max_count = cities_counted[0]['characters'][char] print(f'The character "{char}" appears the most ({max_count} times) in the following cities:') for city in cities_counted: print("\t", city['city']['ascii_name']) if __name__ == "__main__": main()