もっとプログラマ脳を鍛える数学パズル アルゴリズムが脳にしみ込む70問(増井 敏克)|翔泳社の本
  1. ホーム >
  2. 書籍 >
  3. もっとプログラマ脳を鍛える数学パズル アルゴリズムが脳にしみ込む70問

もっとプログラマ脳を鍛える数学パズル アルゴリズムが脳にしみ込む70問


形式:
書籍
発売日:
ISBN:
9784798153612
定価:
2,838(本体2,580円+税10%)
仕様:
A5・344ページ
カテゴリ:
プログラミング・開発
キーワード:
#プログラミング,#開発環境,#開発手法,#Web・アプリ開発
紙の書籍

全国のプログラマを悩ませたパズル集、待望の新作!
問題を解きながら、楽しくアルゴリズムを身につけよう

【本書の特徴】
・パズル問題をソースコードで解く
・楽しみながらプログラミングが上達
・4人のキャラクターによるやさしい解説
・アルゴリズムを深く理解できる
※初歩的なアルゴリズムの知識があることを前提としています

【本書で使用する言語】
Ruby/JavaScript
※すべての問題で、上記2つの言語の解答を掲載しています
※どの言語でも活用できるような解説の仕方をしていますが、上記のどちらかを習得していると、より理解しやすくなります

【内容紹介】
コンピュータを取り巻く環境は日々、大きく変化しています。

そんな時代の変化の中でも、変わらずに
重要とされているのが「アルゴリズム」です。

効率よく処理するプログラムを作成するには、
アルゴリズムを工夫することが求められています。

本書は、さまざまな数学パズルを解くことにより、
「よいアルゴリズム」を身につけることを目的としています。

一筆書きや組み合わせなどの定番問題から、
「サンタクロースが効率よく家を回るには?」
「カップルを隣同士に並ばせない席順は?」といったものまで、
楽しみながら思考が広がる問題を70問用意しました。

【目次(抜粋)】
★序章 パズル問題を解くコツ

★第1章 入門編 素直に実装して感覚をつかもう
Q01:一発で決まる多数決
Q02:山手線でスタンプラリー など

★第2章 初級編 メモ化などを使って処理時間を意識しよう
Q20:酔っ払いの帰り道
Q37:ダイヤルロックを解除せよ! など

★第3章 中級編 数学的な工夫を考えて処理を高速化しよう
Q40:沈みゆく島で出会う船
Q43:隣り合えないカップル など

★第4章 上級編 複雑な処理を正確に実装しよう
Q63:永遠に続くビリヤード
Q65:n-Queenで反転 など

【目次】
★第1章 入門編 素直に実装して感覚をつかもう
Q01:一発で決まる多数決
Q02:山手線でスタンプラリー
Q03:ローマ数字の変換規則
Q04:点灯している量で考えるデジタル時計
Q05:枚数で考えるパスカルの三角形
Q06:長方形から作る正方形
Q07:ファイルの順番を元どおりに戻したい!
Q08:セルの結合で一筆書き
Q09:ナルシシストな8進数
Q10:アダムズ方式で議席数を計算せよ!
Q11:オリンピックの開催都市投票
Q12:円周率に近似できる分数
Q13:並べ替えの繰り返し2
Q14:現地で使いやすい両替
Q15:幅優先の二分木を深さ優先探索
Q16:既約分数はいくつある?

★第2章 初級編 メモ化などを使って処理時間を意識しよう
Q17:グループで乗るリフト
Q18:非常階段での脱出パターン
Q19:バランスのよいカーテンフック
Q20:酔っ払いの帰り道
Q21:本の読み方は何通り?
Q22:百マス計算で最小のマスをたどると?
Q23:セミナーの座席を整列させろ
Q24:予約でいっぱいの指定席
Q25:左右対称の二分探索木
Q26:回数指定のじゃんけん
Q27:大家族でチョコレートを分けるには
Q28:パターゴルフのコース設計
Q29:公平に分けられたケーキ2
Q30:交互に取り合うカードゲーム
Q31:ソートされないカード
Q32:乗客のマナーがよすぎる満員電車
Q33:ホワイトデーのお返し
Q34:左右に行ったり来たり
Q35:かしこい幹事の集金術
Q36:上下反転した数字
Q37:ダイヤルロックを解除せよ!
Q38:全員が大きく移動する席替え

★第3章 中級編 数学的な工夫を考えて処理を高速化しよう
Q39:隣り合うと消えちゃうんです
Q40:沈みゆく島で出会う船
Q41:スタートメニューのタイル
Q42:大忙しのサンタクロース
Q43:隣り合えないカップル
Q44:3進法だとどうなる?
Q45:一筆書きの交点
Q46:一筆書きでクルクル
Q47:圧縮できるパターンは何通り?
Q48:均等に分配されるカード
Q49:番号の対応表で作るグループ
Q50:戦闘力で考えるモンスターの組み合わせ
Q51:連続する桁の数字で作る平方数
Q52:一列に並べたマトリョーシカ
Q53:重さが素数の荷物を運ぶエレベーター
Q54:素数で作る天秤ばかり
Q55:十文字に反転して色を揃えろ
Q56:回数指定のじゃんけん2
Q57:急行停車駅と特急停車駅のパターン
Q58:ポーランド記法と不要なカッコ
Q59:取られたら取り返す!
Q60:○×ゲームの結果画面は何通り?

★第4章 上級編 複雑な処理を正確に実装しよう
Q61:互い違いに並べ替え
Q62:壊れたピンチハンガー
Q63:永遠に続くビリヤード
Q64:最短距離で往復できる形は?
Q65:n-Queenで反転
Q66:整数倍の得票数
Q67:迷路の最長経路
Q68:Base64で反転
Q69:ファイル数が異なるフォルダ構成
Q70:他人と同じ商品は選ばない

付属データはこちら

会員特典はこちら

お問い合わせ

内容についてのお問い合わせは、正誤表、追加情報をご確認後に、お送りいただくようお願いいたします。

正誤表、追加情報に掲載されていない書籍内容へのお問い合わせや
その他書籍に関するお問い合わせは、書籍のお問い合わせフォームからお送りください。

利用許諾に関するお問い合わせ

本書の書影(表紙画像)をご利用になりたい場合は書影許諾申請フォームから申請をお願いいたします。
書影(表紙画像)以外のご利用については、こちらからお問い合わせください。

追加情報はありません。
この商品の「よくある質問」はありません。

ご購入いただいた書籍の種類を選択してください。

書籍の刷数を選択してください。

刷数は奥付(書籍の最終ページ)に記載されています。

現在表示されている正誤表の対象書籍

書籍の種類:

書籍の刷数:

本書に誤りまたは不十分な記述がありました。下記のとおり訂正し、お詫び申し上げます。

対象の書籍は正誤表がありません。

最終更新日:2024年10月04日
発生刷 ページ数 書籍改訂刷 電子書籍訂正 内容 登録日
1刷 018
pre2_1.rb(ソースコード)の3行目
r.upto(n) do |i|
(n - r + 1).upto(n) do |i|
2018.05.07
1刷 018
pre2_1.js(ソースコード)の3行目
for (var i = r; i <= n; i++){
for (var i = n - r + 1; i <= n; i++){
2018.05.07
1刷 079
q14_2.rb(ソースコード)の下から8行目以降
# 枚数を減らせるものは調整 0.upto(8) do | i | if (used[i] == 0) && (coins[i + 1] * used[i + 1] >= coins[i]) used[i] = 1 used[i + 1] -= coins[i] / coins[i + 1] end end
# 枚数を減らせるものは調整 0.upto(8) do | i | if (used[i] == 0) && (coins[i + 1] == 2000) # 2千円札の調整 if used[i + 1] == 3 # 2千円札が3枚(6千円)のとき used[i], used[i + 1] = 1, 0 # 5千円札を1枚、2千円を0枚に used[i + 2] += 1 # 千円札を1枚増やす elsif(used[i + 1] == 2) && (used[i + 2] >= 2) # 2千円札が2枚、千円札が2枚以上のとき used[i], used[i + 1] = 1, 0 # 5千円札を1枚、2千円札を0枚に used[i + 2] -= 1 # 千円札を1枚減らす end else if (used[i] == 0) && (coins[i + 1] * used[i + 1] >= coins[i]) used[i] = 1 used[i + 1] -= coins[i] / coins[i + 1] end end end
2021.06.24
1刷 080
q14_2.js(ソースコード)の下から8行目以降
// 枚数を減らせるものは調整 for (var i = 0; i < 9; i++){ if ((used[i] == 0) && (coins[i + 1] * used[i + 1] >= coins[i])){ used[i] = 1; used[i + 1] -= Math.floor(coins[i] / coins[i + 1]); } }
// 枚数を減らせるものは調整 for (var i = 0; i < 9; i++) { if ((used[i] == 0) && (coins[i + 1] == 2000)) { if (used[i + 1] == 3) { // 2千円札が3枚(6千円)のとき [used[i], used[i + 1]] = [1, 0]; // 5千円札を1枚、2千円を0枚に used[i + 2]++; // 千円札を1枚増やす } else if ((used[i + 1] == 2) && (used[i + 2] >= 2)) { // 2千円札が2枚、千円札が2枚以上のとき [used[i], used[i + 1]] = [1, 0]; // 5千円札を1枚、2千円札を0枚に used[i + 2]--; // 千円札を1枚減らす } } else { if ((used[i] == 0) && (coins[i + 1] * used[i + 1] >= coins[i])) { used[i] = 1; used[i + 1] -= Math.floor(coins[i] / coins[i + 1]); } } }
2021.06.24
1刷 160
q.33_1.rb(ソースコード)の上から4行目
0.upto(M) do |j|
0.upto(M - i) do |j|
2024.10.04
1刷 160
q.33_1.js(ソースコード)の上から5行目
for (var j = 0; j <= M; j++){
for (var j = 0; j <=M - i; j++){
2024.10.04
1刷 268
一番下のセンセイのセリフ
それに加えて(左のパターン数) ×(右のカッコの数)/2+(右のパターン数)×(左のカッコの数)/2です。
それに加えて(左のパターン数) ×(右のパターン数)/2+(右のパターン数)×(左のパターン数)/2です。
2018.12.25
1刷 321
表3 Base64 コード表
(画像クリックで拡大)
(画像クリックで拡大)
2024.08.26

感想・レビュー

ふじ さん

2018-09-03

だめ、無理、意味わかんない!(笑)数列的な数学の問題をコーディングで解くワーク。言語はRubyとJavaScript。

roughfractus02 さん

2018-03-29

前著では、ソースコードでパズルを解きながら見た目のいいコードの書き方がよい解答だと理解できたが、前著での体験から本書に取り組むと、よいアルゴリズムを書くという目標を常に意識する。使う言語(Ruby,JavaSprict)も前著と同じ、問題数(70問)とレベルも大差ないかに思えるが、アルゴリズムを短くシンプルに、と考えると解答の目標時間を超えることが多くなる(途中からは無視)。グラフ理論系のひと筆書き問題では掲載されたコードサンプル以上のシンプルさに適わないが、さらによい書き方を考えつつ解く意欲は養われる。