プログラミングのお題スレ Part19
レス数が1000を超えています。これ以上書き込みはできません。
const array = ['乙', '1', '>', '>'];
for(let i = 0; array.length > 0;) {
console.log(array.pop());
} 全スレ >>995 C++
DPでO(N)
ただスマホコーディングなのと今すごく眠いので、何か間違ってたらすまん
https://wandbox.org/permlink/aZbSfE5gQHA9x9B6 >>1乙
>>http://mevius.2ch.net/test/read.cgi/tech/1594702426/995
bat
:: 配列中の小計の最大値を取る区間A-Bを出力。0を閾値にしているので正の最大値限定
@echo off &setlocal enabledelayedexpansion
set args=-2,1,-3,4,-1,2,1,-5,4
set /a S=N=i=0
for %%a in (%args%) do (
set /a i+=1
set /a N+=a[!i!]=%%a
if !N! GTR !S! set /a S=N, B=i &if not defined A set /a A=i
if !N! LSS 0 set /a N=0 &set A=
)
for /L %%i in (%A%,1,%B%) do set R=!R!,!a[%%i]!
set R=[%R:~1%]
echo %R%
pause&exit /b >>2
それだと
>
>
1
乙
になってしまうのでは? http://mevius.2ch.net/test/read.cgi/tech/1594702426/995
Haskell
import Data.List
maxConsSub x = let
ss = concat $ map ( tail . reverse . tails ) $ tail $ inits x
comp xs ys = compare ( sum xs ) ( sum ys )
in maximumBy comp ss
main = print $ maxConsSub [ -2, 1, -3, 4, -1, 2, 1, -5, 4 ] サブ配列とは、連続している領域の事か?
どこかで、こういう問題を見た事があるような気がする
これで、配列の前後がつながっている、循環バージョンもやってみれば? 前スレ>>995 Perl5
@a = qw[-2 1 -3 4 -1 2 1 -5 4];
sub f {
my ($i, $j) = @_;
return $t[$i][$j] if defined $t[$i][$j];
$t[$i][$j] = $a[$i] + ($i < $j ? f($i+1, $j) : 0);
}
for $i (0..$#a) {
for $j (reverse 0..$#a) {
my $v = f($i, $j);
if (!defined($max) or $max < $v) {
$max = $v;
($s, $e) = ($i, $j);
}
}
}
print "@a[$s..$e]\n"
~ $ perl 18_995_sumsubarry_dp.pl
4 -1 2 1 >>9 Bugってんじゃん、解は変わらないけど無駄なとこ計算する
× for $j (reverse 0..$#a) {
↓
○ for $j (reverse $i..$#a) {
ついでっちゅうわけじゃないけどnaive版 Perl5
@a = qw[-2 1 -3 4 -1 2 1 -5 4];
use List::Util 'sum';
for $i (0..$#a) {
for $j (reverse $i..$#a) {
my $v = sum(@a[$i...$j]);
if (!defined $max or $max < $v) {
$max = $v;
($s, $e) = ($i, $j);
}
}
}
print "@a[$s..$e]\n";
実行
~ $ perl 18_995_sumsubarry_naive.pl
4 -1 2 1 前スレ>>971
前スレ 994 の Java のやつを見て Kotlin script に変換。
java.time.DayOfWeek.values().map { it.name.toLowerCase().capitalize() }.forEach(::println)
991 は java.text.DateFormatSymbols 使ったから順序を変える必要があったが
java.time.DayOfWeek 使えばその必要なかったんだな。 前スレ971 Go言語
package main
import "fmt"
import "time"
func main() {
for i := 1; i < 8; i++ {
t, _ := time.Parse("2006/01/02" , fmt.Sprintf("0001/01/%02d", i))
fmt.Println(t.Weekday())
}
} 蟻人間
クソスレ立てて
一人芝居
即効バレて
自演失敗
作ろう!ウェブアプリ開発コンテストPart1
https://mevius.5ch.net/test/read.cgi/hp/1605200346/
83 Name_Not_Found sage 2020/11/30(月) 01:23:51.15 ID:???
蟻=熊
33 蟻人間 ◆T6xkBnTXz7B0 sage 2020/11/18(水) 22:50:58.32 ID:???
local storageはセキュリティどうなん?
34 蟻人間 ◆T6xkBnTXz7B0 sage 2020/11/18(水) 22:55:28.97 ID:???
>>33
今回は技術情報システムで、公開される情報だから、問題ないんとちゃうん?
36 Name_Not_Found sage 2020/11/18(水) 23:20:35.82 ID:???
トリップそのままとか斬新な自演ですね(笑)
一人ママゴト楽しい? この番組は、殺伐とした5ちゃんねるにネタとうるおいをお届けする蟻人間とご覧のスポンサーの提供でお送り致します。
___提_供___
__蟻_人_間__ お題
格子点上にH×Wの矩形がある。
この矩形の辺上の格子点から3点を選んで三角形を作る。
三角形の作り方は何通りあるか?
[例]
H=1, W=1 => 4
H=2, W=3 => 110
H=987, W=654 => ? おなじサイズの矩形でも配置によって点の数変わるよね たしかに。5x5の時は軸に平行だったり斜めだったりできるな まあ辺が垂直と水平に限られるとは書いて無いけどそういう問題? イヤ、格子状に並んでいる限りアフィン変換で通常の意味の格子になるやろ H=2,W=3だと200じゃないの
0≦x≦3, 0≦y≦2内の格子点として
格子点から3点選ぶ選び方は12C3=220組
同一直線上に並ぶものは
x=0,1,2,3上に並ぶものが1組ずつで4組
y=0,1,2上に並ぶものが4組ずつで12組
x+y=3,4, x-y=0,1上に1組ずつで4組
よって同一直線上に並ばない3点の組みは200組
な気がする >>30
辺上なら
(2h+2w)C3-2 (h+1)C3 -2 (w+1)C3
=(2h + 2w)(2h + 2w-1)(2h + 2w-2)/6 - 2(h+1)h(h-1)/6-2(w+1)w(w-1)/6
じゃないの? >>31
は純粋にすごいと思ったけど
>>32
はドヤっててキモい 指摘が意味不明すぎなんだわ
てかこんなん中学の算数だろ コンビネーションって高校じゃなかったっけ?
まあ、31は24と30の反論になってないから(むしろ論を補強してる)、
意味がよく分からない指摘だというのは同意。 イヤ、だってH=987, W=654の時どうしますか?
がお題だけど
こコレ
「まともに3282C3=5,886,638,960通りから直線に並ぶ場合を抜くとどえらい計算になります。どうしますか?」
という意味にしか見えないんけど
コレが辺上だけじゃなくて内点も走るならともかく、辺上しか走らないならどうしますかもへったくれもない >>36
ああ、そういう文脈で言ってたのね
ただ問題文で辺上って言われてるし、しかも2x3の例からもそれは明らかなんで
ぱぱぱっと計算して終わりで良いんじゃないの >>24
(h + w) * ((h + w - 1)^2 + h * w) が答えだな。
たかがこんな計算を凄いと思えちゃう>>33君かわいい。 まぁじゃババっと
Haskell
f n = div (n*(n-1)*(n-2)) 6
g h w = ( f $ 2*h+2*w ) - 2*( f $ h+1 ) - 2*( f $ w+1 )
main = do
print $ g 1 1
print $ g 3 2
print $ g 987 654
----
4
110
5472895818 当人同士が反目し合ってるわけじゃないのに外野が騒いでるのがなんとも 整数 a, b, c が与えられるので, x^3 + ax^2 + bx + c = 0 を満たす実数を1つ求めよ.
0 0 -1 -> 1.0
-6 -11 -6 -> [1.0, 2.0, 3.0 の内のいずれか]
1 2 3 -> -1.275682203650985
4 5 6 -> -3.0
3 -1415 926535 -> -103.38046753468685
30000 299905755 -942477760 -> ??? >>47
クソスレ立てるなカス
作ろう!ウェブアプリ開発コンテストPart1
https://mevius.5ch.net/test/read.cgi/hp/1605200346/
111 蟻人間 ◆T6xkBnTXz7B0 sage 2020/12/05(土) 17:53:48.82 ID:???
☆★☆テナント募集中☆★☆
スレッド終了のため、一緒にスレッドを盛り上げてくれる
イベント企画が出来る方を募集しています。
まずはご連絡下さい。
株式会社突撃商会 TEL 03-XXXX-XXXX >>47
映像化することがお題というなら、ライフゲーム自体はお前が提供するのか お題
表が連続する長さの平均を求めてください
入力: 裏裏表裏裏表裏裏裏表裏裏裏表表裏表裏裏表裏裏裏裏表表表表表裏表表裏裏表裏表表裏表表表表表裏裏裏裏裏表表表表裏表表表表裏表表表裏表表表裏裏表裏裏表表裏裏表裏表表表裏裏裏裏裏表表表表表裏表表裏表裏裏表裏表 >>51
haskell
import Data.List
str = "裏裏表裏裏表裏裏裏表裏裏裏表表裏表裏裏表裏裏裏裏表表表表表裏表表裏裏表裏表表裏表表表表表裏裏裏裏裏表表表表裏表表表表裏表表表裏表表表裏裏表裏裏表表裏裏表裏表表表裏裏裏裏裏表表表表表裏表表裏表裏裏表裏表"
consecHeads = id
. map genericLength
. filter ( (=='表') . head )
. group
avg x = ( sum x ) / ( genericLength x)
main = do
print $ consecHeads str
print $ avg $ consecHeads
----
[1.0,1.0,1.0,2.0,1.0,1.0,5.0,2.0,1.0,2.0,5.0,4.0,4.0,3.0,3.0,1.0,2.0,1.0,3.0,5.0,2.0,1.0,1.0,1.0]
2.2083333333333335 >>51 Ruby
Str = '裏裏表裏裏表裏裏裏表裏裏裏表表裏表裏裏表裏裏裏裏表表表表表裏表表裏裏表裏表表裏表表表表表裏裏裏裏裏表表表表裏表表表表裏表表表裏表表表裏裏表裏裏表表裏裏表裏表表表裏裏裏裏裏表表表表表裏表表裏表裏裏表裏表'
series = Str.scan( /表+/ )
puts series.sum(0.0){|s| s.size } / series.size >>49
クソスレ立てるな
すき家とかかつやみたいな和食屋で外国人雇うな
https://mevius.5ch.net/test/read.cgi/tech/1607138691/
13 蟻人間 ◆T6xkBnTXz7B0 sage 2020/12/07(月) 19:09:17.13 ID:rNPNmVA2
>>11
いい所に来たな。ウェブ技術に関するあるプロジェクトがあるんだが、手伝ってくれるかい?
成果物は山分けだ。
HTTPもしくはHTTPS通信で、とあるURLにあるHTMLをダウンロードして画像を含めてレンダリングする。ただし、jQueryまたはPython3を使用する。
ここまで。
14 蟻人間 ◆T6xkBnTXz7B0 sage 2020/12/07(月) 19:25:06.23 ID:rNPNmVA2
いわゆるスクレイピングって言う技術だけど、それ以上のことがしたいんだ。
ホームページの構成要素を破壊するような動画を作りたい。まあ、実際に破壊する訳じゃないけど、ハッカーになりたい子どもたちの娯楽として役に立つらしい。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13212452128
なぜですか?
質問者からのお礼コメント
小学生でもわかるような回答ではなく、なぜそうなのかも回答できないと社会人として微妙ですよ。
わかる箇所だけ答えるのはニワカです。 ヤフー知恵袋スマホで見たらどこがサイト本体なのかわからねえなゴミ袋かよ >>51
python
s = input()
return sum(len(x) for x in s.split("裏") if x != 0) / len([None for x in s.split("裏") if x != ""])
何もimportせずに1行にする方法が思いつかなかった jsならreduceがあるからできるな
window.prompt().split("裏").filter(x=>x!="").map(x=>x.length).map(x=>[x,1]).reduce((a,b)=>[a[0]+b[0],a[1]+b[1]]).reduce((a,b)=>a/b) 書き込みミスったすまん
print((lambda a: sum(a) / len(a))([len(x) for x in input().split("裏") if x != ""])) あ、間違えた。表の方を数えるのか。じゃあこっそり直そう。 >>51 Python
print((lambda a: a.count("表")/(a+"裏").count("表裏"))(input())) お題:
プログラム言語X1では32ビットの符号なし整数と32ビットの符号付き整数が使える。
しかし、プログラム言語X2では32ビットの符号なし整数が使えず、32ビットの符号付き整数が使える。
このままではX1からX2への移植が困難である。
そこで、X2において与えられた32ビットの整数を符号なしと見なした値を10進数文字列化せよ。 >>71
クソスレ立てるな自演野郎
作ろう!ウェブアプリ開発コンテストPart1
https://mevius.5ch.net/test/read.cgi/hp/1605200346/
83 Name_Not_Found sage 2020/11/30(月) 01:23:51.15 ID:???
蟻=熊
33 蟻人間 ◆T6xkBnTXz7B0 sage 2020/11/18(水) 22:50:58.32 ID:???
local storageはセキュリティどうなん?
34 蟻人間 ◆T6xkBnTXz7B0 sage 2020/11/18(水) 22:55:28.97 ID:???
>>33
今回は技術情報システムで、公開される情報だから、問題ないんとちゃうん?
36 Name_Not_Found sage 2020/11/18(水) 23:20:35.82 ID:???
トリップそのままとか斬新な自演ですね(笑)
一人ママゴト楽しい? >>71
クソスレ立てるな
すき家とかかつやみたいな和食屋で外国人雇うな
https://mevius.5ch.net/test/read.cgi/tech/1607138691/
13 蟻人間 ◆T6xkBnTXz7B0 sage 2020/12/07(月) 19:09:17.13 ID:rNPNmVA2
>>11
いい所に来たな。ウェブ技術に関するあるプロジェクトがあるんだが、手伝ってくれるかい?
成果物は山分けだ。
HTTPもしくはHTTPS通信で、とあるURLにあるHTMLをダウンロードして画像を含めてレンダリングする。ただし、jQueryまたはPython3を使用する。
ここまで。
14 蟻人間 ◆T6xkBnTXz7B0 sage 2020/12/07(月) 19:25:06.23 ID:rNPNmVA2
いわゆるスクレイピングって言う技術だけど、それ以上のことがしたいんだ。
ホームページの構成要素を破壊するような動画を作りたい。まあ、実際に破壊する訳じゃないけど、ハッカーになりたい子どもたちの娯楽として役に立つらしい。 >>51 bat
:: 循環小数の循環節を()で表す
@echo off &setlocal enabledelayedexpansion
set str=裏裏表裏裏表裏裏裏表裏裏裏表表裏表裏裏表裏裏裏裏表表表表表裏表表裏裏表裏表表裏表表表表表裏裏裏裏裏表表表表裏表表表表裏表表表裏表表表裏裏表裏裏表表裏裏表裏表表表裏裏裏裏裏表表表表表裏表表裏表裏裏表裏表
set str=%str:裏= %
for %%a in (%str%) do set /a n+=1
set /a s=%str:表=1+%0, a=s/n, r=s%%n
:: test sample
:: set /a s=5, n=108, a=0, r=5
:: set /a s=10, n=3, a=3, r=1
:: set /a s=1212123, n=9999999, a=0, r=1212123
:: set /a s=12, n=4, a=3, r=0
:: echo %s% / %n% = %a%...%r%
set /a j=0, max=1024
:FLACT
if %r% EQU 0 goto :END
set RR=%RR% %r%
set /a r*=10, d=r/n, r%%=n, i=0, j+=1
set f=%f%%d%
for %%a in (%RR%) do (if %%a EQU %r% for /f %%i in ("!i!") do set "f=!f:~0,%%i!(!f:~%%i!)…"&goto :END ) &set /a i+=1
if %j% LSS %max% goto :FLACT
set f=%f%…
:END
if defined f set f=.!f!
echo %s% / %n% = %a%!f!
pause
REM 53 / 24 = 2.208(3)… お題:
符号なし演算ができない言語X2において、2個の32ビットの符号付き整数x, yがあたえられる。x, yを符号なし整数x', y'と見なしたときの比較演算 x' < y' の値を求めよ。 >>78
素晴らしい回答ですね。少し簡単に解説してくれませんか?
出題者がおバカですみません。 えっ??
頭おかしいだけかと思ってたらホントに馬鹿なんだなw
右シフトとマスクでマイナス値は正の値に直す。右シフト1で1/2
更に5で割って1/10。これで10の位から上の値になる
上の割る5で切り捨てられた余りの2倍(左シフト1)と右シフトで捨てられたLSBを足して1の位 >>84
ちょっと動作が遅いね。どちらも正だった場合は普通に比較できるんだから、マイナスありとなしで場合分けできるんじゃね。 >>79 Julia
function f(x , y)
if (x >= 0) == (y >= 0)
x > y
else
!(x > y)
end
end 今年考えたがボツにした、イマイチ問題より
[お題]
整数A, B (1 <= A < B <= 20億)が与えられる。
A以上, B以下の整数が持つ"約数の個数"を合計する。
1) 12 14 → 12
2) 1 100 → 482
3) 98765432 1234567890 → ?
4) 393939393 1772727272 → ?
5) 1 2000000000 → 43141689413
※ 1)の補足、各整数の約数は 12{1,2,3,4,6,12}->6個, 13{1,13}->2個,
14{1,2,7,14}->4個, 個数合計は 6+2+4=12個
※ 小問実行時間を1秒程度で。
※ "約数の個数"はwikiに準拠
https://ja.wikipedia.org/wiki/%E7%B4%84%E6%95%B0#%E7%B4%84%E6%95%B0%E3%81%AE%E5%80%8B%E6%95%B0 お題:
整数 N,M が与えられます
M 個の1でない正整数をそれぞれ任意に選んだとき、
それらを全て掛け合わせて N を作ることが出来るような選び方が存在するか求めて下さい
制約:
2≦N≦10^9
1≦M≦10^9
例:
入力: N = 1576, M = 3
出力: Yes (例えば 2*2*394 = 1576 です)
入力: N = 1576, M = 5
出力: No
入力: N = 5, M = 1
出力: Yes (5 の1つだけを選んでもいい) >>89
エラトステネスっぽく√Nまでで約数を考えていけばいいかな?
それ以上は対称性から*2すればよくて、二乗数の時だけ注意
それで
B以下の約数の個数の和-A未満の約数の個数の和
をする >>91
前半は想定解と異なるので、何とも言えない。
("*2すればよい"の意味がわからない)
最後の2行は、想定解もその通り。
>>90
by python3 https://paiza.io/projects/RY7_PhZbZz-noBfirgTOHA まあ要するに
Σ[n] ( floor (B/n) - ceiling (A/n) + 1 )
かな >>71,79 bat 組み合わせてmax関数化。変換は>>78さん模倣
:: maxUint32 2つの引数(int32)をunsignedINT32と見做して比較し大きい方をunsignedINT32と同じ数字文字列に変換
@echo off &setlocal enabledelayedexpansion
for /f "delims=:" %%A in ('findstr /en ARGS "%~0"') do set /a N=%%A
for /f "usebackq skip=%N% tokens=1,2* delims=, " %%A in ("%~0") do (
set /a "x=%%A, u=y=%%B, m=0x7fffffff, xor=(x^y)&~m, xx=x&m, yy=y&m, msby=y>>31&1"
set z=%%C
if !xor! EQU 0 (if !xx! GTR !yy! set /a u=x ) else if !msby! EQU 0 set /a u=x
set /a "L=u&1, u=u>>1&m, h=u/5, L+=u%%5<<1"
if !h! EQU 0 set h=
if "!h!!L!"=="!z!" (set "z=OK") else set z=NG
echo !h!!L! : !z!
)
pause &exit /b
:: ARGS
0, 0, 0
0, 1, 1
1, 0, 1
1, 1, 1
123, 456, 456
456, 123, 456
0, -1, 4294967295
-1, 0, 4294967295
0x7fffffff, 0x80000000, 2147483648
-1294967296, 0x80000000, 3000000000
-294967296, -2147483647, 4000000000 >>89
haskell
div' x y = -1 - ( div ( -x ) y )
f a b = ( g b ) - ( h a )
g a = let
c = truncate $ sqrt $ fromInteger a
v = sum [ ( div a x ) | x <- [1..c] ]
in 2*v - c^2
h b = let
c = truncate $ sqrt $ fromInteger b
d = if c^2 == b then 1 else 0
v = sum [ ( div' b x ) | x <- [1..c] ]
in 2*v - c^2 + d
main = do
print $ f 12 14
print $ f 1 100
print $ f 98765432 1234567890
----
12
482
24201731790 >>90
haskell
import Data.List
pdcmp n = let
mainLoop d m = case () of
_ | d^2 > m -> [ m ]
_ | mod m d /= 0 -> mainLoop ( d + 1 ) m
otherwise -> d : ( mainLoop d $ div m d )
in if n > 1 then mainLoop 2 n else [ ]
sumMult = sum . map length . group . pdcmp
isOk m n = m <= ( sumMult n)
main = do
print $ isOk 3 1576
print $ isOk 5 1576
print $ isOk 1 5
print $ isOk 15 735134400
print $ isOk 29 536870912
print $ isOk 2 1000000007
----
True
False
True
True
True
False お題: テキスト内の指定の文字をタグで囲む関数wrapを作成せよ
wrap関数の引数は(text, target_char, tag_left='<', tag_right='>')とする
wrap関数の返り値は文字列とする
wrap関数はtext内の文字を解析し、文字がtarget_charだった場合にその文字をtag_left, tag_rightで囲むものとする
タグで囲んだテキストは返り値として返却する
以下のテストケースが通過するように実装せよ
assert pad('abc', 'a') == '<a>bc'
assert pad('bac', 'a') == 'b<a>c'
assert pad('bca', 'a') == 'bc<a>'
assert pad('aba', 'a') == '<a>b<a>'
assert pad('abcabc', 'a') == '<a>bc<a>bc'
assert pad('aaa', 'a') == '<a><a><a>'
余力があればtarget_charをtarget_strにした関数wrap2も作成せよ
wrap2関数は指定の文字列target_strをタグで囲む関数である >>98
haskell
(引数の順はhaskell風に変更)
iimport Text.ParserCombinators.Parsec
pad tgt = insBraket "<" ">" tgt
insBraket op cs tgt = id
. ( \( Right x ) -> x )
. parse ( makeP op cs tgt ) ""
makeP op cs tgt = let
mainP = pzero
<|> ( pzero
<|> ( try $ ( ( op ++ ) . ( ++ cs ) ) <$> ( string tgt )
<|> ( count 1 anyChar ) ) <> mainP )
<|> ( string "" )
in mainP
main = do
putStrLn $ pad "a" "aba"
putStrLn $ pad "a" "abcabc"
putStrLn $ pad "a" "aaa"
putStrLn $ insBraket "🎄" "🎅" "Christmas" "Merry Christmas!"
----
<a>b<a>
<a>bc<a>bc
<a><a><a>
Merry 🎄Christmas🎅! >>98
この正規表現を関数にするのか?
IFxU2W - Online Perl Interpreter & Debugging Tool - Ideone.com
https://ideone.com/IFxU2W
$c = 'a';
$l="<";
$r=">";
while(<>){
s/$c/$l$c$r/g;
print;
} お題
値のペアが複数入力されます
1列目の値でソートしてユニーク化し、2列目の値を出力してください
1列目の値が同じ時、2列目の値はソート後のインデックスが最も小さいもののみを出力してください
入力
c,e
b,c
c,f
b,d
a,b
c,g
出力
a,b
b,c
c,e > 1列目の値が同じ時、2列目の値はソート後のインデックスが最も小さいもの〜
と書かれてるがそのソート方法は
> 1列目の値でソート
としか書かれてない
これでは例えば
c,e
c,f
は出現順なのか、はたまた2列目の値も使って昇/降順にするのかわからない >>103
haskell 入力パーサなし
import Data.List
pairs = [
('c','e'),
('b','c'),
('c','f'),
('b','d'),
('a','b'),
('c','g')
]
f = id
. map head
. groupBy (\x y -> ( fst x ) == ( fst y ) )
. sort
main = mapM_ print $ f pairs 出現順という言葉が使われていないから、出現順ではない。
2列目もソートすべき
ソートの仕方は書いていないので、文字列でよい >>103
C++
入力を競プロぽく改変
https://ideone.com/CUTjOy
#include<iostream>
#include<map>
#include<set>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int N;
cin >> N;
map<string, set<string>> xs;
for(int i=0; i<N; i++){
string k, v;
cin >> k >> v;
xs[k].insert(v);
}
for_each(xs.begin(), xs.end(), [xs](auto& it){
cout << it.first << "," << *(xs.at(it.first).begin()) << endl;
});
return 0;
} >>103
# # cat input
c,e
b,c
c,f
b,d
a,b
c,g
# # cat input | sort | perl -F"," -lane 'print unless $LAST eq $F[0]; $LAST = $F[0]'
a,b
b,c
c,e >>103 bat
@(for %%a in ("c,e" "b,c" "c,f" "b,d" "a,b" "c,g") do @echo %%~a)|(cmd /v:on /s /c "for /f "tokens=1,2 delims=," %%b in ('sort') do @(if not "%%b"=="!s!" set "s=%%b" &echo %%b,%%c)")&pause お題: ランダムに生成されるバイナリツリーがある
ツリーのルートから見て最も左にあるノードと最も右にあるノードの位置を出力せよ
位置はツリーのルートが原点とする
x座標は原点から左に進むとマイナスになり、右に進むとプラスになる
y座標は原点から下に進むとプラスになるものとする
生成されるツリーは原点から下に向かって伸びていくものとする
生成されるツリーの最大の高さは8とする
出力例は↓のようになる
l = -3, 4
r = 5, 7 >>113
あとツリーの最大の横幅は原点から左右に8ずつで >>103 J
a =: /:~ ',' & cutopen @ >cutopen stdin ''
f =: >@{. , ','&,@>@{:
smoutput f"1 a #~ ~: {. "1 a >>103 Perl5
@a = qw{c,e b,c c,f b,d a,b c,g};
$h{(/(\w)/)[0]} //= $_ for @a;
print "$_\n" for map{$h{$_}} sort keys %h;
実行結果
~ $ perl 19_103.pl
a,b
b,c
c,e >>89
https://ideone.com/lQvahn
投稿があった、O(√)以外の方法もあるみたいなので、両方を載せておこう。
他方は、O(N)解法の最後の方の同じ数をまとめて計算するやり方。
O(√)解法より確実に計算量が多い。 >>98
Kotlin 及び Kotlin script
target_char の場合
fun wrap(text: String, target_char: Char, tag_left: Char = '<', tag_right: Char = '>') = text.replace(target_char.toString(), "$tag_left$target_char$tag_right")
target_str の場合
fun wrap(text: String, target_str: String, tag_left: Char = '<', tag_right: Char = '>') = text.replace(target_str, "$tag_left$target_str$tag_right")
要するに Java の String クラスの replace() 使ってるので、肝心な部分は何も考えてない。
tag_left, tag_right はデフォルト値として '<', '>' を指定しているので呼び出す側で指定しなければこれになる。
もう少しだけ Kotlin らしくするとしたら拡張関数にするぐらいかな。
fun String.wrap(target_str: String, tag_left: Char = '<', tag_right: Char = '>') = replace(target_str, "$tag_left$target_str$tag_right")
これで String クラスのメソッドになるので "abcabc".wrap("bc") が "a<bc>a<bc>" を返すようになる。 >>98 JavaScript
const wrap = (text, target_str, tag_left='<', tag_right='>') => text.replace(RegExp(target_str, 'g'), tag_left + target_str + tag_right); [お題] 和が2021の倍数
2021000以下の素数を昇順に並べた数列がある。
[2, 3, 5, ..., 2020979, 2020999] 項目数:150399
この数列より 空でない連続する部分列を P とする。
(全てのPの選び方はNCR(150399+1, 2) = 約113億通りある)
Pの和が2021の倍数となるのは何通りあるか。
[8081,8087] [3361, 3371, 3373] [2011, 2017, 2027, 2029] 等が該当するP
※無駄に素数を乱数代わりに使った、一発正解問題
※実行時間は素数生成を含めて、3秒以内 >>103
Kotlin script
pair.csv にその入力を入れておいてから実行する。
以下は kotlinc コマンドで REPL にして直接入力して実行した時のコピー
>>> java.io.File("pair.csv").bufferedReader().lineSequence().map { it.split(',') }.sortedBy { it[0] }.fold(mutableListOf<List<String>>()) { a, c -> if (a.size == 0 || a[a.lastIndex][0] != c[0]) a.add(c); a }.forEach { println(it) }
[a, b]
[b, c]
[c, e]
>>>
2列目については考慮していないので sortBy が中でやっているソートのアルゴリズムが変われば変わるかも知れない。 a[a.lastIndex][0] の部分は a.last().first() と書いても同じだった。
この方が a.lastIndex 呼ばない分だけ無駄が少ないかも知れない。
(でもコンパイラが中で適当に最適化して同じになるかも知れないのでどうでも良いかな?) お題: 半径dの円にぴったり内接する正n角形を描画せよ。 ぴったり内接とは?
ぴったりじゃない内接を教えてください ぴったり内接ってなんだよって言おうとしたらすでに言われててくっそワロタ 量子化誤差を最小化した演算を求めているのでは?
我々は実数を扱えないので。 n角形をなす線分が円の外側に飛び出さないよう注意を与えているのかもしれない。
実数を扱えない以上、注意する必要が有る。
ということを示唆するのかも。 >>133
processing
void setup(){
size(400, 400);
float d=200;
float r=d/2;
int n=7;
PVector c = new PVector(width/2, height/2);
ArrayList<PVector> p = new ArrayList<PVector>();
for(int i=0; i<n+1; i++){
float theta = (TWO_PI*i)/n;
PVector t = new PVector(r*cos(theta),r*sin(theta));
t.add(c);
p.add(new PVector(t.x, t.y));
}
ellipse(c.x, c.y, d, d);
for(int i=0, j=1; i<n+1; i++, j++, j%=n){
line(p.get(i).x, p.get(i).y, p.get(j).x, p.get(j).y);
}
} [お題] MarkdownのParagraph/BlockQuoteをパースしHTMLを生成してください
入出力例(1)
paragraph
> block quoted paragraph
↑入力 / ↓出力
<p>paragraph</p>
<blockquote>
<p>block quoted paragraph</p>
</blockquote>
入出力例(2)
> hoge
> > nested piyo1
> > nested piyo2
> fuga
↑入力 / ↓出力
<blockquote>
<p>hoge</p>
<blockquote>
<p>nested piyo1</p>
<p>nested piyo2</p>
</blockquote>
<p>fuga</p>
</blockquote> quote に入れるのは"> "の繰り返しのみで桶? >>141
はい、blockquoteは
"> > "のように"> "の繰り返しで始まる行としてください。
簡単のために">>"のような入力は考慮不要として下さい。 お題
文字列を数値文字参照に変換してください
入力: 𝚙𝚛𝚘𝚐𝚛𝚊𝚖𝚖𝚒𝚗𝚐 𝚌𝚑𝚊𝚕𝚕𝚎𝚗𝚐𝚎𝚜
出力: 𝚙𝚛𝚘𝚐𝚛𝚊𝚖𝚖𝚒𝚗𝚐 𝚌𝚑𝚊𝚕𝚕𝚎𝚗𝚐𝚎𝚜 >>146は不正なUnicode文字列の入力を考慮していませんでした
高位サロゲートが低位サロゲートを伴わず単独で現れていると、その直後の文字が抜け落ちます
つまり
"<\ud83c>" → "<�>" ではなく
"<\ud83c>" → "<�" になってしまう
修正版: https://ideone.com/bz8cMe すごいどうでもいいことなんだけど、
ArrayListってどういうデータ構造なの?
ArrayなのそれともListなの?
おじさんわからないよ。。 >>149
お題
array listを実装してください
次の要項を満たしてください
・add, removeができること
・サイズが可変であること
・序数で要素にアクセスできること
・要素へのアクセスの計算量はO(1)もしくはO(log n)であること >>150
add, remove は任意箇所の挿入と一要素削除で桶? >>150
それがArrayListの要件? ありがとう >>154
>>150ってただの可変長配列じゃないの? >>150
この問題の要件は
>・要素へのアクセスの計算量はO(1)もしくはO(log n)であること
だけでいいのかな?
コレだけでいいならデータの更新時に常に深さが±1の二分木に納直せば必ず参照の計算量はO(log(n))になるし、毎回ソートして格納し直せば参照の(indexによる)計算量はO(1)になる希ガス
データの更新時の制限は全くないでいいのかな? メモリが安くなったとはいえ
やはりメモリの制限は必要では?
無尽蔵にあるわけではないので お題: 四方に広がる無限のサイズの方眼紙があって、1マス1マスに一個のアラビア数字を一度だけ記入できる。
方眼紙に記録したデータの一部は「仮想画面」に出力できる。
マス(x, y)に数字dを記入することを「P(x, y, d)」と表すことにする(x, yは任意の整数)。
(a) 3桁の自然数が2つ与えられる。その足し算の筆算を実演するアルゴリズムを出力するプログラムを書け。
(b) 任意の自然数が2つ与えられる。(以下略) 補記。
マス(x, y)にある数字を「P(x, y)」と表すことにする。マス(x, y)に数字がなければP(x, y)==0とする。
また、マス(x, y)に数字がなければE(x, y)==1とし、数字があればE(x, y)==0とする。 お題: ランダムな数列を生成せよ
数列の長さは4 <= len <= 20とし、これもランダムとする >>163 Ruby 3.0
p Array.new(rand(17) + 4){rand * 1e32} >>163 js
const rand = (a, b) => Math.floor(Math.random() * (b - a + 1)) + a
const range = (n) => [...Array(n).keys()]
range(rand(4, 20)).map(Math.random) >>163
Kotlin または Kotlin script
以下は kotlinc コマンドで REPL で実行した時のコピー。
(先頭の >>> はプロンプト)
>>> (1..(4..20).random()).map { kotlin.random.Random.nextInt() }
res0: kotlin.collections.List<kotlin.Int> = [1712097059, 2034192723, -1232228362, 634194098, 1788814029, -1878195330, -2043751487, 933285281, 1116738696, -934057871, -1657983454, -1761832713, -1836302098, -902578867, -1306790359, 1824207694, 386095401, -389307033, 380242891, -2028767653]
>>>
実行結果は何処にも出力しようとしてしていないが REPL なので自動で出力されている。 >>163 Ruby
# こんな意味だと解釈した
puts ( '%020b' % rand(1<<20) )[ 0, 4+rand(17) ] # ( 2進) '0000'-'00000000000000000000'..'1111'-'11111111111111111111'
puts ( '%020d' % rand(1e20) )[ 0, 4+rand(17) ] # (10進) '0000'-'00000000000000000000'..'9999'-'99999999999999999999' お題
アルファベットの開始の文字、アルファベットの終了の文字を
入力としてうけとり下記のように文字列を出力してください
入力: a,k
出力:
a
ab
abc
abcd
abcde
abcdef
abcdefg
abcdefgh
abcdefghi
abcdefghij
abcdefghijk 意味不明な途中省く
sh & perl5
echo "a,k" | perl -lane 'm/(\w),(\w)/; print ($1..$2)'
abcdefghijk >>169
Haskell
import Data.List
consecutiveAlph a z = tail $ inits $ [ a .. z ]
main = mapM_ putStrLn $ consecutiveAlph 'a' 'k'
----
a
ab
abc
abcd
abcde
abcdef
abcdefg
abcdefgh
abcdefghi
abcdefghij
abcdefghijk >>169
# Ruby3.0
x = ("a".."k")
x.inject{
p _1
_1 + _2
} >>169 Perl5
@a = split',', <>;
print($a[0]..$_, "\n") for $a[0]..$a[1];
実行結果
~ $ echo 'a,k' | perl 19_169_a,k.pl
a
ab
abc
abcd
abcde
abcdef
abcdefg
abcdefgh
abcdefghi
abcdefghij
abcdefghijk つか、これでよかったわ
@a = eval <>;
print($a[0]..$_, "\n") for $a[0]..$a[1]; お題
オセロのようなルールでひっくり返しを行う処理を実装せよ
変数のイメージ
0 = 置かれてない場所
1 = 黒
2 = 白
3 = 今のターンで置いた黒
入力:01202113112120
出力:01202222222120 >>177
それやと1が置かれたのか2が置かれたのかわからないのでは?
0123120のとき
1が置かれたとして0111120になるのか
2が置かれたとして0122220になるのか
わからない >>177
haskell
twosTurn x = let
( pre, ( '3' : post ) ) = span (/='3') x
revOne y = let
( pre02 , post02 ) = span ( == '1' ) $ y ++ "0"
twos = zipWith const ( repeat '2' ) pre02
in if ( head post02) == '0'
then y
else take ( length y ) ( twos ++ post02 )
revOne' = reverse . revOne . reverse
in ( revOne' pre ) ++ "2" ++ ( revOne post )
sample = "01202113112120"
main = print $ twosTurn sample >>177 Ruby
board = '01202113112120'
puts board
puts board.sub( /2(1*)3(1*)2/ ){ "2#{'2'* ($1.size)}2#{'2' * $2.size}2" } >>182 は間違いでした
board = '01202113112120'
puts board
puts board.sub( /2(1*)3/ ){ "2#{'2'* ($1.size)}3" }.sub( /3(1*)2/ ){ "3#{'2'* ($1.size)}2" }.tr( '3', '2' ) 仕様を出来るだけ簡潔にしたかったんだろうけどやり過ぎてモヤる
下位から
第1bit 駒有無
第2 駒種別
第3 now flag
として
0:駒無し
1:白, 3:黒
5:白now, 7:黒now
と置いてnowの結果を出力の方が良くね この問題の本命は、オセロを作るっていうお題にしたつもりじゃないからw
スレに居る人はオセロくらい作ったことある人しかいないと思っているし
ゲームのアルゴリズムの一端を文字列処理として見るのも可能っていう点な >>184
お前がそういうお題を新たに出せば良い。 >>184 Ruby
board = [0b000,0b011,0b001,0b000,0b001,0b011,0b011,0b101,0b011,0b011,0b001,0b011,0b001,0b000].pack('C*')
if board["\x05"]
board = board.sub( /\01(\03*)\x05/ ){ "\01#{"\01"* ($1.size)}\x05" }.sub( /\x05(\x03*)\x01/ ){ "\x05#{"\x01"* ($1.size)}\x01" }.tr( "\x05", "\x01" )
else
board = board.sub( /\03(\01*)\x07/ ){ "\03#{"\03"* ($1.size)}\x07" }.sub( /\x07(\x01*)\x03/ ){ "\x07#{"\x03"* ($1.size)}\x03" }.tr( "\x07", "\x03" )
end
puts board.unpack('C*').map{|b| '0b%03b' % b.ord }.join(',')
#=>0b000,0b011,0b001,0b000,0b001,0b001,0b001,0b001,0b001,0b001,0b001,0b011,0b001,0b000 >>169 octave
https://ideone.com/li5G9s
f = @(b, e) arrayfun(@(e) {b:e}, b:e);
f('a', 'k') >>169
Perl5
コマンドラインからこんな風に入力して実行する。(実際に試した shell は bash)
perl -ne 'chomp;@d=split/,/;print join("\n", map { join("", $d[0]..$_) } $d[0]..$d[1])."\n";' >>169 Ruby
def f(a,b)
(a..b).map{|c| [*a..c]*""}
end
puts f("a","k") お題
N個の時系列データが与えられる。i番目のデータはa_iである
i=1〜Nについて、以下の条件を満たすx_iを出力せよ
x_i : 直近c個でa_iが最大となるようなcのうち、最大のもの
[入力]
N
a_1 a_2 ... a_N
[出力]
x_1 x_2 ... x_N
(例1)
5
3 1 2 6 6
=> 1 1 2 4 5
3 = max(3)
1 = max(1) //今までの中で最小
2 = max(1, 2) //直近2個で最大
6 = max(3, 1, 2, 6) //直近4個で最大 (直近3個でも最大だが、cの値として最大のものを選ぶ)
6 = max(3, 1, 2, 6, 6) //直近5個で最大(最大タイ)
(例2)
3
100 10 1
=> 1 1 1 上田隆一
シェル芸勉強会問題一覧
https://b.ueda.tech/?page=00684
色々な問題が掲載されている。
問題作りのヒントになるかも >>169 bat
@echo off &setlocal
set ALL=abcdefghijklmnopqrstuvwxyz
call :RANGE a,k
pause &exit /b
:RANGE
setlocal enabledelayedexpansion
if "%1" GTR "%2" echo ERROR: Invalid argument&exit /b
set STR=!ALL:*%1=%1!
if not "%2"=="z" call set STR=%%STR:!ALL:*%2=!=%%
:LENGTH
set /a n+=1
if not "!STR:~0,-%n%!"=="" goto :LENGTH
for /L %%n in (1,1,%n%) do echo !STR:~0,%%n! >>196
完全に全く意味がわからないお題を久々に見た >>163 octave
https://ideone.com/GX9hjP
f = @() rand(randi([4 20]), 1); >>196
haskell
import Data.List
c = id
. map length
. map (\x -> takeWhile ( <= ( last x ) ) . reverse $ x)
. tail
. inits
main = do
print $ c [ 3, 1, 2, 6, 6 ]
----
[1,1,2,4,5] >>143
Kotlin
>>194のJavaのやつを見て>>158のKotlinのやつを改造した。
https://paiza.io/projects/iNRMUv2Annc6YFqJjAO4wg
要するに >>158 を作っている時に String#codePoints() に気付いていなくて自作してしまったということだが、
Java 8 から追加されたメソッドのようなので、>>158は古い JVM ライブラリでも動くということではある。 お題
>>196を小学生にも理解できるぐらいのやさしい日本語に翻訳せよ。 このスレの住人なら日本語分からなくても例だけ見れば普通に理解できるだろ
IQテストみたいなもんだ >>206
こういう事じゃない?
入力値が遡って比較する最大個数と値を兼ねてるんでしょ
同値ならindex(1始まり)の大きい方
入力:3 1 2 6 6 4
3 [(3)] →1
1 [3 (1)] →1
2 [3 (1 2)] →2
6 [(3 1 2 6)] →4
6 [(3 1 2 6 6)] →5
4 [3 1 (2 6 6 4)] →3 >>209
最後の4違うぞ
入力:3 1 2 6 6 4
3 [(3)] →1
1 [3 (1)] →1
2 [3 (1 2)] →2
6 [(3 1 2 6)] →4
6 [(3 1 2 6 6)] →5
4 [3 1 2 6 6 (4)] →1
x_iは要素数。上の例でいうと()の中の数が何個あるかってこと。で、(右から)直近の要素の中での最大値が一番右の数字になるのは最大でいくつかってこと。
一番下の4のケースでは次の6を含んでしまうとMAXが4にはならないので要素数1で打ち止め。 現在地から前に遡って見ていって自分と同じか小さい要素が続く数を
最初から最後まで求めるだけ
もっと早く一発で求める方法があるかは分からないけど >>206
長さ N の整数列 A が与えられる
A の連続した部分列であって、各 i (1≦i≦N) について次の条件を満たすものをすべて求めなさい
・整数 j (1≦j≦i) を max(A_j, A_{j+1}, ..., A_i) = A_i を満たす最小の j とし i - j + 1 の値 >>196 C++ O(N log N)
セグメント木を使うと区間 max の二分探索を O(log N) で行える
atcoder の aclib を使用
https://wandbox.org/permlink/8rm8MsauDMJhvpAf お題
将棋のルールで可能な最初の2手を全て求める。 なるほど
(∞,0)のみからなるリストから始めて(-値、インデックス)についての辞書式順序(ただしインデックスは降順)でリストに追加していくと考えればいいのか
i番目の要素(v,i)が来た時(u,h)<(w,j)の間に入るならvより大きい最大のインデックスはjだからi番目の出力はi-jになるのか >>216
先手後手ともに可能性が30通りあるのでそれらを単純に組み合わせて出力すれば良い 最初の初期状態の配置ならつまらんね
途中経過のどの状態からでもすべての2手(3手でもいいよ!)を出力とかなら
本格的な将棋プログラム組まないと導き出せない お題:sortしてreverseしてforeachせよ
https://ideone.com/35HTkC
List(7, 8, 3, 6, 4).sorted.reverse.foreach(print) >>224 rust
https://ideone.com/SY2DMY
fn main() {
let mut v = [7, 8, 3, 6, 4];
v.sort();
v.reverse();
v.iter().for_each(|x| println!("{}", x));
}
>>224 dart
https://ideone.com/w26D8S
void main() {
var a = [7, 8, 3, 6, 4];
a.sort();
a.reversed.forEach(print);
} >>224 ocaml
https://ideone.com/bitFC6
List.iter print_int (List.rev (List.sort Pervasives.compare [7; 8; 3; 6; 4]))
>>224 ruby
https://ideone.com/K14REi
[7, 8, 3, 6, 4].sort.reverse.each(&method(:p))
>>224 octave
https://ideone.com/E2DoUr
arrayfun(@disp, flip(sort([7 8 3 6 4]))) >>224 C++
for (auto i : multiset<int, greater<int>>({ 7, 8, 3, 6, 4 })) cout << i << endl; >>224 Perl5
print reverse sort qw(7 8 3 6 4);
実行結果
$ perl 19_224.pl
87643 >>224 Perl5、foreach も要るんやったね…
print foreach reverse sort qw(7 8 3 6 4);
実行結果
$ perl 19_224.pl
87643 >>224 Bash
cat <<EOS | sort -r | while read v; do echo ${v}; done
7
8
3
6
4
EOS
>>224 Ruby
[7, 8, 3, 6, 4].sort_by(&:-@).each{p _1} >>229
> print foreach reverse sort
perlってこんな気持ちいい書き方できる言語やったんけ
正直恐れ入った お題: 俺のチ〇コの長さ分だけfor文でカウントしてカウント変数を出力せよ >>232
perl
for ($i = 0; $i < 1; $i += 0.1) { print "$i\n" } お題: 日付をYYYYMMDD形式で表したとき、それを表す整数が今日より後に素数になる日付を求めなさい。 >>224
Kotlin script
kotlinc コマンドで REPL にして直接入力して実行した時のコピー。(>>> はプロンプト)
出力は println() を使って1つづつ改行させた。
>>> listOf(7, 8, 3, 6, 4).sorted().reversed().forEach { println(it) }
8
7
6
4
3
>>> お題:
整数 N が与えられます
長さ N の正整数列 A_1, ..., A_N であって以下の条件を満たす lcm(A_1, ..., A_N) が最小のものを求めなさい
・gcd(A_1, A_2) * gcd(A_2, A_3) * ... * gcd(A_{N-1}, A_N) * gcd(A_N, A_1) = lcm(A_1, ..., A_N)
制約:
3≦N≦4000
例:
入力: 5
出力: 6 15 35 77 22 >>238 perl
print join ' ', (1) x $ARGV[0]; Aiの制約で....
Aiが異なる正整数なら
N=5 [1,2,4,8,64] ->lcm=64
Ai>=3 なら
N=5 [5,7,14,6,15] -> lcm=210(=1*2*3*5*7)
(同じlcmで数列は複数作れる)
※あの例はどういう条件だろう すいません...
素数を小さい順に組み合わせて 2*3, 3*5, 5*7, 7*11, 11*2
とすると綺麗に数列が作れていいなーと思って投稿したのですが、最小ではなかったようです...
このお題は無かったことに お題、灘中入試っぽい問題
開始点S から、終点G まで、最短距離9 で移動する方法は、何通りあるか?
移動は右か下へ、1ずつ移動できるが、* は通れない所である。
数字は通れる所で、単に分かりやすくするために座標を書いただけで、移動コストではない
S23456
12*456
1234*6
123456
12345G プログラムなら実際に駒動かしてかぞえるの?
なんか、足し算引き算で出来そうだよね、 >>248 sh
echo 48
#やっぱ計算しなきゃダメ? お姉さん問題なら、
Ruby で、そのライブラリを使って解いてみて 超高速グラフ列挙アルゴリズム 〈フカシギの数え方〉おねえさん問題
BDD/ZDD の湊真一が、北大から京大大学院の教授へと出世してる https://ideone.com/b2CQ5a
48ってなったからあってるのかな適当に作ったけど お題:
これ出題してみるか。
黒板に1〜nの自然数が一つずつ書かれている。
二人でかわりばんこに次のルールで黒板に書かれた自然数を消していくゲームをする:
・自分の番のとき、黒板に残っている数から一つ選び、
その数及びその数の約数をすべて消す。
・自分の番で黒板の数をすべて消し去ったとき勝者となる。
実はこのゲームはnによらず先攻必勝であるが、初手をどう打つかを判断するのは簡単でない。
1〜30のすべての自然数nについて、後攻を勝たせないために初手で先攻が選ぶことができる数をプログラム中で5秒以内に計算し、すべて列挙せよ。 1〜30ならデータベース化してしまえばなんとかなるな >>248
9C4 - 3C1 * 6C3 - 6C2 * 3C1 + 3C1 * 3C1 * 3C1 = 48 >>248
お受験風にdpで数え上げる
Haskell
test1 = ""
++ "┏┳━┳┳┓\n"
++ "┣┫ ┣┻┫\n"
++ "┣╋┳┫ ┃\n"
++ "┣╋╋╋┳┫\n"
++ "┗┻┻┻┻┛\n"
to01 = let
parseC c = if c == '\x2001' then 0 else 1
parseL = map ( parseC )
in map parseL . lines
cntRoots posCrs = let
z y x = zipWith ( * ) y $ zipWith ( + ) x $ ( 0 : ) $ z y x
rs = id
$ ( ( 1 : ( repeat 0 ) ) : )
$ zipWith z posCrs rs
in rs
nRoots = last . last . cntRoots
main = print $ nRoots $ to01 test1
----
48 >>248
再帰で全パターンやらせるようなのは誰もがやりそうなので他の人に任せるとして、後はやるとしたらスレッド使ってやるぐらいかねえ。再帰は再帰だけど、うまくいけば速く動きそう。(スレッド作るコストが高くて遅くなるかも知れんが)。
ま、しかし、今は麻婆豆腐定食食ってる最中なのでできない。後で時間が空いた時にまだ覚えてたら作ろう。 総当たりから、* で通る経路を引くぐらいしか、思いつかない
>>260
漏れも、そういう木を考えた ちなみに>>260はお受験で出てくる
1 1 1 1 1 1
1 2 x 1 2 3
1 3 3 4 x 3
1 4 7 11 11 14
1 5 2 23 34 48
と上から順に数える方法です
Haskellのdpは読みにくい
オレの書き方が下手なだけか?orz 開始点から数え上げるので良かったのか
漏れは、終点から数え上げる方法を考えていた お題:以下のパイプを実現するプログラムprogを作りなさい
$ echo "1 + a" | prog
1a
$ echo "b + 3" | prog
3b
$ echo "2 + d + 1 + c" | prog
12cd >>267
Kotlin
https://ideone.com/6Il455
いやー。スマホで入力するのは大変だな。画面は小さいはエディタはまともにうごかんはで非常に疲れた。 >>267 Ruby
$ echo "1 + a" | ruby -e"$><<gets.scan(/\w+/).sort.join"
1a
$ echo "b + 3" | ruby -e"$><<gets.scan(/\w+/).sort.join"
3b
$ echo "2 + d + 1 + c" | ruby -e"$><<gets.scan(/\w+/).sort.join"
12cd >>267
echo "1 + a" | perl -pe 's/[ +]+/\n/g'|sort|perl -pe 's/\n//'
1a
echo "b + 3" | perl -pe 's/[ +]+/\n/g'|sort|perl -pe 's/\n//'
3b
echo "2 + d + 1 + c" | perl -pe 's/[ +]+/\n/g'|sort|perl -pe 's/\n//'
12cd >>267
$ echo "2 + d + 1 + c" | sed "s/ *+ */\n/g" | sort | xargs | sed "s/ //g"
12cd >>266
答えも解き方もあってるとおもう
総当たり以外の方法で解けないかなと思ってるところだけど 先手必勝が分かってるのに具体的な勝つ手は簡単に分からないもんなの? >>275
必勝手を簡単に導くアルゴリズムが、どこかにあるといいなと思います
ただ、そのアルゴリズムがわからなくても先手必勝は証明できます 必勝手を指すのと必勝パターン数を計算するのはまた別物だしな お題:
H×Wのマス目が与えられます。
始点'S'、終点'G'、通路'.'、壁'#'であり、壁や範囲外のマスは通ることができません。
また、始点と終点は隣り合っていないものとします。
いくつかの通路を壁に変更して、始点から終点に到達できなくするには
最小でいくつ壁が必要でしょうか?
[入力]
H W
(マス目を表す文字列)
[入出力例]
1 5
S...G
=> 1
3 3
S#.
#..
..G
=> 0
4 4
....
.S..
..G.
....
=> 4 お題:ニセコインを見つけよ
半年毎に数学板で出てくるお題
n枚のコイン(n≧3)の中から重さの違うニセコインを見つけには何回天秤つかえばよいか
なおどのコインも最低一回は天秤に乗せてニセコインが重いか軽いかも判定するものとする
答えは
e = ceiling( logBase 3 ( 2*n+2 ) )
さてさてこの回数で可能はそんなに難しくない
実際e行n列の1,0,-1からなる配列で
@どの行も1の数と-1の数が等しい(右の皿と左の皿に同じ数乗せる)
Aどの相異なる行u,vをとってもu ≠ ±v
となる配列が作れる
そこで n≧3 にたいしてこのような配列を出力するプログラムを作って下さい
例
3->
[[-1,0,1],[0,1,-1]]
10->
[[-1,0,1,-1,0,-1,1,1,-1,1],[0,1,-1,-1,0,0,0,-1,1,1],[0,0,0,0,-1,1,1,-1,-1,1]]
12->
[[-1,0,1,-1,0,-1,1,1,-1,0,0,1],[0,1,-1,-1,0,0,0,-1,1,-1,1,1],[0,0,0,0,-1,1,1,-1,-1,1,1,-1]
39->
[[-1,0,1,-1,0,-1,1,1,-1,0,0,-1,1,0,1,-1,-1,1,0,0,1,-1,-1,1,0,0,1,-1,-1,1,0,0,1,-1,-1,1,0,0,1],[0,1,-1,-1,0,0,0,-1,1,-1,1,-1,1,0,0,0,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,0,0,0,0,0,0,1,-1,1,-1,1],[0,0,0,0,-1,1,1,-1,-1,1,1,-1,-1,0,0,0,0,0,0,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1],[0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1]] 訂正
× Aどの相異なる行u,vをとってもu ≠ ±v
◯ Aどの相異なる列u,vをとってもu ≠ ±v >>279
最初しか読んでないが、その条件では軽い方が偽物なのか重い方が偽物なのか決定することが不可能 >>282
今確かめてみたら合ってるようです
main = print $ [ ( n, ceiling $ logBase 3 $ fromInteger $ 2*n +2) | n<- [3..16] ++ [38..42]]
[(3,2),(4,3),(5,3),(6,3),(7,3),(8,3),(9,3),(10,3),(11,3),(12,3),(13,4),(14,4),(15,4),(16,4),(38,4),(39,4),(40,5),(41,5),(42,5)]
ちなみに軽重が確定しない=一度も乗せないのもありにすれば13枚でも3回で可能です
12回のときの解に「一度も乗せないコイン」を入れればいいだけなので
ちなみにn=12とn=39のときの解でそれぞれ3回、4回で可能
[[1,0,1,-1,0,1,-1,0,0,1,-1,-1],[0,1,-1,-1,0,0,0,1,-1,1,-1,1],[0,0,0,0,1,-1,-1,1,1,-1,-1,1]]
[[1,0,1,-1,0,1,-1,0,0,1,-1,1,-1,0,1,-1,-1,1,0,0,1,-1,-1,1,0,0,-1,1,0,0,1,-1,-1,1,0,0,1,-1,-1],[0,1,-1,-1,0,0,0,1,-1,1,-1,-1,1,0,0,0,1,-1,1,-1,1,-1,-1,1,-1,1,0,0,0,0,0,0,1,-1,1,-1,1,-1,1],[0,0,0,0,1,-1,-1,1,1,-1,-1,1,1,0,0,0,0,0,0,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1],[0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1]] >>279
ちょっと盛り上がらないのでアルゴリズムの一例例示してみます
まぁここはプログラミングのスレだから数学部分はどうでもいいでしょう
構成法はほかにもいくつかあります
なお{1,0,-1}はうるさいので{1,0,2}にします
---
以下において{ }で囲まれた数は3進数表示とする
以下3進数表示した時
最高位が1でそれ以外が0であるものを10型、
最高位が2でそれ以外が0であるものを20型、
最高位が2で次に来る0でない数も1であるものを11型
‥
と定めていき、自然数全体を10型、20型、11型、12型、21型、22型と6型に分類する
与えられた自然数のうち
@何もしない
A最高位のみ1⇔2の交換をする
B最高位以外1⇔2の交換をする
C全桁1⇔2の交換をする
で11型の変換できる
例えば{2201}=73であればCを適用して
f11(73)={1102}=38となる
同様にしてf12,f21,f22を定義しておく
では自然数eと3≦n≦(3^e-3)/2を満たす自然数nについて条件を満たす組みを構成する
まずn-eが奇数のときn-a-1をm、そうでないときはn-eをmとおく
前者のときケースA、後者のときケースBと呼ぶ
次にe桁以下の11型の数からケースAでは{111‥11}(e桁)を取り除いたものを、ケースBでは{111‥10}(e桁)を取り除いたものを並べたものを考える
(続く) (続き)
この列の最初のm/2個を2個ずつ並べてm個にした列
{11},{11},{101},{101},{110},{101},{111}‥
にf11,f12,r21,f22を順に作用させていく
ただし桁が上がるごとにf11に戻す
最初の方を例示すれば11型の数を2個ずつ並べたものが
{11},{11}
{101},{101},{110},{110},{111},{111},{112},{112},
{1001},{1001},{1010},{1010},{1011},{1011},‥
だから
{11},{12}
{101},{102},{210},{220},{111},{122},{212},{221},
{1001},{1002},{2010},{2020},{1011},{1022},‥
となる
この列は偶数番目のどこで切っても各桁に現れる1の個数と2の個数は同数か1の方が2個多い事に注意する
また最低位では常に1の個数と2の個数は同数になる
よってケースAではe個の10型、もしくは20型の数を追加する事によって全てのくらいで1の個数がちょうど一個多くなるようにできる
またこの時列の長さはm+e=n-1個である
最後に{222‥22}を追加して条件を満たす列ができる
また同じくケースBではe-1個の10型、20型の数を追加して最低位だけ同数でそれ以外の桁では1の個数がちょうど一個多くなるようにできる
この時の列の長さはm+e-1=n-1個である
最後に{222‥20}を追加すれば良い 盛り上がりませんね
解答例
https://ideone.com/cHEv2n
見栄え考えて"+ -"の三文字で表現してます
まぁ数学というわけでもないです
ただ数学板にはもう半年に一回くらい上がってくる
意外にネットでちゃんと解説してるサイトがない お題
整数 a_i が n_i 個ある。(1 <= i <= K)
このデータの中央値を求めよ。
[入力]
K
a_1 n_1
...
a_K n_K
[入出力例]
3
1 2
2 2
3 4
=> 2.5
{1, 1, 2, 2, 3, 3, 3, 3}の中央値は(2+3)/2=2.5
2
0 1000000000
1 999999999
=> 0 こわれてる
K=3
i=4
K=3<4=i と i<=Kが矛盾 お題:機械翻訳しなさい
入力:this is a pen
出力:これはペンです
入力:is this a pen?
出力:これはペンですか? >>295
間違ってね?
3
1 2
3 4
2 2
とか 中央値は出現順の中央の値じゃないよ値の順の中央の値だよ 1,2,3,100 の場合
中央値は 2.5 ですか?
それとも 2 または 3 ですか? floor(n/2) 番目の値とceiling(n/2)番目の値の平均 違う
floor ((n+1)/2)番目とceiling (n+1)/2)番目だ まぁ zero-based indices だと思えばどちらでも 要するにindexがa〜bならその中央値はfloor((a+b)/2)番目とceiling((a+b)/2)番目の平均 お題:数字をスワップせよ
時刻とスワップ対象が以下のフォーマットで与えられる
yyyy/mm/dd hh:MM:ss
a
b
a,bに指定された数字をスワップせよ
例:
入力
2021/02/17 02:37:41
yyyy
MM
出力
37/02/17 02:2021:41 >>299
ああ。そうか。
>>295はソート入れて修正した。 最近のC++って連想配列やら正規表現やらが標準で使えるんか >>312
連想配列はプラプライレブン以前の旧C++ ですら map で扱えていました、正規表現はどうなのか私はよく知りません‥‥ 昔は正規表現つったらboost入れて使ってたよね(ヽ´ω`) >>306 Perl5
$f = 'yyyy/mm/dd hh:MM:ss';
@w = $f =~ /(\w+)/g;
%h = map{$_ => [index($f, $_), length $_]} @w;
$f =~ s/\w+/\$$&/g;
$f = 'print "'.$f.'\n"';
($s, $p, $v) = <>; chomp ($p, $v);
@g = map{substr $s, $h{$_}[0], $h{$_}[1]} @w;
${$w[$_]} = $g[$_] for 0..@w;
($$p, $$v) = ($$v, $$p);
eval $f;
実行結果
https://ideone.com/5ZWolC >>317 もっとコンパクトに書けるんだった…orz
$f = 'yyyy/mm/dd hh:MM:ss';
@w = $f =~ /(\w+)/g;
($s, $p, $v) = <>; chomp ($p, $v);
@g = $s =~ /(\d+)/g;
${$w[$_]} = $g[$_] for 0..@w;
($$p, $$v) = ($$v, $$p);
print "$yyyy/$mm/$dd $hh:$MM:$ss\n";
あるいはもっと
@w = qw{yyyy mm dd hh MM ss};
($s, $p, $v) = <>; chomp ($p, $v);
@g = $s =~ /(\d+)/g;
${$w[$_]} = $g[$_] for 0..@w;
($$p, $$v) = ($$v, $$p);
print "$yyyy/$mm/$dd $hh:$MM:$ss\n"; >>306 Perl5、もっと素直にすんなり書けるんだった…><
%h = qw{yyyy 0 mm 2 dd 4 hh 6 MM 8 ss 10};
($s, $p, $v) = <>; chomp ($p, $v);
@f = $s =~ /(?:(\w+)(\W?))/g;
@f[@h{$p, $v}] = @f[@h{$v, $p}];
print @f;
実行結果
https://ideone.com/ROZTJ8 お題:正の整数を入力として、後ろにアルファベットを2文字足して英語の基数詞を出力せよ
例) 入力=3 → 出力=3rd
入力=19 → 出力=19th
入力=2021 → 出力=2021st
ガイシュツかしら? 残念ながらガイシュツで、
海外のスゲー短いゴルフコードも紹介されてた希ガス >>320 Ruby
f = ->n{n.to_s + %w[th st nd rd][n % 10 > 3 || n / 10 % 10 == 1 ? 0 : n % 10]}
puts (0..27).map{f[_1]} # =>
0th
1st
2nd
3rd
4th
5th
6th
7th
8th
9th
10th
11th
12th
13th
14th
15th
16th
17th
18th
19th
20th
21st
22nd
23rd
24th
25th
26th
27th >>320
プログラミングのお題スレ Part15
ttp://mevius.5ch.net/test/read.cgi/tech/1564310397/520
で回答したcode
%h = qw{1 st 2 nd 3 rd};
for (1..4,11,12,13,21,22,23,101,102,103,111,112,113,121,122,123, 2021) {
/(\d?)(\d)$/;
printf "$_ => $_%s\n", $1 eq 1 ? 'th' : $h{$2}//'th';
} >>320
haskell
showOrd x = let
[ a, b ] = map ( mod ( x - 10 ) ) [ 10, 100 ]
s = show x
in case () of
_ | b < 10 -> s ++ "th"
_ | a == 1 -> s ++ "st"
_ | a == 2 -> s ++ "nd"
_ | a == 3 -> s ++ "rd"
_ -> s ++ "th"
main = mapM_ putStrLn [ showOrd x | x <- [ 1..30 ] ] お題:1から100までFizzBuzzせよ
1から100までの数字を印刷するプログラムを作成します。
ただし、3の倍数の場合は数字の代わりに「Fizz」を出力し、
5の倍数の場合は「Buzz」を出力します。
3と5の両方の倍数である数の場合は「FizzBuzz」を出力します。
ocaml
https://ideone.com/cPM0O8 >>331 Ruby
1.upto(100){puts'FizzBuzz
'[i=_1**4%-15,i+13]||_1} >>331
haskell
fizzbuzz x = case () of
_ | mod x 15 == 0 -> "FizzBuzz"
_ | mod x 3 == 0 -> "Fizz"
_ | mod x 5 == 0 -> "Buzz"
_ | otherwise -> show x
main = mapM_ putStrLn $ [ fizzbuzz x | x <- [ 1..100 ] ]
https://ideone.com/XbOOp2 >>331
Kotlin script
(1..100).forEach{n->println("${((if(n%3==0)"Fizz" else "")+(if(n%5==0)"Buzz" else "")).let{if(it=="")n.toString()else it}}")} >>331 Ruby
(1..100).each{|i| puts ({1=>i, 3=>"Fizz", 5=>"Buzz", 15=>"FizzBuzz"})[i.gcd(15)]} >>331 Ruby
a = [0] * 100
2.step( 100, 3 ){|i| a[i] = 1 }
4.step( 100, 5 ){|i| a[i] += 2 }
100.times{|i|
puts (a[i] == 0)? i+1 : [ 'Fizz', 'Buzz', 'FizzBuzz' ][ a[i]-1 ]
} >>337
それだ
gcdか
Haskell
fizzbuzz x = case gcd x 15 of
3 -> "Fizz"
5 -> "Buzz"
15 -> "FizzBuzz"
_ -> show x
main = mapM_ putStrLn $ [ fizzbuzz x | x <- [ 1..100 ] ]
思いつかなかったorz お題
連続する文字列を抽出してください
入力: むかしむかし、あるところにワッフルワッフルがありました
出力: むかし, ワッフル >>342 Ruby
puts "むかしむかし、あるところにワッフルワッフルがありました".scan(/(.+)\1/)*?,
# => むかし,ワッフル むかしむかしむかし、あるところにワッフルワッフルワッフルがありました >>346>>347は4連続だとうまく行かなかったのでちょっと直した。
(.+)\1+ じゃなくて (.+?)\1+ でないと4連続が2連続で一塊になってしまった。 そもそも問題の解釈が色々あるよな
ワッフルワッフルワッフルワッフル
が入力に入ってるとき最長の
ワッフルワッフル
を出力するのか2通りの読み方の
ワッフル、ワッフルワッフル
の両方を出力するのか
ワッフルワッフルうまいワッフルうまい
の場合出力は
ワッフル、ワッフルうまい
両方なのかどっちか消すのか
試験じゃないんだから好きに解釈していいのかもしれんけど 繰り返し文は全部リストアップすると解釈して
Haskell
https://ideone.com/HidXyj > 2通りの読み方の ワッフル、ワッフルワッフル の両方を出力するのか
これは辞書持たせないと無理だから現実的では無いでしょ
最長解(複数あるなら全てか最初の一つ)、或いは最短、全パターン列挙でないと
ワッフル,ッフルワ,フルワッ,ルワッフ,ワッフルワッフル >>353
どのみち計算量はn^2で定数分しか差ないのでは? お題 ルートとガウス
数学板より
c = 50 + √2501 とする
整数列anが漸化式
a0 = 1
a(n+1) = [ ca(n) ]
で与えられているときa(n)の下2桁をn:0〜100の範囲で表示しなさい
----
ちなみに理詰めなら答えはすぐ出ます
しかしFloatやDoubleでは最初の10項位で桁溢れで詰みます
どうしますかというお題 数学の知識がなくても
計算の精度をあげれば解けなくもない >>357
a0はa(0)のこと?
ca(n)はc*a(n)?
[ ] でくくっている意味は?
整数列ってことは整数化すると思うけど切り捨て?四捨五入?
以上素朴な疑問。
なお回答コードを書くかは、未定です >>359
検索して調べた
私が高校生だった頃は数学過程で使われていなかったか、あるいは忘れちゃったか >>359
ガウスの記号はいつ習うんですか? - 習いません。設問の中で必ず定義が示されて... - Yahoo!知恵袋
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1464989549
だそうだ。いつごろから使われるようになった記号なんだろうね。 括弧をガウス記号の意味で使う場合、ガウス記号であることは明示した方が良いよ あーperlおじさんこの前数学問題に発狂してたな
触れないどこ >>363
入試などの試験で使われるんだろうけど
オレが学生だった頃は見かけなかったぞ、ほんまに。 数学は嫌いじゃないんだよね。むしろ好きな方(得意かどうかは別)
なにがいやだつって、人に分からせるつもりがないような書き方して
数学が分からないんだと、と他人を馬鹿にしたような態度の傲慢さがいやなんだよね ありゃ
ガウス記号通じませんでしたか
失礼しました
やはりプログラム板ならfloorの方が良かったのかな?
まぁテーマとしては
1)大きい自然数を扱う
2)そのルートをとる
ですね
1)は最近流行りのプログラミング言語はほとんどサポートしてるので問題ないでしょう
ルートはどうなんでしよう?
私はHaskellerでHaskellは大きさに制限なしのInteger型はあるんですけどsqrtはDouble型のものしか用意されてなくてsqrtは自前実装させられました
その実装の仕方も色々あるようですので解答お待ちしてます >>355 Perl
https://ideone.com/93109J
#!/usr/bin/perl
use Math::BigInt;
$b=Math::BigInt->new(10)->bpow(400);
$l=Math::BigInt->new(2501)->bmul($b)->bmul($b)->bsqrt()->badd(Math::BigInt->new(50)->bmul($b));
$a=Math::BigInt->new(1);
for $i ( 0 .. 100 ) {
printf "%3d: %2d\n", $i, $a % 100; $a->bmul($l)->bdiv($b);
}
# チートを使わずに Math::BigInt を使って書くとこんな感じ
# なぜこのような結果になるかは数学板をご参照のこと 俺が学生だった頃も模試や入試含めて見たことないな[] 他の工学部ならともかく情報工学部の教科書にはガウス記号は頻出する 情報工学だけど教科書は⌈⌉や⌊⌋だったな[]見覚えないわ
いつごろから使われ始めたんだろうか >>355 Perl
大きな整数の平方根(小数点以下切り捨て)を自分で実装するならこんな感じ
https://ideone.com/WizN7D お題
文字列"OF"と文字列"OFF"の
2種類の要素だけからなる配列がある。
間違えて空文字を区切り文字として連結してしまった。
この文字列から元の配列を復元する。
例
入力:OFOFOFFOFOFFOFOFF
出力:["OF", "OF", "OFF", "OF", "OFF", "OF", "OFF"] >>373
haskell
ofoff x = case x of
_ | x == "" -> [ ]
_ | x == "OF" -> [ "OF" ]
_ | x !! 2 == 'F' -> "OFF" : ( ofoff $ drop 3 x )
_ -> "OF" : ( ofoff $ drop 2 x )
main = print $ ofoff "OFOFOFFOFOFFOFOFF"
---
["OF","OF","OFF","OF","OFF","OF","OFF"] >>373 javascript
'OFOFOFFOFOFFOFOFF'.match(/OFF|OF/g) >>373
多少技巧的だけど見た目にはキレイ
haskell
ofoff x = case ( take 3 $ x ++ ( " " ) ) of
" " -> [ ]
"OFF" -> "OFF" : ( ofoff $ drop 3 x )
_ -> "OF" : ( ofoff $ drop 2 x )
main = print $ ofoff "OFOFOFFOFOFFOFOFF" >>373
p "OFOFOFFOFOFFOFOFF".split(/(?=O)/) >>373 Perl5
$s = 'OFOFOFFOFOFFOFOFF';
@a = $s =~ /(OFF?)/g;
print "@a\n";
あるいは一行で書くなら
print "@{['OFOFOFFOFOFFOFOFF' =~ /(OFF?)/g]}\n";
いずれも実行結果は
$ perl 19_373_OF_OFF.pl
OF OF OFF OF OFF OF OFF >>374
>>376
人のコードにコメントは控えてきた方だけれど
ゴミ見たいなコードだな
時頭悪そう >>367
慇懃無礼にならないように気をつけましょう >>379
きつい書き方しちゃったけれど
勉強・精進して、技術的にも人間的にも成長してくれればいいです >>373 bat
set s=OFOFOFFOFOFFOFOFF
set s=["%s:FO=F","0%"]
echo=%s%&pause 上のやり取りみるにちょっとでも数学の話題になる度にスレ荒らしてたのがperlの人だったのかね
流石にガウス記号知らないのは嘘だと思うが 数学板でプログラム関連の話題を出すと攻撃され
プログラム板で数学関連の話題を出すと攻撃され
プログラムも数学も好きなニキは行き場がないな >>384
>>364
こういう人をバカにしたような挑発を受けたときに
今回と前回、名前欄にレス番書いて反論したことはあるけど
他の何度か大荒れしたときはオレは参加していないので念のため
数学は好きなので解ける問題は回答してきた
ただし>>358に書いたように人に伝わりにくいような略した書き方をされると
独善的な印象の違和感を感じているところに、
数学という分野の観点から>>384みたいな人をバカにしたレスがつくと機嫌が悪くなる。
嫌がられるのは出題分野が数学かどうかではないところに第一原因があると思うので気がついたほうがいいよ
>>379 は黙ってりゃいいことなんだけれど、
せっかくHaskell勉強したのに残念というか、もったいないなとつい手が滑ってしまった
今後精進ください
それからC,C++,go,pythonでも回答してるよ >>373 js
"OFOFFOFOFFOFFOFOFFOF".replace(/FO/g, "F🥺O").split('🥺') ただし…
やみくもに「数学板に帰れ」のような過激発言や攻撃をする
一部に極端な数学アレルギーのソフト屋さんもいるようだね
あれはオレも過剰反応だと思う。
ちな、ここにレス書く数学屋さんは数学板のどのようなスレの住人なんだろうか…
ちょっと気になる >>373 octave
https://ideone.com/ZQ5BHB
regexp('OFOFOFFOFOFFOFOFF', 'OFF?', 'match') Haskellの人に勉強不足などと言う前に
数学の基本的な初歩の作法くらい学んではいかが? >>394
その「離散数学」というのは伝統的な数学ではどの分野にあたるのでしょうか?解析学?代数学?幾何学? >>396
誰も勉強不足だなんて書いてないよ。
つか、勉強してあれかよ、、、
そこらの底辺コーダーよりも素養無いんじゃな…(ry
また余計な一言を書いてしまった。 >>382で「勉強・精進して、技術的にも人間的にも成長してくれればいいです」と堂々と言ってて笑うわ >>373
Kotlin
https://paiza.io/projects/lTXR1DFdbRbedugwfltAHw
なんというか、自分ではほとんど何も考えてないようなプログラム。
正規表現のパターンも >>377 のやつを見てそのまんま利用w >>373 J
smoutput<;. 1 'OFOFOFFOFOFFOFOFF'
+--+--+---+--+---+--+---+
|OF|OF|OFF|OF|OFF|OF|OFF|
+--+--+---+--+---+--+---+ >>373
Haskell
import Text.ParserCombinators.Parsec
import Data.Either
ofoff = let
ofoffP = many $ try ( string "OFF" ) <|> ( string "OF" )
in fromRight [ ] . ( parse ( ofoffP ) "" )
main = print $ ofoff "OFOFOFFOFOFFOFOFF" >>373 Perl
#! perl
$_ = 'OFOFOFFOFOFFOFOFF';
# 正規表現つかう場合
#@out = /(.F*)/g;
# 正規表現つかわない場合
while( length ) { push @out, ($c = substr($_, 0, 1, '')) eq 'F' ? pop(@out) . $c : $c ; }
printf "[%s]\n", join ',', map { qq("$_") } @out; >>373
こういうのどうだろう? (主にUNIX用シェルのコマンドラインで echo, sed 使用)
echo 'OFOFOFFOFOFFOFOFF' | sed 's/FO/F, O/g'
これは出力がこうなる。
OF, OF, OFF, OF, OFF, OF, OFF >>355 の想定回答はなんだろうね
ガウス記号がそれほど知られてなかったのは誤算として、
大きい数の演算を組ませたかったのか
それとも結果だけ知りたかったのか 355です
ちょっとスレの雰囲気よろしくなかったので355は無かった事にしようかとも思ったんですけど一応想定してた解書いてみます
数学板で最初この話題が出たときHaskellにはBigintのsqrtがない事に気づいてめんどくせえと思ったもんですから他の言語ではどうなんだろうなぁと
調べたらperlにはあるけどrubyやputhonにはないみたいですね
bigint sqrt ruby とかで検索するとノウハウがヒットします
想定してた解はその手の解答でまず最初に出てくる
a(1)=1,
a(k) = [ ( a(k) + [ n/a(k) ] ) / 2 ] ( [x] は floor(x) )
で定義される数列a(k)を
a(k)^2≦n<(a(k)+1)^2
が成立するまで計算していくという方法です
Haskellでの実装はこんな感じ
https://ideone.com/gLt8mp
後面白いのには連分数を利用する解答などもあります
数列pn, qnを
p(0)=1, p(1)=100, p(n+2)=100p(n+1)+p(n)
q(0)=0, q(1)=1, q(n+2)=100q(n+1)+q(n)
とすると
p(2n-1)/q(2n-1) < 50+√2501 < p(2n)/q(2n)
を満たしながらlim p(n)/q(n) = 50+√2501になります(連分数の打ち切り近似)
コレを利用するとこんな感じです
https://ideone.com/X0UgJb >>368で、なぜこのような結果になるかは数学板をご参照のこと、なんていってるけど
数学の問題として解くからこそ下2桁に規則性があることが分かるんであって
数値計算の結果見たからって規則性があるなんて誰も分からないだろうに 下2桁に規則性がありそうだ、
ということは数値計算の結果を見ればなんとなく分かるんだけど
なぜ規則性があるか、ずっと計算を続けても同じ規則があてはまるかどうかは
数学的には証明しないといけない >> 355 Ruby
Q = 10 ** 1000
C = 50 * Q + Integer.sqrt(2501 * Q ** 2)
a = 1
0.upto(100) { puts a % 100; a = C * a / Q } >>410
ガウス記号知らなかったのなんて騒いでた1人だけじゃん そういやあったなって感じだし競プロでしか目にした覚えないし解説入れてた気がするし
忘れても良いわ >>411の上のはニュートン法ですね。プログラミングの教科書によく出てくるメジャーなやり方だと思います
二分木検索は>>372がその実装っぽいけど合ってるかな? 知らなくてもググればすぐにわかるようなことでキレてるのが滑稽なわけで
しかもなぜかHaskellの人に暴言まで吐いてる 底辺コーダーが年経て自尊心だけが膨らみ現実との乖離にアイデンティティを保てなくなった典型
老害と言われるものの一端
改善の見込みは無く今後悪化の一途を辿るので首吊るよう誘導するのが最善策 >>419
そうですね
広い意味では二分木探索
(ri)^2<n<(ri+2ei)^2のとき(ri+ei)^2<nか否かでr(i+1)を決める
その時n-(ri)^2の値を保持しておいて次の(n-r(i+1))^2を計算するのにわざわざ二乗する手間を省く
いわゆる和算の“開平算”の二進数版ですね
コレも「平方根、アルゴリズム」とかで検索するとよく出てきます
実際Cで実装してる例とかヒットしますね
話をfloor√nの計算に適用すれば与えられた整数nに対して
(n0,r0,b0) = (n,0,4^( floor log[4]n ))
(n(i+1),r(i+1),b(i+1))
=(n(i), r(i)/2, b(i)/4 ) (n(i)<r(i)+b(i)のとき)
=(n(i)-r(i)-b(i), r(i)/2+b(i), b(i)/4) (そうでないとき)
でb(i)=1になるまで続けると最後のriがfloor(√n)を与えるようです OK
前スレ見たらグラフィックスとかサウンドとかのお題もあるのね
要は何でもありってことか なんでもありと言ってもなんでもレスつくわけじゃない
メディア系のお題は環境の違いでほとんど他の人が確かめる方法もないから正直うざい
事実上”みんなが確かめられるメディア系のお題”となるとjavascript一択になってしまう お題
何番目?
ascii文字列が与えられる
その文字列が、その文字列を並べ替えてできる文字列全体の中で辞書式順序で何番目にあるかを計算せよ
例) 入力が hello であるなら並べ替えて順に並べると
ehllo ehlol eholl
elhlo elhol ellho elloh elohl elolh
eohll eolhl eollh
hello ...
なので13である
"cabaac" -> 47
"2021312" -> 197
"This is an apple." -> 975082180080 発展
ucs4のユニコード文字列も処理できるようにせよ
"いろはにほへとちりぬるを"
34213807
"ちょっとちょっと、大嶋さん。小島だよ!"
2031206446571101 >>429 Python3
https://ideone.com/jk3SDm
最後のは10分ぐらい回したが終わらなかった 解説入れます
例えば2021312が何番目か考えます
樹形図を利用します
樹形図を使って2021312以前に何個の文字列が入り得るか考えます
┳0━(112223)‥‥‥‥‥‥‥‥‥6!/(2!3!1!)=60
┣1━(012223)‥‥‥‥‥‥‥‥‥6!/(1!1!3!1!)=120
┗2━0┳1━(1223)‥‥‥‥‥‥4!/(1!2!1!)=12
┗2━1┳1━(23)‥‥‥2!/(1!1!)=2
┣2━(13)‥‥‥2!/(1!1!)=2
┗3━1━2‥‥..1
図の例えば(112223)は“112223を自由に並べてできる房”を表しており公式により6!/(1!3!2!)=60個の文字列が入ります
右の欄を合計して197が2021312の番号とわかります
この作業をプログラムで自動化して下さいがお題です >>436
ようするにコレ階乗進数だよな?
ただの進数変換じゃねえの? >>429
Kotlin
https://paiza.io/projects/aJ5J0aIVgB9tYzGBCtrRlA
折角なので順列を求めるクラスを作った。
でもこれ、長いやつは駄目なんだよな。馬鹿正直に全パターン求めてリストに貯め込んでるだけなので。
>>434のプログラムは長くても大丈夫になっているけど、どうしてそれで良いのかがまだよく分からない。
分かったらこちらでも作ろうと思う。(面倒くさくなったら分からないままにするかも知れないが)。 単に>>436に書かれてる方法を忠実に実装するだけじゃないでしょうか 何をもってURLとする?
関連RFCに完全準拠してるか厳密に判定する? >>444
RFC準拠でもいいしhttps://だけにマッチさせる適当なやつでもいい >>446
他のテキストと連続している場合もある
abc https://xxxx.xxx def
みたいに
半角スペースやタブで区切られてる
>>447
それ使ってもいいよ Ruby のURI.regexp は、Ruby 2.2 から廃止予定で困る。
URL の規格がハッキリしないのか?
誰か、C でも良いし、モジュールを作ってほしい >>447
この正規表現は\bとかwikipediaに載ってる標準の正規表現じゃないみたいだけどコレの正規表現ってどの言語の正規表現ですか? '.'が文字列の結合を表してるみたいだからphpという奴ですかね? >>442
そうなのかも知れないが>>436が何を言っているのかよく分からない。 >>443
perl -pe 's#https?://\S+##g'
なんていう誤魔化しでは駄目か?w まぁでも所詮お遊びなんだからurlの切れ目はスペース、タブ、改行と決め打っても十分な気もする
こだわり出すとキリないからなぁ あらゆるプロトコルのURLに対応したこれが最強かな。
perl -pe 's#\S+://\S+##g' 自分が実装するときに困らないぐらいには、曖昧さのない問題にしようよ >>411
Pythonにはmath.isqrt()がある(3.8から)。
ttps://docs.python.org/ja/3/library/math.html お題:
N 個のボールがあります。
A 君がそこから 0 個以上のボールを取り、
B 君が残りから 0 個以上のボールを取り、
C 君が残りから 0 個以上のボールを取りました。
A 君が取ったボールの数を a、
B 君が取ったボールの数を b、
C 君が取ったボールの数を c とします。
3 人がとったボールの数の組 (a, b, c) としてあり得るものはいくつか求めてください。
制約:
0≦N≦10^5
入力例 1:
3
出力例 1:
20
入力例 2:
25252
出力例 2:
2684350843635
入力例 3:
100000
出力例 3:
166676666850001 入力例 1 は以下の 20 通りです
(0,0,0),(0,0,1),(0,0,2),(0,0,3),
(0,1,0),(0,1,1),(0,1,2),
(0,2,0),(0,2,1),
(0,3,0),
(1,0,0),(1,0,1),(1,0,2),
(1,1,0),(1,1,1),
(1,2,0),
(2,0,0),(2,0,1),
(2,1,0),
(3,0,0), >>463
>>461とは違う答えになるようだが? >>466
です
公式うろ覚えで間違えました
自力で考えたい人のネタバレになるといけないので詳細などは差し控えます それほど多くの回数の演算が必要だったのかどうか一考の余地あり >>461 Haskell
463のやりたかったのはむしろこれじゃなかろうか
https://ideone.com/1TfuY4 >>469
いえ、すでに訂正した>>465です
その式だと答えはあいますけど通例の公式の定義と文字の使い方がズレます
まぁ計算のお題というだけなら答えさえ合えばいいですけど
しかし“数学的に”という縛りもつけるなら、やはり特に理由がないなら文字、関数の命名も極力通例のそれに合わせるものでしょうね >>470
どういう意味で計算式を使っているか
コメントをいれた方がいいでしょうね
hが重複組み合わせてあることはわかりますが、どういう意図でx回ループさせる必要があるのか想像たけでは読み取れません
その意味では469も同じですが (n+1)*(n+2)*(n+3)/6
これのどこがプログラムの問題なんだ? >>472
AtCoderの問題にも文句言って解けなさそうw お題:しりとり
しりとりで繋げよ
入力:
あんこ, ここあ, ころも, ごりら, だるま, ぱんだ, まくら, もぐら, らっこ, らっぱ, らむね, りんご
出力:
りんご → ごりら → らっこ → ここあ → あんこ → ころも → もぐら → らっぱ → ぱんだ → だるま → まくら → らむね
りんご → ごりら → らっぱ → ぱんだ → だるま → まくら → らっこ → ここあ → あんこ → ころも → もぐら → らむね 拗音・長音の扱いは?
要は、
ばれいしょ → しょうゆ
なのか、
ばれいしょ → ヨーグルト
なのか。
あるいは、
マヨラー → ラーメン
なのか、
マヨラー → ラムちゃん
もOKなのか。 >>476
まぁその辺はご自由にという事で
よいしょ→よいしょ
も
いでで→てめ、このやろ
もありでもなしでも
やはりありの方が評価高い? やっぱりなしでいきましょか?
息抜きなんだしぱぱっと作れる範囲という事で
純粋に最初の一文字と最後の一文字完全一致のみ考慮すれば桶が基本路線という事で 制限お題シリーズ
お題: アルファベットと改行(LF)、ダブルクオートのみで構成されたテキストがある
テキストからダブルクオートで囲まれた文字列を抽出せよ
ただし正規表現を使ってはならない
abc"def"ghi"jk
l"mno"pqr"stu"
↓
[def]
[jk
l]
[pqr] >>481 JavaScript
const s = `abc"def"ghi"jk
l"mno"pqr"stu"`
let quot = ''
let inQuot = false
for (const c of s) {
if (c === '"') {
inQuot = !inQuot
if (!inQuot) {
console.log('[' + quot + ']')
quot = ''
}
continue
}
if (inQuot) quot += c
} >>481 Ruby
str = <<EOS
abc"def"ghi"jk
l"mno"pqr"stu"
EOS
ans = []
str.chomp.split( ?" ).each_slice( 2 ){|a| a[1] && ans << "[#{a[1]}]" }
puts ans 一行だった
str.chomp.split( ?" ).each_slice( 2 ){|a| puts "[#{a[1]}]" if a[1] } >>.481 Python
a='"def"ghi"jk\nl"mno"pqr"stu"'
print (a.split('"')[1:-2:2]) >>481
Kotlin
https://paiza.io/projects/YuEG6qbQJJwhXMYXaysklg
Reader で一文字づつ読むような iterator があるとやり易いなと思ったので作った。
AbstractIterator 使うとほとんど自分で考えないで iterator 作れるから良いな。 お題
1〜6の目のあるサイコロを3つ振って出目の合計が9になる組み合わせの数を出力し
1〜6の目のあるサイコロを3つ振って出目の合計が10になる組み合わせの数を出力してください >>492
(1,2,6)と(6,2,1)は別カウント? >>492
コレ公式使うより普通にdpで計算した方がいいな
haskell
https://ideone.com/4ElczD お題:正方形のタイルが格子状に規則正しく並んでいて、そのサイズは5x5である。そのタイル一つひとつに東西南北(E/W/S/Nで表す)いずれかの矢印が描かれている。
タイルの矢印をたどるとき、ループがあるかどうか判定せよ。 SWNSW
EWSNN
WSNNE
EEWWS
EESWW
NWSEE
NWWSS
WENNW
EWESN
SWESW
ENNWS
WSEES >>498
補足。
地図と同じように北は上とします。 逆方向に進むのもループ?
経路としては一直線上の往復でループ状には見えないけど >>501
逆方向が続くのもループとします。
すべてのループを#で図示して下さい。 なんだ
あるかないか判定するだけじゃなくてループ見つけないといけないのか >>499
5x4にしか見えないけど一段は空白で良いの? >>498 を解けなかった人のために解説!
「数学のグラフ理論を勉強しようね」
以上。。。 >>508
お前が解析と集合論の基礎からやり直せクソ虫が グラフ理論の恩恵はあまり受けられない
単に「ループがあるか否か判定せよ」ならグラフの一次のベッチナンボー計算するだけなので行列のランク計算するライブラリ持っている言語なら終わり
しかし「ループをホントに見つけて軌道の点を#にして出力せよ」では結局各点の軌跡を全部計算するしかない 嘘書いた
向き付きグラフのoriented cycle探す問題だからbetti numberだけでは決まらない
しかし遷移行列の固有多項式が0になる事が必要十分条件なのでmaximaやmathematicaなら一撃 >>508
これの場合難しく考えなくてもなぞって行って一度通過した所に戻るならループしている、で良いのでは?
ループの個所を示す必要がある場合は2度戻るかを調べて2度通通過した所だけを抜き出す。 強連結成分分解だっけ?
深さ優先探索を2回すれば、強連結成分分解できるとか というか難しい数学持ち出してもあまり楽にならない
結局なぞって行くのが1番簡明 お題:1のビットが3個ある二進表記文字列が与えられたとき、次に大きい
1のビットが3個ある二進表記文字列を求める。
例
111 -> 1011
1110 -> 10011
101100 -> 110001 幅優先探索で各まとまりごとに数える
イメージとしては水を流すかんじ >>520
たぶん
外周に番兵を置いて、番兵に接触する空白も番兵とみなす、このとき斜め方向に接触する空白も番兵とする。
あとはそれぞれコマの四方向のコマと空白のつながりから塊を調べる、コマ数をカウントすれば塊の数。
こんな感じ >>498
なぞって行って2度通過した個所を出してみたら EW みたいな進んだ方向にただ戻る個所もループという事になったのだが、
それもアリか?アリならできたぞ。そういうのは除外となるともう一段それの発見のための処理を追加する必要がある。 お題: 上下左右に広がる、がらんどうのX-Y二次元空間がある。直径10cmで質量7kgで均一な密度のボール状の物体Pの中心は、
時刻ゼロのとき、A地点(x1, y1)にあり、ここから謎の力により空中に固定される非常に丈夫な一枚の板と、時刻ゼロより発生する重力を使って、B地点(x2, y2)まで誘導したい。BはAより下にある(y1>y2)。
板は固定すると重力が働いてもびくとも動かない。物体PはB地点を必ず一度以上通過しなければならない。さてどのように板を設置すればいいか。時刻がゼロになる前に板を注文して固定しなければならない。
板は真っ直ぐ直線的であり、板の厚みは考慮しない。摩擦と空気抵抗は無視し、反発係数は1とする。この板は非常に高価なため(1cmが3万円)、なるべく短い長さで注文する必要がある。
重力加速度は下向きで地球上と同じ強さとする。設置する板の両端の座標(x3, y3)〜(x4, y4)[cm]と使用する板の費用price[円]と、時刻ゼロよりB地点到達にかかる時間T[秒]を求めよ。 >>532
例1)
(x1, y1, x2, y2) == (1, 3, 4, 1).
例2)
(x1, y1, x2, y2) == (0, 10, -8, 0).
例3)
(x1, y1, x2, y2) == (-5, 3, 5, 0). >>532
二次元空間なのにボール状の物体が存在するのか。重力加速度の下向きってどっち?
蟻人間ていつも凝った設定を作ろうとして杜撰なものばかりなイメージがある adhdとか何か(学習|発達)障害持ってるんでしょ
ガイジなのは一見して分かるし 注文できる板の最小の長さは1cmとします。初速はゼロとします。 (x1,y1)から右下の(x2,y2)へ45度のスロープ作ったら到達時間は何秒かって問題だろ
板の値段は30000√2円 与えられたパラメータでBを通過するか判定する関数fを定義して下さい。fが正しく定義され、fに成功するパラメータならば正解とします。ブルートフォースや空間探索を使ってもかまいません。 >>542
はね返りを使えば板はもっと短くなるかと。右下ではなく左下の場合も可能。 >>545
板の設置位置に制限がなく反発係数が1、すなわち運動エネルギーのロスが0なら目標地点がどんなにとおくても、高低差がどんなに小さくても到達できる
hだけ下方に設置してθだけ傾けた時を考える
板に反射した地点を原点、t=0として、初速は√(2gh)、最高到達点までの時間は√(2h/g) cos2θ、水平方向速度は√(2gh)sin2θ、反発地点から最高到達点までの水平距離はhsin4θ、最高到達点の高さはhcos^2(2θ)
方程式
x2-x1=2hsin(2θ)cos(2θ)
y2-y1=-hcos^2(2θ)
はy2-y1<0である時常に解もつ ちょっとだけ傾いててほぼ水平なら、板の長さは限りなく1cmに近づき、到達時間は無限に近づくわな
あとはB点が線分上にあるか計算するだけでいい >>546
だいぶ近いけど、ボールの直径を考慮する必要があるよ。 >>547
どのみち常に解を持つから問題になってない お題:次の文章を解読するプログラムを作れ。
「この文書は{SJIS:93C192E894E996A7}です。{SJIS:95948A4F8ED2}が閲覧すると、{SJIS:94B182B982E7}れます。」 >>522
すみません、ルール違反なんですね…以後気を付けます。
>>527
>>531
ありがとうございます!
考え方まで記載いただき、本当に助かりました。 >>518
Kotlin
https://paiza.io/projects/Y2U2DgK9pKbNVqwu8gjpQQ
1のビットを数える方法は以前どっかで見た方法をそのまんま使った。
これ + じゃなくて xor にするとパリティビット求められるんだよね。 >>550
bash のコマンドラインから Perl 使ってでできた。標準入力から入力して標準出力に出力する。但し端末の入出力は UTF-8 。
perl -MEncode=from_to -pe 's/\{SJIS:(.*?)\}/from_to($s=pack("H*",$1),"cp932","utf8");$s/ge' お題
数字のみの文字列を昇順の数値の列になるように
区切るすべての場合を求める。
0で始まるものは数値とはみなさない。
数字の順番は変更しない。 >>554
長さ1も可、狭義単調増加、文字列は全て0〜9のみとして
Haskell
https://ideone.com/zOXDf0
入力 "20210401"
出力 [[20210401],[2,210401],[2,21,401],[2,210,401],[20,210401],[20,21,401],[20,210,401],[202,10401]] >>554
> 0で始まるものは数値とはみなさない。
↑これ見落としてた
Haskell
https://ideone.com/OyB9LO
入力:20210401
出力:[[20210401],[20,210401],[20,210,401],[202,10401]] ところで「チンポがシコシコする」という日本語表現は、学術的に正しいと言えるのか?
チンポ「を」シコシコするのではなくて、チンポ「が」シコシコする。この場合、「チンポ」は主語となる。
オブジェクト指向で言う「集約」は2種類あって、全体(俺)と部分(チンポ)が繋がっている場合と、
全体(俺)と部分(チンポ)が別々になっている場合とが考えられる。けれども「チンポ」はそれ自体
が独立した生き物であり、所有者の意思とは無関係に、自ら勃起して「シコシコする」。
例えば寝てる時にエロい夢みて朝起きてみたらチンコが勃起して射精してたとか。
違うか?
「胸がドキドキする」は良いが、「チンポがシコシコする」はダメな理由を、50字以内で述べろ! お題
下の入力文字列を、「あいう」で始まる文字列に、分割せよ。
出力形式は、配列・改行区切りの文字列などで良い
入力
abあいう1あいう23あいうxyz
出力
["あいう1", "あいう23", "あいうxyz"] >>560 Ruby
p "あいう1あいう23あいうxyz".scan(/あいう.*?(?=あいう|$)/)
# => ["あいう1", "あいう23", "あいうxyz"] >>560 Ruby
p "abあいう1あいう23あいうxyz".split(/(?=あいう)/)[1..] >>558
チンポに主体性はない。胸は心に繋がって心には主体性がある >>563
2.5 では動かないけど、2.6 では動いた >>560
Perl でこんな感じでできた。(1行目はbashのコマンドラインからの入力。2行目が出力)
echo 'abあいう1あいう23あいうxyz' | perl -ne 'chomp;@d=split/あいう/;shift(@d);print "[" . join(", ", map { qq("あいう$_") } @d) . "]\n"'
["あいう1", "あいう23", "あいうxyz"] 「像は鼻が長い」でグクった
なるほど気付かなかった 数学板より
お題:足して9
各桁の和が9である自然数を小さい物順に並べる
9,18,27,36,45,54,63,72,81,90,108,117....
n番目を求める関数を実装せよ
入力:12
出力:117
入力:12345
出力:100204200
入力:123456789
出力:30000100000100000021000001000 数学板では
プログラム好き好きおじさんと
プログラム怖い怖いおじさんが
意味の無い罵り愛を展開しているのだそうな お題: かなとアルファベットと数字からなる文字列をモールス信号に変換するプログラム。ただし、長音を「−」、短音を「・」で表し、モールス信号に変換できない文字は下駄文字(〓)に置き換える。全角・半角の両方に対応すること。
参考:
https://ja.m.wikipedia.org/wiki/%E3%83%A2%E3%83%BC%E3%83%AB%E3%82%B9%E7%AC%A6%E5%8F%B7 モールスか。前にもあったな。そんなお題。
その時は確か音まで出す気合の入った回答をした人も居たと思った。 お題
>>582と同じでモールス信号作成。但し、定義ファイルに文字ごとに対応する信号を入れておきそれを指定して動く方式。(これにより言語が関係なくなる)。
日本語用定義ファイルを指定して動かせばそれに従って日本語での変換が行われ、英語用のを指定すれば英語での変換になるようにする。
プログラムと定義ファイルを最低一つ作ること。定義ファイルの内容は定義に従って正しく変換がされるかの確認が出来る程度で良い(例えば数字の変換だけでも良い)。 定義ファイルのエンコードはご自由に。でも UTF-8 にしておくとあちこちで使えて良いかも知れない。(Javaとか自動変換してくれるやつだと漢字も1文字扱い出来て楽だし)。 お題: UTF-8のCSVファイル(BOMなし)をテキトーにJSONファイルに変換せよ。 お題: 現在のディレクトリに連番のファイル(000.txt〜999.txt)を作成せよ。 お題: 現在のディレクトリの中から「jewel」と書かれたバイナリファイルを探索せよ(ファイル名およびファイルの中身)。大文字小文字、全角半角を区別すること。 >>589 コマンドプロンプト直打ち
>for /L %X in (0,1,9) do @for /L %Y in (0,1,9) do @for /L %Z in (0,1,9) do @echo.%X%Y%Z>%X%Y%Z.txt >>589
Linux で bash のコマンドラインでこうやったらできた。
printf '%03d.dat\n' $( seq 0 999 ) | xargs touch ごめん。 .dat じゃなくて .txt か。
まあでもその部分だけ直せばできる。 関係ないけどDMMブックスの7割引きは凄いな。高い本バスケットに入れまくりだ。 お題: マルチスレッドを使うと処理完了が早くなる例を示しなさい。※CPUはマルチコアを前提とする。 >>589 Ruby
("0000".."9999").each{|x|open(x+".txt","w").close} お題: ここに3つのタンクA,B,Cがある。それぞれの最大容量は20L, 15L, 10Lである。初め、Aには水15Lが入っていて、Bには水10L入っていて、
Cは空っぽだ。重力により、水は2L/sの速さでAからBに流入し、3L/sの速さでBからCに流入する。
このような水の流れとタンク内容量の変化を再現してCがいっぱいになったときのAとBの内容量を求めよ。 >>600 訂正と追記。
s/重力により/ポンプにより/
方程式は使ってはならない。必ずシミュレーションなどで再現すること。 >>600
その「水タンク-システム」=水時計って、水位差と流出量が比例するのほうがおもしろいのでは? 受験の頻出問題で排出される水量が√水位に比例するというのがあった
大学入ってやっとベルヌーイの定理というものだと知った バカみたいな受験数学教えてないでストレートにベルヌーイの定理教えりゃいいのに
ガキに能力キャップを付けて伸びないようにバカはバカのまんまでいいとする教育法が全部悪い
そろそろ文科省は解体した方がいい お題: 計算可能な未知の関数f(x)が与えられる。x=-5〜+5において数値微分してf(x)の導関数の近似グラフを描画せよ。
(1) f(x)=x**2.
(2) f(x)=3*sin(x).
(3) f(x)=sqrt(abs(x)). なお、グラフィックスが使えない言語では、テキストによる「仮想画面」を使って描画すること。 >>604
まともな学校では数学好きな奴は高校の内から高木貞二読んだりしてたぞ >>604
勉強したいなら学校なんか無視して自分でどんどん勉強しちゃって良いんだよ。
学校行かなきゃ情報が入手困難で学習できないなんて時代はとうの昔に終わってるんだし今ではネットもある。 中受算数をやる時間が無駄じゃん
そこで解析が出るならまだしも
ならストレートに連立方程式やら積分やらを出せばいい お題
同じ形の洗濯バサミの足を挟んでつなげてリングを作る。
最初の洗濯バサミの先頭から次のせんたくばさみの先頭までの長さAをとする。
以下同様につなげていくとすると洗濯バサミは何個必要だろうか? >>614訂正
洗濯バサミを3個つないだ状態で
最初の洗濯バサミの先頭から2番目の洗濯バサミの先頭までの長さをAとする。
2番目の先頭から3番目の先頭までをAとする。
1番目の先頭から3番目の先頭までをBとする。 数学の問題やん?
計算機を使って何をしろと?
A,Bが入力されたときに答え出せばいい? お題: 依存関係のあるソート。与えられたいくつかの項目について、各項目ごとに依存関係が指定される。依存対象が先に来るように項目のリストをソートしなさい。
依存関係に循環がある場合は「ERROR」と出力しなさい。依存関係がない場合は名前の順でソートしなさい。
例1) {A, B, C}
AはB, Cに依存する。
BはCに依存する。
Cは何にも依存しない。
例2) {A, B, C, D}
AはCに依存する。
BはDに依存する。
CはB, Dに依存する。
Dは何にも依存しない。 例3) {A, B, C, D, E}
AはEに依存する。
BはDに依存する。
CはBに依存する。
Dは何にも依存しない。
EはBに依存する。 例ってそれぞれの入力してでどう言う出力なのか答え出さないと例にならんやん? >>622
例1の出力) (C, B, A).
例2の出力) (D, B, C, A).
例3の出力) (D, B, C, E, A). 全順序じゃないから、単純なソートアルゴリズムじゃダメみたいだね。 >>628
アルゴリズムを簡単に解説してくれますか?
すみません。 例えば>>821の時は順序の生成元が
E<A, D<B, B<C, B<E
この中で先頭に持ってきて良いものを探す
それはつまり「何かに依存していないもの」
この状態ではA,B,C,Eは何かに依存しているのでダメ
よってこの場合Dしかない
残りA,B,C,Eの順序を決める
その際順序の生成元からD<Xの形は取り除く
つまり
E<A, B<C, B<E
依存していないものはBのみなのでBが2番目
残りA,C,Eで順序の生成元はE<Aのみ
依存してないのはC,Eでどちらがきても良い
‥
数学的には“何かに依存していない”はその“半順序”における“極小元”
そして極小元になり得る必要十分条件がまさに「順序の生成系の中でそれより小さいものがないもの」、すなわち「何かに依存してないもの」とわかる(証明も簡単)
そしてこの作業に於いて順序の生成系にループが有れば、例えばx<y,y<z,z<xのようなものが有ればx,y,zは最後まで取り除かれず、最後には「まだ元は残ってるけど極小元なし」の状態に到達してしまうのでその時点でerror判定して終了すれば良い お題が気持ち悪い
単に有向グラフの辺となるものだけ指定すれば良いのに
依存とか書いちゃうから以下みたいな間接依存が許されない雰囲気
AはBに依存
BはCに依存 >>631
お前全然分かってないだろ
理解できないくせに聞くな 順序集合の定義自体は超簡単じゃね?
順序集合の定理なんか使わないから順序集合なんて言葉を使う必要もないけど
アルゴリズム的には
極大(極小)元の中で名前順の先頭である元を取り出す
を繰り返すだけで良い
取り出せなくなってまだ残っていたらERROR
>>630みたいに無駄に長く説明しなくて良い 順序集合真面目にやるなら集合と位相について学ぶ必要があるわけで そりゃーC++には半順序がバンバン出てくるから選ばれた人間向けの言語だよ。 >>634
ちゃんと理解して実装したぜ。
https://github.com/katahiromz/OleBow/commit/f65c774b625385e855971adb1275de1fd6ebee0c
循環参照の例がうまくいかないけど。
// :: IBindCtx: IRunningObjectTable
// :: IEnumMoniker: IMoniker
// :: IMoniker: IBindCtx
// :: IMoniker: IEnumMoniker
// :: IRunningObjectTable: IEnumMoniker
// :: IRunningObjectTable: IMoniker
// :: PartitionMoniker: IMoniker
// :: SoapMoniker: IMoniker
ポインタ型とかは後回しでいっかな。 >>620 Ruby
# Array
rule = []
while gets
break unless m = /^\s*(\w)は(\w)?(?:,\s*(\w))*/.match( $_ )
rule << m.to_a[1..] - [nil]
end
solution = []
loop {
free = []
break if rule.delete_if{|a| a.size == 1 && free << a[0] && solution << a[0] }.empty?
free.each{|d| rule.each_index{|i| rule[i] -= [d] } }
}
puts (rule.empty?)? "(#{solution.join(', ')})." : "ERROR" >>620 Ruby
# Bit演算
rule = []
while gets
break unless m = /^\s*([A-Z])は([A-Z])?(?:,\s*([A-Z]))*/i.match( $_ )
rule << [ m[1].upcase, m.to_a[2..].inject(0){|r,c| (c)? r | (1 << c.upcase.ord - ?A.ord) : r } ]
end
solution = []
loop {
free = []
break if rule.delete_if{|a| a[1] == 0 && free << a[0] && solution << a[0] }.empty?
free.each{|d| rule.each_index{|i| rule[i][1] &= ~ (1 << d.ord - ?A.ord) } }
}
puts (rule.empty?)? "(#{solution.join(', ')})." : "ERROR" お題
JSONでシリアライズされた未知のm×nの行列が与えられる。
転置行列を返せ。転置行列はシリアライズされていなくてもよい。
例
入力
"[[1,2],[3,4]]"
出力
[[1,3],[2,4]] >>642 Ruby
require "json"
p JSON.parse(gets).transpose # => [[1, 3], [2, ,4]] 当然transpose標準で用意されてる言語はそうなるわなw >>642 J
smoutput |: ". @ }: @ }: ;. _1 }. stdin ''
入力
[[1,2,3].[4,5,6]]
出力
1 4
2 5
3 6 お題: コマンドラインで動作するエクセルもどきを作れ。入力テキストの中身に特定の形式の「フィールド」(field: 欄)を埋め込んでおく。今回はフィールドは以下のような形式で表現される。
(1) {{=数式}}
(2) {{フィールド名:文字列}}
(3) {{フィールド名:=数式}}
フィールドは{{ }}で囲んだ文字列で指定される。
数式にはフィールド名を変数とする式を指定できる。フィールド名は半角英数字の組み合わせとする。
式は少なくとも、丸カッコと、整数の四則演算と、整数から文字列への変換と、文字列の連結をサポートすること。
入力テキストのそれぞれのフィールドを評価後の値に置き換えたテキストを出力せよ。フィールドの循環参照や式のエラーがあった場合はその場所に「ERROR」と出力せよ。
その他の仕様についてはエクセルをできる限りまねること。 >>646 追記。
フィールド名は英字で始まるものとする。
(入力例)
こんにちは、{{NAME:蟻人間}}さん。
今年は{{:=Y}}年です。来年は{{:=Y+1}}年です。
A={{A:=1}}.
B={{B:=2}}.
A+B+4={{=A+B+4}}.
A*B-2={{=A*B-2}}.
日付: {{Y:=2021}}年{{M:=4}}月{{D:=27}}日
{{:="<"&NAME&">"}} >>647 さらに追記。
{{=数式}}と{{:=数式}}は同じように解釈すること。 >>649
代入文か代入式を許容することか。{{A=3}}
そっちの方がいいかもね。
エクセルは数式の先頭で=を書いてるだけで、それ以外に代入式や代入文はなかったはず。 >>646 お題を書き直します。
お題: コマンドラインで動作するエクセルもどきを作れ。入力テキストの中身に特定の形式の「フィールド」(field: 欄)を埋め込んでおく。今回はフィールドは以下のような形式で表現される。
(1) {{数式}}
(2) {{フィールド名=数式}}
フィールドは{{ }}で囲んだ文字列で指定される。
数式にはフィールド名を変数とする式を指定できる。フィールド名は英字で始まる半角英数字の組み合わせとする。
式は少なくとも、丸カッコと、整数の四則演算と、値の比較と、整数から文字列への変換と、文字列の連結をサポートすること。等号は二文字の==とする。
入力テキストのそれぞれのフィールドを評価後の値に置き換えたテキストを出力せよ。フィールドの循環参照や式のエラーがあった場合はその場所に「ERROR」と出力せよ。 >>651
(入力例)
こんにちは、{{NAME=蟻人間}}さん。
今年は{{Y}}年です。来年は{{Y+1}}年です。
A={{A=1}}.
B={{B=2}}.
A+B+4={{A+B+4}}.
A*M-2={{A*M-2}}.
日付: {{Y=2021}}年{{M=4}}月{{D=27}}日
{{"☆ "&NAME&" ☆"}} >>653
くっさ、くっさわらたんよ。ははは。
お題: 5chに粘着して、トリップ付きのコテハンを罵倒し続けるボットを作れ。 人間がボットみたいなことやってたらカバみたいだね。ほんとほんと。 お題
ファイルパスを入力として受け取り、そのサブパスをすべて出力してください
入力: A/B/B/B
出力:
A
A/B
A/B/B
A/B/B/B >>656 Ruby
'A/B/B/B'.gsub(/.+?(?<=\/|$)/).reduce(''){|s, a|p s + a}
# => "A/"
"A/B/"
"A/B/B/"
"A/B/B/B" >>656
haskell
import Data.List
subPathes p = [ str |
str' <- tail $ inits $ p ++ "/",
last str' == '/',
let str = ( reverse $ inits str' ) !! 1 ]
main = mapM print $ subPathes "A/B/B/B" >>656 C
char *str = "A/B/B/B";
int i = 0;
while (str[i]) {
if (str[i] == '/') {
char c[i + 1];
memcpy(c, str, i);
c[i] = 0;
printf("%s\n", c);
}
i++;
}
printf("%s\n", str); >>656 Ruby
gets.split( ?/ ).inject( [] ){|r,d| (r << d).tap{|t| puts t * ?/ } } python
import sys
from pathlib import PurePath
for x in PurePath(sys.argv[1]).parents: print(x) >>656
Kotlin
https://paiza.io/projects/KhmBe1ysOa3PIaPX7xJkDg
最初は再帰でやろうと思ったけど止めて、Kotlin らしく拡張プロパティ作って実現した。 文字列をPATHの区切り文字で後ろから検索しないで先頭から検索しても同じと気付いたのでこっそり直した。 >>656 Ruby
def f(s)
a=s.split("/")
(0..a.size-1).map{|i| a[0..i].join("/")}
end
p f("A/B/B/B")
実行結果
["A", "A/B", "A/B/B", "A/B/B/B"] >>656
Elixir
list = String.split( "a/bc/d", "/" ) # 分割
# 第2引数は、蓄積変数の初期値
%{ list: result } = Enum.reduce( list, %{ list: [ ], word: "" }, fn( str, acc )->
tmp_str = acc.word <> str # 文字だけを連結する。/ は連結しない
acc = %{ acc | list: acc.list ++ [ tmp_str ] } # 連結
acc = %{ acc | word: tmp_str <> "/" } # 連結
acc
end )
IO.inspect result
#=> ["a", "a/bc", "a/bc/d"] a="ko/koh/oreo/n/eone"
['/'.join(a.split('/')[0:i+1]) for i in range(len(a.split('/')))] >>667
さりげなく妙に高い値段のソフトの販売サイトに誘導しないように。 >>668
#include <studio.h> WHEREコマンドはReactOSに既に実装されています。
なので、(あえて作る場合でも)それを基にしてく
ださい(よ、頼むからさ。失礼だと思わないの?)
>コマンドではなく機能です。そして(既に実装されている)
>それは、この目的に対して便利ではありません。
貴方は公開されている(ReactOS実装の?)関数の
コードをパクって、独立したアプリケーションにしたと
いうわけですね。
というのであれば(我々の)メインストリームコードと
同期しているサードパーティコードみたいな感じを
装う必要はありません(はっきり言わせてもらえば
「しないで下さい」) システムで色々な箇所で使用される短縮名称
を正式名称と(相互)変換する機能なんて
アルゴリズムとかの題材とかには不適。
泥臭い部分がかなりあるシステム固有の設計
の話になるしたとえコードは公開しているに
せよ部外者の立ち入りは歓迎されないのは
当然。 実情を詳しく知らない外部の人に
任せられる部分じゃなかったりするから。 >>656 JavaScript
"A/B/B/B".replace(/^\/|\/?[^\/]*/g, (_, o, s) => console.log(s.substring(0, o))); 読み仮名(ひらがな、カタカナ)から、単純なコード順の整列キーを
生成するルーチンを書く。
単純にコード順で整列すると、「ガレージ」は「カレー」の直後には
こなくて、「か(蚊)」の後ではなく、「ガ(蛾)」の後に
来てしまう。
比較関数を定義しようとすると、順序関係が一意に決まらなくなって
整列ルーチンが止まらなくなる。また、SQL などの整列機能が利用できない。
業務系のシステムだと、企業名だとか個人名だとかの読みで整列する
要求があるので、読みの入力時に整列用のキーを生成しておくのが
吉と思われる。 >>651 C++
エクセル使ったことないから挙動が違ってたらごめんね
最後のほうはやっつけで書いたのでバグってるかもしれない
https://wandbox.org/permlink/AfU4a1aLrkxhkErW >>677
うわー、1000行近い大作。しかもかなりモダンなC++。ひょえーー。 お題:
N 人が一列に並んでおり、左から i 人目の人は色 C[i] の服を着ています。
あるチームは次の条件を満たすとき、良いチームであると言います。
- 0 人以上が所属している。
- すべての色 i について、色 i の服を着た人がチームに偶数人所属している。
N 人から "連続する" 0 人以上を選んで良いチームを作るとき、
チームに所属する人の数としてあり得る最大値を求めて下さい。
制約:
1≦N≦10^6
1≦C[i]≦60
入力:
N
C1 C2 ... CN
入力例 1
5
1 2 3 3 1
出力例 1
2
入力例 2
5
1 2 3 4 5
出力例 2
0 >>681
Haskell
import Data.List
mxLenGoodTeams cs = let
teams = [ take j $ drop i $ cs |
i <- [ 0..( length cs - 1) ],
j <- [ 2 .. ( length cs - i ) ] ]
isGoodTeam team
= all ( even . length ) $ group $ sort $ team
in maximum $ ( 0 : ) $ map length $ filter isGoodTeam teams
main = do
print $ mxLenGoodTeams $ [ 1,2,3,3,1 ]
print $ mxLenGoodTeams $ [ 1,2,3,4,5 ] >>681
問題の意味がわからない。
> - すべての色 i について、色 i の服を着た人がチームに偶数人所属している。
とはどういう意味なのか?
「すべての色 i 」とは何か?
「色 i の服を着た人がチームに偶数人所属」というのはどういう意味なのか? 同じ色の服を着た人は存在しないのだよな? 毎度ながら日本語も問題作成も入出力例もクッソ下手だとは思うが
おまえはおまえで読解力無さ過ぎ
連続した (1≦10^6)個のデータ
データ内容は 1≦60
データ内容が偶数個となる連続した部分の最大長
1 2 2 3 3 4 4 5 → 2 2 3 3 4 4 → 6
1 2 3 4 2 3 4 5 → 2 3 4 2 3 4 → 6
1 2 3 4 5 2 3 4 → - → 0
1 2 3 3 2 4 5 4 → 2 3 3 2 → 4
1 2 3 2 2 3 2 4 → 2 3 2 2 3 2 → 6
まあ例に関しては俺も人のこと言えない
陥りやすいミスを確認しやすいキラーサンプル的な例がいくつかあればベスト 入出力例は不親切だとは思うが
問題文自体は問題ないでしょう
あれが理解できないというのであれば理解できない側の能力に問題がある 色C[i]は「i番目の人が来ている服の色」
色iは単に色 正しくないんだから突っ込まれて当然
>>690
Fラン文系か? >>691
真面目に何がダメだったのかわからない
教えてください... 別にiが添え字の自然数と宣言しているわけでもなし文法的にも間違ってない
アスペでもない限り理解できる C[blue]みたいな?
iはインデックスじゃないんだ 出題の意図は>>681で分かる
>>681はバカということも分かる >>686が嫌味で書いたのか本当にわからなかったのかはわからない プログラミング言語が使えても日本語が使えないのでは話が伝わらない。
それだったらプログラミング言語でそのまま書いてくれた方がここのスレでは話が通じる。 ・左から100番目の人はC[100]の色の服を着ていると読める
・列を自由に入力して良いのなら、最大値はN以下の偶数となり自明 >>681
出題者です
問題文がわかりずらかったみたいですいません
想定解法書きます (配列はすべて 0-index です)
A[0] = 0
A[i] = A[i - 1] xor (2^(C[i - 1] - 1)) (1≦i≦N)
な配列 A を考えます
ある区間 [L, R) がいいチームであるならば、A[R] xor A[L] = 0 です (累積和と同じ発想です)
両辺に A[R] を xor すると A[L] = A[R] になります
R を全探索しながらあり得る L のうちで一番左側のものを連想配列などで求めることで
N = 10^6 などのケースでも高速に答えを得ることができます 問題文の他例が二つしかないから分かりにくい
>>687の説明みるまで何が良いチームなのか分かりにくい > 一列に並んでおり、左から
左てなんだ?先頭末尾なら分かるが
> 良いチームであると言います
なんだそのモヤる日本語。普通にチームで良いだろ
チームの条件として色が偶数があれば良いんだから
> i 人目の人は色 C[i] の服を着て
あとの制約見るまで一意かと勘違いする。説明でいちいち C[i] と置くのもイミフ
説明をただただややこしくしてるだけ
仕事で仕様の説明でこんな喩え話してきたらキレるわ >>693
> アスペでもない限り理解できる
「アスペルガー症候群」というのは、昔は「高機能広汎性発達障害」といって、
わりと馬鹿にしたもんでもない。かくいう私も、いわゆる「アスペ」の
一人だ。
ここで問題。日本語の(現代語の)動詞のうち、アルゴリズム的に押さえこめる
動詞(規則活用動詞)"以外の" 動詞はいくつあるか。
なお、「長尾の法則」(頭から見ていって、非・漢字から漢字に変化するところで、
文節は切れる)は使ってよし(「お」とか「ご」とかは名詞につくから、
このさい関係はなし)。
とりあえず六つはあって、サ変とかカ変とかは既知だけど、「そもそも、
どれだけあるのか?」っつー話になると、かなり面倒。 >>705
> アルゴリズム的に押さえこめる
これどういう意味? 意味わかんなすぎてキレそうなんだけど さっさとPythonやらせれ
ちょっとでいいから
20年前に覚えたPerlに変わるマクロがいるんじゃああああああ
VBAでいいとかいわない バカの書いた不適切な文書は不和をもたらす
>>681のことな もうこれからは出題するときは頭に馬鹿には理解できない問題
ってとりあえず書いておけばいいのに
そうすれば荒れることもなくなるだろうから 【コミュニティの一生】
面白い人が面白いことをする
↓
面白いから凡人が集まってくる
↓
住み着いた凡人が居場所を守るために主張し始める
↓
面白い人が見切りをつけて居なくなる
↓
残った凡人が面白くないことをする
↓
面白くないので皆居なくなる 問題を作るのは難しいからしゃあない
どんな入力で、求めるのが値なのかアルゴリズムなのかを明示すればいい お題: join関数を自作せよ
join関数は第2引数の配列を第1引数の文字列で連結する関数である
func join(sep, array)
s = join(':', ['1', '2', '3'])
puts(s)
# 1:2:3
sepは文字列で、文字列で無かった場合の動作は未定義である
arrayは長さが0以上の配列で要素は文字列である。それ以外の構造は未定義である 先に解答例を作ってそこから試験問題作る先生のように
逆にたどって問題作れば分かり易い問題作れるのに
イキって、よーし、ぼくちゃん問題作っちゃるぞー!って、
解答未定のまま問題から作り始めるから今回のようにアフォなことになるんよ python
def joint(s,x,y=""):
if len(x) == 1:
print(f"{x[-1]}{y}")
else:
joint(s,x[:-1],f"{s}{x[-1]}{y}")) >>713
C++
https://ideone.com/HCgb0A
モダンなC++だともっと書き方違うんだろうか?
11, 14あたりしか知らないので不安 >>713
Haskell
join x = tail . concat . map ( ( x : ) . return )
main = do
print $ join ':' "123"
print $ join ' ' "Hello" >>713 Lua
function join(d, a)
local r = a[1]
for i = 2, #a do
r = r .. d .. a[i]
end
return r
end
print(join(":", {"1", "2", "3"}))
実行結果
1:2:3 def join(sep, list)
□return sep.join(list) お題: split関数を自作せよ。
split関数は第2引数の文字列を第1引数の文字列を区切りとして分割した配列を返す関数である。
func split(sep, str)
s = split(':', '1:2:3')
puts(s)
# [1, 2, 3]
sepは文字列で、文字列で無かった場合の動作は未定義である。sepの長さがゼロの場合は第二引数を一文字ずつ分割する。
strは長さが0以上の文字列である。 >>713
Kotlin または Kotlin script
関数定義
fun join(sep: String, vararg a: String) = a.reduce { acc, s -> "$acc$sep$s" }
使用する時
println(join(",", "abc", "def", "1", "23", "456"))
または
println(join(",", arrayOf("abc", "def", "1", "23", "456")))
これで出力はどちらもこうなる。
abc,def,1,23,456 def split(sep,str)
□return str.split(sep) sepの長さがゼロなら一文字ずつ分割するか
忘れてたわ 出題者は効率のいいアルゴリズムを考え(>>701)させたかったが、
回答者は言われた通りのものを実装するだけのお題を望んでたって感じか (だから問題文がややこしいとか言われるんだろう)
このスレ向きのお題じゃなかったな ンなワケねえだろ
お前本人か?
競プロの他の問題文と比べて明らかに文章の質が低いじゃん やはり速度が問題ならその旨ちゃんと書かないとわからない
そもそもプログラムは早ければいいわけではないし、短ければいいわけでもないし、可読性が高ければそれでいいわけでもない
それらは全部トレードオフの関係があってどこにウェイトを置くかはそれが使われる場面場面で変わってくる
「このお題では速度重視」というならその旨明示しないと 100桁以下の60進数の数列があって、条件に適合し得る部分の最大の長さはいくらかだから
N以下の偶数の最大値で自明だろ
だから何の問題なのか分からんって人がいるんじゃね? >>723
Kotlin
https://paiza.io/projects/rXwwuvtSVOP4hMo6FOyZuA
どうせループさせるんだから Iterator 作ってやっちゃおうか、など、色々やって長くなった。 区切り文字列が長さ0の時の処理がバグってて最後の文字がなくなるな。
こっそり直しておこう。 お題: 任意のテキストデータから数値データを抽出し、列挙するプログラム。
「12あいうえお34.5かき7.0くけこ」
→[12, 34.5, 7].
「0.12ABC3.45DE0.02FGH」
→[0.12, 3.45, 0.02]. >>741
document.querySelectorAll('span.name').forEach(e => {
if(e.innerText.indexOf('蟻人間') >= 0){
e.parentElement.parentElement.style.display = 'none';
}
}) >>743
この string-split-if には不満が残る
(string-split-if #'alpha-char-p "123abc456")
実際の結果: ("123" "" "" "456")
期待した結果: ("123" "456") >>741
Eを使った浮動小数点の表現はどうする? 1.23E-8 みたいな。とりあえずなしで良い?
作るとしたら正規表現使うからあろうがなかろうがたいした問題ではないが。 >>741
Perl5
もうほとんど何も考えてない。文字列切り出してるだけ。
以下は Linux で bash のコマンドラインで実行したところ。
$ echo '0.12ABC3.45DE0.02FGH' | perl -ne 'while(/(\d+(\.\d+)?)/g){print "$1\n"}'
0.12
3.45
0.02
$ お題: テキストデータに含まれている数値データを全部2倍にしたテキストを返すプログラム。
「7ABC123DE0.5FG82」
→「14ABC246DE1FG164」.
「あいう75.04えおか54きく-25」
→「あいう150.08えおか108きく-50」. >>748
Perl5
Perlだとこういうのはほとんど何も考えずに作れて楽だね。
$ ( echo '7ABC123DE0.5FG82' ; echo 'あいう75.04えおか54きく-25' ) | perl -pe 's/(\d+(\.\d+)?)/$1*2/ge;'
14ABC246DE1FG164
あいう150.08えおか108きく-50
$ >>748
Kotlin script
小数点以下の桁数を元の文字列に合わせるために java.text.DecimalFormat クラスを使用しているが、長くなってしまったなあ。
以下はコマンドラインから kotlinc で動かした Kotlin の REPL での入力と出力(>>> がプロンプト)。
>>> val ls = listOf("7ABC123DE0.5FG82", "あいう75.04えおか54きく-25")
>>> ls.forEach { println(it.replace(Regex("""\d+(\.\d+)?""")) { java.text.DecimalFormat(it.value.replace(Regex("\\d"), "#")).format(it.value.toDouble() * 2.0) }) }
14ABC246DE1FG164
あいう150.08えおか108きく-50
>>> お題:メールアドレスの難読化。
"info@example.com" ---> "info at example dot com".
"katayama.hirofumi.mz@example.com" ---> "katayama dot hirofumi dot mz at example dot com". お題:オートマドリング
以下の各問の要求された面積の所要室及び廊下を配置した、最も全体面積の小さい間取り図を出力せよ。
また、各間取り図は次の条件を満たすものとする。
・各室は廊下に面し、建物全体の形は長方形とする。
・間取り図は一文字を一坪とし、室はアルファベット、廊下は+で表示。
・廊下の面積は自由に決めて良い。
・最小面積の間取り図が複数の場合は、そのうち一つを表示すれば良い。
・全体面積(坪)を間取り図の下に表示。
【例】
所要室と要求面積(坪)
A:4, B:6, C:8, D:4
【出力例】
AAAA+DDD
BBBB+CCD
BBCCCCCC
(24)
【問1】
A:3, B:5, C:4
【問2】
A:8, B:4, C:6
【問3】
A:5, B:2, C:3, D:6, E,2 >>752
廊下は外周に接する必要があるかどうかとか、廊下は一続きか二つ以上あっても良いかとか、その辺は自由? 間取りが出来てればいいんで問題ないのだろう
人間が住むとも書かれてないし地球上のものだという保証もない
規定数の記号が並んでいればいいんじゃないか?
ようするに員数を満たしてりゃいいんだよ 補足条件です
・廊下の一端は外周に接する事
・室はそれぞれ連続している事
ダメな例
AADDDDCC
BBAA++CC
BBBBCCCC
・廊下が外周に接していない
・室Aが連続していない 廊下の数と面積が自由なら簡単になってしまったかw
修正 廊下は一続きに制限します >>756
このダメ例では、室Bが廊下に面してないので、それもダメ B B + E E
C C + A A
C D D A A
D D D D A
手で作る方がプログラム書くより簡単そうだ
問3とかこれでいいんでしょ >>760
正解です
人間が解くパズルとしてはそれほど難しくない
それをコードに落とすという問題です
更に形状、方位、上下階の連携などを制約に加えると、実用アプリの基本アルゴリズムになります 宇宙ホテルだと部屋種類が10000くらいあるんだろ
そして部屋数合計は100億だ
廊下の長さは1光年くらいあってもいい
なんで人間の地球人の尺度で考えるのか
これが分からない 所要室数の上限と要求面積の上限が制約なんじゃあないの
でもその制約がどこにも書かれているようには見えない
無いものを見ろと言われましても >>764
各問の室名(アルファベット)が所要室
数字がその室の面積
それら所要室を全て配置して、かつ全体が最小面積となるのが答え
例えば問3の解答例だと
BB+DDDD
EE++DDA
CCCAAAA
これは面積が21となり最小では無いのでダメ >>766
所要室数の上限はもしかして26+26=52っていうワケ?
それっぽっちしかないの? >>765
最小面積は、所要室の合計面積プラス最小限の廊下面積
各室が廊下に面するので、最低限必要な廊下の面積も計算可能
例えば外周に接する2坪の廊下なら、5室が面する事が出来る 面積わかって長方形という指定があるんだから最小面積はわか >>767
制限を撤廃して拡張しようと思えばいくらでも出来るよ 条件を後出しした場合は
まとめて「お題」を書き直してくれないかなあ
ていうか、ちゃんと最初から考えて出題して お題:オートマドリング 《 》内は補足した条件
以下の各問の要求された面積の所要室及び廊下を配置した、最も全体面積の小さい間取り図を出力せよ。
尚、各間取り図は次の条件を満たすものとする。
・各室は廊下に面し、建物全体の形は長方形とする。《それぞれ連続した室とする事》
・間取り図は一文字を一坪とし、室はアルファベット、廊下は+で表示。
・廊下の面積は自由に決めて良い。《廊下は外周に接する事》
・最小面積の間取り図が複数の場合は、そのうち一つを表示すれば良い。
・全体面積(坪)を間取り図の下に表示。
【例】
所要室と要求面積(坪)
A:4, B:6, C:8, D:4
【出力例】
AAAA+DDD
BBBB+CCD
BBCCCCCC
(24)
【問1】
A:3, B:5, C:4
【問2】
A:8, B:4, C:6
【問3】
A:5, B:2, C:3, D:6, E,2 >>774
まだコードにしてないけど、ある事はある
確かに難問かも知れない お題: 与えられた文字列が日本国内携帯電話番号かどうかを判定するプログラム。半角のみ。ハイフンは無視して読み飛ばす。 >>775
部屋数をN、部屋の総マス数の合計をTとする
とりあえず廊下を一マス増やすごとに設置できる部屋数は2増えるから廊下ますで最低でも[N/2]マス消費する
なので最低でも[N/2]+Tマスは必要
そこまでは簡単だとして普通[N/2]+Tマスで見つかるわけはない
例えば[N/2]+Tが73とかだと1×73しかないので無理
廊下1マス増やして74マスでも2×37で無理
次の75マスでは見つかるかもだし、こういうケースならまぁ75マスが最小と断じれるけど、一般には最小の[N/2]+Tマスで不可能と断じて次のステップに進むにはそう断じれる何か簡明に判定できる必要十分条件でもないと総当たりするしかない
そりゃ有限個しかないからアルゴリズムと呼べるのかもしれないけど事実上動かないよ 部屋をなるべく方形に(方形の枠±1)みたいな条件付けないとこんなんになるぞ
AA+BB
AC+DD
ACEED
ACDDD >>777
室+廊下の合計面積が素数
または、2×13のような廊下で分断されるような全体形状になる場合、短辺を調整して3×9にし、その分廊下に追加するなどの工夫が要る
数学的に最小面積か証明出来るかは分からんけど >>779
でもお題は「最小面積であるものを出力せよ」なんでしょ?
最小でなくてもなんでもいいなら自分で好きに工夫できるけど
最小の縛りがある以上「それ以下のマス目では無理」と断言できるものじゃないとダメでしょ? >>778
室の形状は制約に無いので、それで正解です
正解パターンが複数あるので、どれか一つを出力すれば良い事にしてます >>782
773の制約に無いものは考慮しなくて良いとします 廊下が存在する場合、少なくとも1坪の廊下が外周に面していればいいの? >>780
例えば、問1は最低必要面積で13坪なので、
2 * 7 = 14坪に変形しないと解が得られないですね
3 * 5 = 15坪が最小でない事が分かる
ここで判定すれば良いのでは? >>786
なるほど
つまり
AAAA
A++A
AAAA
はアウトで
AAA+
A+AA
AAAA
はセーフなのね
1から考え直さないとダメだわ >>788
やべえと思ってるw
皆あまり根を詰めないでね
間違ってもいいから 適切な回答が存在するかわからないなら「お題」にするなよ 頭で解くのが許されるならこれでいい
10 PRINT "BAAA+CC"
20 PRINT "BBBB+CC"
30 PRINT
40 PRINT "AAAAAA+CCC"
50 PRINT "AABBBB+CCC"
60 PRINT
70 PRINT "AA+DD"
80 PRINT "AB+ED"
90 PRINT "ABCED"
100 PRINT "ACCDD" これの方が良かった
10 PRINT "AAA+BBBBB+CCCC"
20 PRINT
30 PRINT "AAAAAAAA+BBBB+CCCCCC"
40 PRINT
50 PRINT "AAAAA+BBEE"
60 PRINT "DDDDDD+CCC" >>793
各問は解答を作ってから出してるよ
コードには落としてないがアルゴリズムは有る
やってる人もいるだろうから、まだ出さないが >>795 嘘
こっち
10 PRINT "AAA+BBBBB+CCCC"
20 PRINT
30 PRINT "AAAAAAAA+BBBB+CCCCCC"
40 PRINT
50 PRINT "AAAAADDDDD"
60 PRINT "BB+CCC+EED"
>>796
回答があるわりにはお題がころころ変わるねえ >>797
変わって無いけどな
質疑に答えただけだ
そのついでに廊下の条件が緩くなってしまった 出題者の題意をくみ取るのがお題じゃないんだから
まともに出題出来ないやつは出題するな
と思う >>800
>>801
すまん
要は建物内部の間取りを作れってだけの問題なんだ
難しく書いたつもりは無い >>803
問題文は間違ってはいないだろ
補足が必要だっただけだ >>785
え?
お題は>>773で出てる3つの場合だけ答えが出ればいいの?
そんなんプログラミングのお題にならんやろ?
プログラミングのお題と言うからには手計算ではできないような部屋数が30とかそうマス数が1000マスとかの入力でも対応できるプログラムって事になるでしょ?
>>773だったら手計算でもできるやん >>806
手計算なら意味無いよw
当然あらゆる入力に対応すべきだが、問題は3つだけ まぁでも出題者の言いたい事はまぁわからないでもない
この手の話は計算量の勉強してると時々出てくる
有名なのが巡回セールスマン問題で、本当の巡回セールスマンでは「セールスマンが最も効率よく巡回できる最小経路を算出するアルゴリズムを出せ」でコレにはNP時間かかるアルゴリズムしか知られていない
しかし「最小でなくても最小値に“そこそこ近い”経路ならP時間で求められるアルゴリズム」はある
多分出題者もこの問題について「最小値じゃないだろうけどまぁまぁ小さい答えを出してくれるアルゴリズム」はもってるんだろう
しかしコレをお題として他の人に出題するなら、その“そこそこ”が数学的に“どのくらい”なら合格とするのかを明示しないとお題にならない >>806
そう解釈したから>>797
>>807
適切な回答は用意してあるんだよね? まあ簡単ではないとは思うが
問題文わかりづらかったかい? >>813
そんなに意味不明な問題だったか?w
マジかw
じゃあ明日にでも参考解答出すよ 例えば>>777の設定で「総マス数が2N+Tまでは合格」とかその手の縛りにしないと“最小”という縛りでは問題にならない >>814
正しい出題が先
条件は>>773から変更は無いか
3題だけ解ければいいのか
時間やリソースを無視すれば解けるコードならいいのか
どの程度の規模の問題まで現実的な時間、リソースで解けれなければならないのか 今のままでは>>797で正解だ
(面積を追加すれば) >>817
773の条件なら797で正解
773で抜け落ちたが、当初は廊下は一続きであるという趣旨なんだよ
だが無闇に難易度を上げるつもりも無いから797で良し 廊下一続き縛りでも、そこまで計算時間かからんと思うよ
巨大な室数と面積でも無ければね
もちろん、宇宙ホテルでは無い なんで>>815は問題改変したがるんだろう?
総当たりだろうが最小を出すことは出来るだろ
Nがでかくなると実用的な時間では答えが出ないかもしれないけど お題:コイントス(数学板の問題の改変)
コインを3回連続で投げるとき
表表表,表表裏,表裏表,裏表表,表裏裏,裏表裏,裏裏表,裏裏裏の8通りが等確率で出る
2人で先手と後手を決めて、先手が上記の8通りの中から1つ選び、後手は残った7通りの中から1つ選ぶ
そして1枚のコインを連続して投げ続けて、先に選んだパターンが出た者の勝利とする
例えばAさんが 表表裏 を選び、Bさんが 表裏表 を選んだとして、
コインの結果が、裏裏裏表表裏 となったら 表表裏 が先に出たのでAさんの勝利
コインの結果が、裏裏裏表裏表 となったら 表裏表 が先に出たのでBさんの勝利
同様のルールで、コインn回(3≦n≦6)のパターンを2人で予想し合うとき、
先手の予想を表す文字列を入力として、後手の勝率が最大となる後手の予想を表す文字列を出力せよ
入力で与える文字列として、"表" "裏" の代わりに "0" "1" を使用して良い
※入力と出力の文字列は同じ長さとする
例1: 入力 = 0000 → 出力 = 1000
例2: 入力 = 111000 → 出力 = 111100 >>818
廊下が連結が元の題意ならそう訂正すれば良い
>>752からあくまで「補足」だと言い張りたいなら
あとから追加した条件「・廊下の一端は外周に接する事」も消さないと
>>819
部屋数A〜Zの26部屋
各部屋のサイズ20くらいまで
が現実的な時間、リソースで解ける
と思って良いか? >>821
いや、総当たりなら出せるけど、それでは「巡回セールスマン問題の最小解を求めるアルゴリズムを求めよ」と言ってるのと同じで事実上総当たりしかない
もちろん総当たりアルゴリズム実装するのは難しい話てはないけど面白くもなんともない
しかし「最小値ではないが最小値にかなり近い値でよい」なら工夫のしようもある
例えばこの問題なら廊下の最小値は[N/2]だけどコレをどこかに真っ直ぐ引いてその両脇からN個の部屋をニョロニョロ伸ばして綺麗に長方形に治るようにする解なら多項式時間程度で求まる
しかしその方法で解が見つからなかったとしても、“あらゆる場合”を検討したわけではないから探索を次のステップに進めることができない
あくまで最小値を求めるならここで総当たりしてるダメな事を確認しないといけなくなる
しかし制限が最小値でなくて例えば2N+T以下くらいに緩ければこの方法で解を求める事が(多分)できる
まぁわかってもらえないようだからいいよ
総当たりプログラムなんて面白くもないのでROMします >>822
ほとんど数学の問題
それともモンテカルロで解く? >>824
アルゴリズムの工夫で現実的な時間で解けるという可能性は?
NP問題だと証明できた? >>824
> 総当たりプログラムなんて面白くもないのでROMします
よろしくねw >>826
そんなのできるわけないやん?
つまりこの問題かperfect NPか?と聞いてるのと同じで全く新しいPerfectNPを見つけた事になる
そんなの論文レベル
まぁ多項式時間では解けそうにないなぁってのはあくまで第1感で実際には解けるもしれない、しれないけど自分が無理くさいと思ってる問題でペイも発生しないお遊びにそこまで頭と時間使う気になれない
チャレンジして「やっぱダメじゃん」で終わった時虚しさしか残らん >>822
おもしろそうなので考えてみます
数学板などのカンニングは無しで
答えを書くのしばらく待って! >>823
廊下の一端は外周に接する、この条件は生き
部屋数は26まで、各面積は20坪までとする
(そこまで想定して無かったがw)
現実的な時間で解けない問題も過去には出てたからなあ
それでも猛者は取り組んでたよ
回転寿司の皿の問題とか >>828
興味が無いならROMしててくださいな
以前みんなが指数関数オーダー以上でしか出来なかった問題を
線形オーダーで解いたことがあったのを思い出した >>830
それ
回転寿司問題
私が線形オーダーに縮めたやつ >>829
その問題数学板では答えしか出てない
計算式とかアルゴリズムは出てないので見に行っても大丈夫
いわゆる受験で出てくる“確率漸化式”の話(Homogeneous Morkov Chainと言います)の話が理解できてれば行列計算のルーチン実装すればできます
HMCの話知らなくても受験数学レベルでギリギリできなくもない >>835
わざわざ「カンニングは無しで」って書いたのに
わざわざヒント書くかねえ
しばらくこのスレ見ないことにする
>>830
とりあえず>>830の範囲で考えてみる
このスレにはしばらく来ないけど
寿司問題、ずいぶん前だよね
ずいぶん前からこのスレにいるなら
最初から出題は正しく曖昧性なく書こうよ >>836
ヒントになんかなってないよ
大丈夫
この単語ググっても答えになんか辿り着かないから
数学板にも答え出てません
まぁコレ以上なんかいうとホントに答えになるのでやめときます
頑張ってください >>837
これかな?18レス付いてた
お題:
回転寿司にやってきた私は、コンベア上のすべての寿司を食べて帰ることにしている
コンベアは1秒に1皿分の速度で流れ、目の前の皿を取るか取らないかを選ぶことができる
私は皿取ると同時に食べ始めるが、食べている間は次の皿を取ることができない
コンベア上の皿は、私が取る以外で勝手に追加されたり無くなったりしない
最初のコンベアの状態が次のような文字列で与えられる
"31_2"
数字(1文字)はその皿を食べ終えるのにかかる秒数を表し、_は皿がないことを表す
1文字目が私の目の前であり、1秒毎に左へ回転する
例えば、最初の皿を食べたとすると食べ終わった時の状態は以下である
"2_1_"
すべての寿司を食べ終わるまで最短何秒か求めよ
"12_3" > 6秒
"313__" > 8秒
"4_35_1264_23_434" > 60秒
"123456789123456789" > ? 部屋の問題はダンジョンや迷路生成のアルゴリズムに似た物じゃない
パラメタが違うだけ
起点(玄関兼廊下)から幹道(廊下)があって支道(部屋)を生成し全体を枠内に収める 対称性があるかどうかも分からない
巨大合成数を生成するのは掛け算するだけでかんたんだけど
それを二つに分けるのはちょっとばかし面倒でしょ >>842
まだ大きい数字のチェックが終わってないが、出しましょうか >>842
これになります
大きい数字で条件違反が出るので、もうふた工夫要りますが
https://ideone.com/Rnq0SJ 500x500くらいになる手頃な大きさの例とか無いの? >>822 Ruby
https://ideone.com/uiPy1x
最大深さnまでの負け以外の集計から勝率の集計に変更 >>776
電話番号の最初が 010 や + ならば国際電話でそれ以外は全て国内電話だと思うが、本当にそれだけの判別で良いのか? >>776
携帯の電話番号というのを見落としていた。で、何が携帯番号かの資料は何処にあるのか? >>678
> 仮名を清音に変換してから比較する
うん、発想はいいが、いまひとつ。
清音のキーと「長音」「濁音」「拗音」とかのキーをそれぞれ生成して、
それをどうにかして整列キーを生成して文字列順の整列ルーチンに
喰わせる、ということを考えたら完璧。 お題: 複数ある改行を1つの改行にまとめる関数join_newlinesを作成せよ
s = 'abc\ndef\n\nghi\n\n\n'
s = join_newlines(s)
print(s)
# 'abc\ndef\nghi\n' >>856 Ruby
p "abc\ndef\n\nghi\n\n\n?".split.join$/ # => "abc\ndef\nghi\n" >>854
小学生の頃、かくれんぼしてたの覚えてるか? 今でも覚えてるからな。 >>856
js
s.replace(/\n(\n)+/g,"\n") >>856
haskell
import Data.List
joinNewLines = id
. concat
. map (\x -> if ( head x == '\n' ) then "\n" else x )
. group >>847 Wrong Answer 0000→0001
>>849 Wrong Answer 0010→1100 >>864 訂正・補足
>>847 右のケースでWA 入力0001→出力0000
>>849 右のケースでWA 入力0010→出力1100 >>856 Python
def join_newlines(x): return "\n".join(x.split()) >>867
これで文字列の最初に空行があったり、文字列の最後に空行が続いたというような場合の復元ができるものですか? >>868
確かにおかしいですね
一応直してみましたがあんまりすっきりとはいきませんでした
>>856 Python
def join_newlines(x): return "\n".join(("@"+x+"@").split())[1:-1] 数学板より
お題 ヘビサイド関数で近似
問題は長いのでリンク先
分からない問題はここに書いてね 467
https://rio2016.5ch.net/test/read.cgi/math/1619884204/439-440
出力して欲しい3つの数値の例
上のリンクの下の440の方
【具体例1】
N = 3
l r s w
1 3 6 1
0 8 4 1
5 7 2 1
a=4, b1=6, b2=2 としたとき、F(a,b1,b2)=0 になり、これが最小値です。
a=3, b1=6, b2=2 としたとき、F(a,b1,b2)=4 になり、最小値ではありません。
a=4, b1=5, b2=3 としたとき、F(a,b1,b2)=4 になり、これも最小値ではありません。
【具体例2】
N = 4
l r s w
0 2 4 3
1 5 6 9
4 10 1 2
8 9 7 10
a=0.8, b1=1, b2=6 としたとき、F(a,b1,b2)=70 になります。 >>872
ここは数学板じゃないので、
「この問題を解くと、どういう用途に役立つのか」
ということを聞いておきたいと思います。 >>873
残念ながらこの質問した人このレスを最後に消えてしまいました
なんの役に立つのやら お題:teshimatta関数関数を作れ
入力は1文字以上を保証される
teshimatta("起きた")
> "起きてしまった"
teshimatta("やった")
> "やってしまった"
teshimatta("あ")
> "ってしまっあ"
teshimatta("古畑任三郎")
> "古畑任三ってしまっ郎" >>877 修整
teshimatta("あ")
> "てしまっあ"
teshimatta("古畑任三郎")
> "古畑任三てしまっ郎" >>877 Ruby
def teshimatta(str) = str.insert(-2, 'てしまっ') >>877
haskell
teshimatta = reverse . concat . zipWith ( flip ( : ) ) ( "っまして" : repeat "" ) . reverse >>877
Kotlin 及び Kotlin script
以下は kotlinc コマンドで REPL で動かした時のコピペ。
>>> はプロンプト。1行目が関数定義。2行目から使用している。
>>> fun teshimatta(s: CharSequence): CharSequence = if (s.isNotEmpty()) StringBuilder(s).insert(s.lastIndex, "てしまっ") else s
>>> teshimatta("起きた")
res1: kotlin.CharSequence = 起きてしまった
>>> teshimatta("やった")
res2: kotlin.CharSequence = やってしまった
>>> teshimatta("あ")
res3: kotlin.CharSequence = てしまっあ
>>> teshimatta("古畑任三郎")
res4: kotlin.CharSequence = 古畑任三てしまっ郎
>>> >>877 Python
def teshimatta(s): return s[:-1] + "てしまっ" + s[-1] お題:一筆書き
0:床、1:穴、2:スタート地点
からなる数字列が与えられる。スタート地点から縦または横に1マスずつ移動し、すべての床を通過することとする。
穴や外周は通過できない。床は一度通過すると穴となり二度目は通過できない。
すべての床を通過できれば「OK」、できなければ「NG」と表示せよ。
【例1】OK
0000
0210
0000
0100
【例2】NG
0000
0200
0010
0000
【例3】OK
000000
210000
000100
000001
000000
【例4】NG
000000
210000
000100
000000
000001 >>883
まさかこれ頂点の次数を数えるだけで終わるのか? NP完全らしいから事実上考えても無駄で総当たりで検索するしかなさそうやね >>883 Prolog
'お題:一筆書き
0:床、1:穴、2:スタート地点
からなる数字列が与えられる。スタート地点から縦または横に1マスずつ移動し、すべての床を通過することと
する。
穴や外周は通過できない。床は一度通過すると穴となり二度目は通過できない。
すべての床を通過できれば「OK」、できなければ「NG」と表示せよ。'(_行,_列,L) :- nth1(_スタート,_数字列,2), 選択(_行,_列,_スタート,_数字列).
選択(_行,_列,_n,_数字列) :- \+(member(0,_数字列)), write('OK\n'),!.
選択(_行,_列,_n,_数字列) :- 隣接(_行,_列,_n,_n_2), nth1(_n_2,_数字列,0), '_n番目を1に変える'(1,_n_2,_数字列,_数字列_2), 選択(_行,_列,_n_2,_数字列_2).
選択(_,_,_,_) :- write('NG\n').
'_n番目を1に変える'(_n,_n,[_|R],[1|R]) :- !.
'_n番目を1に変える'(M,_n,[_現在位置|R1],[_現在位置|R2]) :- succ(M,N), '_n番目を1に変える'(N,_n,R1,R2).
隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 - 1, \+(0 is _隣接 mod _列).
隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 + 1, \+(1 is _隣接 mod _列).
隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 - _列, _隣接 > 0.
隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 + _列, _隣接 =< _行 * _列. >>884 すみません。一箇所間違えました。
Prolog
'お題:一筆書き
0:床、1:穴、2:スタート地点
からなる数字列が与えられる。スタート地点から縦または横に1マスずつ移動し、すべての床を通過することと
する。
穴や外周は通過できない。床は一度通過すると穴となり二度目は通過できない。
すべての床を通過できれば「OK」、できなければ「NG」と表示せよ。'(_行,_列,_数字列) :- nth1(_スタート,_数字列,2), 選択(_行,_列,_スタート,_数字列).
選択(_行,_列,_n,_数字列) :- \+(member(0,_数字列)), write('OK\n'),!.
選択(_行,_列,_n,_数字列) :- 隣接(_行,_列,_n,_n_2), nth1(_n_2,_数字列,0), '_n番目を1に変える'(1,_n_2,_数字列,_数字列_2), 選択(_行,_列,_n_2,_数字列_2).
選択(_,_,_,_) :- write('NG\n').
'_n番目を1に変える'(_n,_n,[_|R],[1|R]) :- !.
'_n番目を1に変える'(M,_n,[_現在位置|R1],[_現在位置|R2]) :- succ(M,N), '_n番目を1に変える'(N,_n,R1,R2).
隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 - 1, \+(0 is _隣接 mod _列).
隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 + 1, \+(1 is _隣接 mod _列).
隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 - _列, _隣接 > 0.
隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 + _列, _隣接 =< _行 * _列. >>891
総当たりでやる前に市松判定ではじく処理くらいは入れてもいいと思う お題:今日は第何曜日か計算して現在の日時を以下のように出力する
2021/06/09/第2水曜日/19:21/
ヒント
今日の日にちを7で割る 例:9 / 7
少数点以下は切り捨て
1を足す
カレンダーを見ながら計算すると分かりやすい >>895 Ruby
puts Time.now.then{|t| t.strftime('%Y/%m/%d/第%%d%%s曜日/%R') % [(t.day + 6) / 7, %w[日 月 火 水 木 金 土][t.wday]]}
# => 2021/06/09/第2水曜日/19:52 >>895のヒント通りだと7の倍数の日付で不具合が発生するが宿題か? >>897
>>896のほうが簡単なのでヒント変更
今日の日にちに6を足して7で割る 例:(9+6) / 7
少数点以下は切り捨て
カレンダーを見ながら計算すると分かりやすい >>896の方が「より」簡単なんじゃなくて>>895が「完全に」間違いなんだろうが >>901
テンプレくらい読めよアホ
>宿題は宿題スレがあるのでそちらへ。 >>902
宿題である証拠あんのか?あ?いいかげんなこといって綾つけてんじゃねえぞおら だいたいテンプレにあるからなんだってんだよ、マジメかバーカ >>903
宿題じゃないって証拠でもあんのか? うせろガキが >>905
証拠がないんだったら宿題じゃないよね
ここはお題スレだから
どこの学校の何先生が出した宿題なんですかー?w さっさと証拠出せやおら、だせねえんだったら発言撤回して謝罪しろ大人なめんなよ 自分の発言には責任持とうね、証拠早くだせ、言いがかりつけてただですむと思うなよ 宿題キッズは死んでください。
ID:YKvIUGd6
ID:YKvIUGd6
ID:YKvIUGd6 >>910
お前が死んでください
神様お願いします>>910の脳天に雷を落として黒焦げにしてください
それをミキサーでくだいて花壇に撒くととてもきれいなお花が咲きます
よろしくお願いします >>895からして頭悪そうな文章だと思ったがガチの糞ガキで草 >>904
テンプレすら守れないやつはただの荒らしなんで
NGぶっこんどくわ お前ら報連相はきちんとできるのにお題は解けないのな >>913
第何曜日か計算するのに日付をそのまま7で割るとかいう発想しかできない糞馬鹿のお前に言われても草しか生えないんだが 宿題は宿題スレがあるのでそちらへ。
宿題は宿題スレがあるのでそちらへ。
宿題は宿題スレがあるのでそちらへ。 小学生レベルの算数すらできなかったYKvIUGd6が悪い。 リアル予備校講師の俺がガチ解説してやろうか? おん? 駒場で公理的集合論研究してる俺にガチ解説して見ろやゴミムシが
お前みたいな雑魚がこの世に生きてるのが一番許せないわ >>922
1月を30日とするだろ
1〜7 は第1回目の曜日
8〜14 は第2回目の曜日
15〜21 は第3回目の曜日
21〜30 は第4回目の曜日
になる
つまり
1〜7を1に変換する式を考えれば良い >>923
お前それ自分で自分の間違い認めてるじゃん。 ちなみに集合論は数学の最底辺、集合論を研究してる数学者は文学科と呼ばれてる 本物の小学生っぽくて暴言吐くのがちょっといたたまれるレベル まだピンと来てないようだから図で説明する
https://light.dotup.org/uploda/light.dotup.org695020.png
このように日付が7個ごとに箱に入っていてその箱の数を数えれば良いわけ
駒場では教えてもらえないだろうけど、こういうふうに考えると良いわけ >>932
あれあれw君回答してないよね、回答の提出がない人は理解できてないので、すぐに回答を提出するように > ヒント
> 今日の日にちを7で割る 例:9 / 7
> 少数点以下は切り捨て
> 1を足す
馬鹿過ぎて草も生えない
ヒント とかドヤって思いっきり間違えてるとこが痛々しすぎる
> カレンダーを見ながら計算すると分かりやすい
更に駄目押し
分かりやすいとか言ってるのにコレかよ
真面目に頭の検査してもらった方が良いんじゃねーか?
頭に寄生虫とかウジャウジャ湧いてんじゃねーの?
冗談でも脅しでも無く本当にあるからな
更にキレっぷり見るに火病の疑いもある
死にたくなければマジで脳の検査してこい >>933
プログラムの回答コード出さなかったら負け >>935
だったらお前はお母さんの子宮からやり直せ
産道を通ってお母さんの膣の臭いを脳味噌に焼き付けてから
歩む人生こそいまのお前にふさわしい >>936
粘着レスしてんじゃねえよバーカ、発達障害かよw そうだ、お前らコロナのワクチンの注射頭に刺してくださいって言ってみれば? ガチガイジかどうかまでは分からんが
少なくともガイジ扱いされた事のある人の反応ですね
自覚があるから草で誤魔化す
認めたく無いのだろうけど素直に診療受けた方が良いよ
病種によっては投薬や訓練で治ったり緩和出来るものもあるからさ >>942はガイジ扱いされたことのある人になりました 完全に間違ったことを言ってしまったというのに
そのことを指摘されて相手をなお罵倒するというのは
まともな頭脳の持ち主がするところではないわな
しかも自分の正当性を一切主張できていないというのがお笑いポイント 回答してない分際で何の分析してんだよ
YouTubeでもいるよな、松本はわかったうえであえて
こうすることで笑いにしてるみたいな分析をコメントに書くやつ
そしてそれにGoodするやつな、あいつらは本当にアホですわ
もっとアホなのは令和3年に見てる人ーとアンケート取るやつな で、お前らが好きなYouTuber誰よ? 言ってみ? おん? >>948
あなたがこの上ない苦しみを感じながらこの世から消え去っていきますように(。>人<。) >>949
で、君のお題に対する回答コードはどれだね? おん?
他人のコードに便乗するのは認めないよ >>950
集合論と絡めてもっと洒落たことを言って欲しい
駒場で培った頭をフル回転させて欲しい
君の本気が見たい >>953
客観的に見てそれが乞食が物を乞う態度か? >>954
僕の態度が乞食がものを乞う態度でないならば僕は乞食ではないということですよね
これが集合論 >>957
> 習合
wwwwwwこれなんですか?wwwww
wwwwwwwwww習合ってなんですか?wwwwwww
wwwwwwwwwwwwwwなんまんだぶなんまんだぶwwwww 俺は駒場の本気が見たいんだよ
こ・ま・ば! こ・ま・ば! こ・ま・ば! これでも良いです
ヒント
今日の日にちから1を引く 例:9 - 1 = 8
それを7で割る 例:8 / 7
少数点以下は切り捨て
1を足す >>961
これでもいいですじゃなくてこちらに訂正してくださいませだろ
脳みそ腐ってんのかよ >>962
それはお前が言うことじゃない
客が神様だとでも思ってるのかつけあがるな痴れ者が
訂正するのは誰なんだ? あ? 日本語わかるか? おん? 訂正してくださいませは訂正しろということだからな
相手に訂正させようとしてんのか? あ?
そんな馬鹿な日本語あってたまるかよ 丁寧な言葉を使おうとするあまりコンテキストにバグを混入させるバカ
プログラマ辞めた方が良い、絶望的に人間に向いてない
汚い庭に首輪で繋がれてワンワン言ってた方が良い > 962+1 :デフォルトの名無しさん [↓] :2021/06/09(水) 23:55:21.66 ID:qriTcyP1
> >>961
> これでもいいですじゃなくてこちらに訂正してくださいませだろ
> 脳みそ腐ってんのかよ
バカを晒し上げ >>895-896
#!/bin/sh
# 日にち
d=$(date "+%e")
# 第n曜日のn
n=$(( ($d + 6) / 7 ))
# +%a : 曜日 (出力例:木)
dw="第$n"$(date +%a)"曜日"
echo $(date "+%Y/%m/%d/$dw/%H:%M/") >>896
6を足す方法を知ってからだいぶプログラミングが楽になったよ。ありがとう。
#!/bin/sh
d=$(date "+%e")
d7=$(echo "scale=3; $d / 7" | bc)
if [ ${#d7} -lt 2 ]; then n=$d7;
else n=$(echo "scale=3; $d7 + 1.0 " | bc | cut -c 1); fi
dw="第$n"$(date +%a)"曜日"
echo $(date "+%Y/%m/%d/$dw/%H:%M/") 整数型での切り上げは
(a + (b - 1)) / b
でできるからねー 今世紀最大のバカ
ID:YKvIUGd6
ID:SL5oYI2o お題: 正方形内部の2次元空間(0, 0)〜(100, 100)にランダムに1000個の頂点を配置し、頂点群をk-means++により3個のクラスタに
クラスタリングし、頂点群の位置と3個のクラスタ中央をわかりやすく図示せよ。図示できないときはクラスタ中央の座標を表示せよ。 TimeZoneをlocalに指定したのだけれど、これが'UTC'になっている。_時に9を足せば
良いだけのことではあるが。local、'UTC'以外の何を指定すればよいのか。 >>967-968
# Python版
from datetime import datetime
import locale
locale.setlocale( locale.LC_TIME, 'ja_JP.UTF-8' )
today = datetime.now().strftime( '%d' )
num = ( int( today ) + 6 ) // 7
print( datetime.now().strftime( '%Y/%m/%d/' + '第' + str(num) + '%A' + '/%H:%M/' ) ) >>895
日から1引いてからじゃないと7日が2になって駄目だよな。
(ヒントに間違いを書いて惑わす作戦か?) >>895
Kotlin script
Kotlin だから色々省略出来たりもしてはいるがやっぱ長くなるな。
java.time.LocalDateTime.now().run { println("%d/%02d/%02d/第%d%s曜日/%02d:%02d".format(year, monthValue, dayOfMonth, (dayOfMonth - 1) / 7 + 1, "月火水木金土日"[dayOfWeek.value - 1], hour, minute)) }
今これを実行するとこう出る。
2021/06/12/第2土曜日/19:47 そういや (dayOfMonth - 1) / 7 + 1 は (dayOfMonth + 6) / 7 と同じだったな。
と思ってから他の回答見るとみんなそう計算していた。とほほ。 ごめん。Javaのライブラリだともっと簡単にできるんだった。
println(java.time.format.DateTimeFormatter.ofPattern("YYYY/MM/dd/第Weeee/HH:mm").format(java.time.LocalDateTime.now()))
これ、Kotlin かどうかは println() の部分だけで中身は Java でも同じ。
月の中の何週目なのかはFormatterで W を使うと自動でやってくれるので自分で計算しなくても良い。
今実行するとこう出る。
2021/06/12/第2土曜日/20:24 Formatter.ofPattern() での Locale は本当は設定した方が良いかも知れない。>>979は日本語環境で実行したので曜日が日本語になっている。他の言語向け環境だと曜日の文字列は違って出ると思う。 >>979
ふーむ
YYYYはweek-based-yearなので2021/12/26が2022/12/26になってしまうよ
Wはweek-of-monthなので6/6が第2日曜日になってしまうよ お題
年月と第何曜日が入力されます
その日付を出力してください
入力: 2021-07,第3月曜日
出力: 2021-07-19 >>983 Ruby
def s2d( str )
return '' unless /(\d+)-(\d+),第(\d+)(.)曜日/ =~ str
tm = Time.new( $1.to_i, $2.to_i, 1, 12 )
( tm + 86400 * ( $3.to_i * 7 - 7 + ("日月火水木金土".index($4) - tm.wday) % 7 ) ).strftime( '%F' )
end
puts s2d( '2021-07,第3月曜日' ) #=> 2021-07-19
閏秒やサマータイムを挟んでもおそらく問題ない JS
const f = (x) => {
let [p,q] = x.split(","); let days = {日:0,月:1,火:2,水:3,木:4,金:5,土:6};
let nth = q.match(/\d/)[0]*1;
let day = (r=>{
for (let [k,v] of Object.entries(days)) { if (q.includes(`${k}曜日`)) {return v}}
})(q)
let i = 1;
while (i<32) {
if (new Date(`${p}/${i}`).getDay()!=day) {i++;}
else if (nth != 1) {i+=7; nth--;}
else {break}
}
return new Date(`${p}/${i}`).toLocaleDateString();
}
やっつけ >>981
あ。そうか。YYYYはyyyyにするとしても、第xの方は計算しないと駄目か。 >>983
haskell
import Data.Time
import Data.Time.Calendar
import Data.List
data Day = Sun | Mon | Tue | Wed | Thu | Fri | Sat deriving ( Eq ,Show )
nthWeekDayOf y m n w = let
Just wn = elemIndex w [ Sun, Mon, Tue, Wed, Thu, Fri, Sat ]
baseDay = ( fromGregorian 2021 6 13 )
firstDay = fromGregorian y m 1
diffDaysOfFst = fromInteger $ diffDays firstDay baseDay
d = 1 + mod ( wn - diffDaysOfFst ) 7 + 7 * ( n - 1 )
in fromGregorian y m d
main = do
print $ nthWeekDayOf 2021 7 3 Mon c#
OPEN FILE DIALOGで複数画像ファイル取得
配列に入れる
40秒後2枚目表示、また40秒後3枚目表示という感じで5枚表示したい。
表示はpicture BOXで。 >>983 Perl5
use utf8;
$in = '2021-07,第3月曜日';
%h = map{$_ => ++$i} split '','月火水木金土日';
($y, $m, $wom, $dn) = $in =~ /(\d+)-(\d+),第(\d)(.)曜日/;
$dow = $h{$dn};
use DateTime;
$d = 7 * ($wom - 1) + $dow + DateTime->new(year => $y, month => $m)->day_of_week;
printf "$y-$m-%02d\n", $d;
実行結果
~ $ perl 19_983_day_of_month.pl
2021-07-19 # >>895のPython版、>>898のPython版は>>975コレのほうが簡単
import datetime, locale, math
now = datetime.datetime.now()
locale.setlocale( locale.LC_TIME, 'ja_JP.UTF-8' )
# 今日の日にちを取得、型は文字列
day = now.strftime( '%d' )
div7 = ( int( day ) / 7 )
# 日にちを7で割って割り切れたらそれが第何曜日の何に入る数字
# 割り切れなかったら1を足して小数点以下を切り下げ
# import math ; math.floor( 3.9 ) #実行結果は3
# カレンダーを表示させて日にちを7で割ると分かりやすい
if type( div7 ) == int: num = div7
else: num = math.floor( div7 + 1 )
print( now.strftime( '%Y/%m/%d/' + '第' + str(num) + '%A' + '/%H:%M/' ) ) >>994のコードをPython3の read-evaluate-print loop (REPL)ウィンドウにコピペして実行するときは
最終行手前のelse行の行末までをコピペした後にEnterキーを2回押して
repl画面に>>>を出してから最終行のprint文を実行する このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 201日 0時間 0分 46秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。