X



プログラミングのお題スレ Part12
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2018/09/28(金) 10:09:07.13ID:phwOkayR
プログラミングのお題スレです。

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

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

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

プログラミングのお題スレ Part11
https://mevius.5ch.net/test/read.cgi/tech/1524570314/
0726デフォルトの名無しさん
垢版 |
2018/11/30(金) 23:16:05.51ID:TjeK6E2T
お題: 入力にこのスレのhtmlが与えられるので数字だけ,区切りで出力しなさい。

出力例
2018,11,30,...
0728デフォルトの名無しさん
垢版 |
2018/12/01(土) 00:17:45.63ID:XKE5KJf3
>>722
誰もお前になんか言ってねーよ
自意識過剰なんじゃボケカス
0729デフォルトの名無しさん
垢版 |
2018/12/01(土) 01:26:07.16ID:3EVAE812
>>720
Perl
https://paiza.io/projects/Q_MF7JmVJMMjF1aqffgfaw

Perl だと簡単だ。

但し /* /* */ */ みたいな二重のやつには対応していない。最初の /* から次に出た */ を削除して */ が残る。
(この辺は本物のCプリプロセッサでも同じかな?)
0733デフォルトの名無しさん
垢版 |
2018/12/01(土) 03:00:24.20ID:3EVAE812
>>731
あー。文字列リテラルについては何も考えてなかった。
明日考えよう。

>>732
やはりそうでしたか。わざわざどうも。
0734デフォルトの名無しさん
垢版 |
2018/12/01(土) 03:09:09.09ID:3EVAE812
>>731
今閃いたので修正した。(URLは同じ)
0735デフォルトの名無しさん
垢版 |
2018/12/01(土) 03:22:24.06ID:Zs5zJNI/
>>720 Ruby
src = $<.read
i = 0
loop do
  break if i >= src.size
  case src[i]
  when ?" then i += src[i..-1][/(?:".*[^\\]|")(?:\\\\)*"/].size
  when ?' then i += src[i..-1][/(?:'.*[^\\]|')(?:\\\\)*'/].size
  when ?/ then src.sub!(/(?<=.{#{i}})(?:\/\/[^\n]*|\/\*.*?\*\/)/m, ''); i += 1
  else i += 1
  end
end

-*- input -*-
hoge(); // fuga
hoge('"'); // fuga ");
hoge("// \"fuga\"\\");
hoge("/* fuga */"); /* fuga
fuga /* "fuga" // */; hoge

-*- output -*-
hoge();
hoge('"');
hoge("// "fuga"\\");
hoge("/* fuga */"); ; hoge
0736デフォルトの名無しさん
垢版 |
2018/12/01(土) 03:24:23.46ID:3EVAE812
>>720
Cでも作った。
https://paiza.io/projects/2RgQrlBLrzJe9MQp9weQmQ

これは1文字づつ読んでモード切り替えて出力したりしなかったりする方式。
文字列リテラルにも対応。
0741デフォルトの名無しさん
垢版 |
2018/12/01(土) 05:34:42.40ID:qLkjgui5
>>735 訂正
src = $<.read
i = 0
loop do
  break if i >= src.size
  case src[i]
  when ?" then i += src[i..-1][/\A"(?:.*?[^\\])?(?:\\\\)*"/].size; next
  when ?' then i += src[i..-1][/\A'(?:.*?[^\\])?(?:\\\\)*'/].size; next
  when ?/ then src.sub!(/(?<=\A.{#{i}})(?:\/\/[^\n]*|\/\*.*?\*\/)/m, '')
  end
  i += 1
end
puts src

-*- input -*-
hoge(); // fuga
hoge('"'); // fuga ");
hoge("// \"fuga\"\\", /* fuga */ *"fuga");
hoge("/* fuga */"); /* fuga
fuga /* "fuga" // */; hoge

-*- output -*-
hoge();
hoge('"');
hoge("// \"fuga\"\\", *"fuga");
hoge("/* fuga */"); ; hoge
0742デフォルトの名無しさん
垢版 |
2018/12/01(土) 07:52:53.53ID:U3mK8vlP
>>728
誰も俺に言われてると思ってねーよ
自意識過剰なんじゃボケカス
0743デフォルトの名無しさん
垢版 |
2018/12/01(土) 11:03:33.46ID:XKE5KJf3
>>742
生きづらそう
0745デフォルトの名無しさん
垢版 |
2018/12/01(土) 11:16:56.49ID:50ygxsN0
>>744
ゴメン再帰マッチは(?R)や(?1)だた
時間あればnest対応版書いてみたいけど
多分ないや…

こういうのは再帰降下パーサParse::RecDescentやPerl6のRule使うと楽に書ける
0746デフォルトの名無しさん
垢版 |
2018/12/01(土) 12:39:50.92ID:U3mK8vlP
>>743
おまえやわw
いちいち素っ頓狂なレスすんなカスw
0747デフォルトの名無しさん
垢版 |
2018/12/01(土) 12:41:56.31ID:1eGLRG7/
いつもの単芝君やないか
この板に粘着して荒らしまわってる奴やで
意思疎通は不可能なのでNGするなりスルーするなりしてくれ
0748デフォルトの名無しさん
垢版 |
2018/12/01(土) 15:19:58.00ID:3EVAE812
>>729の改造終了(URLは同じ)
長い呪文になってしまった。

>>744>>745
なるほど。その内暇な時にでも考えよう。
0749デフォルトの名無しさん
垢版 |
2018/12/01(土) 17:02:07.43ID:3EVAE812
>>736も改造終了(URLは同じ)。
0751デフォルトの名無しさん
垢版 |
2018/12/01(土) 17:37:04.95ID:XO3Kyvz4
>>750 はインタプリタでないので無視してください
0753711
垢版 |
2018/12/02(日) 16:02:26.97ID:aFBnTuDv
>>702 c
https://ideone.com/6sLfPH
・ mandelbrotが4.24s→3.42s→3.24s→2.13s
・G: while (*dp) dp += ip->d; ip++; goto TOP; を追加

>>723
caseで分岐するほうが移植性あっていいよね( ^ω^)
0755デフォルトの名無しさん
垢版 |
2018/12/03(月) 22:04:03.50ID:cV13JBu4
[お題]
整数A,B(1<=A<B<=50万)と P(1<=P<=10)が順に与えられる。
A以上B以下の10進数の整数から異なる2つの整数を選ぶ。
その2つの整数を表現するのに使われている(各桁の)数字の種類が
ちょうどP種類である選び方は何通りできるか。

※ 先頭ゼロ詰禁止、実行時間一問1.5秒以内(ideone等で)

1) 8 11 2 --> 4
2) 10 1000 5 --> 207480
3) 44 44444 4 --> 33808313
4) 56785 113452 1 --> ?
5) 102345 480713 6 --> ?
6) 1 500000 7 --> 47440713600

 例題1) の補足 "8 11 2" のとき
  {8,9,10,11}から2整数を選ぶ。NCR(4,2)=6通りあるなかから
  (8,9)(8,11)(9,11)(10,11) の4通りが答え。[]内を使用数字とすると、
  例として、(8,11)は[8,1]の2種類, (10,11)は[1,0]の2種類からなる。
  対象外は (8,10)は[8,1,0] (9,10)は[9,1,0]で ともに2種類ではない。

 ※解き方をパックて単純化した問題。
0758デフォルトの名無しさん
垢版 |
2018/12/04(火) 13:11:47.75ID:vhrUEqnQ
>>720 正規表現だけで書いてみた

regexp = /((?:([^"']*?)(?:\/\/[^\n]*|\/\*.*?\*\/))*)(("|').*?(?<!\\)(?:\\\\)*\4)?/m

puts <<~EOT.gsub(regexp, '\2\3')
  hoge(); // fuga
  hoge('"'); // fuga ");
  hoge("// \\"fuga\\"\\\\", /* fuga */ *"fuga");
  hoge("/* fuga */"); /* fuga
  fuga /* "fuga" // */; hoge
EOT
# =>
hoge();
hoge('"');
hoge("// \"fuga\"\\", *"fuga");
hoge("/* fuga */"); ; hoge
0759デフォルトの名無しさん
垢版 |
2018/12/04(火) 13:34:55.49ID:fo8RIf+e
>>758 無駄な括弧があったので修正

regexp = /([^"']*?)(?:\/\/[^\n]*|\/\*.*?\*\/)?(("|').*?(?<!\\)(?:\\\\)*\3)?/m

puts src.gsub(regexp, '\1\2')
0761デフォルトの名無しさん
垢版 |
2018/12/04(火) 17:20:50.80ID:tkE9zz4k
お題: テキストが入力されるのでそれがお題であれば1,お題でなければ0を出力せよ
0762デフォルトの名無しさん
垢版 |
2018/12/04(火) 17:37:59.07ID:HMynH27O
>>761

#!/bin/sh

if grep お題 >/dev/null 2>&1
then
 echo 1
else
 echo 0
fi
0763デフォルトの名無しさん
垢版 |
2018/12/04(火) 17:43:36.31ID:evmq38l5
お題

C/C++言語のソースをHTMLに変換

・色分け(外部スタイルシートで色分け以外にも
サイズや種類など色々と細かく指定可能)表示
・コメント・クォート・マクロ定義部分・マクロ等に対応
・ローカル変数・グローバル変数・static関数・非static関数
ライブラリ変数/関数/マクロ(ヘッダ記載)・
ローカル型・グローバル型名の区別

入力:コマンドラインからファイル名(.c/.cpp)
出力:出力htm(l)ファイルとそれが参照するスタイルシート(.css)を
新規作成
0764デフォルトの名無しさん
垢版 |
2018/12/04(火) 17:47:43.27ID:evmq38l5
あと、コードブロックや式の括弧のネストレベルに応じて
背景色を変えてほしい(要望)
コマンドラインからタブ=4,8とか指定できるようにもして欲しい
0766デフォルトの名無しさん
垢版 |
2018/12/04(火) 18:05:08.94ID:HMynH27O
1. 好きなIDEのエディタで画面に表示。
2. PrtSc キーを押す。
3. ペイントを起動してペースト。
4. PNGファイルとして保存。
5. メモ帳を起動。
6. HTML を書き、imgで先の画像を表示するようにする。
7. 拡張子をhtmlにして保存。
8. ブラウザで表示。
9. 終了。
0767デフォルトの名無しさん
垢版 |
2018/12/04(火) 18:14:10.74ID:evmq38l5
型に応じて変数の色分け(スタイル変更)に対応できたら最高
忘れてたけど予約語の色分けは当然
ソースコードの構文エラー箇所以降は単色赤文字で表示
0770デフォルトの名無しさん
垢版 |
2018/12/05(水) 19:36:38.80ID:W3jESzak
お題:ビュフォンの針をシミュレートして円周率の近似値を求めよ
0771デフォルトの名無しさん
垢版 |
2018/12/05(水) 20:02:35.88ID:W3jESzak
自分でやってみた
Python3
https://ideone.com/A2FnPP
1000万本投げた場合
3.14219665312
0774 ◆QZaw55cn4c
垢版 |
2018/12/05(水) 23:30:56.16ID:qUBA/FDJ
>>772
そんなツッコミは初めてみました、うまいですね…
0775デフォルトの名無しさん
垢版 |
2018/12/05(水) 23:42:52.79ID:W3jESzak
>>772
書いてて思ったけどめんどくさくなってそれ以上考えなかった
0776デフォルトの名無しさん
垢版 |
2018/12/06(木) 01:36:29.15ID:Yn5Hc93r
>>770 Squeak/Pharo Smalltalk

| length N rand needle nCrossed |
length := 10000.
N := 1e7.
rand := Random new.
needle := LineMorph from: length / -2 @ 0 to: length / 2 @ 0 color: Color black width: 1.
nCrossed := 0.
N timesRepeat: [
| crossed |
needle rotationDegrees: 90 * rand next; center: 0 @ (length * rand next).
crossed := length negated @ 0 to: length @ 0 intersects: needle firstVertex to: needle lastVertex.
crossed ifTrue: [nCrossed := nCrossed + 1]
].
N / nCrossed asFloat "=> 3.142226273599298 "
0778デフォルトの名無しさん
垢版 |
2018/12/06(木) 02:09:23.51ID:7UXgAx11
>>771 Ruby
# length = 2; gap = 2
buffon_s = -> n {n.fdiv((1..n).count{rand < sin(rand(1e10))})}
p buffon_s[10**6]
# => 3.1421245789553063
0779755
垢版 |
2018/12/06(木) 20:58:20.17ID:fqSvUjwD
>>755
需要はほぼなかったみたいだが、出題者コメントを

 答えだすのに必要なものだけに前処理で集計。今回必要なのは
 0-9数字使用の有無だけなので2^10に集約・集計できる( 50万→1024)
 この数になればあとは、二重ループで集計をすればいい。
 後半は集約にビットを使えば、popcountを使って簡潔に書けるパターン。

 想定解(python by pypy) https://ideone.com/bujm1x

 回答者さんとほぼ同じ。
 あえて相違点は、pythonのpopcount相当が意外と重かったので、
 前処理でテーブル化している。(高速に出れば、いらないはず?)


 ※制約の50万と1.5秒は、素の(標準だけの)pythonに合わせている。
  (このコードも素のpythonだと、例題6)だけで0.8秒くらい)
0782デフォルトの名無しさん
垢版 |
2018/12/07(金) 22:19:34.17ID:x8xNXHP3
お題
1,3,4,6,7,9,10,12,…
のように1から始まり奇数, 奇数,偶数,偶数,
奇数,奇数,偶数,偶数…と続く場合2019番目はいくつになるか
0791デフォルトの名無しさん
垢版 |
2018/12/08(土) 09:20:01.90ID:vpfNpx82
プログラミング初心者なんですがJavaを覚えるのに良い課題下さい
言語の本は一冊読みました
0792デフォルトの名無しさん
垢版 |
2018/12/08(土) 09:29:35.75ID:5PBkTMHJ
Winならtypeコマンド(LinuxとかUnix系だとcat)と同じ機能を自作してみるとか、行番号も表示するようにするとかから始めては?
0793デフォルトの名無しさん
垢版 |
2018/12/08(土) 09:53:44.58ID:Mku3deOK
>>782
f=:+/@$&1 2

f 2019
3028
0794デフォルトの名無しさん
垢版 |
2018/12/08(土) 09:59:51.42ID:Mku3deOK
>>793
言語はJ
0796デフォルトの名無しさん
垢版 |
2018/12/08(土) 15:30:02.59ID:dsjig1JQ
お題:N×Nの盤面に石を置いていく。
どの4つの石も同一円周上に乗らないようにする場合、最大何個配置できるか?
ただし、一直線上に並ぶ配置は半径∞の円周上と考える。

N=3 => 5
N=4 => 7
5 => 9
6 => 11
9 => 18
0797デフォルトの名無しさん
垢版 |
2018/12/08(土) 17:29:13.00ID:xmV4OmOO
>>796
問題の意味がわからない。図とか描いてくれ。
0800デフォルトの名無しさん
垢版 |
2018/12/08(土) 19:05:02.19ID:xmV4OmOO
共円でググってようやっとわかった。
0803デフォルトの名無しさん
垢版 |
2018/12/12(水) 02:35:41.59ID:84v7sPOJ
お題
2次元平面上で点(x,y)が点列(X1,Y1), (X2,Y2), ..., (Xn,Yn), (X1,Y1)を順に結んでできる多角形の内部にあるかどうか判定せよ
0804デフォルトの名無しさん
垢版 |
2018/12/12(水) 07:13:05.92ID:SVnAXs6w
どのような多角形をなすかの
仮定で方法も違ってくるだろうけど、
一般的な場合を視野に入れる限り
複数の数学ライブラリを組み合わせて
扱うソリューションパッケージ的なものに
なりそうでお題としてはなんだかなって感じ
0805デフォルトの名無しさん
垢版 |
2018/12/12(水) 08:10:30.84ID:3f3X1OW4
>>803
多角形の定義がひどい。
重なる事はあるのか、と、重なったときに内部はどうするのかとか。(抜けるのはめんどくさい)
重なってはいけないけど辺は突き抜けても良いのかとか。
描いた絵みたいな状態を許すかどうかでけっこう判定が変わる。
0806デフォルトの名無しさん
垢版 |
2018/12/12(水) 08:27:43.91ID:3f3X1OW4
多角形を三角形に分割して、
(x1,y1)→(x2,y2)のベクトルと
(x2,y2)→(x3,y3)のベクトルと
(x3,y3)→(x1,y1)のベクトルを
それぞれ、
(x2,y2)→(x,y)
(x3,y3)→(x,y)
(x1,y1)→(x,y)
と外積をとって、正負が一致したらその点は多角形内部にある。
重ならないなら三角形に分割、は、
1,2,3、2,3,4、3,4,5…と使う頂点をスライドさせていくだけで良いんじゃないかな?どっかで裏返るかな。
0809デフォルトの名無しさん
垢版 |
2018/12/12(水) 11:12:59.34ID:3f3X1OW4
数学になるの?
俺CAD関連と3DCG関連でこういうの書くけどな。
コード書こうと思って出題者に問うたつもりだけど。。
証明出来てないコード書いても無意味なんだから先にロジック書いたつもり。

ってかどうして数学?っぼい問題が嫌われるの?
脳筋コードが良いってこと?
0810デフォルトの名無しさん
垢版 |
2018/12/12(水) 11:17:02.00ID:rSdIoMBA
>>803 Ruby 与えられるのは凸多角形のみとし、頂点は反時計・時計回りのいずれかで与えられるものとする

def diff(a, b); a.zip(b).map{|i, j| i - j}; end
def in_triangle?(p, a, b, c)
  ap, ab, ac = [p, b, c].map{|v| diff(v, a)}
  det = ab[0] * ac[1] - ab[1] * ac[0]
  s = (ac[1] * ap[0] - ac[0] * ap[1]) / det
  t = -(ab[1] * ap[0] - ab[0] * ap[1]) / det
  [s, t].all?{|e| (0..1).include?(e)} && s + t <= 1
end
def in_con_polygon?(p, *vers)
  vers[1..-1].each_cons(2).any?{|v1, v2| in_triangle?(p, vers[0], v1, v2)}
end

# 原点を左下の頂点とする長さ1の正方形の内部に(0.5, 0.5)は含まれるか
p in_con_polygon?([0.5, 0.5], [0, 0], [1, 0], [1, 1], [0, 1])
# => true
p in_con_polygon?([1.76, 1.75], [0, 0], [3, 0], [2, 1.5], [1, 2.5], [0, 3])
# => false
0811デフォルトの名無しさん
垢版 |
2018/12/12(水) 11:40:32.38ID:rSdIoMBA
問題を勘違いしてたので一部修正
凸多角形でなくてもOK 順番も結ぶ順でOK
ただし>>805の星型の内部は多角形には含まれないとする

def in_con_polygon?(p, *vers)
  vers[1..-1].each_cons(2).count{|v1, v2| in_triangle?(p, vers[0], v1, v2)}.odd?
end
0814デフォルトの名無しさん
垢版 |
2018/12/12(水) 12:14:30.79ID:ygJIxGmd
>>809
このスレには解答者側に数学ができない人がいて、そういう人が文句を言ってる
かく言う俺も数学できないが文句は言わない
0815デフォルトの名無しさん
垢版 |
2018/12/12(水) 14:03:01.24ID:FdJbiO2G
数学の問題集から拾ってきただけみたいな雑な出題が叩かれてるんじゃなかったのか
問題文自体に不備があってそこを詰めるのが主になってしまうパターンもあるけど
0816デフォルトの名無しさん
垢版 |
2018/12/12(水) 14:49:36.03ID:GETLERsG
純粋に数学だけで解けて解法の式を作ったら、あとはコードにベタ書きしてただ解を出力するだけ、という問題だったら、わざわざプログラム板でやる面白味はないなあと思う。
数学的に解いても、その後コードに起こす際にプログラミング固有の工夫とか言語による違いが見られるような物だと興味深い。
個人的な感想です。
0817デフォルトの名無しさん
垢版 |
2018/12/12(水) 15:01:41.06ID:LIx8RHBs
集合論的なのをリスト使うのと配列使うのだったら違いもあるだろうけど、
そういう問題出ないね。

A∪B := {x | x ∈ A ∨ x ∈ B}

はHaskellだと仮にx が{1,2,3,4,5,6,7,8,9,10}の要素で、Aが{3,4,5,6}、Bが{5,6,7,8}なら

setX = [1..10]
setA = [3..6]
setB = [5..8]

[x | x <- setX, x `elem` setA || x `elem` setB]
(Haskellは変数名の初めに大文字使えない)

これがCで配列縛りだとreallocでも使いながらなんじゃろか。。。
0818 ◆QZaw55cn4c
垢版 |
2018/12/12(水) 20:48:43.83ID:5ElL+qNp
>>816
>純粋に数学だけで解けて解法の式を作ったら、あとはコードにベタ書きしてただ解を出力するだけ、
それは甘い、大甘だと私の経験は私の心に語ってくれています
0819 ◆QZaw55cn4c
垢版 |
2018/12/12(水) 20:49:58.51ID:5ElL+qNp
>>817
そういう問題はある種の順序関係を仮定してインプリメントしたいところです
0821デフォルトの名無しさん
垢版 |
2018/12/13(木) 00:26:45.67ID:ilwXN+sT
>>817 Squeak/Pharo Smalltalk

| X A B |

X := 1 to: 10.
A := 3 to: 6.
B := 5 to: 8.

X intersection: (A union: B) "=> #(3 4 5 6 7 8) "
■ このスレッドは過去ログ倉庫に格納されています