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

■ このスレッドは過去ログ倉庫に格納されています
2020/07/14(火) 13:53:46.47ID:jW5p6F/e
プログラミングのお題スレです。

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

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

※前スレ
プログラミングのお題スレ Part17
https://mevius.5ch.net/test/read.cgi/tech/1584031367/
2020/10/17(土) 01:58:38.41ID:S6LboNFt
>>695 Ruby
n = 20201016
nl = 0
while n > 0
nl = ((nc = (n.odd?)? nc + 1 : 0) > nl)? nc : nl
n >>= 1
end
puts nl
2020/10/17(土) 01:59:32.64ID:u2s9P3C4
>>702
125の時1になった
2020/10/17(土) 02:41:53.51ID:AbkDXvLA
これだからQZ
2020/10/17(土) 02:53:09.41ID:4JRxXuyk
>>695
C++: https://ideone.com/7H5HBx

>>702 にはロジックに欠陥がありました

>>704
ご指摘ありがとうございます。
707703
垢版 |
2020/10/17(土) 09:22:46.57ID:S6LboNFt
>>704
自分の >>703
- nl = 0
+ nc = nl = 0
2020/10/17(土) 12:19:37.13ID:a+zi+w45
>>695 C++
https://wandbox.org/permlink/udZVzwy6pQKbcPa5
2020/10/17(土) 13:46:27.15ID:eBu6AjRf
>>695 C
https://ideone.com/DwvfL2
2020/10/17(土) 18:57:16.23ID:S6LboNFt
>>695 Ruby
n = 20201016
i = 0
while n != 0
n &= n << 1
i += 1
end
puts i
711デフォルトの名無しさん
垢版 |
2020/10/17(土) 19:11:03.54ID:wXdm0x1E
>>710
うまいやり方だな。それには気付かなかった。
712デフォルトの名無しさん
垢版 |
2020/10/17(土) 19:29:10.40ID:wXdm0x1E
>>695
Kotlin script

2進数文字列に変換してから 0 を区切り文字にして分割してその中の一番長い文字列の長さを出すというやり方。

fun max1(n: Int) = n.toString(2).split('0').map { it.length }.max()

println(max1(20201016))

これで 5 が出る。

同じやり方を perl5 で(特にモジュール使わずに)やるとこんな感じ。

perl -e '$n=20201016; $m = (sort { $b <=> $a } map { length($_) } (split /0+/, sprintf("%b", $n)))[0]; print "$m\n"'

同じく5が出る。
2020/10/17(土) 20:05:12.33ID:vimxgZ9f
>>695 JavaScript

let num = 20201016
let ans = num.toString(2).split`0`.sort().pop().length

console.log(ans) //=> 5
2020/10/17(土) 20:50:55.84ID:w8j3NnhR
>>695 octave
https://ideone.com/dO1WZp
f = @(n) max(cellfun(@numel, strsplit(dec2bin(n), '0')));
f(20201016)
715デフォルトの名無しさん
垢版 |
2020/10/17(土) 20:54:06.81ID:frzgm+pU
>>695
Perl
https://paiza.io/projects/VO9_CFHPOVbO5iI8uDc__A
2020/10/17(土) 23:22:21.08ID:P3PLPttw
いつもRubyの人からなにかしら学ぶことがある
717デフォルトの名無しさん
垢版 |
2020/10/18(日) 00:42:32.49ID:nYmbGZmV
ハトにエサを与えないで下さい
2020/10/18(日) 01:06:12.01ID:qT62bbHa
QZは自分の頭が悪いのをわざわざ周知してもらうためにクソコードを晒すのか
ドMだな
2020/10/18(日) 03:42:01.18ID:DpwMGaW+
>>710
なるほどな、感心した
n>>1でもいいわけだな
2020/10/18(日) 04:21:53.35ID:xWXtsYNK
>>700 のほうが速いと思うが
2020/10/18(日) 04:36:21.54ID:F/EhVBet
rubyよく分からないけど>>710の方が100倍くらいは速そうに思える
722デフォルトの名無しさん
垢版 |
2020/10/18(日) 05:53:44.51ID:28u9FaXE
うん。速そうだね。数値計算しかしてないし。
2020/10/18(日) 10:06:25.57ID:ARbR7jXS
20201016みたいに桁数が少ないならそうだけど桁数が増えるとルーブが答え×桁数回だからアルゴリズムそのものは遅い
桁数が少ないうちは内部関数しか使ってない利点で早いとは思うけど
2020/10/18(日) 12:07:22.14ID:GUbLWvo/
>>723

>>700,710 をベンチマークで比較してみた
https://ideone.com/t0ZYLg
https://ideone.com/DUEWmC
20201016 では 5~6倍
巨大な数だと 7000倍以上
2020/10/18(日) 15:53:00.51ID:xUpUEWAV
>>693
残念ながら、私の出題もイマイチ人気がありませんでした‥‥
726デフォルトの名無しさん
垢版 |
2020/10/18(日) 21:20:25.30ID:wanN/5Zd
>>685
Java
https://paiza.io/projects/frlfP3US1doeAO_HZBnLWQ
727デフォルトの名無しさん
垢版 |
2020/10/18(日) 21:43:52.67ID:wanN/5Zd
>>669
Java
https://paiza.io/projects/0xfQrdW_qpJoUbOO6ux6wg
728デフォルトの名無しさん
垢版 |
2020/10/18(日) 22:06:12.69ID:wanN/5Zd
>>667
Java
https://paiza.io/projects/x3j0kbjqsSoVGNJX5qun2g
729デフォルトの名無しさん
垢版 |
2020/10/18(日) 22:14:01.64ID:wanN/5Zd
>>695
Java
https://paiza.io/projects/Eo4-fSXmdnoqjyHOMsi92Q
2020/10/18(日) 22:45:56.62ID:F/EhVBet
>>724
x = n
while x != 0
x &= x << 1
i += 1
end
ruby知らないから適当に書いたけど
こんな感じにしないと二回目以降nが0でやってるっぽい
こうすると22倍くらいの差だった
2020/10/18(日) 22:54:22.98ID:F/EhVBet
連続してるビット数が多いときはこの方が速くなったけど
すごいごちゃごちゃになった

i = 0
s = 1
x = n
while x != 0
t = x & (x << s)
if t == 0 then
if s == 1 then
i += 1
break
end
s = 1
else
x = t
i += s
s = (s << 1)
end
end
2020/10/18(日) 22:56:30.98ID:QW0aA1Hz
>>724
GJ
2020/10/19(月) 06:30:07.92ID:8QFJcUQW
>>695
echo "obase=2; 20201016" | bc | sed 's/./&\n/g' | uniq -c | perl -lane 'if ($M < $F[0]) {$M = $F[0]}; END{print $M}'
5
734724
垢版 |
2020/10/19(月) 15:26:08.35ID:u+lqDWSF
>>730
ご指摘の通りでした
https://ideone.com/DUEWmC
を修正しました

>>710 は 1の連続が多いと弱いですね
2020/10/19(月) 17:41:48.20ID:Sd7Rn+fr
お題
2^(1/3)を百桁表示せよ

出力
1.2599210498948731647672106072782283505702514647015079800819751121552996765139594837293965624362550941543102560356156652593990240

参考 
a(n+3) = 3*a(n+2) + 3*a(n+1) + an
a(1) = 3, a(2)=3, a(3)=15
で決まる数列について
min (a(n)/a(n+1), a(n+1)/a(n+2), a(n+3)/a(n+3) )
. < 2^(1/3)-1
. max (a(n)/a(n+1), a(n+1)/a(n+2), a(n+2)/a(n+3) )
で lim a(n)/a(n+1) = 2^(1/3)-1となる
2020/10/19(月) 21:36:44.38ID:gq9726ze
>>733
echo "obase=2; 20201016" | bc | sed 's/0\+/\n/g' | wc -L
でよくね?
2020/10/19(月) 22:00:17.27ID:gq9726ze
>>735 Bash

$ echo "scale=100;e(l(2) / 3)" | bc -l
1.25992104989487316476721060727822835057025146470150
79800819751121552996765139594837293965624362550940
2020/10/19(月) 22:30:56.87ID:14xSvmON
>>735 dc
dcには平方根の演算子はあるが立方根はないので
c^(1/3) = sqrt(c/sqrt(c/sqrt(c/...)))
と変形して適当に反復

100k[2z333>av/]dsaxp

1.2599210498948731647672106072782283505702514647015079800819751121552\
996765139594837293965624362550941
2020/10/19(月) 23:54:32.40ID:mPlPc+C9
>>735
参考を誰も参考にしてくれないのにワロタ
参考を元に作ったコード
Haskell

https://ideone.com/ywJPjx

ちなみにrubyのpi.rbが同じテクニック使ってます
そっちは定数係数でない三項間関係の漸化式パージョン
2020/10/20(火) 02:36:31.61ID:gFGmv7lM
>>736
たしかに
2020/10/20(火) 04:08:13.14ID:Mf7a0fdE
おっせえじゃん
2020/10/20(火) 21:07:35.93ID:hsuNVmIy
お題:ぼくがかんがえたさいきょうのちょうわへいきん
2変数調和平均 f(x, y) = 2 / (1 / x + 1 / y)
但し xまたはyがゼロの時、f(x, y) == 0
の計算を考える。
Cのdoubleに相当する精度で計算する際に、理論値(≒多倍長精度で計算したものを
double相当に丸めたもの)と一致しない割合(エラー率)をモンテカルロ法で求めよ。
x, yは、正規分布N(0, 1)の絶対値に従うものとする。

発展的なお題:
前掲の調和平均の式を変形し、エラー率の変化を調べよ。例えば、
f(x, y) = 2 * x * y / (x + y)
のエラー率は、前掲の式と比較してどうだろうか?
また、2 / (1 / x + 1 / y)よりエラー率が低い式は在るだろうか?

発展的なお題その2:
x, yがベンフォードの法則に従う場合はどうなるか。
正規分布N(0, 1)の絶対値の場合と比べて、エラー率の順位は入れ替わるだろうか?
2020/10/22(木) 01:17:43.95ID:rA+WIIWx
...but nobody answered
744253
垢版 |
2020/10/23(金) 09:17:13.74ID:7L0FHKID
正規乱数をモンテカルロ法で算出して
doubleと多倍長浮動小数点でそれぞれ計差した2変数調和平均に
差がある率を求めれば良いの?
正規乱数なら書かなくともライブラリにあるんだよね。
あるいは誤り率の計算そのものにモンテカルロ法を使うようなやり方なのかな
2020/10/23(金) 14:48:32.25ID:oxO2c12D
次のプリーズ
746デフォルトの名無しさん
垢版 |
2020/10/23(金) 20:02:36.14ID:Vzf4XOui
お題
乱数を使ってシミュレーションしてください

ジョーカーを除くトランプ52枚から1枚抜き取って箱に入れました
その後、残った51枚から3枚引いて確認したら3枚ともダイヤでした
では最初に抜き取った箱の中が1枚がダイヤである確率はいくらか?
2020/10/23(金) 20:27:24.17ID:LovVc5SM
>>746 Ruby

DECK = [*0..51]

def hoge
a, *b = DECK.sample(4) until b&.all?{|v| v % 4 == 0}
a % 4 == 0
end

def fuga(n)
1.0 * n.times.count{hoge} / n
end

p fuga(1e6) # => 0.20414
p 10 / 59 # => 0.20408163265306123
2020/10/23(金) 20:46:02.34ID:LovVc5SM
途中で送信してしまった

99%信頼区間は 0.20414±0.0010382 => [0.2031018, 0.2051782]
理論値は 10/49 = 0.20408163265306123
749デフォルトの名無しさん
垢版 |
2020/10/23(金) 20:49:11.91ID:5NWyTruo
確認前後での確率変動を出せ、っていうお題じゃねえのコレ
2020/10/24(土) 01:58:03.71ID:6bv42JD2
お題
ジョーカー除く52枚のカードがある
スートを表すS,H,D,Cと、A,K,Q,J,X,9,8,7,6,5,4,3,2との2文字からなる文字列でカードの柄を表すこととする。
当然ながら52枚のうちどの2枚も同じ柄でない

この一組のカードを使ってポーカーゲームをする。
すなわち、初手のカード5枚を配られたプレイヤーは、そのうち0枚以上5枚以下のカードを場に捨てて、同じ枚数のカードを残りの山札47枚から引くことができる。
このときどのカードが選ばれるかは無作為であり、プレイヤーは選択できない。

さて、プレイヤーは、初手のカード5枚に対して、最終的に手に残る5枚のカードをポーカーのルールで評価して得られる配点の期待値が最も高くなるように捨て札を決めたい。
入力としてカード5枚が与えられたとき、そのような捨て札の組み合わせを求めるプログラムを記述せよ。

ここで、ポーカーの役と配点の対応はプログラムのパラメータとして組み込んで良い。
2020/10/24(土) 21:09:47.85ID:xQuuF55s
>>750

// 任意の役の配点を0とする
printf(0);
752デフォルトの名無しさん
垢版 |
2020/10/24(土) 23:43:41.92ID:DlOr4HzX
>>746
Java
https://paiza.io/projects/rAHsohR9Q8vhh4kLZnfKAw
2020/10/25(日) 09:27:41.37ID:dKQi7OF0
>>750 Perl5
https://ideone.com/stLkXf

役のレートは某ゲームのものを使用

ノーペアのとき
全部変えるより1枚残したほうが有利という結果が出てちょっと驚いてる
754デフォルトの名無しさん
垢版 |
2020/10/25(日) 10:49:49.59ID:zd7LSfWt
3が1枚来てて、3が3枚残ってるなら、
・手元の3を捨てると、3が来ても何も起こらない
・手元に3を残すと、3が来るとワンペアになる

つまり、残りのカードを引けるかどうか、になる
>>746の亜種
2020/10/25(日) 11:44:16.63ID:c/nOQwtG
746はシミュレーションも何もただの引っ掛け問題でしょ
モンティホール問題の方が引っ掛け問としては出来が良い
2020/10/25(日) 12:58:23.56ID:vQGWPLvq
引っかけも何も条件付確率の初歩の初歩の問題だろ
2020/10/25(日) 14:14:17.31ID:tOCt4zCM
52枚トランプの束で2枚目から4枚目までがダイアであるような場合に限定してその内先頭もダイアであるような場合は全体の何バーセントかを問う問題
758742
垢版 |
2020/10/26(月) 01:17:42.67ID:LimhPZzI
>>744
正規乱数自体は既存のライブラリで(Pythonならnumpy.random.randnとか)。
例えば、最初のお題(2/(1/x+1/y)で計算するやつ)は、34%位のエラー率になります。
759253
垢版 |
2020/10/27(火) 00:51:04.61ID:uqMOOUWw
そうすると俺にはモンテカルロ法をわざわざ使うところが
どこかよく分からないんだよね…
2020/10/27(火) 23:07:51.35ID:9NNPSda/
結局>>742は数学的にはどういう意味なんやろ
x,yがN(0,1)に従う独立確率変数、
ρ:R→RがDouble型に丸める関数(Doubleのレンジに入らない確率はほとんど0だから無視)、
h(x,y)=2xy/(x+y)
としたとき
P(ρ(h(ρ(x),ρ(y))) ≠ ρ(h(x,y))) ≒ 34%
って事?
761253
垢版 |
2020/10/28(水) 00:01:38.74ID:Jno143Es
面白い記号だなそれ。
だが、他の人にも伝わるように書いた方が話が広がってよいよ。
どんなに数学が得意な人でも本当に優秀な人はそうすることができると思う
2020/10/28(水) 00:17:22.90ID:3yQQm3er
Φρズと書いてハイロウズと読みます
2020/10/28(水) 00:21:17.79ID:n11gpLQR
煽りでもなく素直に疑問なのだが>>760のどこら辺がわからないんだ?
正規分布の下りか?
764253
垢版 |
2020/10/28(水) 00:30:53.43ID:Jno143Es
>>762
マジレスしようと思ったが、そういう問題じゃないんだよ
言葉で書きゃー2,3行のことなんだから
言葉で人に伝わるように書けばいいだろ


と、突き放しちゃ実も蓋も無いので少しマジレスすると
ρ:R→R が写像なのは分かる。
がしかしだ

P(ρ(h(ρ(x),ρ(y))) ≠ ρ(h(x,y))) ≒ 34%

って、お前の教室のホワイトボードじゃねんだぞ。

そんなんでどうっやって世の人と付き合ってんだか…
765253
垢版 |
2020/10/28(水) 00:40:32.18ID:Jno143Es
大体、P()てのは何の関数だ。
どこにでもあるような関数名だが、一般的な関数か?
いや、そんなことの説明は要らない

お前の言いたいことはそんな自己流の式よりも
手短な読んで分かる日本語で書けるはずだ

いいやP()に限らない、お前のレスは一事が万事そんな感じ
一からからやり直せ
そしたら相手してやる
2020/10/28(水) 00:42:08.54ID:n11gpLQR
>>765
文脈から明らかにP(A)はAが起こる確率でしょうが
ちなみに俺は>>760じゃないんで
767253
垢版 |
2020/10/28(水) 00:43:23.90ID:Jno143Es
>>766
それ関数じゃないだろ。何で関数として書くんだ。
どういう関数空間なんだ?
768253
垢版 |
2020/10/28(水) 00:47:05.09ID:Jno143Es
簡単なことを
わざわざ難しいことのように書くのは
有能な人のすることではない
2020/10/28(水) 00:51:02.28ID:n11gpLQR
>>767
落ち着けよお前
P(事象A) := 事象Aが起こる確率 なんて高校数学の範疇だぞ
>>760が殊更ペダンチックには感じない
770253
垢版 |
2020/10/28(水) 01:00:33.01ID:Jno143Es
>>769
別に落ち着いているけど
これか
https://ja.wikipedia.org/wiki/%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E7%A2%BA%E7%8E%87
P()が確立っていつから?
俺が大学の頃まではこういう記法は見た記憶が無いんだけど

P(ρ(h(ρ(x),ρ(y))) ≠ ρ(h(x,y))) ≒ 34%

これは言葉で書いたらもっと分かりやすくならないのか?
771253
垢版 |
2020/10/28(水) 01:15:04.26ID:Jno143Es
結局 >>760

2 / (1 / x + 1 / y)をdoubleで計算した値と倍長精度で計算したものをdouble相当に丸めたものが一致しない割合

この一行をわざわざ他の人に分かりにくい式で再度書いているだけのこと

繰り返しだし分かりにくいし
意味(doubleで計算した値と倍長精度で計算したものをdouble相当に丸めたものが一致しない割合)
が欠落している

そういうことに気づきな
2020/10/28(水) 01:17:27.13ID:6h0Rpnv/
多分ですけど、あなた以外はそこまでわかりにくい表現だとは感じていないのだと思いますよ
773253
垢版 |
2020/10/28(水) 01:19:14.69ID:Jno143Es
まじかw
そしたら回答山盛りだ

お前もさんも回答よろしくな
2020/10/28(水) 01:20:24.09ID:6h0Rpnv/
>>742の意味するところが数学的に自明になればおのずと回答も付くでしょう
775253
垢版 |
2020/10/28(水) 01:20:47.31ID:Jno143Es
蛇足だが、あの式で意味がわかった上で
まさか回答できなかったら、単なる無能だからな
776253
垢版 |
2020/10/28(水) 01:27:14.39ID:Jno143Es
>>774
参考までにあなたは今までどのような回答を投稿されましたか?
2020/10/28(水) 01:29:09.84ID:3yQQm3er
>>761
> 面白い記号だなそれ。

で、結局面白い記号って何だったの?
778253
垢版 |
2020/10/28(水) 01:30:24.94ID:Jno143Es
ふふ、それは
ヒ・ミ・ツ
2020/10/28(水) 01:43:43.54ID:3yQQm3er
教科書ないから高校数学 確率で一番上に出たやつ。
https://studysapuri.jp/contents/high/article/subject/sp/math00003.html

やっぱ高校の教科書に載ってたよなあww

仮に載ってなかったとして大学で使う書籍にもP載ってないって?w

> 俺が大学の頃まではこういう記法は見た記憶が無いんだけど
780253
垢版 |
2020/10/28(水) 01:56:33.39ID:Jno143Es
ゆとり以降だなそりゃ
2020/10/28(水) 02:11:35.07ID:d52OC3St
恥の上塗りするくらいなら黙ってればいいのに
782253
垢版 |
2020/10/28(水) 02:16:39.09ID:FRCNqyyj
じゃあ何か自慢の回答でもしてよ
783742
垢版 |
2020/10/28(水) 05:10:48.17ID:MEeLXnFm
>>760
2/(1/x+1/y)

2*x*y/(x+y)
と変形した場合だと、36%位です(100万回試行してみた)。
2020/10/28(水) 06:02:02.77ID:W3KKdO+Q
>>742 C
https://ideone.com/iPEwg8
2 / (1 / x + 1 / y) のエラー率は 38.5%
2 * x * y / (x + y) のエラー率は 40.4%
と出た
785742
垢版 |
2020/10/28(水) 12:23:39.00ID:jim4KuYP
>>784
h0の計算は、xdやxdをlong doubleにcastする感じで!
>double h0 = ( xl == 0. || yl == 0. ? 0. : 2. / (1.L / xd + 1.L / yd));
786742
垢版 |
2020/10/28(水) 13:16:35.16ID:jim4KuYP
間違えました
double h0 = ( xd == 0. || yd == 0. ? 0. : 2. / (1.L / xd + 1.L / yd));
2020/10/29(木) 00:16:48.93ID:GFOWX4AY
お題:言語機能のみを使い単方向リストを実装しメソッドpushとpopを実装せよ
pushはリスト末尾にノードをプッシュし、popはリスト末尾からノードをポップする
ノードの持つ値は整数とする
2020/10/29(木) 00:52:01.80ID:wtq/xrTf
複数pushできるの?
popも個数指定できるの?一個ずつ?
pushの戻り値はリスト自身?入れた値?成否?
2020/10/29(木) 01:01:50.46ID:GFOWX4AY
>>787
>>788
pushもpopも値は1つずつ
pushの戻り値はなんでもいい
2020/10/29(木) 10:47:03.25ID:jsAu6jIB
>>787 js
入出力のサンプルケース書いてないやつ絶対自分はやってないだろ

class SinglyLinkedList {
push(value) {
this.head = { next: this.head, value }
}
pop() {
if (!this.head) return
this.head = this.head.next
}
str() {
let { head } = this, s = ""
while (head) {
s += head.value + ", "
head = head.next
}
return s
}
}
2020/10/29(木) 12:03:58.95ID:GFOWX4AY
>>790
なんで>>787,789の仕様でこんな実装になるんだ?
お題ちゃんと読んでる?
2020/10/29(木) 12:11:08.30ID:moZIRBYC
>>791
「言語機能のみを使い」は引っかかる表現だったけどそれのことかい?
2020/10/29(木) 12:16:22.08ID:95aSRVZj
オレもこの「言語機能のみを使い」がわからなかった
「ライブラリ関数使うな」か「文字列操作関数のみを使い」かどっちかかなと
わからんから様子見
2020/10/29(木) 12:18:16.67ID:GFOWX4AY
>>792
>>790
は787の仕様としてただしかったわ
すまんな
こっちのお題の定義があいまいすぎたらしい
言語機能は問題ない
2020/10/29(木) 12:21:59.18ID:GFOWX4AY
>>793
ライブラリ使うなって言いたかった
あとお題提出前の実装については>>790に比べるとかなり冗長な実装をしてある
ここに晒す気はないが
796デフォルトの名無しさん
垢版 |
2020/10/29(木) 12:33:09.26ID:AOpu1Zek
stdlib.h使わずに作るの?
2020/10/29(木) 12:36:05.93ID:jsAu6jIB
>>794
まあええわ
俺もclassは久々に使ったけどできれば使わずに実装したかったわ
2020/10/29(木) 12:50:57.59ID:GFOWX4AY
>>797
こっちの実装したコードに比べるとそっちのコードはえらくシンプルなんだよな
軽くショックだわ
>>791みたいな口きいてすまんかったな
2020/10/29(木) 13:24:14.72ID:GFOWX4AY
>>796
リスト以外の実装は自由の想定
stdio.hも使っておk
2020/10/29(木) 13:27:39.52ID:GFOWX4AY
>>796
C/C++などの言語はmallocなどを使っても良いことにする
2020/10/29(木) 15:09:10.20ID:dNWGwdex
Haskellみたいな純粋関数だとそもそも標準ライブラリだけだと“状態”を作るのも難しいんだよな
同じ表現は永遠に同じ答えを返すからスタックの“状態”を変化させるというのがそもそもできない
それをなんとかするのに“モナド”というのがあるんだけど状態を処理する“ステートモナド”は標準ライブラリではないんだよな
ほとんど“準標準”だけど
2020/10/29(木) 16:24:06.73ID:95aSRVZj
State モナドを“準標準”と認めてもらえるなら簡単
Haskell

import Control.Monad.State

pop :: State [a] a
pop = do
a <- get
modify tail
return $ head a

push :: a -> State [a] ()
push x = do
modify ((x :))
return ()

test = do
push 1
push 2
push 3
a <- pop
b <- pop
c <- pop
return ([a,b,c])

main = print $ evalState test []
---
出力
[3,2,1]
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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