X



プログラミングのお題スレ Part11
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2018/04/24(火) 20:45:14.49ID:ZY7R7Sru
プログラミングのお題スレです。

前スレ
プログラミングのお題スレ Part10
https://mevius.5ch.net/test/read.cgi/tech/1514772904/

【出題と回答例】
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/

宿題は宿題スレがあるのでそちらへ。
0004デフォルトの名無しさん
垢版 |
2018/04/24(火) 21:57:24.56ID:+2ez/H34
出題に際しては
- お題の意図を汲みやすい入出力例も示す
- 事前に自分でもコードを書いてみる
0007デフォルトの名無しさん
垢版 |
2018/04/24(火) 23:28:41.47ID:b5LehDYo
>>6
過去ログから持ってきた訳じゃないんだけど、こういうお題を考えた

平面座標aとbが入力されます。bから見てaがおおよそ何時の方角にあるか時刻で出力してください。
例えば座標の方角が2時と3時の中間だった場合は両方の時刻を同時に出力してください。
座標が重なった場合は0時と出力してください。方角の精度は時刻み、分刻みから選択自由とします。

でも何か既視感あるんだよな
過去ログに似たようなお題があったかもしれない
0009デフォルトの名無しさん
垢版 |
2018/04/25(水) 01:02:21.48ID:Xk9Nens/
数学じゃん。
紙と鉛筆で解いて算出は電卓でやれ。
プログラムでやっても電卓でできる程度のことしかしないじゃん。
0010デフォルトの名無しさん
垢版 |
2018/04/25(水) 04:59:23.37ID:uzp6LfsA
>>7 Squeak Smalltalk

| fn |
fn := [:a :b | (a - b) theta negated / (2 * Float pi) * 12 + 3 \\ 12].

fn value: 6@12 value: 6@6. "=> 0.0 "
fn value: 6+(2*3 sqrt)@12 value: 6@6. "=> 1.0 "
fn value: 6-(2*3 sqrt)@12 value: 6@6. "=> 11.0 "
fn value: 12@6 value: 6@6. "=> 3.0 "
fn value: 6@0 value: 6@6. "=> 6.0 "
fn value: 0@6 value: 6@6. "=> 9.0 "
fn value: 6@6 value: 6@6. "=> 0.0 "
0011デフォルトの名無しさん
垢版 |
2018/04/25(水) 07:24:05.48ID:OIcVuxa9
過去ログから、さすがにこれはプログラミングの問題でしょ

お題:
下図のように山の麓(標高0)の両側にいるA君B君が頂上(標高10)を目指して同時に出発する
ただし、A君B君のいる位置の標高はどの時刻でも等しくなるように登らなければならない
(下図でA君が標高7の峠から標高3の谷へ下るときにはB君は来た道を引き返す必要がある)
標高1だけ上るor下るのに1時間かかるとして頂上まで最短で何時間かかるか求めよ

            10
       7   /\
     /\/3   \
A 0/            \0 B

山の形状は以下のような文字列で表現する
1)文字列の先頭と末尾はA君B君のスタート地点(標高0)を表し、必ず'0'である
2)ゴールの頂上(標高10)の位置は':'で表す(文字コードがちょうど':'='0'+10なので)
3)途中の峠と谷の標高を'1'〜'9'で表す(上図の山の形状は"073:0"と表される)
4)途中の峠と谷は交互に現れるようにする(例えば"037:0"は無し)

テスト例
"073:0" -> 18
"07362:450" -> 36
"06464:36470" -> 42
"0827171:28480" -> 66
"0737491:28180" -> 146
"05374734372747484:184618186912120" -> ?
0014デフォルトの名無しさん
垢版 |
2018/04/25(水) 08:57:14.64ID:s6Mh195j
スレの宿題のをやってみた (規制対象なのでurlに全角スペースいれてます)
https://bi t.ly/2FdJBkh
以下のルール
全員が以下のルールを守って空席に決められた順に座るものとする
・全員の数字と着席順は皆が知っている
・スコアは上下左右の2〜4セルの数値の合計
・必ず空席のうちの最大のスコアになる席に座る
・最大のスコアの席が複数ある場合はどこに座っても良い
・「最大のスコアの席」とは、以降の人のルールに適う選択を考慮した上で決定される
(現在スコア5の2つの空席A, B があったとして、全員がルール通り座った結果Aが8、Bが7に
 なる場合はAを選択しなくてはならない)
座席
〇〇5
〇9〇
12〇
に対して、
番号 3、4、6、77、8 がこの順でルール通り座ろうとすると下記の結果になった。
座る順の早い4番が77の隣に行けず6番に負けてしまうとかちょっとおもしろい

77 3 5
6 9 4
1 2 8
0015デフォルトの名無しさん
垢版 |
2018/04/25(水) 09:00:27.95ID:s6Mh195j
>スレの宿題のを
「前スレの宿題の」と書こうとしてミスしました。
実際のとこ宿題なのかどうかは知らないけど。
0017デフォルトの名無しさん
垢版 |
2018/04/25(水) 10:26:52.48ID:tAxnUvIH
>>11
テスト例の最初のやつはなぜ18になるのか?7+3+7=17ではないのか?
0018デフォルトの名無しさん
垢版 |
2018/04/25(水) 10:28:30.47ID:tAxnUvIH
あ、ごめん。寝ぼけてた。すまん。
0022デフォルトの名無しさん
垢版 |
2018/04/25(水) 12:51:35.60ID:/CvNfD/i
>>11 の参考として戻る必要があるケースの例
05131:4501050
手計算では40時間。あってるかな

[ ]がA君B君の位置、
左端はそのステップに要する時間
0 [0]5131:450105[0]
5 0[5]131:45010[5]0
5 [0]5131:4501[0]50
1 0[]5131:450[1]050
1 [0]5131:45[0]1050
5 0[5]131:4[5]01050
4 05[1]31:45[]01050
3 051[3]1:45[]01050
2 0513[1]:45[]01050
4 05131[]:4[5]01050
1 05131[]:[4]501050
9 05131[:]4501050
0023デフォルトの名無しさん
垢版 |
2018/04/25(水) 15:06:56.64ID:eqJJBtIM
>>14
A, B, C の3人の順番で、
Bがaマスを選ぶと、Cには最高点になるx, y の2つの選択肢があり、
Cがxの場合、Bは10点、
Cがyの場合、Bは5点となる

この場合、Bがaの場合は5点と考えるので、
Bがbの場合が7点なら、Bはbを採用する

しかし、Bのbが5点なら、aと同じだから、どうなるんだ?
002422
垢版 |
2018/04/25(水) 15:15:39.29ID:/CvNfD/i
>>11
理解できてなかったわ
"07362:450" の解がもうわからん
002522
垢版 |
2018/04/25(水) 15:29:44.32ID:/CvNfD/i
>>23
Bはa,bどちらも5点ならどちらを選んでも良い

各人は自分の順になったとき、
選択可能な各位置について「以降誰が何をしても最悪でも〜点とれる」という点数を考え、
それが最大になる位置(のうちのどれか一つ)を選ぶ

(何をしても、といってももちろん皆が上記のルールは守るものとする)

ストレートなMin-Max戦略だなこれ
0026デフォルトの名無しさん
垢版 |
2018/04/25(水) 15:30:57.61ID:ucQtsZek
>>24
0 [0]7362:45[0]
5 0[]7362:4[5]0
1 0[]7362:[4]50
3 0[7]362:[]450
3 07[]362:[4]50
1 07[]362:4[5]0
2 07[3]62:45[]0
2 073[]62:4[5]0
1 073[]62:[4]50
2 073[6]2:[]450
2 0736[]2:[4]50
1 0736[]2:4[5]0
3 0736[2]:45[]0
3 07362[]:4[5]0
1 07362[]:[4]50
6 07362[:]450
36時間
002722
垢版 |
2018/04/25(水) 15:37:00.23ID:pPLIJyjZ
>>26
ありがとう
問題は理解できていて頭が悪いだけでした
002823
垢版 |
2018/04/25(水) 18:07:14.08ID:eqJJBtIM
>>25
Bのa・b 戦略が、共に5点の同点で、その2つをA に戻すから、

Aは両方を比較しなければならないから、複雑だと思って
0031デフォルトの名無しさん
垢版 |
2018/04/25(水) 20:26:41.27ID:ucQtsZek
>>29 手計算
0 [0]6464:3647[0]
6 0[6]464:3647[]0
2 06[4]64:3647[]0
2 064[6]4:3647[]0
2 0646[4]:3647[]0
3 06464[]:364[7]0
3 0646[4]:36[4]70
2 064[6]4:3[6]470
2 06[4]64:3[]6470
2 0[6]464:3[6]470
3 0[]6464:[3]6470
3 0[6]464:[]36470
2 06[4]64:[]36470
2 064[6]4:[]36470
2 0646[4]:[]36470
6 06464[:]36470

>>30
無いんじゃね?
003229
垢版 |
2018/04/25(水) 21:13:14.97ID:/CvNfD/i
>>29はバグってた
直したら>>11と一致しました

https://ideone.com/ECmxkW

常に解がありそうだけど証明はどうやるんだろ
003429
垢版 |
2018/04/25(水) 21:33:09.38ID:/CvNfD/i
適当に折り返すことによって山谷の数を合わせられる
あとは略、って感じか
003529
垢版 |
2018/04/25(水) 21:38:29.30ID:/CvNfD/i
数じゃなく高さを合わせるのか
眠くて頭が回らない
0036デフォルトの名無しさん
垢版 |
2018/04/28(土) 14:30:11.12ID:O8BM7Wua
e^(z) + 1 = 0 を満たす全ての z∈C の絶対値の集合をSとする.
この時、Sの中でN番目(N≦10^5)に小さい元を求めよ.
なお, e = Σ{n∈N}(1/n!) である.
0040デフォルトの名無しさん
垢版 |
2018/04/28(土) 17:14:48.72ID:GokrK/uL
簡単なところで。

【お題】
与えられた整数のリストを、
すべての奇数がすべての偶数の前に来るよう並べ替えなさい。
ただし奇数、偶数、それぞれの順番は変えないこと。

[-1, 2, 8, -9, -2, -3, -6, -10, -8, 5, 7, 9, 7]

-> [-1, -9, -3, 5, 7, 9, 7, 2, 8, -2, -6, -10, -8]
0042デフォルトの名無しさん
垢版 |
2018/04/28(土) 18:15:08.94ID:7FInXxAw
J

((#~2&|),(#~2&|&>:)) -1, 2, 8, -9, -2, -3, -6, -10, -8, 5, 7, 9, 7

出力
_1 9 3 _5 _7 _9 _7 _2 _8 _2 _6 10 _8

(Jでは_が負の符号)
0043デフォルトの名無しさん
垢版 |
2018/04/28(土) 18:19:04.17ID:XQamhGXx
>>40 Perl

@a = (1, 2, 8, -9, -2, -3, -6, -10, -8, 5, 7, 9, 7);
@o = grep{$_ & 1} @a;
@e = grep{!($_ & 1)} @a;
use feature 'say';
use Data::Dump qw(dump);
say dump [@o, @e];


$ perl 11_41.pl
[1, -9, -3, 5, 7, 9, 7, 2, 8, -2, -6, -10, -8]
0044デフォルトの名無しさん
垢版 |
2018/04/28(土) 18:21:14.38ID:PugBvw3H
> _1 9 3 _5 _7 _9 _7 _2 _8 _2 _6 10 _8
Jは全くわからんが、出力おかしくないけ?
_1 _9 _3 5 7 9 7 2 8 _2 _6 _10 _8 になるはず?
0047デフォルトの名無しさん
垢版 |
2018/04/28(土) 19:06:51.88ID:bUTNgJY5
>>42
>((#~2&|),(#~2&|&>:)) -1, 2, 8, -9, -2, -3, -6, -10, -8, 5, 7, 9, 7

こう書かなきゃダメだった
((#~2&|),(#~2&|&>:)) _1 2 8 _9 _2 _3 _6 _10 _8 5 7 9 7
0050デフォルトの名無しさん
垢版 |
2018/04/28(土) 19:16:25.16ID:bUTNgJY5
カンマはあっても良いんだけど _2 を -2 と書くと
,- なる演算子のコンビネータで世にも奇妙な動きになる
0052デフォルトの名無しさん
垢版 |
2018/04/28(土) 19:20:47.82ID:e4v0vK3x
違った

1,2,3 => 1 2 3
1, -2, 3 => 1 _2 _3

マイナスがそれまで連結したそれより右、
上の例だと 2 3 全体に作用してた
0054デフォルトの名無しさん
垢版 |
2018/04/28(土) 20:34:22.01ID:7FInXxAw
あー!
ソートするだけか。グッと短くなるな
J
(\:2&|) _1, 2, 8, _9, _2, _3, _6, _10, _8, 5, 7, 9, 7

結果
_1 _9 _3 5 7 9 7 2 8 _2 _6 _10 _8
0055デフォルトの名無しさん
垢版 |
2018/04/28(土) 21:15:59.30ID:Ie6V8ZCt
>>40 Squeak/Pharo Smalltalk

| fn1 fn2 |
fn1 := [:arr | (arr select: #odd), (arr select: #even)].
fn2 := [:arr | (arr sort: [:x | x odd asBit] descending) asArray].

fn1 value: #(-1 2 8 -9 -2 -3 -6 -10 -8 5 7 9 7).
"=> #(-1 -9 -3 5 7 9 7 2 8 -2 -6 -10 -8) "
fn2 value: #(-1 2 8 -9 -2 -3 -6 -10 -8 5 7 9 7).
"=> #(-1 -9 -3 5 7 9 7 2 8 -2 -6 -10 -8) "
0056デフォルトの名無しさん
垢版 |
2018/04/28(土) 21:55:04.43ID:efxIQEuI
>>40
# Rubyで。
def f040(a)
a.select(&:odd?) + a.select(&:even?)
end
0057デフォルトの名無しさん
垢版 |
2018/04/28(土) 21:58:00.35ID:fbonRnOo
>>40 Perl

@s = (-1, 2, 8, -9, -2, -3, -6, -10, -8, 5, 7, 9, 7);
push @{$a[$_ & 1]}, $_ for @s;
($e, $o) = @a;
print "@$o @$e\n";

$ perl 11_40.pl
-1 -9 -3 5 7 9 7 2 8 -2 -6 -10 -8
0059デフォルトの名無しさん
垢版 |
2018/04/28(土) 22:24:14.64ID:kOoyKfN/
安定なソートである必要は無いのかな
0061デフォルトの名無しさん
垢版 |
2018/04/29(日) 00:30:13.18ID:VMPsXvec
>>36って S = {(2m + 1)π / √((2nπ)^2 + 1)|(m, n)∈N^2}だから最小値存在しなくね?
複素数の複素数乗って多価関数だよね?
0062デフォルトの名無しさん
垢版 |
2018/04/29(日) 01:45:04.33ID:eN7o88HV
>>61
e は実数で S = {(2n-1)π} じゃないの。
数学は良く知らんけど。

[[[{[{{]] を見て反省してJの良さが伝わりやすいように>>54をわかりやすく書き直してみた

定義
data =: _1 2 8 _9 _2 _3 _6 _10 _8 5 7 9 7
modulo =: |~
ascending_sort_by = \:

実行
data ascending_sort_by 2 modulo data

結果
_1 _9 _3 5 7 9 7 2 8 _2 _6 _10 _8

これを分かりにくくして行くと>>94になる

2項演算子 f と単項演算子 g から単行演算子 (f g)、
(f g) x の値は x f (g x) を作れる仕組み

2項演算子 f の左側引数をxに固定した単項演算子 x&f、(x&f) y の値は x f y を作れる仕組み

これらを使って「2での剰余をキーとしてソートする
単行演算子」を作って data に適用する形に書き直すと

(ascending_sort_by (2&modulo)) data

これを直に書いて不要な空白や括弧を取ると>>94
(\:2&|) data
0063デフォルトの名無しさん
垢版 |
2018/04/29(日) 01:48:41.58ID:eN7o88HV


\ になってる文字は本来バックスラッシュ
Jはスマフォアプリがあるので暇で困っている人にはパズル的に遊ぶのにお勧め
0064デフォルトの名無しさん
垢版 |
2018/04/29(日) 02:09:53.25ID:VMPsXvec
>>62
z := x + y*i (x, y∈R)
e^z = -1
⇔ exp((x + y*i)(p.v.Log|e| + i*arg(e))) = -1
⇔ exp(x - 2nπy)*exp((2nπx + y)i) = -1
⇔ x = 2nπy and 2nπx + y = (2m + 1)π
⇔ x = 2nπy and y = (2m + 1)π/((2nπ)^2 + 1)
⇔ z = (2m + 1)π/(2nπ - i)
⇒ |z| = |2m + 1|π/sqrt(4n^2π^2 + 1) (m, n∈N)
だからS = {(2n-1)π}はありえないよ
0067デフォルトの名無しさん
垢版 |
2018/04/29(日) 03:00:09.99ID:zLWhc+ki
>>40 javascript
var ary = [-1, 2, 8, -9, -2, -3, -6, -10, -8, 5, 7, 9, 7];

// 条件判定が二倍走るのが気に食わない
var ans = [...ary.filter(n => n % 2), ...ary.filter(n => !(n % 2))];
console.log(ans);

// のでこうした。長い…読むとき引っ掛かりそう
var ans = ary.reduce((acc, n) => n % 2 ? {odd: [...acc.odd, n], even: acc.even} : {odd: acc.odd, even: [...acc.even, n]}, {odd: [], even: []});
console.log([...ans.odd, ...ans.even]);

// 結局俺にはこれが分かりやすくていいや
var odd = [], even = [];
ary.forEach(n => {n % 2 ? odd.push(n) : even.push(n);});
console.log([...odd, ...even]);
0077デフォルトの名無しさん
垢版 |
2018/04/29(日) 21:35:33.15ID:f+z04ZEq
お題: 文字列をソートしなさい。ただし、英字のみをソートし他はそのままにすること。
例:
 "213cba213cba213cba" -> "213aaa213bbb213ccc"
0080デフォルトの名無しさん
垢版 |
2018/04/29(日) 22:50:48.02ID:WuAwAiPA
お題
二次元平面上の4点が与えられる。この4点で凸四角形を構成できるか判定せよ。
※4点の順番は、時計回りや反時計回りとは限らない。
(0, 0), (1, 0), (1, 1), (0, 1) => true
(0, 0), (1, 1), (1, 0), (0, 1) => true
(0, 0), (2, 0), (1, 1), (0, 2) => false
(0, 0), (1, 1), (2, 2), (3, 3) => false
(0, 0), (0, 0), (0, 0), (0, 0) => false
0082デフォルトの名無しさん
垢版 |
2018/04/29(日) 23:11:38.79ID:wF7FhsU6
>>77 Squeak/Pharo Smalltalk

| fn |
fn := [:str |
 | letters |
 letters := OrderedCollection new.
 ((str asArray gather: [:chr | chr isLetter
  ifTrue: [letters add: chr. '{', letters size asString, '}']
  ifFalse: [chr asString]]
 ) as: String) format: letters sort
].

fn value: '213cba213cba213cba' "=> '213aaa213bbb213ccc' "
0083デフォルトの名無しさん
垢版 |
2018/04/29(日) 23:14:55.98ID:UI+loYQZ
>>77 Perl5

@s = split '', '213cba213cba213cba';
@i = 0..$#s;
@k = grep{$s[$_] =~ /[a-z]/} 0..$#s;
@l = sort @s[@k];
$s[$k[$_]] = $l[$_] for 0..$#k;
use feature 'say';
say @s;


$ perl 11_77.pl
213aaa213bbb213ccc
0085デフォルトの名無しさん
垢版 |
2018/04/29(日) 23:22:03.47ID:WuAwAiPA
>>77 C++
#include <iostream>
#include <string>
#include <algorithm>
#include <boost/iterator/filter_iterator.hpp>

template <typename FwdIt>
void selection_sort(FwdIt first, FwdIt last) {
for (auto it = first; it != last; ++it) std::iter_swap(it, min_element(it, last));
}

int main() {
std::string s;
std::cin >> s;
selection_sort(boost::make_filter_iterator(&::isalpha, s.begin(), s.end()), boost::make_filter_iterator(&::isalpha, s.end(), s.end()));
std::cout << s << std::endl;
}
0086デフォルトの名無しさん
垢版 |
2018/04/29(日) 23:46:37.03ID:wPb3/3m7
>>77
Haskell
アルゴリズム自体は単純だけどコードが泥臭い
もっと綺麗に書けそう
import Data.Char
import Data.List
solve [] ys = ([],reverse $ sort ys)
solve (x:xs) ys = if isAlpha x
then let (vs,w:ws) = solve xs (x:ys) in (w:vs,ws)
else let (vs,ws) = solve xs ys in (x:vs,ws)
main = putStrLn $ fst $ solve "213cba213cba213cba" []
0088デフォルトの名無しさん
垢版 |
2018/04/30(月) 00:14:03.81ID:wP9Edy/s
それは概念的な方?それとも実際に仕事に影響する方?
後者ならプレミアムフライデー列挙は0文字でできるが
0090デフォルトの名無しさん
垢版 |
2018/04/30(月) 03:49:27.01ID:XX4FB8lc
あれ?strdup() で警告出てるな。strdup() って標準ではないか。
まあでもCコンパイラのアバウトな処理によって動くバイナリは作られたようだがw
やりたいことは分かると思うのでそのままにしておく。
0093デフォルトの名無しさん
垢版 |
2018/04/30(月) 09:43:30.53ID:6GiCfUEC
>>77 Squeak/Pharo Smalltalk

| fn |
fn := [:str |
| letters |
letters := (str select: #isLetter) sort readStream.
str collect: [:chr | chr isLetter ifTrue: [letters next] ifFalse: [chr]]
].

fn value: '213cba213cba213cba' "=> '213aaa213bbb213ccc' "
0094デフォルトの名無しさん
垢版 |
2018/04/30(月) 11:03:34.34ID:6GiCfUEC
>>87 Squeak/Pharo Smalltalk

| preKinsOf |
preKinsOf := [:year |
(year asInteger asYear months collect: [:month |
(month dates select: [:date | date weekday == #Friday]) last]
) reject: [:date | date mmddyyyy beginsWith: '4/29']
].

preKinsOf value: 2022

"=> {28 January 2022 . 25 February 2022 . 25 March 2022 . 27 May 2022 .
24 June 2022 . 29 July 2022 . 26 August 2022 . 30 September 2022 .
28 October 2022 . 25 November 2022 . 30 December 2022} "
0095デフォルトの名無しさん
垢版 |
2018/04/30(月) 11:06:46.51ID:51rF4oVe
>>77
>>86のアロー版
import Control.Arrow
import Data.Char
import Data.List
solve ([],_) = ([],[])
solve ((x:xs),~yss@(y:ys)) = if isAlpha x
then first (y:) $ second (x:) $ solve (xs,ys)
else first (x:) $ solve (xs,yss)
main = putStrLn $ loop (second sort . solve) "213cba213cba213cba"
0097デフォルトの名無しさん
垢版 |
2018/04/30(月) 15:39:38.12ID:3TseVeeC
>>77 Emacs Lisp

(defun f (a)
(flet ((alphaumericp (c) (string-match "[A-Za-z]" (string c))))
(let* ((b (concatenate 'list a))
(c (sort (remove-if-not #'alphaumericp b) #'<)))
(concat (mapcar (lambda (d) (if (funcall #'alphaumericp d) (pop c) d)) b)))))
f

(f "213cba213cba213cba")
"213aaa213bbb213ccc"
0099デフォルトの名無しさん
垢版 |
2018/04/30(月) 20:05:33.19ID:AG7SQVmm
>>98
書き込んでから気がついたけど、お題の5個の入力では問題を起こさないが
差ベクトルが短すぎる場合や外積の面積が細過ぎる場合の打ち切りは、
nextで一階層ブロック脱出ではなく更にもう一階層外側のloopに脱出すべきか…orz
ま、いいか、テヘペロ
■ このスレッドは過去ログ倉庫に格納されています

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