プログラミングのお題スレ Part15
■ このスレッドは過去ログ倉庫に格納されています
蟻人間、プログラミングに興味を持ち始めた中学生臭がすごい >>559
はいはい、模範解答出せばいいんでしょ?
// C++/Win32
#include <windows.h>
#include <stdio.h>
int main(void)
{
char buf[MAX_PATH];
GetModuleFileNameA(NULL, buf, MAX_PATH);
WIN32_FIND_DATAA find;
HANDLE hFind = FindFirstFileA(buf, &find);
printf("%ld bytes", find.nFileSizeLow);
FindClose(hFind);
return 0;
} >>559 別解ね。
/* C */
#include <stdio.h>
int main(int argc, char **argv)
{
FILE *fp = fopen(argv[0], "rb");
fseek(fp, 0, SEEK_END);
printf("%ld bytes\n", ftell(fp));
fclose(fp);
return 0;
} >>559 Perl5
print -s $0, "bytes\n";
実行
~ $ perl 15_559.pl
25bytes >>514 Pharo/Squeak Smalltalk
| suffixes fn |
suffixes := #(st nd rd), (Array new: 7 withAll: #th).
suffixes := (0 to: 9) gather: [:idx | suffixes].
suffixes from: 11 to: 13 put: #th.
fn := [:n | n asString, (suffixes atWrap: n)].
fn value: 1. "=> '1st' "
fn value: 23. "=> '23rd' "
fn value: 12. "=> '12th' " >>560 修正、0割回避、localtimeが返すepochのmtimeはUTCベースなのでTZ設定追加し9時間ずれ対策
$ENV{TZ} = 'UTC';
use File::Find 'find';
use Time::Piece;
sub hier {
my $mtime = (lstat)[9];
push @epochs, $mtime if -f _;
}
find({wanted => \&hier}, "$ENV{USERPROFILE}/My Documents");
print "Number of files = " . @epochs . "\n";
@w = ([],[],[],[],[],[],[]);
for (@epochs) {
($sec, $min, $hour, $wday) = (localtime $_)[0..2,6];
push @{$w[$wday]}, 3600*$hour + 60*$min + sec;
}
use List::Util 'sum';
@dw = qw(日 月 火 水 木 金 土);
for (0..6) {
$n = @{$w[$_]};
if ($n) {
$mean = sum(@{$w[$_]}) / $n;
$s = Time::Piece->new($mean);
printf "$dw[$_](%4d): %s\n", $n, $s->hms;
}
} >>548
出題の狙い。犯罪捜査において被疑者または関係者の生活パターンを知りたいときに、パソコンのファイルの日時の統計のデジタル鑑識により、パソコンの使用実態が類推可能であることを示すものである。 出勤とか寝る時間があまり変わらないという仮定で
同一人物の疑いがある2つのコテハンを
数百スレ分から時間別書き込み頻度から検証したことがあるが
それにくらべると得られる情報少なすぎて草 >>568
朝と夜に作ったファイルの平均は昼になるし
ダウンロードした大規模なOSSのアーカイブを展開した物とか入っているんで
曜日ごとの平均時刻じゃー何の傾向も分かりません >>567
そうじゃねぇだろ、file systemのmtimeはUTCベースなのに
わざわざlocaltimeでTZ=JST_9の日時に変換してから
時分秒だけTime::Pieceに食べさせるから
GMTとして解釈され9時間ずれたんだよ。
それを回避するためTZ環境変数にUTCを設定するとは
何たる尻の青い、くちばしの黄色い、まだ駆け出しの青二才、未熟者 >>559 Common Lisp
https://ideone.com/idfFJM (sbcl)
https://ideone.com/8G7hUD (clisp)
ideoneは、sbclの場合は compile-file で作成したファイルを実行しているらしく
結果が異なっているのはそのため >>504 Lua
a={}
for x in io.lines() do a[x]=(a[x] or 0)+1 end
for k,v in pairs(a) do print(k,v) end >>550
シェルスクリプト (find, touch コマンド使用)
2019/09/27 02:48:00 に合わせる場合
#!/bin/sh
find あるフォルダ -type f -exec touch -t 201909270248.00 {} \; >>548
Powershell
ls ([Environment]::GetFolderPath(5)) -Recurse -Force |? {!$_.PSIsContainer} `
|% {$_.LastWriteTime} | sort {[int]$_.DayOfWeek} | group {"{0:ddd}" -f $_} `
|% {"{0}{1,10:T}" -f $_.Name, [DateTime][Int64]($_.Group |% {$_.TimeOfDay.Ticks} | measure -Average).Average} >>580をコピペで実行するときは、`の後の半角空白を削除しないとエラーになる。 >>582 Ruby
p [3, 1, 4, 1, 5].uniq.sort_by(&:-@)
# => [5, 4, 3, 1] >>582 javascript
[...new Set([3, 1, 4, 1, 5])].sort().reverse() >>582 Pharo/Squeak Smalltalk
#(3 1 4 1 5) asSet sorted: #> "=> #(5 4 3 1) " >>582 Perl5 二回答
%h = map{$_=>1} qw(3 1 4 1 5);
@a = sort{$b<=>$a} keys %h;
print "@a\n";
use List::Util 1.45 'uniq';
@a = uniq sort{$b<=>$a} qw(3 1 4 1 5);
print "@a\n"
実行結果、いずれも
~ $ perl 15_582.pl
5 4 3 1 >>568
それだったら曜日毎の1時間毎のファイル数でグラフにするとかしないと分かりづらいのではないか?
ああ。そういうお題作ればいいか。 お題: 指定のディレクトリ以下にある全てのファイルの更新日時を取得し、曜日毎、及び時間毎にしてグラフにして出せ。
これは同じ曜日の同じ時間で更新されているファイルのカウントということね。例えば今週と先週の土曜日の7:00代の更新ファイルが一つづつあれば土曜日7時代のカウントが2になる。
で、グラフにする時は表示方法はなんでもいいので例えばテキストでアスタリスク2個で出す。(後でこちらでもプログラム作るのでそれ参考にしてもいい)。
ディレクトリの指定方法は普通なら引数での指定が良いだろうけどプログラムに埋め込んでも標準入力やファイルから読み込んでも何でもいい。それはこのお題では肝心な事ではないので。 それだったらファイル、ディレクトリ操作は除外してランダムに日時発生させるとかでいいだろ
機種依存するので
ランダム生成は依存しない unixタイムとかで、日時と整数は一対一対応してるだろ
ランダム生成で日時は作れる >>592
いや、そうじゃなくて >>589 は何番のレスに対するレスなの? 何番と限らず日時と整数は一対一できるから日時が関係するあらゆる問題 >>594
いや、 >>589 は何かを読んだ結果書いたんでしょ? 何を読んで書いたの? >>582
@Mathematica
deleteDuplicatesSort[lst_] := lst //
DeleteDuplicates //
Sort[#, Greater] & ;
In[1] := deleteDuplicatesSort[{3, 1, 4, 1, 5}]
Out[1] = {5, 4, 3, 1}
# Mathematica のカーネルがいつの間にか無償開放されてた!
#
# 「「Mathematica」や“Wolfram|Alpha”の核「Wolfram Engine」が開発者向けに無償開放」
# https://forest.watch.impress.co.jp/docs/news/1186454.html C++標準のファイルシステムでは、パスは取れるが、時間を取得する関数がないっぽい。 あぁ、あったわ。C++17で入ったからまだ不明瞭だ。自分にとって。 >>548
https://ideone.com/AWfTOd
C++。マイドキュメントの列挙だけで力尽きた。ぐはぁ・・・。 >>588
PowerShell
$path = [Environment]::GetFolderPath(5)
$all = ls $path -Recurse |? {!$_.PSIsContainer} |% {$_.LastWriteTime}
$max = [Math]::Max(10, ($all | group DayOfWeek, Hour | measure Count -Max).Maximum)
"時" + (("日月火水木金土" -split "") -join "|".PadRight(9))
"--+" + ("-" * 10 + "+") * 7
$y = $all | group Hour -AsHashTable
0..23 |% {
if ($y[$_]) {
$x = $y[$_] | group {[int]$_.DayOfWeek} -AsHashTable
} else {
$x = @()
}
$line = "{0,2}" -f $_
0..6 |% {
$n = ($x[$_].Count * 10 + [int]$max / 2 - 1) / $max
$line += "|" + ("*" * $n).PadRight(10)
}
$line + "|"
} お題: 地球上の2地点を緯度・経度で指定すると、(球面上の)直線距離を求めてくれるプログラム。
地球がほぼ球体であることを仮定してもよい。 ロンドンからニューヨーク。
北京から台湾。
ニュージーランドからトルコ。 ヒント: 度をラジアンに変換。dの公式に代入する。緯度経度はグーグル マップで調べる。コサインの逆関数はアークコサイン。 数学の問題どすな
地球半径をR、緯度をΦ、経度をΘとすると
地表上の点Pの座標(x,y,z)は
(x,y,z)=R(cosΦcosΘ,cosΦsinΘ,sinΦ)
(R,0,0)は赤道上の東(西)経0度の地点
(ギニア湾 ガーナ アクラ沖約600km)
(0,R,0)も赤道上の東(西)経180度の地点
(太平洋 ナウル島から約1450km)
二地点の座標をベクトルに見立て
内積をR^2で割って逆余弦関数に
与えた結果にRを掛けたモノが答え ちょい間違った
(0,R,0)は東経90度の赤道上の太平洋上の地点で
スリランカ・コロンボから約1360kmの地点
(-R,0,0)がナウル島から1450kmの地点
(0,-R,0)はガラパゴス諸島から20〜25km程度の
太平洋上の地点 仮定してもよい なんだから球に近似しないで書けばいい話じゃね? >>603 大円距離の問題なんだから、距離が一番短くなる2点間の長さとすべき、
great-circular distance
>>605 の数値を使い
地球の半径を 6378.137 km
2点の緯度経度
139.74477,35.6544 ,
39.8261, 21.4225
Python
https://ideone.com/qp1Fer
答え 9,491.28 km >>603-6
use Math::Trig qw{deg2rad acos};
($lat1, $long1) = map{deg2rad $_} (51.507448,-0.1287243); # ロンドン ウエストミンスター チャールズ1世騎馬像
($lat2, $long2) = map{deg2rad $_} (40.712775,-74.005973); # ニューヨークCity Park Hall(市庁舎)
$theta = $long1 - $long2;
$dist = sin($lat1) * sin($lat2) + cos($lat1) * cos($lat2) * cos($theta);
$dist = 6378.137 * acos($dist);
printf "%.2f[Km]\n", $dist;
実行結果
~ $ perl 15_604.pl
5576.40[Km]
cf.)
https://www.geodatasource.com/developers/perl >>614 アンカーしくった
>>603-606 だた…orz お題: サイズ15x15の空白マス('_')がある。黒マス('#')をいくつかランダムに置いて、空白マスが縦または横向きに5マス連続に並ばないようにしたい。ただし、
1. なるべく早く黒マスを配置せよ。
2. 実行のたびに常にランダムにまんべんなく配置せよ。
3. 黒マスが縦または横に隣り合ってはいけない。
4. (ア)全て並べる、そして(イ)並びが正しいか検証する、の(ア)と(イ)を15回繰り返してかかる時間を実測せよ。 >>617
考えた。
でもこれは発表しない。誰にも教えない。墓まで持っていく。 >>620
https://ideone.com/FggLLg
C++。ふえ〜。円の当たり判定しようと思ったのに、うごかないよ〜。
コード間違ってるのか、数学ぶっ壊れたのかわからん。
デバッグしてくれる人募集。
コード間違ってるんやったら、俺の認識限界がおかしいな。 >>623
https://ideone.com/Q1X602
C++。代替え案。実行ごとにパターンが変わって敷き詰めた一例。
変わってないと思うなら0点のパターンを見てみよう。 お題
言語限定(コマンドプロンプト・パワーシェル・bash/csh等のUNIXシェル)
10000までの素数を列挙して出力
当然だが、スクリプト言語処理系やコンパイラに丸投げさせるのは禁止
というか、技量の程度が疑わてしまうのでお勧めしない 「○○は禁止」系のお題はろくなのがないから禁止した方がいい プログラミング言語なんて、禁止の塊で出来たものなんで
「禁止の所産」って奴な >>629
C で書いておけば許されるかんじがする
https://pastebin.com/pHNKfcun
実行
https://i.imgur.com/f62qe9L.jpg
最大の素数の幅を見てからきちんと整列される
~/bin/is_prime.exe 50900 60000
50909 50923 50929 50951 50957 50969 50971 50989 50993 51001
51031 51043 51047 51059 51061 51071 51109 51131 51133 51137 >>629 Linux
$ primes 2 10001
2
3
...
9967
9973 遅くまともな言語ではないやつで、どうにかして動くのを作れというお題なんだろ
まともな言語使用してしまえばお題からずれてるかと 配列使えるシェルもあるからそういうの使えば楽かも
shでもsetすりゃ配列だが
まあでも遅そうで実用性なさげ >>629 コマンドプロンプト(Windows)
https://ideone.com/aeDkD1
おそい…コマンドプロンプトよーわからんですよ >>637
スゴイw
やれば出来るものですね。
10000を超えても出力し続けてますw あ、10000までの制限がないww
limit=100までにしてるから10000以降に出た数値は信頼性ないwww
修正したものを実行して確認中…10000で止まったらUPる…遅い(´・ω・`) >>629 コマンドプロンプト (>>637の修正版)
https://ideone.com/5keIkO
637は書いてたはずのecho 2も消えてた(´・ω・`) まあまだ 49(7*7) 289(17*17) 961(31*31) 2209(47*47) 3721(61*61) 6241(79*79)を出力するバグがあったわけだがw シェルスクリプトでチョコチョコと何かやる分には良いが、プログラムを書くというのとは違うだろ。
プログラムはそれなりのものた^_^書いた方が効率的。
どっちからでも起動できるんだから餅は餅屋。 >>629
遅くても構わなければ、PowerShellではとても簡潔に書ける。
$p = 2..10000
while ($p) {
$p[0]
$p = @($p |? {$_ % $p[0]})
} >>648
ジェネリックに書くとして、ハッシュ関数はどうやって書けばいいんだ?
std::vector<std::list<T>>> HashMap;
っていう感じのことはできそうではあるけどな。 # Java
HashMap<String, Integer> shop = new HashMap<String, Integer>();
shop.put("apple", 100);
shop.put("banana", 125);
System.out.println(shop.get("banana")); //=> 125
# Python
shop = { 'apple':100 , 'banana':125 }
print(shop['banana'])
# 125 >>648
このスレの住民のレベルに合っていてかつプログラマにとって必要不可欠な知識なので良いお題 実装って何を言ってるのかな? コンパイラを作れってこと? それとも基本関数を使ってそれらしいハッシュマップを作れという事?
実装されている言語にさらに実装しろって意味不明。 ハッシュマップのアルゴリズム部分を自分で書けってことだろ
アスペかよ 言わんとすることは何となくわかるんだが、多分ジェネリックが有る言語なら比較的考えやすいがジェネリックがない言語ではどう解釈するのかな。 お題:文字列操作のUndo/Redoを実装せよ。
文字列Sに対し
(a) 文字位置indexからcount文字を別の文字列strで置き換える(replace)、
(b) 文字位置indexからcount文字を削除する(erase)、
(c) 文字位置indexに別の文字列strを挿入する(insert)
という操作が連続的に可能であるとき、これらの操作に対するUndo/Redo(元に戻す/やり直す)を実装せよ。
ただし操作対象の文字列Sが長いときにメモリーを無駄にする実装にしてはいけない。
解答例:
Undo/Redo framework for C++11
https://github.com/katahiromz/UndoSystem ここの回答に使われる言語でハッシュマップ自分で実装せなあかん言語なんて少ないと思うが? ジェネリックなハッシュ関数の書き方が解らない。Orz ■ このスレッドは過去ログ倉庫に格納されています