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

■ このスレッドは過去ログ倉庫に格納されています
2021/06/19(土) 00:02:57.84ID:MQWrKSb7
プログラミングのお題スレです。

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

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

※前スレ
プログラミングのお題スレ Part19
https://mevius.5ch.net/test/read.cgi/tech/1606662245/
2022/01/08(土) 18:45:49.69ID:qvdwzZse
>>481
>binary64を二つ使って、上位53ビットと下位53ビットとで106ビットの浮動小数に見立てたものが
>double-double演算です。
現在検討中ですが、binary64 中には仮数部に使用できるビット幅は 52 bits しかありません。つまりケチビット表現です
53+53 とのことですが、実際には 53 + 52 = 105 しか格納できないのではないでしょうか?
511464
垢版 |
2022/01/08(土) 21:07:22.52ID:Xrz2Tlot
>>510
上位の±1/2ulp相当が下位になります
512デフォルトの名無しさん
垢版 |
2022/01/09(日) 01:28:46.61ID:/FHAAuzb
>>509
perlでワンライナー。入力は標準入力からする。

perl -MPOSIX -ne 'chomp;$n=$_?2**floor(log($_)/log(2)):0;print "$n\n"'

でも、こんなので良いの?自分ではほとんど何も考えてないんだが。
(log2()がないからlog(n)/log(2)でやるって所ぐらいしか工夫がない)
2022/01/09(日) 07:56:15.63ID:9G1CcY2f
>>509 C++
環境+コンパイルオプション依存 little endian, double = 64bit, long double = 128bit

double fl2( double x )
{
*( (uint64_t*) &x ) &= 0xFFF0000000000000LLU;
return x;
}

long double fl2( long double x )
{
*( (__uint128_t*) &x ) &= *( (__uint128_t*)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF" );
return x;
}
2022/01/09(日) 07:59:19.16ID:+WoQnCHD
2進表記した時に先頭のビット以外を0にすればいいだけだがワンライナーで書ける気がしない
2022/01/09(日) 08:00:08.09ID:+WoQnCHD
先頭のビットというより「(存在するなら)0じゃない一番位の大きいビット」だな
2022/01/09(日) 08:27:45.00ID:Gu7/igUi
ビットいじる方法だと、非正規化数が0に、NaNが無限大になる
そういえば、無限大やNaNはどうすればいいのだろうか
517509
垢版 |
2022/01/09(日) 09:16:00.82ID:42F2CcU6
Python
でかい値だとうまくいかないやつ

def foo(x):
_c = x * float(2 ** 52 + 1)
_xh = c - (c - x)
_if xh > x: return(xh * 0.5)
_return(xh)

>>516
深く考えてませんでしたw
518509
垢版 |
2022/01/09(日) 09:53:47.91ID:42F2CcU6
>>512
log2(n)をlog(n)/log(2)で近似した際の「誤差」
(ぴったり整数値になって欲しいのにそれよりも数ulp小さい値になったとか、
数ulp大きくて、ぎりぎりfloor()で切り捨てられる筈の値が1大きくなったとか)
を補償するコードが欲しい。
519デフォルトの名無しさん
垢版 |
2022/01/09(日) 15:38:39.37ID:DwVfG/qv
そこは性能とトレードオフになるしかない気はする
例えばfloor( log 32 / log2 ) = 5が使用上の動作だけど
log 32/log2 =4.9999999999978 × 10^0が返されて答えが4になってしまうのを避けるならおそらく大きすぎる場合は無視していいから
res' = floor( log x / log2 )
if (2^res'* 1.5) < x
// (1.5倍でも届かないなら不当な丸め誤差が出たと判断)
then res = res' + 1
else res = res'
とかちょっと汚い書き方するしかない希ガス
520デフォルトの名無しさん
垢版 |
2022/01/09(日) 21:50:51.38ID:sZC3oXej
なんか変なこと書いた

res' = floor( log x / log2 )
if 2^res' < x
then res = res' + 1
else res = res'

やな
res'の算出で丸め誤差は-1までと仮定して補正する
しかしもちろんlog(x)とか2^nハード的にFPUとかで高速にやってくれてしかも整数演算は誤差なしでやってくれる前提
この辺は高級言語プログラマレベルの話でなんとかなるもんではない
やるならアセンブリ言語レベルでやるしかない
2022/01/10(月) 00:03:40.12ID:gj6cLR2i
>>509 C
https://ideone.com/5kDuzA
非正規化数、NaN、無限大とかはそのまま返すようにした
やり方は>>513と変わらない
522509
垢版 |
2022/01/10(月) 00:53:57.15ID:MGxmK4tZ
いまどきのコンパイラなら、frexp()やldexp()をいい塩梅に最適化してくれるのだろうか?

from math import frexp, ldexp
def foo(x):
_m, e = frexp(x)
_if m == 0: return 0.0
_return ldexp(0.5, e)
523512
垢版 |
2022/01/10(月) 01:47:47.54ID:av6tewvz
>>509
またPerlでワンライナー。

perl -ne 'chomp;if($_<=0){print"0\n"}else{for(my$i=0;;$i++){if((1<<$i)>$_){print 1<<($i-1),"\n";last}}}'

今度は計算している内容から考えて結果が同じになるようにした。浮動小数点演算をしていない。
また整数値が何ビットであるかも考慮しておらず、Perlの整数が32bitだった場合は2^32以上の値を入力されたら多分うまく動かない。
当然64bitだったら2^64以上の値の入力で多分うまく動かない。
524509
垢版 |
2022/01/10(月) 02:23:50.20ID:MGxmK4tZ
>>522の修正
from math import frexp, ldexp
def foo(x): return 0.0 if x == 0 else ldexp(0.5, frexp(x)[1])
525デフォルトの名無しさん
垢版 |
2022/01/10(月) 03:27:40.49ID:av6tewvz
>>509
またまたPerlでワンライナー。

perl -MPOSIX -ne 'chomp;if($_==0.0){print"0\n"}else{print ldexp(0.5,(frexp($_))[1]),"\n"}'

これは>>524の真似(ていうかやってること同じ)。
2022/01/10(月) 12:43:53.01ID:SgLm6fjp
>>511
それは答えになっていないかと
質問を変えます。下位側の指数部も意味を持つようにインプリメントするべきでしょうか?
527464
垢版 |
2022/01/11(火) 02:38:04.94ID:i2HiBm5J
>>526
先人の実装例だと、
上位 + 下位 = double doubleの数値
という事になってますね(上位側の指数が決まると、下位側の指数も決まる)。
tps://na-inet.jp/na/qd_ja.pdf

勿論、そう実装しないのもあり。
2022/01/11(火) 03:06:24.10ID:Y9TTYX77
>>527
となると、
>>510
>binary64 中には仮数部に使用できるビット幅は 52 bits しかありません

よって下位側指数部無視なら 53bit + 52 bit = 105bit の実装となりますが?
下位側指数部有意ならば、下位側にもケチビットを適用できますが、今度は仮数部が 106 ビットとはいいきれなくなりますね(数によって変わる)
2022/01/11(火) 03:08:13.70ID:Y9TTYX77
>>527
失礼 pdf が紹介されていることを見落としていました、精査します、紹介ありがとうございます
530デフォルトの名無しさん
垢版 |
2022/01/30(日) 18:02:46.10ID:Np8aVX2s
お題: 1より小さい実数を1以上2より下にせよ

< 0.123
> 1.23

< 0.0000123
> 1.23
2022/01/30(日) 18:25:00.85ID:A8jovols
>>530

x / 10^[log10(x)]
2022/01/30(日) 20:39:55.64ID:DZg7owi9
お題: 質量0.2 kgの直方体の物体が摩擦のある水平な床の上にある。
物体の初速を右向きの0.5 [m/s]とすると、物体は転倒することなく底面が床に接したまま、約x秒後に自然停止した。xより垂直抗力F[N]と動摩擦係数kを求めよ。
重力加速度を 9.8 [m/s^2]とする。
2022/01/30(日) 20:58:19.92ID:DZg7owi9
お題(HTML/JavaScript): ユーザがGoogleから訪問した場合は、3秒間ブラウザを停止させるようにせよ。
2022/02/01(火) 07:45:34.60ID:/+irRzAS
>>530
負の数や2以上の数は?
2022/02/01(火) 16:02:38.13ID:zoPPBktH
>>534
・・・!
536デフォルトの名無しさん
垢版 |
2022/02/01(火) 18:02:38.08ID:zoPPBktH
お題: -1 < n < 1 の実数nを-10 < m < 10の実数m(ただし1桁目が0を除く)に桁上げせよ(>>530の改良)

< 0.123
> 1.23

< -0.00056
> -5.6
2022/02/01(火) 20:01:29.11ID:TQ6+L4kb
負だったらabsolute取るだけのことじゃん
538デフォルトの名無しさん
垢版 |
2022/02/01(火) 23:48:43.79ID:/+irRzAS
>>536
perl

ワンライナー。以下はbashのコマンドラインから実行して試した。
入力は標準入力で一つづつ改行する。

perl -ne 'chomp;$n=$_;while(int(abs($n))<1){$n*=10}print "$n\n";'

やってることは見ての通り殆ど何も考えず10倍し続けるだけ。
2022/02/21(月) 17:49:01.62ID:QCKFV9kK
もうすぐ22日、今年は "22/2/22"といつもより多め
[お題] 偶数ゾロ目

URLのページに都道府県別の人口が載っている。
 URL: https://ideone.com/2w86hj
 今回使用するのは、2020/10のデータ

 同じ県は一回のみで、異なる県を 22 県選らぶ。
 (単純な選び方は全部で NCR(47, 22) = 約14.8兆通り)
 整数A,Bが与えられる(1<=A<=B<=1億)
 選択した22県の人口合計が A以上B以下となるのは何通りか?

1) 44444444 44444444 --> 214209
2) 22222222 44444444 --> ?
3) 44444444 66666666 --> ?

※上の三問を全部で5秒程度で
 想定解はあるが、もっとスマートな方法がありそう
 「またか」と思った人、以前の問題とは想定解はかなり違う
540デフォルトの名無しさん
垢版 |
2022/02/23(水) 19:08:44.10ID:jKeAH0Dy
>>536
やぱしn==0は除外?
2022/02/24(木) 00:35:12.16ID:5B3hmiET
>>540
一桁目が0は除外してね
542デフォルトの名無しさん
垢版 |
2022/02/24(木) 08:38:30.17ID:GiducjAN
難しい、こんなの小学生が解けるのか?

今年の中学受験の算数で一番の良問がこれらしい [976717553]
https://hayabusa9.5ch.net/test/read.cgi/news/1645558073/
543539
垢版 |
2022/02/25(金) 17:25:00.82ID:STd/IFZD
>>539
旬だと思って出題

https://ideone.com/2w86hj 下部に追加

半分全列挙 + 尺取り法

早い言語でしかできない解答例でした
2022/02/25(金) 19:14:08.69ID:RZ7O9d2K
>>543

時間取れなくてやれてないが季節感あるネタ好き
545デフォルトの名無しさん
垢版 |
2022/02/26(土) 19:41:18.44ID:4VT1Qgxn
haskellでやったらやっぱり5秒はきつかった
2022/02/27(日) 02:34:25.32ID:VdMMR1Xg
お題: RustかGoでバイナリーサーチを実装してください
2022/03/20(日) 12:30:16.47ID:nN0Ys+dW
お題: トライ木を使ってサジェスト機能を実装してください

$ prog
> w
world
would
will
wish

辞書は任意の大きさとする
入力は英語、または日本語とする
2022/03/20(日) 19:32:45.03ID:Ycqbgo6j
>>545
なんかHaskellってGHCのオプションに-O2とか指定すれば結構早くなった記憶がある
あとListじゃなくVector使うとか
2022/03/20(日) 19:41:12.56ID:sy393qRd
お題 バッタの大冒険
 a(1),a(2),⋯,a(n) を相異なる正の整数とし、M を n-1個の正の整数からなる集合と
する。また、M は s=a(1)+a(2)+⋯+a(n) を含まない。数直線の 0 の地点にいるバッタが
数直線の正の向きに n 回ジャンプする。 n 回のジャンプの距離は a(1),a(2),⋯,a(n) の並べ替えである。このとき並べ替えをうまく選べば、バッタがM の要素に対応するn-1点に一度も着地しないようにできることを証明せよ。

↑数学オリンピックの問題
もちろん証明はどうでもよろしい
お題は(ジャンプの幅のリスト、禁止点のリスト)から禁止点を交わしていく飛ぶ順を見つけるプログラムを実装せよです

入力
([3,5,8],[5,10])
出力
[8,5,3] #着地するのは8,13,16で禁止点5,10をかわしている

入力
([5,6,8,10,13,15],[2,18,24,29,45])
出力
[15,13,10,8,6,5] #着地するのは15,28,38,46,51で全ての禁止点をかわしている

入力
([3,26,30,32,36,44,53,62,68,82],[36,40,59,79,92,126,178,233,394])
出力
[82,68,62,53,44,36,32,30,26,3] #同文
2022/03/20(日) 21:13:54.18ID:yn4DTgXG
2番目の例着地するのは
15,28,38,46,52,57
ですた
2022/03/22(火) 20:44:30.68ID:0IfoPmot
>>549
は数学の問題としても面白いけどココはプログラムのお題スレなのでアルゴリズムそのもの考えるのは嫌な人のためにアルゴリズムひとつ紹介しておきます
以下の探索で線形オーダーで解を見つけられます
自分で考えたい人は無視してください

以下aを最大ジャンプとします
a=a(n)としておく

(A)一回目を最大ジャンプで飛んだとして最初の禁止点に届かないかギリギリ届くとき

一回目のジャンプが最大ジャンプしたと想定して残りのn-1回ジャンプで最初の禁止点を無視したn-2個の禁止点を交わしたジャンプ順b(1)...b(n-1)を作る
この順番でとんて行って最初に最初の禁止点をi回目に超えたとする
解のジャンプとして
b(1),b(2),...,b(i-1),a,b(i),...,b(n)
とすると全ての禁止点をかわしている

(B) 一回目を最大ジャンプで飛んだとすると最初の禁止点を超えて、しかも禁止点以外に着地できるとき

一回目のジャンプが最大ジャンプしたと想定して残りのn-1回ジャンプで最初の禁止点を無視したn-2個の禁止点を交わしたジャンプ順b(1)...b(n-1)を作る
解のジャンプとして
a,b(1),...,b(n-1)
とすると全ての禁止点をかわしている

(C) 一回目を最大ジャンプで飛んだとすると最初の禁止点を超えるが別の禁止点に着地してしまうとき

この状況だとa(1)〜a(n-1)のいずれかのジャンプa(i)でa(i)もa+a(i)のどちらも禁止点でないものが取れる( (∵) 全てのi:1〜n-1でa(i)かa+a(i)のどちらかが禁止点とするとこれだけでn-1個の禁止点全部尽くされてしまうけど、この中には最初の仮定である“一回目aで飛んだら禁止点”はこの中には出てこないので矛盾 )
それをa(n-1)としよう
最小の2回をa(n-1),a(n)と飛んだとしてこの時点で最初の禁止点と最初a(n)だと踏んでしまう禁止点の2点は超えているので残りの禁止点はn-3個以下しか残ってない
そこでa(1)〜a(n-2)をうまく並べ替えれば全部かわすことができる
552デフォルトの名無しさん
垢版 |
2022/05/03(火) 15:12:22.98ID:FP7f4hyR
問題がよくわからなくて解く以前の所で停止。そしてやる気消滅。
2022/05/03(火) 23:10:33.84ID:JwGzWANE
説明不足で申し訳ない
問題文は数オリの紹介サイトからそのままコピペしてきたのでわかりにくかったかもしれない

1番最初の例

([3,5,8],[5,10])

だとバッタは最初x=0の地点にいて+3,+5,+8のジャンプでx=16の地点に行こうとしている
しかしx=5,x=10の地点は着地禁止地点で着地できない
飛び方は全部で6通りあるがその中から禁止地点に着地しないものを選んで下さいという問題
3回くらいなら総当たりで答え出せるけどジャンプ10回禁止地点9ヶ所だと全数検索すると10!通り必要になって実用にならない
どうしますかというテーマだけどもちろん数学オリンピックの問題なので中々自分で答え出すのは難しい
でここは数学板ではないので同じ数オリサイトにあった解答を転記して「こんなアルゴリズムが知られているけどアルゴリズムをインプリメントできますか」がお題です
554デフォルトの名無しさん
垢版 |
2022/05/04(水) 00:16:07.90ID:0lMETj8q
お題: C/C++でスレッドセーフなstrtok関数を作れ
設計は各自で考えること
2022/05/04(水) 08:22:49.31ID:WTZHV9SY
政府公認のスカトロサークルだって!?じゅるり
2022/05/05(木) 02:33:11.33ID:FeY8iOM4
高度IT人材、富士通は最大年収3500万円へ

AI人材の獲得に超本気 NECが新人事制度を9人に適用、富士通は最大年収3500万円へ

【年収3500万円も】富士通、「ジョブ型」人事制度を導入 幹部社員から 高度IT人材

来年度から副業解禁 人材多様化へ―大同生命次期社長

第一生命HD、副業解禁 約1万5000人対象

第一生命HD、副業解禁 1万5000人対象―大手生保初

IHI、国内8000人の副業解禁 重厚長大企業も転機

IHI、社外兼業を解禁 社内副業もルール化
557デフォルトの名無しさん
垢版 |
2022/05/05(木) 16:49:02.33ID:SGcHNlDo
>>554
C言語

https://paiza.io/projects/xS5GP9DAU6KzhDsM6x7M6g

strtok_r() を strtok_r2() の名前にして自分で実装した。
strsep() も paiza.io のCのライブラリには何故かなかったので strsep2() にして自分で実装した。
2022/05/11(水) 08:28:38.45ID:zQqHPRjb
思い付きでお題考えてみた
検証してないんだけどどう?

お題: ランダムな部屋を移動する最短距離を求める

行列がある
任意の横幅Wと高さHで表現される部屋がランダムに1 <= N <= 5個生成される
この部屋を部屋内の座標からランダムに選択した別の部屋の部屋内の座標まで通路を作る
通路の要素は斜めには生成されず横と縦に生成される
通路はランダムに1つの部屋から0 <= R <= 3生成される

各部屋を各通路で繋げ任意の部屋Aと任意の部屋Bを選択する
このときAからBまでの最短経路を求めよ
2022/05/11(水) 10:03:08.65ID:u3pPN9f9
ランダムの部分いる?
2022/05/11(水) 19:40:13.01ID:RtJ1FIjP
日本語がよくわからんから数式で書いてくれ
2022/05/11(水) 19:57:58.11ID:dPHs0KwZ
数式だと答えになりそうだから図で書いてくれ
2022/05/17(火) 17:53:19.20ID:UVEhLnaE
さらに、閑古鳥をよびよせるか

[お題] 多倍長では無理!?
整数 S, T が与えられる。(1 <= S <= T <= 400万)
S以上T以下の(連続する)整数の最小公倍数(LCM)をもとめる
答えは, 1000000007(10億7)の余りで出力

1) 6 8 --> 168
6,7,8 の最小公倍数、LCM(6, 7)= 42 --> LCM(42, 8)= 168
2) 10 30 --> 89546497
剰余前は、2329089562800
3) 2567890 3456789 --> ?
4) 1 4000000 --> ?
2022/05/19(木) 21:03:46.76ID:f4mJcXLG
>>562

Haskell

https://ideone.com/dPbmse
2022/05/19(木) 21:16:43.90ID:bqW40Z5X
√T以下の素数列挙
各数を素因数分解して各素数の指数の最大を求める
10億7の剰余で上の乗算を行う
2022/05/19(木) 22:51:31.74ID:vGEyxbeO
>>562 C
https://ideone.com/IWOE9a
2022/05/20(金) 19:19:40.97ID:nM/DB7wD
>>562
https://ideone.com/O9PQbN

想定解としては、(他の人同様)
 求める最小公倍数を素因数分解した形に作るイメージ
 400万以下の"素数及び素数べき乗"は、高々28.3万件。
 S以上T以下で、素数べき乗が割り切れるかどうかチェックしている。
 (方法は T/素数べき乗 > (S-1)/素数べき乗 ならあると, O(1)判定)
 ボトルネックは素数を求める部分なので、手抜きしている。

余談)
・4)を多倍長で計算すると173万桁だった(一分程度ででた)
・10^9+7 ではなく、下9桁を出力だと、4)は 0になる(5^9が範囲にあるから)
2022/07/01(金) 10:06:17.68ID:GRk1+wVC
age
2022/07/01(金) 15:47:14.28ID:GJ0Vg4bO
お題: 循環リストを検出するプログラムを書け
2022/07/01(金) 19:58:00.80ID:il671KyI
循環リスト
の定義を書いてください
2022/07/02(土) 02:10:30.75ID:1mXsd8mZ
お題: 文字列が整数だったらINT, 実数だったらFLOATと出力するプログラムを作れ
変換できない場合はINVALIDと出力せよ

123 -> INT
1,234 -> INT
1.23 -> FLOAT
a123 -> INVALID
12abc -> INVALID
1.23.435 -> INVALID
571デフォルトの名無しさん
垢版 |
2022/07/02(土) 04:54:46.54ID:5fwFwNtd
>>570
Kotlin

自分ではほとんど何も考えていない脱力感溢れるプログラム

https://paiza.io/projects/EK5QmNc2f4MgmmMLM3FcrQ
2022/07/02(土) 05:51:46.20ID:y+j5RBoo
>>570 Ruby

f = -> s {
case s
when /\A(?:0|[1-9]\d*)\z|\A(?:[1-9]\d{0,2})(?:,\d{3})*\z/
:INT
when /\A(?:0?|[1-9]\d*)\.\d+\z/
:FLOAT
else
:INVALID
end
}

%w[123 1,234 1.23 a123 12abc 1.23.435 .142857 1. 0 01 1,234,567 1234,567].each{|s|
puts '%s -> %s' % [s, f[s]]
}

# =>

123 -> INT
1,234 -> INT
1.23 -> FLOAT
a123 -> INVALID
12abc -> INVALID
1.23.435 -> INVALID
.142857 -> FLOAT
1. -> INVALID
0 -> INT
01 -> INVALID
1,234,567 -> INT
1234,567 -> INVALID
2022/07/02(土) 05:58:59.35ID:At3W7bIA
>>570
こう言うのは仕様をちゃんと提示してよ
123.
123.0
12,34
はどうなればいいのか
2022/07/02(土) 08:08:58.00ID:syeRaQWQ
そんな文句みたいな言い方するほどか?
他の問題に比べたらケースちゃんと提示してる方だし
そういうのは想定してないってなんとなくわかるだろ
競プロならちゃんと定義必要だろうけど
2022/07/02(土) 08:09:44.82ID:syeRaQWQ
123.0は確かに気になるけど
2022/07/02(土) 09:41:42.13ID:At3W7bIA
>>574
> そういうのは想定してないってなんとなくわかるだろ
お題なんだから想定しろよ
でないとそのケースはそうじゃなくてこうすべきとか言う奴が出てきて荒れる元だし
2022/07/02(土) 09:58:04.16ID:dKfad4Z0
はい!
578デフォルトの名無しさん
垢版 |
2022/07/02(土) 09:58:41.88ID:COZLaCzb
123.0はfloatだろ常考
2022/07/02(土) 12:04:36.48ID:oDFjP9XJ
黙って実装して自分なりの仕様を提示するテストケースを追加して提出した>>572の勝利
2022/07/02(土) 14:55:56.14ID:w21fdpYM
>>579
激しく同意
2022/07/02(土) 15:40:39.43ID:ZFJdClOp
>>579
クールだよな
2022/07/02(土) 16:54:51.10ID:RqXE55Ja
>>570
こういうアホがソフト仕様を書くと悲惨
2022/07/02(土) 17:49:49.50ID:Vxz6zO/I
久々に出題者現れたかと思ったらフルボッコでかわいそう
2022/07/02(土) 18:03:20.65ID:+K04BJMF
もっと気楽にやれよ
普段ゴミみたいな案件で意を汲み取れず怒られ理不尽な思いしてる底辺コーダーが叩き行為で鬱憤晴らししたいんだろうけどさw
仕様の隙間をどうするかをこういったところで一般共通認識得るのは有意義
その議論を「荒れる」と捉えるのは違うでしょ
2022/07/02(土) 20:54:40.02ID:1mXsd8mZ
お題: 文字列が整数だったらINT, 実数だったらFLOATと出力するプログラムを作れ
変換できない場合はINVALIDと出力せよ
version 1.0.1

123 -> INT
1,234 -> INT
1.23 -> FLOAT
a123 -> INVALID
12abc -> INVALID
1.23.435 -> INVALID
.142857 -> FLOAT
1. -> INVALID
0 -> INT
01 -> INVALID
1,234,567 -> INT
1234,567 -> INVALID
123.0 -> FLOAT
2022/07/02(土) 23:37:34.43ID:12WH0HiU
>>568
https://ideone.com/WdXv5B
2022/07/03(日) 06:43:46.91ID:/5k6Ls0P
.142857がOKで1.がNG
なんか違和感
どの言語の流儀?

具体例だけに頼らないで
定義っぽく書けない?

----
[整数部]、[整数部].[小数部]、.[小数部] のいずれかの形
[整数部] : 0123456789の列1文字以上、もしくはこれを3桁ずつ,で区切った形
2桁以上の場合は先頭は0ではない
[小数部] : 0123456789の列1文字以上
....

こんな感じ
2022/07/03(日) 07:10:28.62ID:3/zKVKew
0.DDD を .DDD と表記するのは欧米では情報系に限らず日常よく見られること
CSSもperlも昔のrubyも対応してたんじゃなかったかな
2022/07/03(日) 09:01:07.02ID:udoKn6Zg
1. がNGなのは?
どこの流儀?
2022/07/03(日) 09:17:25.30ID:aLgpTdvv
>>584
> 仕様の隙間をどうするかをこういったところで一般共通認識得るのは有意義
だからその一般認識がないから揉めるって話
既に違和感と言い出す奴とか欧米ガーとか流儀ガーとか言い出してるだろ
エディタの宗教戦争と同じで正解なんてないんだからお題を作った奴が決めないと収拾つかんよ
2022/07/03(日) 09:24:18.29ID:3/zKVKew
>>590
1から10まで教えてもらえないとなんもできないのかよ
エディタ宗教戦争を例に出してるけどあんなのにガチに捉えてるバカはお前くらいだ
2022/07/03(日) 09:34:46.48ID:/kuq8Z/3
お題: 文字列が整数だったらINT, 実数だったらFLOATと出力するプログラムを作れ
変換できない場合はINVALIDと出力せよ
BNFは↓とする

INT: digit+
2022/07/03(日) 09:37:29.23ID:/kuq8Z/3
お題: 文字列が整数だったらINT, 実数だったらFLOATと出力するプログラムを作れ
変換できない場合はINVALIDと出力せよ
BNFは↓とする
version 1.0.2

int: digits
float: digits ('.' digits)?
digits: digit+
digit: [0-9]+
2022/07/03(日) 10:08:31.69ID:JHbRyeE7
>>591
ガチに捉えるもなにも今でもやってるだろw
2022/07/03(日) 10:15:42.92ID:JHbRyeE7
>>593
カンマとかはなくなってるけど、仕様変更ですか?
あと
digits: [0-9]+
にしてdigitをやめるか
digit: [0-9]
にした方がいいかと思いますよ
2022/07/03(日) 12:27:53.93ID:/kuq8Z/3
>>595

お題: 文字列が整数だったらINT, 実数だったらFLOATと出力するプログラムを作れ
変換できない場合はINVALIDと出力せよ
BNFは↓とする
version 1.0.3

int: comma_digit
float: comma_digit '.' digit* | '.' digit*
comma_digit: digit_123 { ( ','? digit_3 ) }*
digit_3: digit digit digit
digit_123: digit digit? digit?
digit: [0-9]

どや?完璧だろこのBNF
これで文句ないな
2022/07/03(日) 12:41:01.89ID:E32cFzvb
>>596
"1."、"01"、"1234,567" が INVALID になりませんし "." だけでも FLOAT になるのはどうかと思いますが...
2022/07/03(日) 12:54:46.68ID:/kuq8Z/3
>>597
お題: 文字列が整数だったらINT, 実数だったらFLOATと出力するプログラムを作れ
変換できない場合はINVALIDと出力せよ
BNFは↓とする
version 1.0.4

int: comma_digit
float: comma_digit '.' digit_09+ | '.' digit_09+
comma_digit: digit_123 { ( ','? digit_3 ) }*
digit_3: digit_09 digit_09 digit_09
digit_123: digit_19 digit_09? digit_09?
digit_19: [1-9]
digit_09: [0-9]

どや?
2022/07/03(日) 14:30:14.53ID:+vJDgzA0
勉強になる
2022/07/03(日) 15:35:40.90ID:VBJi0e3g
>>598
指摘された箇所すら直せないとかどう見ても向いてないからやめたら?
> "1234,567" が INVALID になりませんし
2022/07/03(日) 15:38:27.96ID:7UQlj4nA
ハズレ上司感
2022/07/03(日) 15:41:49.46ID:yV0MWMu9
>>570 ocaml
https://ideone.com/j9z2um
2022/07/03(日) 16:15:01.49ID:/kuq8Z/3
>>600
めんどくせ~な~
お前やれよ
2022/07/03(日) 16:24:52.83ID:/kuq8Z/3
>>600
version 1.0.5

int: comma_digit | normal_digit
float: ( comma_digit | normal_digit ) '.' digit_09+ | '.' digit_09+
comma_digit: digit_123 { ',' digit_3 }*
normal_digit: digit_19 digit_09*
digit_3: digit_09 digit_09 digit_09
digit_123: digit_19 digit_09? digit_09?
digit_19: [1-9]
digit_09: [0-9]

ていうか1234,567にはならんはずだぞ
2022/07/03(日) 16:30:18.21ID:/kuq8Z/3
>>600
version 1.0.6

int: comma_digit | normal_digit
float: ( comma_digit | normal_digit ) '.' digit_09+ | '.' digit_09+
comma_digit: digit_123 { ',' digit_3 }*
normal_digit: ( digit_19 digit_09+ ) | digit_09
digit_3: digit_09 digit_09 digit_09
digit_123: digit_19 digit_09? digit_09?
digit_19: [1-9]
digit_09: [0-9]

おら!完璧だろ!
2022/07/03(日) 17:25:11.12ID:bGSSCSEx
>>604
> ていうか1234,567にはならんはずだぞ
しれっと変えといてさすがにそれは恥ずかしいな
>>598> comma_digit: digit_123 { ( ','? digit_3 ) }*
>> 604 > comma_digit: digit_123 { ',' digit_3 }*

>>605
まあ、よしとしてやろう
2022/07/03(日) 20:20:25.60ID:H80x+Ni5
問題を解かずに出題の形式美に必死になるなんて、このスレ的にどうなのよ?
2022/07/03(日) 21:46:41.57ID:wwKaul6r
char buf[64];
fgets(buf, 64, stdin);
char *endptr;
strtol(buf, &endptr, 10);
if (*endptr == 0) {
puts("INT");
return;
}
strtod(buf, &endptr);
if (*endptr == 0) {
puts("FLOAT");
return;
}
puts("INVALID");
2022/07/04(月) 22:09:22.65ID:hLP3lYAM
>>570 dart
https://ideone.com/hT8xrN
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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