米田氏が企画した「競プロ典型90問」を解いていきます。
ここでは私の試行錯誤やら解説の理解やら気づきやらをメモしていこうと思います。
競プロ初心者なのでどうか温かい目で見守ってください。
なお、本記事中のPythonコードはブラウザ上で実行可能です。
よろしければ遊んでいってください。
問題
kyopro_educational_90/002.jpg at main · E869120/kyopro_educational_90
![](data:image/png;base64,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)
002 - Encyclopedia of Parentheses(★3)
やってみよう!
テストデータ・テスト関数定義 ↓
# 縮小表示
test_data = [
{
"in":[2],
"out": "()"
},
{
"in":[3],
"out": ""
},
{
"in":[4],
"out": """(())
()()"""
},
{
"in":[10],
"out": """((((()))))
(((()())))
(((())()))
(((()))())
(((())))()
((()(())))
((()()()))
((()())())
((()()))()
((())(()))
((())()())
((())())()
((()))(())
((()))()()
(()((())))
(()(()()))
(()(())())
(()(()))()
(()()(()))
(()()()())
(()()())()
(()())(())
(()())()()
(())((()))
(())(()())
(())(())()
(())()(())
(())()()()
()(((())))
()((()()))
()((())())
()((()))()
()(()(()))
()(()()())
()(()())()
()(())(())
()(())()()
()()((()))
()()(()())
()()(())()
()()()(())
()()()()()"""
}
]
def test_all(f):
for i, data in enumerate(test_data):
exp = data["out"]
ans = f(*data["in"])
result = "AC" if exp == ans else "WA"
print(f"{i+1} {result}")
下のmain0
関数を完成させて「Run」ボタンをクリックしよう!
def main0(N):
pass
test_all(main0)
自由欄
try(1st.)
- 長さNの正しいカッコ列($S_{(N)}$)って、長さN-2の正しいカッコ列($S_{(N-2)}$)に以下の3パターンを加えたものじゃね?
- 「()$S_{(N-2)}$」
- 「($S_{(N-2)}$)」
- 「$S_{(N-2)}$()」
- それだったら再帰で簡単に実装できるな。ヨユー😁
- あかん、「$S_{(N/2)}S_{(N/2)}$」とかのパターンもあるやん…。どないしよ。
- 💡これ、格子上のスタートからゴールまで最短経路で移動するパターンと一緒やん!
イメージ:「(」だと右に進む、「)」だと下に進む
![](data:image/png;base64,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)
という訳で実装したのが以下
def gen_kakko(n, l, r):
if n == l + r: return [""]
if l == r:
return add_l(n, l, r)
elif l == n / 2:
return add_r(n, l, r)
else:
return add_l(n, l, r) + add_r(n, l, r)
add_l = lambda n, l, r: ["("+kakko for kakko in gen_kakko(n, l+1, r)]
add_r = lambda n, l, r: [")"+kakko for kakko in gen_kakko(n, l, r+1)]
def main(N):
if N % 2: return ""
out = gen_kakko(N, 0, 0)
return "\n".join(out)
test_all(main)
いけそう。
結果(1st.)
提出 #32357603 - 競プロ典型 90 問
一発AC!やったー
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAo8AAACUCAYAAADyHsMKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAACEJSURBVHhe7d0LvFVj/sfxXySnGulGpUgJQxdKLpVcQmiKJmYYpIYyyd0wcn0h/BtyK7ckhHGbkVsMTYNIzSSi6fIiEgrR/S6pv++v9Rzr7LPPOevcL/vz7rVeZ++11771WvvZ3/V7nmftalt+ZgAAAEAC20R/AQAAgAIRHgEAAJAY4REAAACJER4BAACQGOERAAAAiREei2Djxo1222232ciRI23p0qXR2pxeeukl69ixo11zzTW2YcOGaC0AAEDllmd4/Pe//22DBw+2SZMm2Q8//BCt/YXW3XPPPfbKK6/YJ598YldeeWWeQaoiKe770pmNXnvtNXvuuedsyZIlVrNmzeiWwlmxYoX179/fA2ZhFt1H9wUAACgPacPjsmXL7G9/+5tNmzbN/vznP9vxxx9v9913n33//ffRFmbbb7+97bXXXvbMM89Y9erV7ccff7Q33ngjuvUXq1atsiFDhtjJJ59s8+fPj9aWj+K+L4XJc845x2688UZr166dnX/++R5Gdf3111+33/zmN9khT+tEQfPQQw/NXq+KJAAAQGWVNjzWr1/f7r//frv99tutffv2HgAffvhhO/HEE+3WW2+1r7/+2rfTbTvvvLN3yx533HG2YMGCXNW8rKwsD2S6TZW64lq5cqWNHTvW/vKXv3gYLIzivi/dX+9Fevfu7WH4zjvvtLfeessD6DbbFG0UwIMPPmjTp0/3RZelTZs2NnHixOz11113na8HAAAoTwX+woxu/u677+wf//iHV+003q9ly5Z2xx13WLNmzaKt8qeApgqfqn1/+MMf7KeffvLgtnDhQvv888/t008/tVmzZnkYvPTSS61r165WrVo1v68C3fPPP2/Lly+3yy67zDZt2mTXX3+9B7bLL7/cfv/732dv+8EHH/g2Bx10kF111VVWp04dX59OUd+XArAee+bMmV6Z3Lx5s1199dXWo0eP7NchqjCq+qjwqXGPCtFx6nq++OKL/X0XhkLlXXfdZXXr1o3WAAAAlJ1cpbJ58+bZueeea08++aR98803vq5Ro0Z23nnn2fjx4+2ss86yfv36WdOmTf22/Kxbt84D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2qLs6MCmT58+tmDBgmgNAJitW7fOrrrqKm+j1F6lircd+j7T99r1119vGzZsiLYAiqbMwmOoSIalvLuY9aFScNQHb8qUKb68+uqr1rp1a7998ODBVrduXb+MzDNp0iQbPny49ezZ05566ik77bTT7MMPP7Qffvgh2gIAytfChQtt1qxZlpWVZW+88YaHSaAslFp4TK3kTZ061YOaNG7c2Nq0aeOX4/I6MkpaeVEYLCiY6jH0WHp98uWXX/pfPffll19us2fPtjPOOMPat2/v65F5Nm7caO+++67tuuuuduyxx1rz5s298njvvffazjvvHG0FAOVny5Yt/r2600472fnnn2/Tpk2zzz77LLoVKF0lEh5DIFNwO++883ydAlio6GlR5ebFF1/028466yzbfffd/XK4rwKiKn2q+E2YMCG7BK8Q+d1331mDBg0KrASGKqICoV6LHjNO1U+9jqOPPjq7yqgQOWDAAH9NITjqNQAff/yxPf/887Zq1apozVZqtKdPn+4N9mGHHebVyZdeesm7ukUHL4MGDbKnn37aevfubaeffrrvW88884wdd9xxvuhy2D5UwV955RXf/ogjjrCxY8fmWeX89ttv7brrrvPt9Nx6LAVeAJlj6dKl9vbbb3sb1LVrVz/I1UGv2iegtJVIeFQQHDdunAe3UF1M9eSTT/oXaPfu3T28BbqvrivEKdzts88+vo2CpqqBCo+LFi2ypk2bemk+CYU/lfAVOuOVSFUT9RpDl/TIkSP9uebMmeNfyHrtBEfUqFHDjj/+eKtVq5aPc1RAGzJkiIdJNczr16/3Rvrggw+2xx57zMOhAqD2o0CX16xZY7feequ1aNHCLrjgAu9eGjFihD+2qpgzZ86MtjZ77bXXvAtKXeWqvo8ZM8beeeed6NZf6Atj6NChvm/feeedduWVV/pnTwdcADKHhtF88cUX1rFjR2vYsKGHyPfee8/bCKC0lcmYR4U3hUNV+i6++OJcIVDVQN0WKpMnnniiB83Jkyfb559/7pf1AUkaHkXbqvtbofXhhx/OVYVUKB02bFiOL93Q7R1fFGiReQ444AAPjqeccorVqVPHj/Avuugi3xcVKnVZk2l08NOpUydfp4Y8UGOug6K99trLq4na31Rh1/UTTjjB6tev7wdFwd577+3P1apVK+vRo4ftueee3iWVWlFU4FSIVYVfB0NdunTx7RU0Ge8EZAa1J/p+POigg/zgtFq1at4OqQiiUAmUtlIPj9rJdSSkcHjbbbel7XrWOn0RKsjNnTs3u0KoL18FSt330EMPjbYunFAVjVcUFSS7devmz6fKo6qUer74ou5rZC41xhrzqJCoffCKK67wcPb+++979VEBTpVqdR3r4EeNdl623Xbb6NJWeuxttsn7oxduV7f25s2bo7VbrV271l/Hn/70p+wDnFGjRtmyZcvougYyhHopPvjgA3vrrbf8e1LtQP/+/W358uVMnEGZKPXwqApgv379vIqT35hFhTuFtvhEFY17VMBTJbKg8Y5JxCfLKDQqlALpqGs6BDeFv3bt2nm1sFGjRl59VKhs1qyZ3X///R7eSnIizY8//uhBUBXP7bbbLlq7Ve3atW3HHXe0e+65x8fthuWOO+7w9QCqNh28athMzZo17ZFHHsnRDlx22WVMnEGZKPHwqLGJJSFMIlAFUGPOSkJ8bKa6z4F0VMVTI6zKooYtfPLJJ/bss896cGvbtq1PoNGR/W677ebhTvuT7lMcX331lVcM5s+f78Ms1KWtMUypVcv999/fu7Y1HENDOpYsWWIvv/yyn1ootUoJoOoJE2X2228/77JWYSUsHTp08INOVSWZOIPSVOLhsV69en4qHg3oV5d1YSk0qgSv6qAmFZT2BBZVNtWFHboAw6LnR2ZSBe/MM8/0/feSSy6xc845x08OroMZHRwpwOmARpNhbrjhBh+vqO7r4tCYSY1V0qx/jXXUBB19EaTS5+vqq6/2sw/otelMARrqodeQGjQBVD1qJ+bNm2eHHHKIT+6L03evxmu/+eab9v3330drgZJX7eejEz880R9VMtQVV1yq1oRT9qSjHVzdbKoEBgqNCmzpbitIuK8qRUmrlOG8jgoD+qJOnYwTHlMBNt6VXhgal1IS/5+o2rSv6TOT15hgVG20EwAqMrVRYWJWUCrhEVvxpYAkCI+ZjXYCQEWWLjyW+oQZAPnT0IyCJpQBAFBREB4BAACQGOERAAAAiREeAQAAkBjhEQAAAIkRHgEAAJAY4REAAACJER4BAACQGOERAAAAiREeAQAAkBjhEQAAAInl+m1rAAAAIEj9betc4bFly5Z+A4pv/vz5/H8CyBftBICKTG1Uanik2xoAAACJER4BAACQGOERAAAAiREeAQAAkBjhEQAAAIkRHgEAAJAY4REAAACJER4BAACQGOERAAAAiREeAQAAkFi5hscPPvjAOnbsaCNHjozWVBwvvfSSvzb9BQAAwFZFDo8h+D399NN2zTXX+OV0i27bsGFDdK/SFQJf6tKrVy/r169frvUVMbQCAABUZEUKjwqD48aNszZt2tgRRxzh63R54sSJNn36dF90WeuSGDt2bK5g179/f1uxYkW0RW4LFy60s88+2+bNmxetMTvhhBP8ua+77joPi1oefPBBe/nll/05wmv7+9//bk2aNInulb8bb7wx12sry0CMik37QfzgKcm+Ee6jA7A47e/a78NjcXADQFLbGRVEPv/88+jW9NS+pGuPdD/dPzxWkjYLSFWk8Dh69Gh77bXXrE+fPla3bl1fN2vWLDv66KOzd0hd1rokFPJCsAvLo48+mv3Y6UydOtWaN2/uS2lSEE19bTfddJNlZWVFWyCT6bPQqFGj7H3joIMO8v0jv8Z4zpw5fp8OHTpEa7Z+OQwfPtw/U+GxhAAJZDa1DWpT4u3MwIED7YYbbsizwKL7TJgwwQss8e8qBccLL7zQ76vHmTx5sq9XOwYURqHDo45mVMU7+eSTbdq0aXbXXXf5+uJUHgtr1apV9tZbb3lArVGjRrT2lyMqVQv1GrWcc845BVYxgaLQ/vbpp59a3759ozVmhx12mFfFFRDz8u6771qXLl2ia1uF7bt37+5/pWfPnv5ZKqjCAKDq+uabb2z16tU52pm2bdvali1bbPny5dGanHQfSe1h+9///udtTDhwVbDUAe/ixYupPqJQCh0eP/nkEw+OXbt29erj7rvv7uuTVB5TxyQq2Em6buv8JqqEx00XTlu2bGnDhg3ziuHgwYPtsssui27Jnyo88edXAJV03dap3Y3ITGqId9hhhxxH9qqWH3DAAR4Q01EQXLt2re27777Rmq20vSoL8cdSw7/rrrv68wDITC1atLC77747R0+c2gR9F+m2dMaPH+8hMbWHTEO7Lrjgguja1gqlikDq8UjdFshPocPjqaeeaoMGDfIyt8Lbcccd5yX1UHFMXdJ18abrCg6LbsvPxo0bvaqpsZZ16tSJ1ub05ZdfWrNmzaJrW+mxQ/j73e9+l31klkpjJFNfU1jUvQ7EpQa+gqjRV3BMd5/SHoIBoHILBRgFPnVdp6NeNlUSVUjJi0KjxjoeeuihXnmMD6EBkijSmMe3337bq38KaA888EB2KMtrKclxW1988YXNnz/fOnXqFK3JSR+cDz/80OrVq+cVHo0ji4uHw/gRGFDatG+q0VfXNgAUVpgUqsCnIk664Vj6ftbt+c0Z0MGrCjsa86g2ibHVKKxCh0d1u8UH11588cXZYSy+hAqiwlpqSEvXFRyW0F2cjsZ4vPPOO7bnnnt6xScvp5xyipfz9bwFVTJTqSs93evSou51IK4wY4V00KP9Nq9GXQdGAFCQcACqNiVObZHGT2tMZBIKkeqyfv/995kXgEIpdHjUWIr99tsve7yhJsykC1ohBCqMhfGL4agpr0VHQeoG11ivdDv/kiVLbNKkSXbkkUfadtttF63NadmyZXbRRRfleh2pwuSaMH5RQTPdawpLmACkJb/uAGQO7aMayB4Pj2qA1RCnTojRNpr9qEkw6Wj71CCqoRVfffVV4i8CAFWPvj+Tnk5HwbF27dppx0Lq/nqc/OYTAEkVOjwqZMUnoWgmswKVAp/OnxjCVrzyqNAoCmoKdNqBdT8tCxYsyL6snVtHQfrSHDNmTK4Py4wZM6xWrVrZwTWd+vXrp30dqTRLLT7uMYwl0WQbhUq9Rn0Qw+VwhKbu+scffzy6FzKZGuhWrVrl2B/UZaThHKkTYvKa/RiE7RUwAx2oaZ/Ma1A8gKovnMEh3jbk1c6kO5NDEL7D1HMYzuCg71ids1nr8+vmBlIVacxjnHY4nTdKX475nXdK60eMGOFfnjr3lGakKoipUhhCmT4Q+jCo+qiZ3PHTnaxbt86rf926dctzoozo8TQhpqDKY1zoilcoVYhVZfWjjz6ymjVr+oy18Fr0IdY2+hCHDx8ymwatq2IY9jeNHwoHG3F5zX4MtF4HZWrIw2MJ43KBzKbvWPXwxduGdO2MvpPSnckhThNj9D0dviPDhJlQ4AGSKnZ4FO2Qmoms0KcxGOFci/EuXlVnFBD1ZatKSjg60pFSCGX6cOhISDuzQub69et9G1H4POaYYwrcyfOqPGq9HjOMadRfvV69PlU5FX4Vghs3buzPr+uaGatuRt1Pr00fVIVeINA+ET/bQLqzC2jf1WekoBmN+pLQyfHDYxEcAUhq25Cunfn66699Ek3q+lRqh8LjaCE4oiiqbdEslJ/pj45cGM9XchSk+f8EkB/aCQAVmdooFf2qVasWrSmhyiMAAAAyA+ERAAAAiREeAQAAkBjhEQAAAIkRHgEAAJAY4REAAACJER4BAACQGOERAAAAiREeAQAAkBjhEQAAAIkRHgEAAJBYrt+2BgAAAILU37bOFR6bNWvmN6D4Fi5cyP8ngHzRTgCoyNRGpYZHuq0BAACQGOERAAAAiREeAQAAkBjhEQAAAIkRHgEAAJAY4REAAACJER4BAACQGOERAAAAiREeAQAAkBjhEQAAAIlViJ8nXLFihV1++eXWvn17Gzx4cLR2q/vuu8+eeOIJu/fee/32yoSfHatclm5YamM/Hmtzls2xLT//K2nVfv63b/19rd/e/axBVoNoLTId7UTVVprtCm0KykKF/XnCyZMn29KlS61Hjx7RmoIpcA4cONA6d+5c4KLttD2QHzXws5fNLpXgKHpcPb6eB0BmKM12hTYF5aVcw+OGDRvs+uuvt1tuucXOOussXzdgwAAbPnx4dvBT1VHOO+88v96nTx9bsGCBr5Pu3bvbG2+8YVOmTLGrrrrK16lKqeuvvvqqtW7d2tcBBVFloCyUxvPMmDEj12cDQPkri3alJJ9DbUn4/tWi63EF3Y7MUO6VR5VCRZXHm2++2XbccUc76qijPPxpOeOMM/z2EAjHjRtnu+++u6+TCRMmWLdu3XwnVgiVEDRVyZw9e7avAwpSWhXHVCX9PAqM+nzEPxcAKoayaFdK6jkUBDVUTIUXfd8++eSTNnTo0OyAGNoarQ8FGm1PgMw85Roes7KyrF+/fh4QR40a5euuvfbaQo1tpPKIsjSk4xB7/NjHbUDrAdGarU5qdZI9cswjfpuW0UeNti67dIluTe7bb7+NLv0i3bpAwzF00HXaaaflGI8CoHJQO6H2YsThI3z8YpzamdCmaEm3TUHUw5c6bEvXtT7V1KlT7cQTT7S6dev6dR2QHn300bZo0SK/ru/U3r17Zx+oajtt/+KLL6Z9PFRdFWa2dePGjX2yjCbOqNtaXXCqHqZ2W6ubm50U5UGN/B477mFrflxj7Rq2y27E1cD33qO3fbz8Y+v7el9fNEi+V4tefntSatB18KQj+UCX9blI1x2tz8Fdd93ljXeHDh2itQAqk667dPW/O9TYwTo36eyXRQeqhzc73CYtnORtyv+993++/oSWJ/jfpCZOnOjDwkIbor+6/vDDD/v1OLU1PXv2jK5tbWO+++47v6z2SRXGpk2b+vWgTZs2PqEiv4NcVD3lGh61M2oyiwKidjwFRHUzr1mzJrssnrooPKpiGdBtjbKyT719/O/7i9+3mtVr2j719/EAqSC5aM0iGzZ9mN8uQ94d4kth6Ch+9OjRflmhMYTI1KEagRr/nXfeOUdjD6DyUPuxS+1d7LOVn9nidYutVd1Wvj4cqM5eOtsemv2Qr9O4xgsnXZijnUlC7cMdd9xhN910k/fS6a+up57ZJJ25c+fazJkzPSBKnTp1rF69en4Zma1cw2P4stQOre7n0AXdv39/74ZTAExdwhdquG88WKZ2W4dF24UyPFBUathVUZzyzRRbv2m97Vl3Tw+Qqhh8uuLTaKviC426jvjDRLJUqgDkdzuAik/thw5E562Y522ITrej4KgD1erbVPf1JUEHn9dcc43dc889XlxJMj5aFUqNd1RvSJLtkVnKvdtaYfDqq6+21atX+6LLkyZNsgYNGuQYz6hKpLq2A90vNVimVh7jSwidQFFoTGOjWo28gVcF4Ou1X3tlYNcddo22KDlhX+3YsaMNGzYs1zANXdcYo3jVXVV2jVfSQRf7OlA5HNjoQD8Qnbtsrs1dPtfXhW7skqQgqIpjGBZT0AQXbX/ppZf6wWl8DsKqVats+fLl0TVksnINj2E8RZMmTWyHHXbwRZd1svKCqDoTKouh4hinoBnv+k5SogfyoiqjKgEag6SB660btLas6llWu3pt27R5U3Z3U3Ho86BhGbvttlv22KN0AVLDNrRd2Le1aCB7p06dfJ9nXwcqPlUYVWmsl1XPrjzwShvUdpC3KerGVlsjaneKS0FRk+o0l0BB8Lbbbss3QMaDY3xIjHrvdP8weSaYNWuWn+Q+XtxB1Vfu4VE7YvPmzaM15pc1+Fan7klCHwJVHDVjO4TI22+/3dq1a+dVmIKOsICChHFJGtcYJsRo8PryDcu9y1rjlZr+qqkPcA+Gdhrq1crCWLlypU9+iTfYunzuuef6bQCqjtA1/cJnL2S3K5ocozbl+/Xf+xhIHaSGMzuoHRrWZZiHzsJQpXDkyJHZQ7fCkK908gqOgXo4XnjhBd9ONG9BvSBqt+JzEVD1lfuEGf0sYhiMK7169fIjJHVbx7vlFATjs7m082pGdvjpwni1JVRmFCjVhU03HopDsxvVoL+3+L1ozdbB6zOXzPTQuGT9Em/01dCHU2p4RWH7wg0sb9SoUdrTVGm9FgBVgwLgwY0P9oD43KfPRWvNx1Ov3rjaDm96uD029zGfMBN6O1SdrFW9lg+fKQx9h6YLdqltjb6PVaHU96wKMvFhX+EsJxr7qO/UMCdBYVLfvenaLVRtFeK3rbVTqmtOhgwZ4td1yh6dEkDXteOHIyKdc0o7bLqjo/Hjx/tOrzAZdubw2JoxphlmZTnwl9+srVzOfvPs6FLpG3PkmOgSMh3tRNVWVu0KbQpKS7rftq4Q4bGq4kuhciE8ojzQTlRthEdUdunCY7nPtgYqimo//ysLZfU8AMpfWXzeaVNQ1giPQCT8YkxpK6vnAVD+yuLzTpuCskZ4BCL99u5nreu3LrWjeD2uHl/PAyAzlGa7QpuC8sKYx1LEWCYABaGdAFCRMeYRAAAAxUJ4BAAAQGKERwAAACRGeAQAAEBihEcAAAAkliM8Vq9ePcdsGgAAAGQmZcJttsldZ8yxpkaNGrZ27droGgAAADKVMmFWVlZ07Rc5zvO4ceNGW7Zsmf3www+2efNm3wAAAACZRRXH7bff3urXr+/FxXjPdHZ4lBAgN23a5JcBAACQeRQWNZwxNTiamf0/jAgJ54jzAxkAAAAASUVORK5CYII=)
解説
kyopro_educational_90/002.jpg at main · E869120/kyopro_educational_90
全探索してから条件に合うパターンを抽出するとのこと。
001の羊羹問題が全探索でタイムアウトだったので最初から除外してたが、ありなのか…
そこらへんのさじ加減がまだ掴めてないなぁ
try(2nd.)
解説を踏まえて実装しなおしてみます。
from itertools import accumulate, product
from functools import reduce
def main(N):
if N % 2: return ""
return "\n".join([
reduce(lambda acc, v: acc+("(" if v == 1 else ")"), pat, "")
for pat in product((1, -1), repeat=N)
if sum(pat) == 0 and min(accumulate(pat)) > -1
])
まさかの2文(と言っていいのか?)で実装できてしまいました。
ちょっとコメントを加えると、
- 9行目 全てのパターンを列挙:「(」を1、「)」を-1とする
- 10行目 条件:「(」と「)」が同数、かつ左から足していって0より小さくならない
- 8行目 パターンからカッコ列を生成
って感じです。
test_all(main)
サンプルケースも大丈夫そうなので提出してみます。
結果(2nd.)
提出 #32359024 - 競プロ典型 90 問
無事ACとなったものの、今回は実行時間が486 msと、1回目(78 ms)の約6倍になってしまいました。
実装の方向性が大きく変わってくるだけに、与えられた制約下でどれだけ手を抜けるか見積もれるようになることも今後の課題です。
補足
今回の問題では「辞書順に出力」という条件が付いていましたが、2回目のスクリプトで該当する処理はproduct((1, -1), repeat=N)
です。
このパターンは辞書式順序を作り出し、入力のイテレート可能オブジェクトたちがソートされていれば、直積タプルもソートされた順に出てきます。
例
from pprint import *
pp(list(product((1, -1), repeat=4)))
このように、「(」を1、「)」を-1と見立てることで最初から辞書順のパターンを作ることができます。
まずreduceを知っていたほうが理解しやすいです。
そして一般的なreduce
の説明はJavaScriptのreduce(英ページが圧倒的に詳しい!)が分かりやすいです。
その上で、このaccumulate
はreduce
で引き回されるacc
の各時点での値を返します。
言葉では分かりづらいので以下例
例① デフォルトで加算
list(accumulate([1, 2, 3, 4, 5]))
例② 乗算
import operator
list(accumulate([1, 2, 3, 4, 5], operator.mul))
例③ 年利5%で1000万円借り入れ、毎年90万円返済する場合の残高
list(accumulate([1000, -90, -90, -90, -90], lambda bal, pmt: bal*1.05 + pmt))
例④ 先頭から走査してその時点での最大値
list(accumulate([3, 4, 6, 2, 1, 9, 0, 7, 5, 8], max))
自由欄