X



プログラミングのお題スレ Part9 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2016/12/01(木) 16:58:30.97ID:gTkHDluD
プログラミングのお題スレです。

前スレ
プログラミングのお題スレ Part8©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1444216746/

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

2 名前:デフォルトの名無しさん
  >>1 使用言語
  回答本文

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

宿題は宿題スレがあるのでそちらへ。
0483デフォルトの名無しさん
垢版 |
2017/09/19(火) 03:58:59.82ID:KVkpgN/c
tan1°が無理数であることの証明すら面倒くせえのに一体どんな回答を求めているんだ
0486デフォルトの名無しさん
垢版 |
2017/09/19(火) 08:13:59.26ID:Ten4kOds
いや、おれは出来るよ

>>483の実力で出来るのか?と疑問に思っただけ
実力じゃなくてカンニングね
0488デフォルトの名無しさん
垢版 |
2017/09/19(火) 08:49:35.38ID:q1kL6yRz
問題が悪いな

与えられた有理数rに対し、
tan(πr)が有理数かどうか判別するプログラムを書け

ならテーブルは使えない
0492デフォルトの名無しさん
垢版 |
2017/09/19(火) 12:53:02.28ID:RSOddfRB
そもそも出題者はどういう回答を期待してるんだ?
数学の知識無しでは作れないし、数学の知識を使えば>>478になる
0493デフォルトの名無しさん
垢版 |
2017/09/19(火) 14:38:36.12ID:LvSRuVZD
tan()の加法定理
 tan(α+β)=(tanα+tanβ)/(1-tanαtanβ)
により

もしtan(α)が有理数なら
tan(nα) (n = 1,2,3,4・・・)
も全て有理数

このため
整数nにより
tan(n)が無理数なら
nの約数全てによるtan()が無理数

ここで
tan(60)=√3
が無理数なのは簡単に証明されるため、
tan(1)
も無理数

証明終わり
0499デフォルトの名無しさん
垢版 |
2017/09/19(火) 22:25:08.25ID:FbLYus+p
>>492
WolframAlphaが
is tan(pi * 1 / 180) a rational number?
→ not a rational number
と返す仕組みを知りたかった
0501デフォルトの名無しさん
垢版 |
2017/09/20(水) 14:48:00.57ID:jgmli1ek
>>493
は加法定理で(1-tanαtanβ)が0になってはまずいので
0度以上90未満の範囲内に限定しないといけないな。


tan()の加法定理
 tan(α+β)=(tanα+tanβ)/(1-tanαtanβ)
により

もしtan(α)が有理数で、かつ 0 <= nα < 90なら
tan(nα) (n = 1,2,3,4・・・)
も全て有理数

このため
整数 n ( 0 <= n < 90 ) により
tan(n)が無理数なら
nの約数全てによるtan()が無理数

ここで
tan(60)=√3
が無理数なのは簡単に証明されるため、
tan(1)
も無理数
0502デフォルトの名無しさん
垢版 |
2017/09/20(水) 14:51:06.46ID:jgmli1ek
tan(1)だけじゃなくて
>>477 >>478 も証明できるかな???

つまり整数 n ( 0 <= n < 90 ) において
tan(n)が有理数になるのはn=0,45に限ることの証明

tan(90-n) = 1/tan(n) なので
n ( 0 <= n < 45 ) の範囲で証明されればOK

またtan(45)が有理数で加法定理で減算し
 tan(45-n):有理数 ⇔ tan(n):有理数 ( 0 <= n < 45 )
も成立
0503デフォルトの名無しさん
垢版 |
2017/09/20(水) 14:51:42.84ID:jgmli1ek
60の約数 はtan(n)無理数
1,2,3,4,5,6,10,12,15,20,30

これの45-n もtan(n)無理数
44,43,42,41,40,39,35,33,25,15

この約数で、まだ含まれていないもの
11,22,21,8,13,7

45-nにより
34,23,24,37,32,38

この約数で、まだ含まれていないもの
17,16,19

45-nにより
28,29,26

この約数で、まだ含まれていないもの
14

45-nにより
31

ここまでの数を並べると
01,02,03,04,05,06,07,08,**,10,
11,12,13,14,15,16,17,**,19,20,
21,22,23,24,25,26,**,28,29,30,
31,32,33,34,35,**,37,38,39,40,
41,42,43,44

9度の倍数の証明のみが残された
0509デフォルトの名無しさん
垢版 |
2017/09/21(木) 16:21:06.33ID:na02B6ss
[1] 授業単元名:FizzBuzzクイズ
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: (Windows/Linux/等々)特に問わない
 [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)特に問わない
 [3.3] 言語: (C/C++/どちらでも可 のいずれか)特に問わない

http://kohada.2ch.net/test/read.cgi/prog/1209467166/401
FizzBuzzクイズ

1.fizz.buzz #=> 1
3.fizz.buzz #=> "Fizz"
5.fizz.buzz #=> "Buzz"
15.fizz.buzz #=> "FizzBuzz"
999.fizz.buzz #=> 999

となるようなメソッドfizz、buzzは定義可能か?
可能である場合、同様にgizzを追加定義し、
7.fizz.buzz.gizz #=> "Gizz"
21.fizz.buzz.gizz #=> "FizzGizz"
35.fizz.buzz.gizz #=> "BuzzGizz"
105.fizz.buzz.gizz #=> "FizzBuzzGizz"
105.fizz.gizz.buzz #=> "FizzGizzBuzz" と拡張・応用ができるか?

メソッドのコールに()が必須の言語では 3.fizz().buzz() 形式でも構わない。
オープンクラス機構やメソッドのない言語では関数(buzz(fizz(3)) #=> "Fizz" など)で。
0516デフォルトの名無しさん
垢版 |
2017/09/22(金) 09:43:07.90ID:eeRMTLx0
外部出力を伴う関数(あるいはメソッド)なら簡単
たぶん関数(あるいはメソッド)の返値がそうなるようにって意味かと
(じゃないと普通に書けてクイズにならない)
たしか数理学的にはこういう関数は書けないことになっていたはず
0519デフォルトの名無しさん
垢版 |
2017/09/22(金) 12:51:02.25ID:qmG6L9xB
C言語だとトリッキーな技を使わないと出来ない
同じ関数名で複数関数を作れないから
2段や3段重ねて、intを受けて文字列を返すのは普通には無理

C++だと簡単
大きく分けて2つの方法がある

C++でも数値によって戻り値の型を変えるのは無理
数値がconstexprで良いなら出来るだろうけど
0521デフォルトの名無しさん
垢版 |
2017/09/22(金) 16:30:21.56ID:W1Y66+yK
>>520
関数インターフェース的にはその値を与えることが出来ない

別の関数か何かで変えるかインターフェースを変えるしか
0522デフォルトの名無しさん
垢版 |
2017/09/22(金) 16:41:43.04ID:W1Y66+yK
>>516
戻り値を文字列にする方法

方法1
段階によって引数と戻り値の型を変える
S1 fizz(int n);
S2 fizz(S1 s);
std::string fizz(S2 s);
※テンプレートを使うと楽

方法2
戻り値をstd::string固定にしてなんとかする

方法2-1
戻り値は常に結果の文字列にし、パラメーター以外で情報を渡す
方法2-2
文字列に情報をエンコードして入れる
最終型段だけ結果を返すようにする

方法3
戻り値を結果文字列そのままではなく、文字列情報を含む情報とする
(これは反則かな?)
0523デフォルトの名無しさん
垢版 |
2017/09/22(金) 16:44:03.80ID:W1Y66+yK
方法2-1であれば >>520の問題は解決する
ただし、そのままだとスレッドセーフじゃなくて気持ち悪い
0525デフォルトの名無しさん
垢版 |
2017/09/22(金) 18:17:47.82ID:eeRMTLx0
例えばRubyだと文字列を含め組み込み型にインスタンス変数を仕込めるので
たぶんそれで次のメソッドに情報を渡せる
0526デフォルトの名無しさん
垢版 |
2017/09/22(金) 19:04:29.86ID:FtjqsiSd
>>522 の方法2-1
C++版
https://ideone.com/ZavKGg

外部情報は「n」のみ
複数スレッドや割り込みハンドラからコールする時はこのnが問題になるんで
なんとかしてstd::stringに埋め込めれば良いんだけど

>>525
問題を変えちゃダメだよね
> [3.3] 言語: (C/C++/どちらでも可 のいずれか)特に問わない
0527デフォルトの名無しさん
垢版 |
2017/09/22(金) 19:08:43.22ID:FtjqsiSd
8行目、なんとなく文字列から判別してみたけど、
素直にnと同じように外部にフラグを持てば条件が減る
(文字列の最後が数字にならないとか文字コードが連続してるとか)
0528デフォルトの名無しさん
垢版 |
2017/09/22(金) 19:09:11.03ID:pX6TouLp
「(C/C++/どちらでも可 のいずれか)特に問わない」って日本語がまず謎
有限個の具体例しか与えられていないので仕様も謎
0529デフォルトの名無しさん
垢版 |
2017/09/22(金) 19:26:24.34ID:FtjqsiSd
出題者の選択枝が [C/C++/どちらでも可] の3個あって、出題者がその「いずれか」を選ぶ
というフォーマットを使った出題
出題者は回答者に対し『その3個のどれでも良いよ』という意味で「特に問わない」と

と私は解釈した
つまり、回答者の選択枝はCかC++のどちらかだと

出力する文字列のルールはリンク先を見れば大体わかる
gizzが7の倍数かどうかは実際には不明で、実は14で割ると7余る数かもしれないが...

リンク先に「プリントする」とあるので
printfなどで標準出力に出せば良いのかと思ったが、
>>516の解釈は違うらしい

数値の場合だけ""でくくってないので、
文字列の場合は""をくっつける必要があるのか、
型を変えろと言っているのかはよくわからん
いずれにしろ、CやC++では値によって戻り値の型を変えるのは不可能
0531デフォルトの名無しさん
垢版 |
2017/09/22(金) 19:33:47.07ID:eEMHecr4
>>529
>回答者の選択枝はCかC++のどちらかだと
いや、そうじゃなくて、本当に「特に問わない」、どういったらいいかな、このテンプレはC宿題スレのものを、そのまま頂戴しただけじゃない?
0534デフォルトの名無しさん
垢版 |
2017/09/22(金) 19:43:00.43ID:pX6TouLp
>>529
なるほど
.gizzは、与えられた数字に対してfizzbuzzが数字になるなら"Gizz"、
それ以外の場合は所定の位置(説明省くけど)に"Gizz"を挿入するものなのかと思ってたわ
0535デフォルトの名無しさん
垢版 |
2017/09/22(金) 19:51:22.72ID:FtjqsiSd
確かに
7の倍数じゃなくて1の倍数でも良いよな
たまたま >>509 の例がすべて7の倍数になってただけで

この場合、上にあげた3個のコードいずれも
7 を 1 に変えてくださいな
0537デフォルトの名無しさん
垢版 |
2017/09/22(金) 20:00:08.36ID:eEMHecr4
え゛
0点の出題だしー模範解答の質も推して知るべし、なんじゃないでしょうか……:−)
0538デフォルトの名無しさん
垢版 |
2017/09/22(金) 20:35:12.69ID:aD9oWCn2
>>526
↓この但し書きがあるってことは、問題作成者(≠出題者)としてはC/C++限定とは考えてはいないだろう

> メソッドのコールに()が必須の言語では 3.fizz().buzz() 形式でも構わない。
> オープンクラス機構やメソッドのない言語では関数(buzz(fizz(3)) #=> "Fizz" など)で。

そもそもここで出題する時点で [3] の縛りは意味をなさないよ
0540デフォルトの名無しさん
垢版 |
2017/09/22(金) 20:47:11.96ID:W1Y66+yK
と思って私は回答しましたが、
他の人が他の解釈で回答することまで否定はしません
0546デフォルトの名無しさん
垢版 |
2017/09/23(土) 11:25:56.13ID:7PRDVMsP
ネタバレになるけど
このクイズはグローバル変数を使えばそれで済んでしまうシンプルな話なんだけど、それをあえて
- 各言語の機能を熟知・駆使して、面白くしたりひと工夫したりする(たとえばスレッドセーフとか)
- 前者のしくみと、7の倍数のgizzの拡張に必要な追加を最小限にすることを両立させる
というポイントが楽しみどころなんじゃないかな
0550デフォルトの名無しさん
垢版 |
2017/09/23(土) 18:26:18.44ID:80k6Tqnu
関数の入出力の型が同一である必要がある
Cならintをchar*と解釈するわけにいかないから構造体だろう
0552デフォルトの名無しさん
垢版 |
2017/09/23(土) 22:51:39.70ID:PEiEI8OX
>>509 Squeak Smalltalk だけどなんとか >>547 っぽい方法で

| FizzBuzzQuiz |
FizzBuzzQuiz := Trait named: #FizzBuzzQuiz uses: #() category: 'FizzBuzz-Quiz'.
FizzBuzzQuiz compile: 'isDivisibleBy: m
  ^(Processor activeProcess environmentAt: #fbValue) isDivisibleBy: m'.
FizzBuzzQuiz compile: ', str Processor activeProcess environmentAt: #fbValue put: self. ^str'.

FizzBuzzQuiz compile: 'fizz ^(self isDivisibleBy: 3) ifTrue: [self, ''Fizz''] ifFalse: [self]'.
FizzBuzzQuiz compile: 'buzz ^(self isDivisibleBy: 5) ifTrue: [self, ''Buzz''] ifFalse: [self]'.

{Number. String} do: [:each | each uses: FizzBuzzQuiz].

1 fizz buzz. "=> 1 "
3 fizz buzz. "=> 'Fizz' "
5 fizz buzz. "=> 'Buzz' "
15 fizz buzz. "=> 'FizzBuzz' "
14 fizz buzz. "=> 14 "

FizzBuzzQuiz compile: 'gizz ^(self isDivisibleBy: 7) ifTrue: [self, ''Gizz''] ifFalse: [self]'.

7 fizz buzz gizz. "=> 'Gizz' "
21 fizz buzz gizz. "=> 'FizzGizz' "
35 fizz buzz gizz. "=> 'BuzzGizz' "
105 fizz buzz gizz. "=> 'FizzBuzzGizz' "
105 fizz gizz buzz. "=> 'FizzGizzBuzz' "
0556デフォルトの名無しさん
垢版 |
2017/10/15(日) 20:26:14.16ID:12RNBD+4
過去問を眺めていたが、もっとお気楽な問題が多かったようですね
肩慣らし問題を一つ

問題
循環小数を有理数に直せ。
循環節は括弧をつかって表現する。


0.[555] = 5/9
0.3[33] = 1/3
12.[345] = 4111/333
1.2[34] = 611/495
0562デフォルトの名無しさん
垢版 |
2017/10/18(水) 11:15:59.21ID:xwRaz5Kx
>>560
おお。そういう法則で行けるのか。
きっと数学では大昔に証明されてるんだろうけど知らなかった。(または忘れたのかなあ?)
0563デフォルトの名無しさん
垢版 |
2017/10/18(水) 11:35:57.38ID:bG8m3FQp
ああ。なんとなくわかった。10の桁数乗の値で割るとそっくりそのまま小数点以下になるが
1足りないから循環するのか。ああ、しかし、数学的にどう表現したらいいかわからない。w
0564デフォルトの名無しさん
垢版 |
2017/10/18(水) 15:51:59.37ID:+Osy4cjh
お題:顔文字(^o^)があります。この(^o^)を左右に動かしながら出力します。(^o^)は左から右へ一文字ずつ動き、端に到達した瞬間だけ(^o^)から(>_<)に変化し、また(^o^)に戻って左端へ行き、同じように繰り返します。
端から端までは最初80文字分の幅がありますが、(^o^)が端に達した回数だけ1文字ずつ狭くなっていき、最終的に(^o^)の端まで狭くなり、(^o^)が動けなくなります。(^o^)が動けなくなったらプログラムを終了してください。
0565デフォルトの名無しさん
垢版 |
2017/10/18(水) 17:36:32.86ID:jSYDae9q
>>564 Bash (builtins)
https://ideone.com/KFko4s

幅80文字だと出力が長くなりすぎて途中で切られるので50文字にしました。
0566デフォルトの名無しさん
垢版 |
2017/10/18(水) 19:53:42.77ID:4F2aMcKp
ウインドウズでエスケープシーケンス扱うのにおまじないいるからメンドクセー。
0567デフォルトの名無しさん
垢版 |
2017/10/18(水) 21:05:28.73ID:xwRaz5Kx
>>564
改行せずにカーソルを先頭に戻すのは CR (13) の出力で良いのか?
それとも curses ライブラリを使うべきか?
0569デフォルトの名無しさん
垢版 |
2017/10/19(木) 03:35:28.31ID:CNJYIyj0
じゃ、とりあえず CR 出力版。Perl プログラム。
但し、待ち時間入れないと速すぎて見えないので適当に usleep を入れた。
テストした環境は Linux で端末は Windows の TeraTerm。
TERM=xterm の状態。

但し、プログラムを貼り付けたサイト(paiza.io)での出力はおかしくなる。
何故なら端末として動いてないから。
試したい場合はプログラムをコピーして自分の環境のエディタ等にペーストして保存後に実行して。

https://paiza.io/projects/rQDCQizcsrydlcrkxylR1w
0571名無しさん@そうだ選挙に行こう! Go to vote!
垢版 |
2017/10/22(日) 11:49:54.00ID:/Umsqxkx
お題:A〜Z、1〜9で出来たランダムな文字列がある(文字列はプログラム開始時に自動的に決めてよい)
キーを2つ決めて(←→キーが自然かも)例えば→キーを押すと、文字列のうち2〜9があるか
どうかを調べ、あればそのうち一つをランダムに選び、数字を一つ減らし(9なら8へ)、左右ランダムに
1を置く
つまり2以上の数字文字があればそこがゴムのような役目をして文字列が伸びる
全部の数字文字が1になったら何もしない

逆に例えば←キーを押すと、文字列のうち1〜8があるかどうかを調べ、そのうちランダムに一つを
選び、その左右どちらかに数字文字がないかを調べ、足した合計が9を超えないようなら足し合わせて
数字文字をその合計値にし、文字列を1つ縮める
足し合わせた合計が9を超えるようなら他の数字文字もランダムに同様に一つ選び、足し合わせて
9を超えない数字文字の部分が見つかったらそれを一つだけ足し合わせて縮める

全部の数字文字が9になるか、9に満たないが足し合わせると9を超えるようになったら何もしない
0572デフォルトの名無しさん
垢版 |
2017/10/23(月) 04:21:48.29ID:sHZ1Pe4U
>>571
https://ideone.com/pjZbOc
C++。デバッグ難しくてやる気がしないのでバグってるかも。
カーソルキー取るの面倒だからASキーにしておいた。
こんな感じでいいのか?

何のシミュレータかしらんけどめんどくせーな。
0573デフォルトの名無しさん
垢版 |
2017/10/23(月) 04:35:24.25ID:sHZ1Pe4U
あ、それと、文字列で計算するのめんどくさかったから、数字でやった。
そっち事情なんか知ったこっちゃない。
0574デフォルトの名無しさん
垢版 |
2017/10/23(月) 05:46:30.69ID:iFI38Dlw
%%%%1000%%%%

000-[HUM%58*73.1\%]/2I/3NM/61.3SNMK%?%3%51.22222222222221%
001-[[[%6/4$17.6135412α3]]]]+DOM+SIL+7%
002-UML7%[61.2[31.5[!%32∂LM17.36%!16.3!%<<<%!HSTOL7%!Q!S!=3m=<2TOL<3Q9A<2.1GHz%,DOK,HAOARA,
003-[[[HEMLOT47[<\41.2%Q,===>[MLS<DPNO<\2.3>#ESOLA!5%!3MLA!>LTOSA>7TONSA>%>%end
■ このスレッドは過去ログ倉庫に格納されています

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