プログラミングのお題スレ 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/
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]
2020/10/29(木) 19:01:42.56ID:7aED6VYA
>>787
双方向リストの方が、後々いろいろ流用できてありがたいんですけど、それでも端方向リストでインプリしないといけないのですか?
2020/10/29(木) 19:02:59.18ID:c1P6mcgH
持て余すくらいなら「なるべく使わない」とか評価基準を示すだけにしとけばいいのに
2020/10/29(木) 19:32:46.09ID:EQ9lcE/o
>>793
全く同じこと思ってたわw
2020/10/29(木) 19:34:40.84ID:EQ9lcE/o
>>797
どうでもいいけどお前のIDもjsだsな
2020/10/29(木) 19:40:10.12ID:Pf0NRL7D
>>787 Brainfuck

push: <[>],
pop: <[>]<[-]<
808デフォルトの名無しさん
垢版 |
2020/10/29(木) 20:59:03.61ID:zgfLAX1f
>>787
push,popってリストじゃなくてスタックの機能じゃ?
リストにさせるなら、先頭に追加してく方が速くて楽なのに。
push xs a = a:xs
pop (x:xs) = (xs,x)
反転させたいなら最後の最後にすべきだよ。

Haskell

― 使用例用main関数
main = do pushlist <- (return.push (Cons 1 (Cons 2 Null))) 3
(poplst, popval) <- (return.pop) pushlist
print pushlist
print popval
print poplst

― ここからお題のコード(整数に限定じゃないとダメならdataのList a/Cons aのaをIntに)
data List a = Null | Cons a (List a) deriving (Show)

push xs a = xs +++ (Cons a Null)

pop xs = (myinit xs, mylast xs)

Null +++ ys = ys
(Cons x xs) +++ ys = Cons x (xs +++ ys)

myinit (Cons x Null) = Null
myinit (Cons x xs) = Cons x (myinit xs)

mylast (Cons x Null) = x
mylast (Cons _ xs) = mylast xs
2020/10/29(木) 21:10:47.05ID:wtq/xrTf
>>787 JavaScript
class List {
#data = []
push(n) {
this.#data = [n, this.#data]
return this
}
pop() {
const [head, tail] = this.#data
if (tail) this.#data = tail;
return head
}
toArray() { return this.#data.flat(Infinity) }
toString() { return String(this.toArray()) }
toJSON() { return this.toArray() }
}

const list = new List
list
.push(0)
.push(7)
.push(2)
console.log('文字列: ' + list) //=> 文字列: 2,7,0
console.log('JSON: ' + JSON.stringify(list))
//=> JSON: {"test":[2,7,0]}
list.pop() //=> 2
list.pop() //=> 7
list.pop() //=> 0
list.pop() //=> undefined
2020/10/29(木) 21:13:39.21ID:wtq/xrTf
うわ
console.log('JSON: ' + JSON.stringify({'test': list})) //=> JSON: {"test":[2,7,0]}
だった
811デフォルトの名無しさん
垢版 |
2020/10/29(木) 23:09:01.60ID:MaNQDMIt
>>803
お題
双方向リストをC89で実装してください
812253
垢版 |
2020/10/29(木) 23:20:15.73ID:UgpGZWA4
>>807
2020/10/29(木) 23:24:39.19ID:3o7XtB23
>>787 ocaml
https://ideone.com/8ceFxk
type 'a _list = Nil | Cons of 'a * 'a _list
exception EmptyListException
let push xs x = Cons(x, xs)
let pop = function Nil -> raise EmptyListException | Cons (x, c) -> (x, c)
let rec each f = function Nil -> () | Cons (x, xs) -> f x; each f xs
let x, xs = pop (push (push (push Nil 1) 2) 3)
let () = print_int x; each print_int xs
2020/10/29(木) 23:26:08.36ID:GFOWX4AY
>>803
双方向書きたいってことなら書けば
お題は単方向だけど
2020/10/30(金) 00:06:20.24ID:aDtUVDPI
>>802を改良?
State [Int] だとあらかじめ用意した一個のstackしか使えない
噂に聞いたことあつたST monadで複数のスタック使えるように改造
Haskell

import Control.Monad
import Control.Monad.ST
import Data.STRef

data Stack a = Empty | N { car :: a, cdr :: Stack a } deriving (Show)

push stk val = modifySTRef stk (N val)
pop stk = car <$> readSTRef stk <* modifySTRef stk cdr

main = print $ runST $ do
sA <- newSTRef Empty
sB <- newSTRef Empty
push sA 'o' >> push sA 'o' >>push sA 'f'
push sB 'r' >> push sB 'a' >> push sB 'b'
a1<-pop sA
a2<-pop sA
a3<-pop sA
b1<-pop sB
b2<-pop sB
b3<-pop sB
return [a1,a2,a2,b1,b2,b3]
----
出力
"foobar"
816253
垢版 |
2020/10/30(金) 00:07:47.66ID:hMjmzAXb
>>787 Perl5

公式マニュアルに書かれている通りsplice関数を使ってpush, popを記述できる。
 splice(@a,@a,0,$x); # push(@a, $x)
 splice(@a,-1);    # pop(@a)
なんだけどspliceを使わず言語のstatementだけでpush, pop関数を記述すると…こんな感じ

use v5.18;
use feature 'signatures';
no warnings "experimental::signatures";
sub Push($a, $x) {
 @$a = (@$a, $x);
}
sub Pop($a) {
 my @a = @$a;
 my $b = $a[-1];
 @$a = @a[0..$#a-1];
 $b;
}
my @s = (1,2,3); # test main
Push(\@s, 4);
say "@s";
my $y = Pop(\@s);
say $y;


実行結果
~ $ perl 18_787_push_pop.pl
1 2 3 4
4
1 2 3
817253
垢版 |
2020/10/30(金) 00:09:56.81ID:hMjmzAXb
>>816
say $y;
の下に書いてあった最後の行
say "@s";
をコピペしそびれた…orz
818253
垢版 |
2020/10/30(金) 00:22:38.86ID:hMjmzAXb
>>816 Pop関数はこっちの方がいいな、無駄なコピーもないし。

sub Pop($a) {
 my $b = @$a[-1];
 delete @$a[-1];
 $b;
}
819253
垢版 |
2020/10/30(金) 00:32:51.98ID:hMjmzAXb
>>818 deleteは削除したスカラー値を返すわ。だから以下でいいんだ

sub Pop($a) {
 my $b = @$a[-1];
 delete @$a[-1];
}
820253
垢版 |
2020/10/30(金) 00:34:30.90ID:hMjmzAXb
>>819 my $b = @$a[-1]; 不要だった…orz

sub Pop($a) {
 delete @$a[-1];
}
821デフォルトの名無しさん
垢版 |
2020/10/30(金) 00:50:28.84ID:9RgBA+ge
>>787
Java
https://paiza.io/projects/JKwjWCxSc6dHv_ItEaqwlQ
822デフォルトの名無しさん
垢版 |
2020/10/30(金) 02:22:50.19ID:9RgBA+ge
>>811
Java
https://paiza.io/projects/wtaAasQr_Nu5Zw2D1KoPwg
2020/10/30(金) 07:07:30.18ID:cChJ6BWU
>>812
あ?
2020/10/30(金) 23:30:40.86ID:hYhF3+Ov
Brainfuck読めないわ
覚えようかな
2020/10/31(土) 13:49:55.42ID:QnYm1bfS
お題
与えられた文字列を一文字ずつ見ていき"trick"と"treat"の5文字でどちらが先に揃うか判定してください(順序込み)
どちらもヒットしないときは考慮しなくていいです

treakOrTreat("trick or treat")
// => trick
treakOrTreat(". tr ick")
// => trick
treakOrTreat("ttrriecatk")
// => treat
treakOrTreat("tri kc eat")
// => treat
treakOrTreat("my money")
// => none
2020/10/31(土) 13:51:26.24ID:QnYm1bfS
>>825 js(self)
function treakOrTreat(text) {
const [tri] = /t.*r.*i.*c.*k/.exec(text) || []
const [tre] = /t.*r.*e.*a.*t/.exec(text) || []
if (!tri && !tre) return 'none'
if (!tri) return 'treat'
if (!tre) return 'trick'
return tri.length < tre.length ? "trick" : "treat"
}
2020/10/31(土) 14:54:50.69ID:HHhQTZ6R
関数名のミススペリングは修正していいですか
2020/10/31(土) 15:02:04.99ID:QnYm1bfS
ごっつtypoしてたすまんFIXME
829デフォルトの名無しさん
垢版 |
2020/10/31(土) 15:07:31.21ID:DmLmDhBA
>>825 Common Lisp
https://ideone.com/L8wigO
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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