Movatterモバイル変換


[0]ホーム

URL:


はてラボはてな匿名ダイアリー
ようこそ ゲスト さんログインユーザー登録
< anond:20251122093249 |anond:20251122094428 >

2025-11-22

ChatGPT すごい

utf8の文字コード構成されたバイナリファイルがある。このファイルの改行の数を数えよ。改行はCRのみとする。このファイルにはCR が必ず含まれており、CRで分割すればマルチスレッドで処理できる。

質問したら、c++pythonコードが出てきた

size_t count_cr_in_file(conststd::string&amp;path) {

std::ifstreamfs(path,std::ios::binary);

fs.seekg(0,std::ios::end);

size_t size =fs.tellg();

fs.seekg(0);

const size_tthread_count =std::thread::hardware_concurrency();

const size_t chunk_size = size /thread_count;

std::vector&lt;std::future&lt;size_t&gt;&gt; futures;

for (size_t t = 0; t &lt;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, &amp;path]() {

std::ifstreamfs(path,std::ios::binary);

fs.seekg(start);

size_t count = 0;

for (size_t i = start; i &lt; end; i++) {

char c;

fs.read(&amp;c, 1);

if (c == '\r') count++;

}

return count;

}));

}

size_ttotal = 0;

for (auto&amp; f : futures)total += f.get();

returntotal;

}

def count_cr(path):

importmmap

withopen(path, "rb")as f:

mm =mmap.mmap(f.fileno(), 0,access=mmap.ACCESS_READ)

returnmm.count(b'\r')

c#で書けと指示したところ、

using System;

using System.IO;

using System.IO.MemoryMappedFiles;

using System.Threading.Tasks;

class CountCR

{

public static long CountCRInFile(stringpath)

{

using varmmf = MemoryMappedFile.CreateFromFile(path, FileMode.Open, null);

using varaccessor =mmf.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read);

long fileSize =accessor.Capacity;

int processorCount = Environment.ProcessorCount;

long chunkSize = fileSize / processorCount;

longtotal = 0;

object lockObj = newobject();

Parallel.For(0, processorCount, i =&gt;

{

long start = i * chunkSize;

long end = (i == processorCount - 1) ? fileSize : (i + 1) * chunkSize;

long localCount = 0;

byte b;

for (longpos = start;pos &lt; end;pos++)

{

accessor.Read(pos,out b);

if (b == 0x0D) //CR

localCount++;

}

lock (lockObj)

{

total += localCount;

}

});

returntotal;

}

staticvoidMain(string[] args)

{

stringpath = "yourfile.bin";

long count = CountCRInFile(path);

Console.WriteLine($"CR count = {count}");

}

}

というコードが出てきた。

実際はcrlf,lfもあり得るんだが、そこは考慮しなくてもよく、そう考えるとaiはすごいとしか言いようがない。

なお、utf8として成立する単位区切りつつ改行を数える場合、もう一工夫いる。

SJISもできるようにするともっと面倒なことになりそう…)

Permalink |記事への反応(2) | 09:50

このエントリーをはてなブックマークに追加ツイートシェア

記事への反応 -
  • 大体動くけどなぜかときどき間違えるんだよね・・・

  • これらのコードの元ネタがwebにあるはずなので出せ。 と質問とした所、 いい質問。ただ、**今回私が提示した C# コード(MemoryMappedFile + Parallel.For で CR を数える)**には、明確に一つ...

    • なお、最近のaiは元ネタをそのままパクるのは良くないと学習したのか。どうしてそういうことができるのか聞いたところ、 率直に答えます。 --- # 🎯 **なぜ「元ネタを探す」依頼...

      • で?

      • このAI、「きゅむむ。きゅむきゅむ」の意味も答えられないのに、こういうことはある程度答えられるんだな。 ※「きゅむむ。きゅむきゅむ」はネットでも使用例がなく、あったとして...

記事への反応(ブックマークコメント)

全てのコメントを見る

人気エントリ

注目エントリ

ログインユーザー登録
ようこそ ゲスト さん
Copyright (C) 2001-2025 hatena. All Rights Reserved.

[8]ページ先頭

©2009-2025 Movatter.jp