X



プログラミングのお題スレ Part15

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2019/07/28(日) 19:39:57.54ID:832c/ukY
プログラミングのお題スレです。

【出題と回答例】
1 名前:デフォルトの名無しさん
  お題:お題本文

2 名前:デフォルトの名無しさん
  >>1 使用言語
  回答本文
  結果がある場合はそれも

【ソースコードが長くなったら】 (オンラインでコードを実行できる)
https://ideone.com/
http://codepad.org/
http://compileonline.com/
http://rextester.com/runcode
https://runnable.com/
https://code.hackerearth.com/
http://melpon.org/wandbox
https://paiza.io/

宿題は宿題スレがあるのでそちらへ。

※前スレ
プログラミングのお題スレ Part14
http://mevius.5ch.net/test/read.cgi/tech/1558168409/
0563蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/22(日) 23:00:26.05ID:rZK31NHQ
>>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;
}
0564蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/22(日) 23:03:43.50ID:rZK31NHQ
>>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;
}
0566デフォルトの名無しさん
垢版 |
2019/09/22(日) 23:25:59.86ID:35++XhB6
>>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' "
0567デフォルトの名無しさん
垢版 |
2019/09/22(日) 23:32:48.92ID:Yf8464Y3
>>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;
 }
}
0568蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/23(月) 00:23:07.10ID:JAc5gnVl
>>548
出題の狙い。犯罪捜査において被疑者または関係者の生活パターンを知りたいときに、パソコンのファイルの日時の統計のデジタル鑑識により、パソコンの使用実態が類推可能であることを示すものである。
0569デフォルトの名無しさん
垢版 |
2019/09/23(月) 00:28:46.25ID:GyCF+Do4
出勤とか寝る時間があまり変わらないという仮定で
同一人物の疑いがある2つのコテハンを
数百スレ分から時間別書き込み頻度から検証したことがあるが
それにくらべると得られる情報少なすぎて草
0571デフォルトの名無しさん
垢版 |
2019/09/23(月) 01:01:29.40ID:ZSRjXCoe
>>568
朝と夜に作ったファイルの平均は昼になるし
ダウンロードした大規模なOSSのアーカイブを展開した物とか入っているんで
曜日ごとの平均時刻じゃー何の傾向も分かりません
0572デフォルトの名無しさん
垢版 |
2019/09/23(月) 01:43:06.73ID:ZSRjXCoe
>>567
そうじゃねぇだろ、file systemのmtimeはUTCベースなのに
わざわざlocaltimeでTZ=JST_9の日時に変換してから
時分秒だけTime::Pieceに食べさせるから
GMTとして解釈され9時間ずれたんだよ。
それを回避するためTZ環境変数にUTCを設定するとは
何たる尻の青い、くちばしの黄色い、まだ駆け出しの青二才、未熟者
0573デフォルトの名無しさん
垢版 |
2019/09/23(月) 04:00:12.20ID:Sp7ybd6s
>>559 Common Lisp
https://ideone.com/idfFJM (sbcl)
https://ideone.com/8G7hUD (clisp)

ideoneは、sbclの場合は compile-file で作成したファイルを実行しているらしく
結果が異なっているのはそのため
0576デフォルトの名無しさん
垢版 |
2019/09/23(月) 13:54:34.61ID:2RLjyW/B
>>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
0579デフォルトの名無しさん
垢版 |
2019/09/27(金) 02:50:14.35ID:/3CUbuCi
>>550
シェルスクリプト (find, touch コマンド使用)

2019/09/27 02:48:00 に合わせる場合

#!/bin/sh
find あるフォルダ -type f -exec touch -t 201909270248.00 {} \;
0580デフォルトの名無しさん
垢版 |
2019/09/27(金) 19:49:32.99ID:jf7tgLq0
>>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}
0581デフォルトの名無しさん
垢版 |
2019/09/27(金) 19:57:07.16ID:jf7tgLq0
>>580をコピペで実行するときは、`の後の半角空白を削除しないとエラーになる。
0584デフォルトの名無しさん
垢版 |
2019/09/27(金) 23:07:29.28ID:Z4UqEtTG
>>582 javascript
[...new Set([3, 1, 4, 1, 5])].sort().reverse()
0586デフォルトの名無しさん
垢版 |
2019/09/28(土) 00:23:41.09ID:gcUBCYXO
>>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
0587デフォルトの名無しさん
垢版 |
2019/09/28(土) 00:52:45.19ID:HcOq9X6n
>>568
それだったら曜日毎の1時間毎のファイル数でグラフにするとかしないと分かりづらいのではないか?

ああ。そういうお題作ればいいか。
0588デフォルトの名無しさん
垢版 |
2019/09/28(土) 01:09:55.39ID:HcOq9X6n
お題: 指定のディレクトリ以下にある全てのファイルの更新日時を取得し、曜日毎、及び時間毎にしてグラフにして出せ。

これは同じ曜日の同じ時間で更新されているファイルのカウントということね。例えば今週と先週の土曜日の7:00代の更新ファイルが一つづつあれば土曜日7時代のカウントが2になる。
で、グラフにする時は表示方法はなんでもいいので例えばテキストでアスタリスク2個で出す。(後でこちらでもプログラム作るのでそれ参考にしてもいい)。
ディレクトリの指定方法は普通なら引数での指定が良いだろうけどプログラムに埋め込んでも標準入力やファイルから読み込んでも何でもいい。それはこのお題では肝心な事ではないので。
0589デフォルトの名無しさん
垢版 |
2019/09/28(土) 02:06:50.36ID:63IK4172
それだったらファイル、ディレクトリ操作は除外してランダムに日時発生させるとかでいいだろ
機種依存するので
ランダム生成は依存しない
0592デフォルトの名無しさん
垢版 |
2019/09/28(土) 03:10:19.21ID:63IK4172
unixタイムとかで、日時と整数は一対一対応してるだろ
ランダム生成で日時は作れる
0593デフォルトの名無しさん
垢版 |
2019/09/28(土) 03:15:41.26ID:HcOq9X6n
>>592
いや、そうじゃなくて >>589 は何番のレスに対するレスなの?
0594デフォルトの名無しさん
垢版 |
2019/09/28(土) 03:30:16.66ID:63IK4172
何番と限らず日時と整数は一対一できるから日時が関係するあらゆる問題
0595デフォルトの名無しさん
垢版 |
2019/09/28(土) 03:58:16.37ID:HcOq9X6n
>>594
いや、 >>589 は何かを読んだ結果書いたんでしょ? 何を読んで書いたの?
0597デフォルトの名無しさん
垢版 |
2019/09/28(土) 10:58:14.32ID:bVbqLRNA
>>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
0598デフォルトの名無しさん
垢版 |
2019/09/28(土) 15:09:30.05ID:E6lKnilk
C++標準のファイルシステムでは、パスは取れるが、時間を取得する関数がないっぽい。
0602デフォルトの名無しさん
垢版 |
2019/09/28(土) 21:56:43.99ID:yaf8uxdw
>>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 + "|"
}
0603蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/29(日) 02:59:00.33ID:8mEp/ii8
お題: 地球上の2地点を緯度・経度で指定すると、(球面上の)直線距離を求めてくれるプログラム。

地球がほぼ球体であることを仮定してもよい。
0604蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/29(日) 03:04:31.30ID:8mEp/ii8
ロンドンからニューヨーク。
北京から台湾。
ニュージーランドからトルコ。
0606蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/29(日) 03:55:31.74ID:8mEp/ii8
ヒント: 度をラジアンに変換。dの公式に代入する。緯度経度はグーグル マップで調べる。コサインの逆関数はアークコサイン。
0607デフォルトの名無しさん
垢版 |
2019/09/29(日) 09:16:55.67ID:GG+B8frl
数学の問題どすな

地球半径を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を掛けたモノが答え
0608デフォルトの名無しさん
垢版 |
2019/09/29(日) 09:23:23.08ID:GG+B8frl
ちょい間違った
(0,R,0)は東経90度の赤道上の太平洋上の地点で
スリランカ・コロンボから約1360kmの地点
(-R,0,0)がナウル島から1450kmの地点
(0,-R,0)はガラパゴス諸島から20〜25km程度の
太平洋上の地点
0612デフォルトの名無しさん
垢版 |
2019/09/29(日) 12:00:03.35ID:bEy1wMJX
>>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
0614デフォルトの名無しさん
垢版 |
2019/09/29(日) 12:33:05.14ID:mYJaebwB
>>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
0616デフォルトの名無しさん
垢版 |
2019/09/29(日) 19:44:37.93ID:aa2vZ2v/
お題:8queenで面白いパターンを見つけよ。
0617デフォルトの名無しさん
垢版 |
2019/09/29(日) 23:06:17.59ID:OI4EUI6E
お題:もっと面白いお題を考えよ。
0620蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/30(月) 02:22:51.44ID:i5LhrskR
お題: サイズ15x15の空白マス('_')がある。黒マス('#')をいくつかランダムに置いて、空白マスが縦または横向きに5マス連続に並ばないようにしたい。ただし、
1. なるべく早く黒マスを配置せよ。
2. 実行のたびに常にランダムにまんべんなく配置せよ。
3. 黒マスが縦または横に隣り合ってはいけない。
4. (ア)全て並べる、そして(イ)並びが正しいか検証する、の(ア)と(イ)を15回繰り返してかかる時間を実測せよ。
0621デフォルトの名無しさん
垢版 |
2019/09/30(月) 09:19:26.74ID:eZfyppwl
>>617
考えた。

でもこれは発表しない。誰にも教えない。墓まで持っていく。
0623デフォルトの名無しさん
垢版 |
2019/09/30(月) 16:46:23.79ID:ypiuCBLp
>>620
https://ideone.com/FggLLg
C++。ふえ〜。円の当たり判定しようと思ったのに、うごかないよ〜。
コード間違ってるのか、数学ぶっ壊れたのかわからん。
デバッグしてくれる人募集。

コード間違ってるんやったら、俺の認識限界がおかしいな。
0628デフォルトの名無しさん
垢版 |
2019/09/30(月) 20:18:42.58ID:H9c5jpU6
>>620
なるほど
コレだな

黒マスルール - Wikipedia
https://ja.wikipedia.org/wiki/%E9%BB%92%E3%83%9E%E3%82%B9%E3%83%AB%E3%83%BC%E3%83%AB

http://ja-kouka.shinobi.or.jp/wp/wp-content/uploads/2018/07/1b6137e740902d821bd7f9678b59d7d2.jpg

出来上がった白黒の升目に上手いこと単語を置くとクロスワードパズルになる
「縦または横向きに5マス連続に並ばない」は「縦または横向きに4マスまで連続に並んでもいい」だ
そこにさらに追加ルールを仕込むとクロスワードパズルの枠が出来上がる
0629デフォルトの名無しさん
垢版 |
2019/10/01(火) 07:35:49.09ID:NlppalS8
お題

言語限定(コマンドプロンプト・パワーシェル・bash/csh等のUNIXシェル)

10000までの素数を列挙して出力

当然だが、スクリプト言語処理系やコンパイラに丸投げさせるのは禁止
というか、技量の程度が疑わてしまうのでお勧めしない
0631デフォルトの名無しさん
垢版 |
2019/10/01(火) 08:35:57.10ID:NlppalS8
プログラミング言語なんて、禁止の塊で出来たものなんで
「禁止の所産」って奴な
0632デフォルトの名無しさん
垢版 |
2019/10/01(火) 08:56:55.24ID:H2UNgdyX
>>629
シェルスクリプトスレ池
0635デフォルトの名無しさん
垢版 |
2019/10/01(火) 09:21:08.21ID:R4cuDBX/
遅くまともな言語ではないやつで、どうにかして動くのを作れというお題なんだろ
まともな言語使用してしまえばお題からずれてるかと
0636デフォルトの名無しさん
垢版 |
2019/10/01(火) 09:53:39.77ID:PlApYvsP
配列使えるシェルもあるからそういうの使えば楽かも
shでもsetすりゃ配列だが

まあでも遅そうで実用性なさげ
0638629
垢版 |
2019/10/01(火) 13:54:46.98ID:NlppalS8
>>637
スゴイw
やれば出来るものですね。
10000を超えても出力し続けてますw
0639デフォルトの名無しさん
垢版 |
2019/10/01(火) 14:02:08.82ID:ygg8X6aa
あ、10000までの制限がないww
limit=100までにしてるから10000以降に出た数値は信頼性ないwww

修正したものを実行して確認中…10000で止まったらUPる…遅い(´・ω・`)
0641デフォルトの名無しさん
垢版 |
2019/10/01(火) 15:07:38.24ID:ygg8X6aa
まあまだ 49(7*7) 289(17*17) 961(31*31) 2209(47*47) 3721(61*61) 6241(79*79)を出力するバグがあったわけだがw
0643デフォルトの名無しさん
垢版 |
2019/10/01(火) 16:30:10.47ID:7XyHUR/V
シェルスクリプトでチョコチョコと何かやる分には良いが、プログラムを書くというのとは違うだろ。
プログラムはそれなりのものた^_^書いた方が効率的。

どっちからでも起動できるんだから餅は餅屋。
0644デフォルトの名無しさん
垢版 |
2019/10/01(火) 16:32:34.41ID:9fvqkmcJ
^_^;
0646デフォルトの名無しさん
垢版 |
2019/10/01(火) 21:04:23.70ID:rsBZCnlu
>>629
遅くても構わなければ、PowerShellではとても簡潔に書ける。

$p = 2..10000
while ($p) {
  $p[0]
  $p = @($p |? {$_ % $p[0]})
}
0647デフォルトの名無しさん
垢版 |
2019/10/01(火) 21:59:35.52ID:Ueonb/Q5
誰が遅くても構わないと言った
0650デフォルトの名無しさん
垢版 |
2019/10/01(火) 22:21:18.49ID:H9NeHROf
>>648
ジェネリックに書くとして、ハッシュ関数はどうやって書けばいいんだ?
std::vector<std::list<T>>> HashMap;
っていう感じのことはできそうではあるけどな。
0651デフォルトの名無しさん
垢版 |
2019/10/02(水) 07:55:46.84ID:YpMEiTCH
# 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
0652デフォルトの名無しさん
垢版 |
2019/10/02(水) 12:25:17.61ID:56vpBHGI
それは実装ではない。
0653デフォルトの名無しさん
垢版 |
2019/10/02(水) 13:20:24.28ID:+RotAwEg
>>648
このスレの住民のレベルに合っていてかつプログラマにとって必要不可欠な知識なので良いお題
0654デフォルトの名無しさん
垢版 |
2019/10/02(水) 13:31:58.92ID:vkK/4cs1
実装って何を言ってるのかな? コンパイラを作れってこと? それとも基本関数を使ってそれらしいハッシュマップを作れという事?
実装されている言語にさらに実装しろって意味不明。
0657デフォルトの名無しさん
垢版 |
2019/10/02(水) 15:31:03.84ID:vkK/4cs1
言わんとすることは何となくわかるんだが、多分ジェネリックが有る言語なら比較的考えやすいがジェネリックがない言語ではどう解釈するのかな。
0658蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/10/02(水) 16:28:04.58ID:Q9AIQiw1
お題:文字列操作の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
0659デフォルトの名無しさん
垢版 |
2019/10/02(水) 19:48:30.85ID:By3xLmz3
ここの回答に使われる言語でハッシュマップ自分で実装せなあかん言語なんて少ないと思うが?
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況