プログラミングのお題スレ Part16
■ このスレッドは過去ログ倉庫に格納されています
https://twitter.com/AtomDynamics16/status/1197979782719229952
キー入力を一定時間ごとに送るソフトを書いたのだけど、やっぱりグレーですか?
パケット改変して無くて、メモ帳ではうまくいってる。
UOクライアントに使うのが怖くて躊躇している。
https://twitter.com/5chan_nel (5ch newer account) >>4を>>11の方式で求めるプログラムを書いてみた: https://ideone.com/14wgia
nが偶数の場合、n = 8までは>>8の2番目のプログラムと比べて遅いが、n = 10, 12,
14, 16, 18, 20ではそれぞれ1.78倍、7.16倍、49.8倍、327倍、3120倍、30800倍の
速度になり、差がどんどん開いていく。n = 256でも1秒未満で求められる。
nが奇数の場合、n = 11までは遅いが、n = 13で同程度になり、n = 15, 17, 19, 21では
それぞれ3.25倍、12.6倍、58.8倍、325倍の速度で、差がやはりどんどん開いていく。
nが2大きくなるごとに並べ方の通り数が2倍以上に増えるようなので、n = 255では
どんなアルゴリズムを使ってもコンピュータの性能限界をはるかに超えてしまう。 今日は夕焼けが超絶綺麗だったよ。
今まで見たことないくらい。
まだきれいになるだろうか、というのと、これ一回で終わりだろうか。
というのがあった。 お題:Diffアルゴリズムを実装せよ。
差分アルゴリズム、さんぷる。
1:abcdef
2:abdef -> -3:c
3:bcdef -> -1:a,+3:c
4:abcdef -> +1a
以上がオレの考えるアルゴリズムだが、
もっとより良いアルゴリズムが世の中にはあるはずなので、
実装しませんか? >>18
それはアルゴリズムではなく入力と出力のサンプル。
まあとにかく足された文字は+と位置と足された文字(または文字列?)を出して引かれた文字は-と位置と文字を出す仕様ということだな。
で、位置は先頭が1だと。
後で時間が空いたら考えとく。 >>18
https://ideone.com/3VET5r
Rには編集前後の文字列のレーベンシュタイン距離を求める便利な関数adistが
備わっていて、1文字の挿入、削除、置換操作が必要な位置をI, D, S、操作が不要な
位置をMで示す文字列を返してくれる。例えば、"abdef" と "bcdef" を与えると、
"DMIMMM" が得られる。あとは、>>18の出力形式にちょっと加工するだけ。 >>18
Perl
https://paiza.io/projects/71IZPLpIhoNPEexVVb8cCQ
あまりPerlの特性を生かせてないような、かといって今のところこれぐらいしか思い浮かばない。 >>18
やっぱお前ら高性能だな。言い方悪いけど。 お題:自然数aをいくつか[※1]の自然数の組の和で表すとき、それらの自然数の組の
積[※2]が最大となるような自然数の組を、aが1から100までに対して表示せよ[※3]。
[※1] 1つでも構わず、その場合には和も積も自然数n自身となる。
[※2] 例えば、7を1+2+4と表せば積は1*2*4=8、2+5と表せば積は2*5=10であり、
後者の積の方が大きい。
[※3] 最大となるような自然数の組が複数ある場合は、すべての組を表示せよ。 同じ数字を何回も使っていいんだったら2と3だけで作って、2*2を4と置き換えたものを追加(※3のため)すればええんかね?
aが1の場合は1
aが偶数の場合2^(a/2)
aが3以上の奇数の場合2^((a-3)/2)+3 f(a,n)=(a/n)^n
df/dn =(a/n)^n * (-1+log[a/n]) な感じなので
ne=aで増減変化な気がするから
それ前後の整数2つだけしらべれば大丈夫?
a<=100, a>=1 だから200回調べる感じ 3で分割できている間は3で残りが1になってしまう場合は最後の4を2x2にするのが最大っぽいね
7だったら3+3+1ではなくて3+2+2
12は3+3+3+3
13は3+3+3+2+2
100までずっとこれ
最大値しか表示しないけど
https://ideone.com/Ck54FP 求める値をf(a)とする
b+c=a, b<=c, b>0, c>0 となる全てのb,cに対して
max { f(b) f(c) } と a の大きい方
となる
f(a) を a=1 の時から順番に調べれば良い
aが十分大きくて小数も許すなら
e=2.7182818... に分けるのが最善
整数なら>>32の通りかな? 1以外の時には1が出ない
5以上は2個以上に分けた方が大きい
4は2+2にしても同じ
6は2+2+2より3+3よ方が大きい
だから
a>=2の時には
2、3、4以外の値はあらわれず
2と4をあわせて6以上にはならないことがわかる
つまり、(順番を無視すれば)以下の形のみになる
3+3+...+3
3+3+...+3+2
3+3+...+3+2+2
3+3+...+3+4 >>35
なぜそれで「だから」となるのかわからない。 2、3、4以外の値はあらわれず
2と4をあわせて6以上にはならない
どっちがわからない? .... が正として、
.... * n * 1 < .... * (n+1)
.... * n < .... * floor(n/2) * ceil(n/2) @nが5以上
.... * 2 * 2 * 2 < .... * 3 * 3
.... * 4 = .... * 2 * 2 一応、
加算と乗算は交換法則と結合法則が成り立つ
ってのも必要な条件です >>40
38で書いてくれてる
5以上なら分割したほうが大きくなるから最終的な数字は5未満になる 38の内容は
1行目で1が無意味なので1が出ない
2行目で5以上は分割したほうがでかくなる
3行目で2*2*2と3*3は同じ
4行目で2*2と4は同じ
を説明している
3行目4行目はパターンを列挙するために必要な内容 5以上は分割した方が大きくなる事に関しては数学的に証明できてるってこと? n/2*n/2=n^2/4
だからn=4ならnと同じ、5以上なら分子が大きくなるからnより大きくなる
整数でに分割なので↑は偶数のときに限定
奇数のときは
(n-1)/2*(n+1)/2=(n^2-1)/4
だからnが5以上ならnより大きい >>45
より大きくなる具体的な分け方を>>38に書いた
半分の、小数点以下切り上げ
半分の、小数点以下切り捨て
に分ける
これの方が大きい証明はとても簡単
(でもあまりエレガントではない)
もちろんこの分け方が最大というわけではないが
最大の分け方が5以上を含むと仮定すると、
より大きなものが存在するので矛盾
だから5以上は含まない
と言う事が出来る 最大となる分け方が存在する
ってのは有限性から明らか
つまり、
少なくとも1個の分け方が存在する
分け方は有限個しかない
から明らか n ≧ 5 の時
floor(n/2) * ceil(n/2) - n
> { (n - 1) / 2 } * { n / 2 } - n
= n (n - 5) / 4
≧ 0
よって
n < floor(n/2) * ceil(n/2) これでわからんのなら数学じゃなくて日本語が不自由と断言してよいレベルだな >>26
https://ideone.com/5DzbUt
C++。二進数最強伝説を信じて書いてみたよ。
数学出来ないからいつも通り適当に解いてる。。。 >>44
今更だけど3行目の説明間違えてた
2*2*2より3*3が大きい
なので結果的に解は3がたくさん並んで後ろで足りない分を2、もしくは4つける形になる >>26
https://ideone.com/nqON70
C++。理屈が良くわからんけど、これが俺の限界。
2で欠けたほうが普通はいいんだけど、3の倍数は2引くと1余るのでそういうところでコスト取られるのでしょうかねぇ??
プリミティブ触ったほうが詰め込めるというのは普遍的にあると思うのだけどね。。。
もしかしたら、どっかの素数がスイートスポットになってて変な切り方しないとうまくないってこともあるかもしれない。 屁理屈だけど、2と3の組み合わせで表せる数字は多いということかなぁ?? 2の倍数で且つ3の倍数の時は2を使うのがいいのか3を使うのがいいのか解らない。 >>55も若干間違ってるなぁ。
2と3の倍数を兼ねる数字はその数字単体によって切り方を変えないといけないんだと思う。
なんかゲーム的。 >>62
なるほど。一応そこにはたどり着いたが、迷いの中だ。。。 >>26の出題者です。>>32で正解ですが、お題の指示通りに自然数の組み合わせを
出力してもらいたかったな。こういう綺麗な三角形ができるから。
1: [1]
2: [2]
3: [3]
4: [4]
4: [2, 2]
5: [2, 3]
6: [3, 3]
7: [3, 4]
7: [2, 2, 3]
8: [2, 3, 3]
9: [3, 3, 3]
10: [3, 3, 4]
10: [2, 2, 3, 3]
11: [2, 3, 3, 3]
12: [3, 3, 3, 3]
13: [3, 3, 3, 4]
13: [2, 2, 3, 3, 3]
14: [2, 3, 3, 3, 3]
15: [3, 3, 3, 3, 3]
16: [3, 3, 3, 3, 4]
16: [2, 2, 3, 3, 3, 3]
17: [2, 3, 3, 3, 3, 3]
18: [3, 3, 3, 3, 3, 3]
19: [3, 3, 3, 3, 3, 4]
19: [2, 2, 3, 3, 3, 3, 3]
20: [2, 3, 3, 3, 3, 3, 3]
21: [3, 3, 3, 3, 3, 3, 3]
22: [3, 3, 3, 3, 3, 3, 4]
(以下略) 「ループを使わずに1から100を順に出力するコードは書けますか」 >>67
void Array.from({length:100}, (_, i) => {
console.log(i + 1);
});
とか
let counter = 0;
void function count() {
if (counter++ < 100) {
console.log(counter);
count();
}
}();
とか。js >>67 Ruby アイデアは前スレの誰かのパクリ
p 10**303 / 999**2
# => 10020030040050060070080090100110120130140150160170180190200210220230240250260270
28029030031032033034035036037038039040041042043044045046047048049050051052053054
05505605705805906006106206306406506606706806907007107207307407507607707807908008
1082083084085086087088089090091092093094095096097098099100 >>67 julia
println.(1:100) >>67 GNU Smalltalk
(1 to: 100) asArray display
https://ideone.com/Ec2oby >>67
Kotlin script
(1..100).forEach(::println)
今スマホから書いてて試せないんだが多分これでできる。
forEachはループだというならこれではダメだが(確かに中ではループしていると思う)。 お題: アルファベットの文字列の大文字と小文字の対応を反転させて表示しろ
in < Hello, World!
out > hELLO, wORLD! >>77 Ruby
puts 'Hello, World!'.swapcase # => hELLO, wORLD! >>77 Common Lisp
(defun string-invert-case (string)
(map 'string
(lambda (c)
(if (lower-case-p c)
(char-upcase c)
(char-downcase c)))
string))
(write-line (string-invert-case "Hello, World!")) >>67 PHP
<?=implode(range(1,100)," ")?> お題: コンビニでタバコ(マルボロ)を買いたい
喫煙者がコンビニでタバコを購入して喫煙するまでの疑似コードを書け
詳細にかつ現実的で、エラー/例外に可能な限り対応していれば高得点とする
例:
person.walk_to(conbini)
if conbini.has(person) {
employee = conbini.get_current_employee()
tobacco = person.request_to(employee, "マルボロ")
person.smoke(tobacco)
} 1,マルボロ吸いてー。
2,そうだコンビニへ行こう
3,財布を確認
4,どうやって行こうか
5,準備して家を出る
6,道中色々
7,コンビニ到着
8,コンビニ物色
9,予備で買わなければいいけないモノを示唆
10,カゴ買うモノを入れる
11,レジに行く
12,レジでタバコの番号を「N個クレ」という。
13,ホットスナックを示唆する
14,会計が出る
15,ポイントカードを出す
16,お金を払う
17,品物を受け取る
18,コンビニをでる
19,喫煙スポット検索
20,喫煙スポットへいく
21,道中色々
22,到着
23,タバコを開けて一本取り出す
24,ライターで火をつける
25,吸う
26ぷれじゅあぁあああああああああああ タバコに火をつける時は、咥えて軽くチューブを吸わないとつかないのDA!! >>67 Pxthon
print(*range(1,101)) 令和元年(2019年)8月25日(日)・(再)9月1日(日)
テーマ: 未来につながる力を学ぶ プログラミング教育
内容: 2020年度から小学校で始まる「プログラミング教育」。
一体どんな授業が行われるのか?番組では一足先に
プログラミングを取り入れた授業を行っている小学校を取材。
そこには生き生きと楽しく学ぶ子供たちの姿が。さらに、
実際に授業で使われている教材で、徳光さんがプログラミングに初挑戦!
今回は文部科学省プログラミング教育戦略マネージャーの中川哲さんと共に、
進化する学び、「プログラミング教育」に迫ります。
https://www.gov-online.go.jp/pr/media/tv/shiritai/movie/20190825.html
動画は上のURLにある >>67
perl5
perl -e 'print join "\n", 1..100' >>67
Prel5 ってまだ出てないよね?
print join(' ', 1..100) . "\n"; >>97
すいません。ブロックされて書き込みができないのでいろいろテスト中。 >>95>>96
打ちまつがえた。
そしてリロードしてなくて書いた直後に上にPerl5の書き込みが出現orz >>67 Perl5
print "@{[1..100]}\n"; >>101 Ruby
$><<101.times.sum # => 5050 >>101 julia
print(sum(1:100)) >>104
なぜ return 5050; でないのか小一時間ほど問い詰めたい 最適化されるから一緒
意図がわからない
変数に置き換えて汎用化できない
一時間しゃべってみろよおい >>105に対する>>104の利点
(比較的)変数に置き換えやすい
計算式がわかる
自分で計算しなくて良い >>108
そういうことを言うならせめて
return 100*(100+1)/2;
って書けよ +1
は手計算の手間もないし見ればわかる
非常に利点が少なく
文字入力の手間が相対的に大きくなる ■ このスレッドは過去ログ倉庫に格納されています