diff --git a/next.config.js b/next.config.js
index feeee196d..3cf000f7b 100644
--- a/next.config.js
+++ b/next.config.js
@@ -21,15 +21,13 @@ const config = {
},
env: {
productionLocale: process.env.PRODUCTION_LOCALE,
- productionContentVersion: process.env.PRODUCTION_CONTENT_VERSION,
isDevelopment: process.env.IS_DEVELOPMENT
},
// For locale, if running 2 servers (JP and EN) locally, if you use build-time config
// (env instead of publicRuntimeConfig) then the config overlaps in both servers.
// So must use publicRuntimeConfig instead.
publicRuntimeConfig: {
- devLocale: process.env.DEV_LOCALE,
- devContentVersion: process.env.DEV_CONTENT_VERSION
+ devLocale: process.env.DEV_LOCALE
},
exportPathMap(defaultPathMap, { dev, outDir }) {
if (!dev) {
diff --git a/package.json b/package.json
index ad1b22a0d..2939fe3ad 100644
--- a/package.json
+++ b/package.json
@@ -21,10 +21,9 @@
"scripts": {
"jp": "IS_DEVELOPMENT=true DEV_LOCALE=jp next -p 9991",
"en": "IS_DEVELOPMENT=true DEV_LOCALE=en next -p 9990",
- "jp:v2": "IS_DEVELOPMENT=true DEV_LOCALE=jp DEV_CONTENT_VERSION=v2 next -p 9992",
"jp:hide-cards": "DEV_LOCALE=jp next -p 9991",
"en:hide-cards": "DEV_LOCALE=en next -p 9990",
- "dev": "rm -f report.*.json && rm -f *.log && rm -rf .next && concurrently \"yarn jp\" \"yarn jp:v2\" \"yarn en\"",
+ "dev": "rm -f report.*.json && rm -f *.log && rm -rf .next && concurrently \"yarn jp\" \"yarn en\"",
"dev:hide-cards": "rm -rf .next && concurrently \"yarn jp:hide-cards\" \"yarn en:hide-cards\"",
"ts-node": "tsc --project tsconfig.scripts.json && node -r module-alias/register",
"sitemap": "yarn ts-node .tsbuild/scripts/generateSitemap.js",
diff --git a/scripts/lib/buildExpressionFromParams.ts b/scripts/lib/buildExpressionFromParams.ts
index d13e5111a..743619581 100644
--- a/scripts/lib/buildExpressionFromParams.ts
+++ b/scripts/lib/buildExpressionFromParams.ts
@@ -183,7 +183,7 @@ export default function buildExpressionFromParams(
} else if (isVariableShorthandNumberParams(expressionParams)) {
return {
...buildVariableExpression(
- expressionParams.someNumber ? 'someNumber' : 'shorthandNumber',
+ 'shorthandNumber',
true,
expressionParams.initialHighlight ? 'initialHighlighted' : 'default'
),
diff --git a/scripts/lib/initialExpressionContainers.ts b/scripts/lib/initialExpressionContainers.ts
index bcac538df..b12e08ab5 100644
--- a/scripts/lib/initialExpressionContainers.ts
+++ b/scripts/lib/initialExpressionContainers.ts
@@ -790,41 +790,6 @@ export const ynct = initializeExpressionContainer([
}
])
-export const heiy = initializeExpressionContainer([
- {
- magical: true,
- name: magicalVariableName
- },
- 'someNumber'
-])
-
-export const yrrr = initializeExpressionContainer([
- 'someNumber',
- {
- shorthandBinary: 'mult'
- },
- {
- someNumber: true,
- shorthandNumber: 1
- },
- {
- shorthandBinary: 'mult'
- },
- 'abbreviated',
- {
- shorthandBinary: 'mult'
- },
- {
- shorthandNumber: 2
- },
- {
- shorthandBinary: 'mult'
- },
- {
- shorthandNumber: 1
- }
-])
-
export const aizc = initializeExpressionContainer([
{
magical: true,
@@ -927,50 +892,6 @@ export const ipyc = initializeExpressionContainer([
}
])
-export const onbh = initializeExpressionContainer([
- {
- shorthandNumber: 3
- },
- [
- {
- shorthandBinary: 'mult'
- },
- [
- ['abbreviated', 'abbreviated'],
- {
- shorthandNumber: 2
- }
- ]
- ]
-])
-
-export const fzwa = initializeExpressionContainer([
- {
- shorthandNumber: 3
- },
- [
- {
- shorthandBinary: 'mult'
- },
- [
- {
- shorthandNumber: 2
- },
- [
- {
- shorthandBinary: 'mult'
- },
- [
- ['abbreviated', 'abbreviated'],
- {
- shorthandNumber: 1
- }
- ]
- ]
- ]
- ]
-])
-
export const pvph = initializeExpressionContainer([
[
yCombinator,
@@ -999,20 +920,6 @@ export const nxmy = initializeExpressionContainer([
}
])
-export const vgig = initializeExpressionContainer([
- [
- yCombinator,
- {
- arg: 's',
- body: updatedMagicalParams
- }
- ],
- {
- name: 'someNumber',
- highlighted: true
- }
-])
-
export const vfno = initializeExpressionContainer([
[
yCombinator,
@@ -1088,44 +995,6 @@ export const hctu = initializeExpressionContainer([
}
])
-export const imda = initializeExpressionContainer([
- [
- yCombinator,
- {
- arg: 's',
- body: updatedMagicalParamsForPower(true)
- }
- ],
- {
- name: 'someNumber',
- highlighted: true
- }
-])
-
-const updatedMagicalParamsCustomizable: FunctionExpressionParams = {
- arg: magicalVariableName,
- body: {
- checkType: 'isZero',
- condition: {
- shorthandUnary: 'pred',
- name: magicalVariableName
- },
- trueCase: 'question',
- falseCase: 'question'
- }
-}
-
-export const oesh = initializeExpressionContainer([
- [
- yCombinator,
- {
- arg: 's',
- body: updatedMagicalParamsCustomizable
- }
- ],
- 'someNumber'
-])
-
export const vazr = initializeExpressionContainer(yCombinator)
export const zjhi = initializeExpressionContainer({
@@ -1214,38 +1083,10 @@ export const fmlj = initializeDoneExpressionContainer({
shorthandNumber: 6
})
-export const zcxt = initializeExpressionContainer([
- {
- shorthandNumber: 2
- },
- [
- {
- shorthandBinary: 'remainder'
- },
- {
- shorthandNumber: 5
- }
- ]
-])
-
export const zrwn = initializeDoneExpressionContainer({
shorthandNumber: 1
})
-export const ltys = initializeExpressionContainer([
- {
- shorthandNumber: 4
- },
- [
- {
- shorthandBinary: 'remainder'
- },
- {
- shorthandNumber: 2019
- }
- ]
-])
-
export const pduk = initializeDoneExpressionContainer({
shorthandNumber: 0
})
@@ -1287,32 +1128,6 @@ export const pslb = initializeExpressionContainer({
}
})
-export const qbkn = initializeExpressionContainer([
- {
- shorthandNumber: 4
- },
- [
- {
- shorthandBinary: 'remainder'
- },
- 'blankNumber'
- ]
-])
-
-export const jnac = initializeExpressionContainer([
- {
- shorthandNumber: 4
- },
- [
- {
- shorthandBinary: 'remainder'
- },
- {
- shorthandNumber: 2020
- }
- ]
-])
-
export const sbvu = initializeDoneExpressionContainer({
shorthandNumber: 0
})
@@ -1334,55 +1149,6 @@ export const wkny = initializeDoneExpressionContainer({
shorthandNumber: 28
})
-export const wrps = initializeExpressionContainer({
- checkType: 'isZero',
- condition: [
- {
- shorthandNumber: 2
- },
- [
- {
- shorthandBinary: 'remainder'
- },
- {
- shorthandNumber: 5
- }
- ]
- ],
- trueCase: {
- shorthandNumber: 3
- },
- falseCase: {
- shorthandNumber: 4
- }
-})
-
-export const ised = initializeExpressionContainer({
- checkType: 'isZero',
- condition: [
- {
- shorthandNumber: 2,
- initialHighlight: true
- },
- [
- {
- shorthandBinary: 'remainder',
- initialHighlight: true
- },
- {
- shorthandNumber: 5,
- initialHighlight: true
- }
- ]
- ],
- trueCase: {
- shorthandNumber: 3
- },
- falseCase: {
- shorthandNumber: 4
- }
-})
-
export const urrw = initializeExpressionContainer({
checkType: 'isZero',
condition: {
@@ -1397,77 +1163,6 @@ export const urrw = initializeExpressionContainer({
}
})
-export const zhpt = initializeExpressionContainer({
- checkType: 'isZero',
- condition: [
- {
- shorthandNumber: 4
- },
- [
- {
- shorthandBinary: 'remainder'
- },
- 'blankNumber'
- ]
- ],
- trueCase: {
- shorthandNumber: 29
- },
- falseCase: {
- shorthandNumber: 28
- }
-})
-
-export const vtzk = initializeExpressionContainer({
- checkType: 'isZero',
- condition: [
- {
- shorthandNumber: 4
- },
- [
- {
- shorthandBinary: 'remainder'
- },
- {
- shorthandNumber: 2019,
- initialHighlight: true
- }
- ]
- ],
- trueCase: {
- shorthandNumber: 29
- },
- falseCase: {
- shorthandNumber: 28
- }
-})
-
-export const lmst = initializeExpressionContainer({
- checkType: 'isZero',
- condition: [
- {
- shorthandNumber: 4,
- initialHighlight: true
- },
- [
- {
- shorthandBinary: 'remainder',
- initialHighlight: true
- },
- {
- shorthandNumber: 2019,
- initialHighlight: true
- }
- ]
- ],
- trueCase: {
- shorthandNumber: 29
- },
- falseCase: {
- shorthandNumber: 28
- }
-})
-
export const gflf = initializeExpressionContainer({
checkType: 'isZero',
condition: {
@@ -1482,56 +1177,6 @@ export const gflf = initializeExpressionContainer({
}
})
-export const ybmb = initializeExpressionContainer({
- checkType: 'isZero',
- condition: [
- {
- shorthandNumber: 4
- },
- [
- {
- shorthandBinary: 'remainder'
- },
- {
- shorthandNumber: 2020,
- initialHighlight: true
- }
- ]
- ],
- trueCase: {
- shorthandNumber: 29
- },
- falseCase: {
- shorthandNumber: 28
- }
-})
-
-export const rtpi = initializeExpressionContainer({
- checkType: 'isZero',
- condition: [
- {
- shorthandNumber: 4,
- initialHighlight: true
- },
- [
- {
- shorthandBinary: 'remainder',
- initialHighlight: true
- },
- {
- shorthandNumber: 2020,
- initialHighlight: true
- }
- ]
- ],
- trueCase: {
- shorthandNumber: 29
- },
- falseCase: {
- shorthandNumber: 28
- }
-})
-
export const ilun = initializeExpressionContainer({
checkType: 'isZero',
condition: {
@@ -1546,56 +1191,6 @@ export const ilun = initializeExpressionContainer({
}
})
-export const qolg = initializeExpressionContainer({
- checkType: 'isZero',
- condition: [
- {
- shorthandNumber: 4
- },
- [
- {
- shorthandBinary: 'remainder'
- },
- {
- shorthandNumber: 2021,
- initialHighlight: true
- }
- ]
- ],
- trueCase: {
- shorthandNumber: 29
- },
- falseCase: {
- shorthandNumber: 28
- }
-})
-
-export const gxqm = initializeExpressionContainer({
- checkType: 'isZero',
- condition: [
- {
- shorthandNumber: 4,
- initialHighlight: true
- },
- [
- {
- shorthandBinary: 'remainder',
- initialHighlight: true
- },
- {
- name: 'blankNumber',
- highlighted: true
- }
- ]
- ],
- trueCase: {
- shorthandNumber: 29
- },
- falseCase: {
- shorthandNumber: 28
- }
-})
-
export const ygid = initializeExpressionContainer([
{
shorthandNumber: 3
diff --git a/src/components/ContentTags/Blockquote.tsx b/src/components/ContentTags/Blockquote.tsx
deleted file mode 100644
index cd17fc503..000000000
--- a/src/components/ContentTags/Blockquote.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import styled from '@emotion/styled'
-import { colors, spaces } from 'src/lib/theme'
-
-export const Blockquote = styled.blockquote`
- border-left: ${spaces(0.25)} solid ${colors('grey100')};
- padding-left: ${spaces(0.5)};
- padding-right: 0;
- margin: 0 0 ${spaces(1)};
- color: ${colors('grey700')};
-`
diff --git a/src/components/ContentTags/P.tsx b/src/components/ContentTags/P.tsx
index b95ee4a20..aafa2480f 100644
--- a/src/components/ContentTags/P.tsx
+++ b/src/components/ContentTags/P.tsx
@@ -1,14 +1,6 @@
import styled from '@emotion/styled'
-import { ns, spaces } from 'src/lib/theme'
+import { spaces } from 'src/lib/theme'
export const P = styled.p`
margin: 0 0 ${spaces(1)};
`
-
-export const PFullWidth = styled.p`
- margin: 0 ${spaces('-1')} ${spaces(1)};
-
- ${ns} {
- margin: 0 ${spaces('-2')} ${spaces(1)};
- }
-`
diff --git a/src/components/ContentTags/Table.tsx b/src/components/ContentTags/Table.tsx
deleted file mode 100644
index 23cc2cee6..000000000
--- a/src/components/ContentTags/Table.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import styled from '@emotion/styled'
-import { colors, spaces } from 'src/lib/theme'
-
-export const Table = styled.table`
- width: 100%;
- border: 2px solid ${colors('indigo300')};
- margin: 0 0 ${spaces(1)};
- border-collapse: collapse;
- table-layout: fixed;
-`
-
-export const Th = styled.th`
- padding: ${spaces(0.5)} ${spaces(0.5)};
- border: 2px solid ${colors('indigo300')};
- background: ${colors('indigo50')};
- text-align: center;
-`
-
-export const Td = styled.td`
- padding: ${spaces(0.5)} ${spaces(0.5)};
- border: 2px solid ${colors('indigo300')};
- text-align: center;
-`
diff --git a/src/components/ContentTags/index.tsx b/src/components/ContentTags/index.tsx
index 38a5f4492..f423c31c1 100644
--- a/src/components/ContentTags/index.tsx
+++ b/src/components/ContentTags/index.tsx
@@ -1,10 +1,8 @@
export { Ul, Ol, OlLi, UlLi } from 'src/components/ContentTags/List'
-export { P, PFullWidth } from 'src/components/ContentTags/P'
-export { Table, Th, Td } from 'src/components/ContentTags/Table'
+export { P } from 'src/components/ContentTags/P'
export { Hr } from 'src/components/ContentTags/Hr'
export { Strong, Em, InlineHeader } from 'src/components/ContentTags/Inline'
export { ExternalLink, InternalLink } from 'src/components/ContentTags/Links'
-export { Blockquote } from 'src/components/ContentTags/Blockquote'
export { H3 } from 'src/components/ContentTags/Headings'
export { Img } from 'src/components/ContentTags/Img'
export { LinkButton } from 'src/components/ContentTags/LinkButton'
diff --git a/src/components/EmojiForLetterWithTopRightBadgeWrapper.tsx b/src/components/EmojiForLetterWithTopRightBadgeWrapper.tsx
deleted file mode 100644
index 7d61b27b6..000000000
--- a/src/components/EmojiForLetterWithTopRightBadgeWrapper.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-/** @jsx jsx */
-import { css, jsx } from '@emotion/core'
-import { zIndices } from 'src/lib/theme'
-import TopRightBadge, { TopRightBadgeProps } from 'src/components/TopRightBadge'
-
-interface EmojiForLetterWithTopRightBadgeWrapperProps {
- topRightBadgeType: TopRightBadgeProps['topRightBadgeType']
- children: React.ReactNode
-}
-
-const EmojiForLetterWithTopRightBadgeWrapper = ({
- topRightBadgeType,
- children
-}: EmojiForLetterWithTopRightBadgeWrapperProps) => {
- return (
-
-
-
- ちなみに、ここで言う - ソフトウェア - とは、アプリ・ウェブサービス・ゲーム・AI・組み込みシステムやITシステム・仮想通貨など、「 - コンピュータプログラムによって機能するもの - 」の総称です。 -
-
- 身近なものでいえば、
-
+ こんにちは、上杉周作
+ と申します。米国在住のプログラマ兼ブロガーです。2019年に日経BP社から発売された『
+
+
『ファクトフルネス』>}
+ />
+
+ 本稿「{lessonTitle} + 」は、 + + プログラミング未経験者向けの、邪道なコンピュータサイエンスの入門書 + + です。どういう意味かは、すぐに説明しますね! +
++ ちなみに、本稿は最後まで無料 + で公開しており、スマホからもパソコンからも閲覧できます。 +
+
+ 本稿は、
+
+ 大半の方は、 + + 読了までに約2時間ほどかかる + + と思います。長いので、少しずつ読み進めてくださると嬉しいです。 +
+↓ クリックすると各章に飛べます。
++ 「前置きはいいから早く読みたい! + 」という方は、下のボタンを押して先に進んでください! +
++ 反対に「 + + 本稿についての説明を見てから読むかどうか決めたい! + + 」という方は、そのまま下に読み進めてみてください。 +
+ > + ) + }, + { + title: <>コンピュータサイエンスって何?>, + content: ( + <> ++ 本稿のタイトルは「 + {lessonTitle} + 」ですが、そもそもコンピュータサイエンスって何? + と思われる方は多いでしょう。そう思われる方向けに、コンピュータサイエンスの + 非常に単純化した定義を書いてみたいと思います。 +
+
+ わたしたちの身の回りは、パソコンやスマホといった「コンピュータ」と、そのコンピュータ上で動く「
+
+ アプリ・ウェブサービス・ゲーム・AI・組み込みシステムやITシステム・仮想通貨など、「
+ コンピュータプログラムによって機能するもの
+ 」はすべて、「
+ そして「 + コンピュータサイエンス」とは、 + + こういったソフトウェアを開発したり、またはソフトウェアを用いて情報を処理する際に + 根幹となる学問のことを指す + + のです。 +
++ コンピュータサイエンスという言葉をはじめて聞く方に、コンピュータサイエンスについて説明しようとすると、「 + それはプログラミングと何が違うの? + 」というご質問をよくいただきます。 +
++ 非常に単純化して言うと、「 + + コンピュータサイエンスは、プログラミングを支える + 『学問』 + + 」です。この『学問』の部分が重要なのですが、そう言ってもピンと来ないかもしれないので、例えを用いて説明します。非常に乱暴な例えなのですが、わかりやすさを優先しているのでご了承ください。 +
++ + コンピュータサイエンスは「医学」に、プログラミングは「治療」に例えることができます。 + + お医者さんは、患者を治療することができますが、その治療方法は「医学」に基づいていますよね。「こうすれば治る可能性が高い」と医学的に根拠があるからこそ、それに基づいた治療法を選ぶわけです。 +
++ それと同じで、プログラマも、プログラミングをすることでソフトウェアを作ることができます。そして + + プログラムを設計する際、医者にとっての医学のように、指針のひとつとなる + + のがコンピュータサイエンスという学問なのです。 +
++ 医学の知識が浅い人が医者になってしまうと、間違った治療を施してしまいますよね。それと同じで、 + + コンピュータサイエンスの知識が浅い人が高度なプログラミングを行った場合、非効率なプログラムを書いてしまいサーバー代がかさんだり、セキュリティーが脆弱なものになってしまう + + かもしれません。 +
++ そして、 + + 医学もコンピュータサイエンスも、日々研究が行われ、進歩しています。 + + 医学の進歩によって、どれほど優れた医者でも治療できなかった病気でも、治療が可能になったりしますよね。 +
++ 同じように、 + + コンピュータサイエンスの進歩によって、どれほど優れたプログラマでも作ることができなかったソフトウェアが作れるようになったりします。 + + 最近だと、人工知能分野の進歩が著しく、以前はどれほど優れたプログラマでも作ることができなかったようなAIアプリを、多くのプログラマが作れるようになりました。 +
++ また、「 + コンピュータサイエンスを学ぶメリットはあるの? + 」という質問も、医学に例えることで答えることができます。 +
++ 医学の話をすると、まず大前提として、 + ほとんどの人が医者になることはありえません。 + その一方で、 + + 簡単な医学の知識は誰にでも身につけることができるし、身につけておくべきです。 + + たとえば、「タバコは体に悪い」というのは、すべての人が知っておくべき超初歩的な医学的知識ですよね。 +
++ これと同じ話で、 + ほとんどの人がプログラマになることはありえません + 。その一方で、世の中はソフトウェア無しには回らなくなっており、この傾向は人工知能の発展とともに加速するでしょう。 +
++ だからこそ、 + + 多くの人が簡単なコンピュータサイエンスの知識を身につけるべき + + だと思うのです。たとえば最近だと、人工知能や仮想通貨がどういう仕組で動いているかなどは、基礎的なコンピュータサイエンスの知識があればすぐに理解できます。 +
++ まとめると、 + + コンピュータサイエンスを学ぶメリットは、簡単な医学の知識を学ぶメリットと似ている + + と言えるかもしれません。 +
+ > + ), + footer: { + content: ( + <> +
+
+ 最近はツールが発達してきているので、たとえば簡単なスマホアプリを作るだけならコンピュータサイエンスの知識は必要ありません。一方、たとえばGoogleのような企業で、検索エンジンの精度向上のように難しい課題を解決するには、コンピュータサイエンスの知識は必須です。 +
+ > + ) + } + }, + { + title: <>邪道なコンピュータサイエンスの入門書>, + content: ( + <> ++ 誰もがコンピュータサイエンスを学ぶべきというわけで、今回は + コンピュータサイエンスの入門書 + を書きました。ただ、本稿はよくある入門書とは違い、 + 邪道なコンピュータサイエンスの入門書 + です。 +
++ わたしはアメリカの大学でコンピュータサイエンスを学んだのですが、当時から教育者気質・作家気質だった筆者は、「 + いつかコンピュータサイエンスの入門書を書いてみたい + 」と考えていました。 +
++ ただ、もちろんコンピュータサイエンスの入門書なんて掃いて捨てるほどあるので、何らかの差別化をしないと書く意味がないと思っていました。そこで思いついたのが、「 + 正統派の入門書ではなく、邪道な入門書を書く + 」ということです。 +
+邪道とはどういうことかは、以下の2点にまとめることができます。
+それぞれどういうことか説明しますね!
+ > + ) + }, + { + title: <>邪道な理由1: プログラミングの必要なし>, + content: ( + <> ++ 本稿がコンピュータサイエンスの邪道な入門書である理由のひとつめは、 + プログラミングを必要としないからです。 +
++ ほとんどの正統派のコンピュータサイエンスの入門書は、「 + + プログラミングをしながら、コンピュータサイエンスを学ぶ + + 」という教え方をします。 +
++ たしかにそのほうが効率が良いのですが、 + + ほとんどの人はプログラミング未経験者ですし、将来プログラマになることもありません。 + + プログラミングをコンピュータサイエンスを学ぶ必須事項にしてしまうと、それだけで学ぶハードルを上げてしまいます。 +
++ 個人的には、 + + プログラマになる気がない、またはコンピュータサイエンスを専門として目指さないのであれば、 + + プログラミング抜きにコンピュータサイエンスだけを学ぶほうがいい + + + と考えています。 +
++ そのためにはどうすればいいかというと、 + + プログラミングの代わりに、プログラミングに似たパズルを使って学べばいい + + のです。 +
+
+ 本稿では、以下のようなパズルを解きながらコンピュータサイエンスの題材を学んでいきます。以下のパズルがどういう仕組みかは次のページで説明しますが、とりあえず
+
+
+ 上記のように、 + + 本稿で紹介するパズルはすべて、スマホからでもパソコンからでも行える + + ようになっています。将来的には、「スマホから、プログラミング無しにコンピュータサイエンスを学ぶ」ことが当たり前になればいいなと考えています。 +
++ 本稿がコンピュータサイエンスの邪道な入門書である理由のふたつめは、 + 内容が高度だからです。 +
++ ほとんどの正統派のコンピュータサイエンスの入門書は、 + 初歩的な内容 + から教えはじめます。それはそれで良いと思うのですが、本稿では逆に、みなさんに + 高度な内容 + を学んでもらいます。 +
++ 本稿は2時間程度 + で読み切れる長さを目標にしているのですが、そのくらいの文量だと、コンピュータサイエンスのすべてを語ることは到底できません。 + だから、 + + わたしはその限られた文量の中で、「 + 自分にもコンピュータサイエンスを学べるかも + 」と思うきっかけを読者に提供したい + + と考えています。 +
++ そのためには + + 初歩的な内容ではなく、ある程度高度な内容を教えるほうが良い + + と思っています。なぜなら、 + + もし高度な内容を理解することができれば、それより易しい他の分野も勉強すれば理解できるということ + + になり、「コンピュータサイエンスを学べるかも」という自信につながるからです。 +
++ もちろん、高度な内容を理解できなかったら本末転倒です。だから、できる限り分かりやすく説明するつもりです。また、高度な内容とはいえ、 + + 数学やプログラミングなどの事前知識は一切必要ありません + + ので、ご安心ください。 +
+ > + ) + }, + { + title: <>Yコンビネータ>, + content: ( + <> +
+ では、今回学ぶ高度な内容とは何かというと、タイトルにもある「
+ Yコンビネータ」です。
+
+ わたしの大学だと、Yコンビネータは + コンピュータサイエンス専攻の3年生 + が学ぶ、なかなか高度で、しかもマニアックな内容でした。実用的ではないので、知っていても業務に役立つことはありません。 +
++ なのに、なぜそんなマニアックな題材を選んだかというと、 + + Yコンビネータには、コンピュータサイエンスの面白さのエッセンスが詰まっている + + からです。これについては、最後まで読んでいただくと分かると思うので、ぜひ楽しみにしていてください。 +
+ > + ), + footer: { + content: ( + <> +
+
+ Yコンビネータは、シリコンバレーで最も有名なITベンチャー養成機関の名でもあります。
+
+ AirBnBをはじめとする超有名ITベンチャーを多数輩出しており、
+ 約2000の卒業企業のうち、トップ100社の企業価値を合計すると
+
+
+ では、なぜYコンビネータという名称がつけられたのでしょうか?
+
+ Yコンビネータ創業者のひとり、ポール・グレアム氏は
+
+ + + Yコンビネータとは、プログラミングのテクニックのひとつです。 + + {' '} + (中略) 個人的に、 + Yコンビネータがあまりにも興味深いテクニックだと思ったので、われわれのITベンチャー養成機関もそう名付けてしまったのです。しかし結果的には、 + われわれが投資する起業家を選別する + 際に、この名前が役立ちました。 +
++ + わたしたちは凄腕プログラマの起業家は招き入れたかったが、スーツ姿のビジネスパーソンは門前払いにしたかった。 + + 凄腕プログラマがわたしたちのことを聞いたら、こう思うでしょう。「Yコンビネータって名のITベンチャー養成機関だって?最高じゃん!きっと、面白い人たちが集まっているに違いない」と。いっぽう、スーツの人たちは、Yコンビネータと聞いても何のことやらさっぱり、となりますから。 +
+ > + ) + } + ]} + /> ++ つまり、彼らは凄腕プログラマの起業家に投資したかった。だから、「Yコンビネータ」という + 高度なコンピュータサイエンスの専門用語 + をITベンチャー養成機関の名前につけることで、凄腕プログラマを呼び寄せたのです。 +
+ ++ + しかし、本稿を読めば、プログラマではなくてもYコンビネータを理解できます + + 。ITベンチャー養成機関としての「Yコンビネータ」をご存知の方も、ぜひ読み進めてみてください! +
+ > + } + preview={{ + text: <>続きを読む>, + content: ( + <> +
+
+ 正統派のコンピュータサイエンスの入門書だったらお代を頂戴していたかもしれませんが、 + + 本稿は邪道な入門書なので、最初から最後まで無料で提供しています。 + +
++ だからというのも何ですが、 + 内容に期待しすぎないでください + 。そして繰り返しますが、本稿は + プログラミング未経験者向け + です。プログラマの方にとって有益な内容かどうかは、正直微妙かもしれません。 +
++ また、本稿は実用的な内容ではありません + 。最後まで読み終えても、日々の暮らしや、キャリアに役立つ気づきは得られないないでしょう。ただその代わりに、 + + もしかしたら読後に「コンピュータサイエンスを学んでみたい」という気持ちが芽生えるかもしれません。 + +
+ > + ), + footer: { + content: ( + <> +
+ プログラマ向けのYコンビネータについての説明で最もおすすめなのは、
+ 「
+
+
+
+ もしも「
+
+ とりあえず読んでみたい
- こんにちは、上杉周作
- と申します。米国在住のプログラマ兼ブロガーです。2019年に日経BP社から発売された『
-
-
『ファクトフルネス』>}
- />
-
- 本稿「{lessonTitle} - 」は、 - - プログラミング未経験者向けの、邪道なコンピュータサイエンスの入門書 - - です。どういう意味かは、すぐに説明しますね! -
-- ちなみに、本稿は最後まで無料 - で公開しており、スマホからもパソコンからも閲覧できます。 -
-
- 本稿は、
-
- 大半の方は、 - - 読了までに約2時間ほどかかる - - と思います。長いので、少しずつ読み進めてくださると嬉しいです。 -
-↓ クリックすると各章に飛べます。
-- 「前置きはいいから早く読みたい! - 」という方は、下のボタンを押して先に進んでください! -
-- 反対に「 - - 本稿についての説明を見てから読むかどうか決めたい! - - 」という方は、そのまま下に読み進めてみてください。 -
- > - ) - }, - { - title: <>コンピュータサイエンスって何?>, - content: ( - <> -- 本稿のタイトルは「 - {lessonTitle} - 」ですが、そもそもコンピュータサイエンスって何? - と思われる方は多いでしょう。そう思われる方向けに、コンピュータサイエンスの - 非常に単純化した定義を書いてみたいと思います。 -
-
- わたしたちの身の回りは、パソコンやスマホといった「コンピュータ」と、そのコンピュータ上で動く「
-
- アプリ・ウェブサービス・ゲーム・AI・組み込みシステムやITシステム・仮想通貨など、「
- コンピュータプログラムによって機能するもの
- 」はすべて、「
- そして「 - コンピュータサイエンス」とは、 - - こういったソフトウェアを開発したり、またはソフトウェアを用いて情報を処理する際に - 根幹となる学問のことを指す - - のです。 -
-- コンピュータサイエンスという言葉をはじめて聞く方に、コンピュータサイエンスについて説明しようとすると、「 - それはプログラミングと何が違うの? - 」というご質問をよくいただきます。 -
-- 非常に単純化して言うと、「 - - コンピュータサイエンスは、プログラミングを支える - 『学問』 - - 」です。この『学問』の部分が重要なのですが、そう言ってもピンと来ないかもしれないので、例えを用いて説明します。非常に乱暴な例えなのですが、わかりやすさを優先しているのでご了承ください。 -
-- - コンピュータサイエンスは「医学」に、プログラミングは「治療」に例えることができます。 - - お医者さんは、患者を治療することができますが、その治療方法は「医学」に基づいていますよね。「こうすれば治る可能性が高い」と医学的に根拠があるからこそ、それに基づいた治療法を選ぶわけです。 -
-- それと同じで、プログラマも、プログラミングをすることでソフトウェアを作ることができます。そして - - プログラムを設計する際、医者にとっての医学のように、指針のひとつとなる - - のがコンピュータサイエンスという学問なのです。 -
-- 医学の知識が浅い人が医者になってしまうと、間違った治療を施してしまいますよね。それと同じで、 - - コンピュータサイエンスの知識が浅い人が高度なプログラミングを行った場合、非効率なプログラムを書いてしまいサーバー代がかさんだり、セキュリティーが脆弱なものになってしまう - - かもしれません。 -
-- そして、 - - 医学もコンピュータサイエンスも、日々研究が行われ、進歩しています。 - - 医学の進歩によって、どれほど優れた医者でも治療できなかった病気でも、治療が可能になったりしますよね。 -
-- 同じように、 - - コンピュータサイエンスの進歩によって、どれほど優れたプログラマでも作ることができなかったソフトウェアが作れるようになったりします。 - - 最近だと、人工知能分野の進歩が著しく、以前はどれほど優れたプログラマでも作ることができなかったようなAIアプリを、多くのプログラマが作れるようになりました。 -
-- また、「 - コンピュータサイエンスを学ぶメリットはあるの? - 」という質問も、医学に例えることで答えることができます。 -
-- 医学の話をすると、まず大前提として、 - ほとんどの人が医者になることはありえません。 - その一方で、 - - 簡単な医学の知識は誰にでも身につけることができるし、身につけておくべきです。 - - たとえば、「タバコは体に悪い」というのは、すべての人が知っておくべき超初歩的な医学的知識ですよね。 -
-- これと同じ話で、 - ほとんどの人がプログラマになることはありえません - 。その一方で、世の中はソフトウェア無しには回らなくなっており、この傾向は人工知能の発展とともに加速するでしょう。 -
-- だからこそ、 - - 多くの人が簡単なコンピュータサイエンスの知識を身につけるべき - - だと思うのです。たとえば最近だと、人工知能や仮想通貨がどういう仕組で動いているかなどは、基礎的なコンピュータサイエンスの知識があればすぐに理解できます。 -
-- まとめると、 - - コンピュータサイエンスを学ぶメリットは、簡単な医学の知識を学ぶメリットと似ている - - と言えるかもしれません。 -
- > - ), - footer: { - content: ( - <> -
-
- 最近はツールが発達してきているので、たとえば簡単なスマホアプリを作るだけならコンピュータサイエンスの知識は必要ありません。一方、たとえばGoogleのような企業で、検索エンジンの精度向上のように難しい課題を解決するには、コンピュータサイエンスの知識は必須です。 -
- > - ) - } - }, - { - title: <>邪道なコンピュータサイエンスの入門書>, - content: ( - <> -- 誰もがコンピュータサイエンスを学ぶべきというわけで、今回は - コンピュータサイエンスの入門書 - を書きました。ただ、本稿はよくある入門書とは違い、 - 邪道なコンピュータサイエンスの入門書 - です。 -
-- わたしはアメリカの大学でコンピュータサイエンスを学んだのですが、当時から教育者気質・作家気質だった筆者は、「 - いつかコンピュータサイエンスの入門書を書いてみたい - 」と考えていました。 -
-- ただ、もちろんコンピュータサイエンスの入門書なんて掃いて捨てるほどあるので、何らかの差別化をしないと書く意味がないと思っていました。そこで思いついたのが、「 - 正統派の入門書ではなく、邪道な入門書を書く - 」ということです。 -
-邪道とはどういうことかは、以下の2点にまとめることができます。
-それぞれどういうことか説明しますね!
- > - ) - }, - { - title: <>邪道な理由1: プログラミングの必要なし>, - content: ( - <> -- 本稿がコンピュータサイエンスの邪道な入門書である理由のひとつめは、 - プログラミングを必要としないからです。 -
-- ほとんどの正統派のコンピュータサイエンスの入門書は、「 - - プログラミングをしながら、コンピュータサイエンスを学ぶ - - 」という教え方をします。 -
-- たしかにそのほうが効率が良いのですが、 - - ほとんどの人はプログラミング未経験者ですし、将来プログラマになることもありません。 - - プログラミングをコンピュータサイエンスを学ぶ必須事項にしてしまうと、それだけで学ぶハードルを上げてしまいます。 -
-- 個人的には、 - - プログラマになる気がない、またはコンピュータサイエンスを専門として目指さないのであれば、 - - プログラミング抜きにコンピュータサイエンスだけを学ぶほうがいい - - - と考えています。 -
-- そのためにはどうすればいいかというと、 - - プログラミングの代わりに、プログラミングに似たパズルを使って学べばいい - - のです。 -
-
- 本稿では、以下のようなパズルを解きながらコンピュータサイエンスの題材を学んでいきます。以下のパズルがどういう仕組みかは次のページで説明しますが、とりあえず
-
-
- 上記のように、 - - 本稿で紹介するパズルはすべて、スマホからでもパソコンからでも行える - - ようになっています。将来的には、「スマホから、プログラミング無しにコンピュータサイエンスを学ぶ」ことが当たり前になればいいなと考えています。 -
-- 本稿がコンピュータサイエンスの邪道な入門書である理由のふたつめは、 - 内容が高度だからです。 -
-- ほとんどの正統派のコンピュータサイエンスの入門書は、 - 初歩的な内容 - から教えはじめます。それはそれで良いと思うのですが、本稿では逆に、みなさんに - 高度な内容 - を学んでもらいます。 -
-- 本稿は2時間程度 - で読み切れる長さを目標にしているのですが、そのくらいの文量だと、コンピュータサイエンスのすべてを語ることは到底できません。 - だから、 - - わたしはその限られた文量の中で、「 - 自分にもコンピュータサイエンスを学べるかも - 」と思うきっかけを読者に提供したい - - と考えています。 -
-- そのためには - - 初歩的な内容ではなく、ある程度高度な内容を教えるほうが良い - - と思っています。なぜなら、 - - もし高度な内容を理解することができれば、それより易しい他の分野も勉強すれば理解できるということ - - になり、「コンピュータサイエンスを学べるかも」という自信につながるからです。 -
-- もちろん、高度な内容を理解できなかったら本末転倒です。だから、できる限り分かりやすく説明するつもりです。また、高度な内容とはいえ、 - - 数学やプログラミングなどの事前知識は一切必要ありません - - ので、ご安心ください。 -
- > - ) - }, - { - title: <>Yコンビネータ>, - content: ( - <> -
- では、今回学ぶ高度な内容とは何かというと、タイトルにもある「
- Yコンビネータ」です。
-
- わたしの大学だと、Yコンビネータは - コンピュータサイエンス専攻の3年生 - が学ぶ、なかなか高度で、しかもマニアックな内容でした。実用的ではないので、知っていても業務に役立つことはありません。 -
-- なのに、なぜそんなマニアックな題材を選んだかというと、 - - Yコンビネータには、コンピュータサイエンスの面白さのエッセンスが詰まっている - - からです。これについては、最後まで読んでいただくと分かると思うので、ぜひ楽しみにしていてください。 -
- > - ), - footer: { - content: ( - <> -
-
-
-
- では、なぜ
-
-
-
-
-
- わたしたちは凄腕プログラマの起業家は招き入れたかったが、スーツ姿のビジネスパーソンは門前払いにしたかった。
-
- 凄腕プログラマがわたしたちのことを聞いたら、こう思うでしょう。「
-
- つまり、彼らは凄腕プログラマの起業家に投資したかった。だから、「
-
-
- しかし、本稿を読めば、プログラマではなくても
-
-
- 正統派のコンピュータサイエンスの入門書だったらお代を頂戴していたかもしれませんが、 - - 本稿は邪道な入門書なので、最初から最後まで無料で提供しています。 - -
-- だからというのも何ですが、 - 内容に期待しすぎないでください - 。そして繰り返しますが、本稿は - プログラミング未経験者向け - です。プログラマの方にとって有益な内容かどうかは、正直微妙かもしれません。 -
-- また、本稿は実用的な内容ではありません - 。最後まで読み終えても、日々の暮らしや、キャリアに役立つ気づきは得られないないでしょう。ただその代わりに、 - - もしかしたら読後に「コンピュータサイエンスを学んでみたい」という気持ちが芽生えるかもしれません。 - -
- > - ), - footer: { - content: ( - <> -
- プログラマ向けのYコンビネータについての説明で最もおすすめなのは、
- 「
-
-
-
- もしも「
-
- とりあえず読んでみたい
+ 本稿はゆるい物語調
+ で話を進めていきます。ちなみに、この話はフィクションです。
+
+ まずは、この物語に登場する「 + 計算箱」の話をしましょう。 +
++ むかしむかし、「ラムダ村 + 」という小さな山奥の村があり、村人が仲良く暮らしていました。 +
+
+ ラムダ村には、代々伝わる「計算箱
+ 」という道具がありました。
この計算箱がどんなものか、説明しましょう!
+ > + ), + footer: { + content: ( + <> +
+
+ こちらをご覧ください。これが、ラムダ村の村人が使っていた「 + 計算箱」のひとつです。 +
+では次に、この計算箱はどのように使うかを説明しましょう!
+ > + ) + }, + { + title: ( + <> +
+ それぞれの計算箱には
+
+
+
+ 結果は
+ 他の計算箱も見てみましょう!たとえばこちらをご覧になり、
+
+
+ こちらは
ここまでをまとめると、下の計算箱のように、
+ということです。
+
+ これが、計算箱に備わっている機能のひとつ、「
+ 1を足す機能
+ 」です。この機能を使えば、
+
+ 何らかの数字に
+ 計算箱は「1を足す」だけではなく、「1を引く
+ 」計算をすることもできます。こちらの計算箱を
+
+ 結果は
+ このように、
+
+ 何らかの数字
+ これが、計算箱に備わっているふたつめの機能、「
+ 1を引く機能
+ 」です。この機能を使えば、何らかの数字から{' '}
+
+ ここが重要なポイントなのですが、計算に使うことができるのは{' '}
+
+
+ それでは質問です。
+ 正解を教えましょう。
+
+ こちらに
+ 結果は
+ ちなみに、
+
+
+ たとえば、下の計算箱は、
+
+
+ 一方、下の計算箱は、
+
+
+ つまり、
+
+ たとえば、
+
+ 答えを言うと、
+
+
+ このようにすれば、 + 計算箱はどんな大きな数字の足し算でも引き算でもできます。 +
+ > + ) + }, + { + title: <>ラムダ村の村人は計算がとても苦手>, + content: ( + <> ++ まとめると、計算箱は足し算や引き算を行ってくれる魔法の道具というわけです。 +
+
+ そして、ラムダ村の村人は計算がとても苦手でした。
+ だから、たとえば「
+
+
+ しかし、計算が大の苦手だった村人たちにとって、足し算や引き算ができるだけでも大いにありがたいことでした。 +
+ > + ) + } + }, + { + title: <>3つめの計算箱の機能>, + content: ( + <> +
+
+ 実は計算箱には、今回紹介した「
+
次のページでは、計算箱の3つめの機能について紹介していきます!
+
-
- まずは、この物語に登場する「 - 計算箱」の話をしましょう。 -
-- むかしむかし、「ラムダ村 - 」という小さな山奥の村があり、村人が仲良く暮らしていました。 -
-
- ラムダ村には、代々伝わる「計算箱
- 」という道具がありました。
この計算箱がどんなものか、説明しましょう!
- > - ), - footer: { - content: ( - <> -
-
- こちらをご覧ください。これが、ラムダ村の村人が使っていた「 - 計算箱」のひとつです。 -
-では次に、この計算箱はどのように使うかを説明しましょう!
- > - ) - }, - { - title: ( - <> -
- それぞれの計算箱には
-
-
-
- 結果は
- 他の計算箱も見てみましょう!たとえばこちらをご覧になり、
-
-
- こちらは
ここまでをまとめると、下の計算箱のように、
-ということです。
-
- これが、計算箱に備わっている機能のひとつ、「
- 1を足す機能
- 」です。この機能を使えば、
-
- 何らかの数字に
- 計算箱は「1を足す」だけではなく、「1を引く
- 」計算をすることもできます。こちらの計算箱を
-
- 結果は
- このように、
-
- 何らかの数字
- これが、計算箱に備わっているふたつめの機能、「
- 1を引く機能
- 」です。この機能を使えば、何らかの数字から{' '}
-
- ここが重要なポイントなのですが、計算に使うことができるのは{' '}
-
-
- それでは質問です。
- 正解を教えましょう。
-
- こちらに
- 結果は
- ちなみに、
-
-
- たとえば、下の計算箱は、
-
-
- 一方、下の計算箱は、
-
-
- つまり、
-
- たとえば、
-
- 答えを言うと、
-
-
- このようにすれば、 - 計算箱はどんな大きな数字の足し算でも引き算でもできます。 -
- > - ) - }, - { - title: <>ラムダ村の村人は計算がとても苦手>, - content: ( - <> -- まとめると、計算箱は足し算や引き算を行ってくれる魔法の道具というわけです。 -
-
- そして、ラムダ村の村人は計算がとても苦手でした。
- だから、たとえば「
-
-
- しかし、計算が大の苦手だった村人たちにとって、足し算や引き算ができるだけでも大いにありがたいことでした。 -
- > - ) - } - }, - { - title: <>3つめの計算箱の機能>, - content: ( - <> -
-
- 実は計算箱には、今回紹介した「
-
次のページでは、計算箱の3つめの機能について紹介していきます!
-では、計算箱を返してやろう!
+ > + ) + } + ]} + /> +あれ…これだけか?
+ > + ) + }, + { + type: 'thinking', + children: ( + <> +
+ これは「1を足す機能{' '}
+
+ 「1を引く機能{' '}
+
+ それらは、まだ返すわけにはいかないな。 +
+
+
+ いまお前たちに返せるのは、「
+ 1を足す機能{' '}
+
な、なんだってー!
+ > + ) + }, + { + type: 'crying', + children: ( + <> ++ 話が違うじゃないか!さっきの問題を解いたら、計算箱を返してくれると言っただろう? +
+ > + ) + }, + { + type: 'devil', + children: ( + <> ++ 計算箱を返すとは言ったが… + + 計算箱のすべての機能を返すとは言っていないからな! + +
+ > + ) + }, + { + type: 'sad', + children: ( + <> +そ、そんなー!嘘つきじゃないか!
+ > + ) + }, + { + type: 'devil', + children: ( + <> +まあ、わたしは悪魔だからな。
+ > + ) + } + ]} + /> + > + ) + }, + { + title: <>どうすればいい?>, + content: ( + <> ++ じゃあ、どうしたらすべての機能を返してもらえるんだ? +
+ > + ) + }, + { + type: 'devil', + children: ( + <> +
+ そうだな…先ほどの問題ではお前たちに、
+
+ 計算箱の「
+ 1を足す機能{' '}
+
+ だから、
+
+ 「1を引く機能{' '}
+
えー!
+
+ 「1を足す機能{' '}
+
だったら、それらは諦めることだな。
+ > + ) + }, + { + type: 'sad', + children: ( + <> ++ で、でも… + + それじゃ + 引き算や、大きな数の足し算・引き算 + ができないよ! + + 俺らは計算箱がないと何もできないんだ! +
+ > + ) + }, + { + type: 'crying', + children: ( + <> +頑張って弁当箱で再現するしかないのか…
+ > + ) + } + ]} + /> + > + ) + }, + { + title: ( + <> ++ もちろん、ヒント無しでやれとは言わん。前回同様、ヒントを出してやろうじゃないか。 +
+ミニオン、ヒントを説明したまえ!
+ > + ) + }, + { + type: 'dog', + children: ( + <> +わかりました。こちらの弁当箱をご覧ください。
+
+ 前回と同じく、
+
+ それぞれの
なんか、めちゃくちゃ複雑な弁当箱だな…
+ > + ) + }, + { + type: 'dog', + children: ( + <> +
+ そして、
+
+ それぞれの
+ 上の
+
+
+ 結果は
+ つまり、計算箱の「1を引く機能{' '}
+
+ しかし…こんな複雑な弁当箱の{' '}
+
+ 村人たちが困っていると、またサヤちゃんが何かひらめいたようです。 +
+ねえねえ、サヤも試しにやってみたんだけど…
+ > + ) + }, + { + type: 'roll', + children: ( + <> +え…サヤちゃん、まさか答えが分かったというのかい?
+ > + ) + }, + { + type: 'saya', + children: ( + <> +とりあえずこれを見てみて!
+ > + ) + } + ]} + /> ++ ふむふむ…まさか今回も一発で正解なんてことはありえないと思うけど、とりあえず試してみるか。 +
+
+ 前回もやったように、
+
+
+ 今回は
+
+ つまり、
+
+ じゃあ、
+
+ それでは、
+ 途中まで早送りしてみますね。
+
複雑すぎて、目で追うのがしんどい…
+ > + ) + }, + { + type: 'dog', + children: ( + <> ++ すべてを目で追う必要はないですよ! + なんとなく、「へー、こんなふうに進んでいくんだ」と思っていただければ大丈夫です。 +
+
+ また、「
+
+
+ それより見てみて!
+
+ 途中で{' '}
+
+ 前回と同じように
+
+ 特別ルールで、
+
+ そうですね!結果が狂わないように、
+
+ では、最後まで
+
+ 最終的に残った以下の弁当箱は、
+
ということは、サヤちゃんの弁当箱は…
+
+
+
+ つまり、
+
やったー!
+ > + ) + }, + { + type: 'surprised', + children: ( + <> +す、すごい…!
+ > + ) + } + ]} + /> + > + ) + }, + { + title: ( + <> +
+ ぐぬぬ…しかし、
+
+ たとえば、
+
+
+ じゃあ、
+
+
+ 合体したものを
+
+ まずは実行してみるね。
+
+ 最終的に残った以下の弁当箱は、
+
+ つまり、
+
わーい、わーい!
+ > + ) + }, + { + type: 'devil', + children: ( + <> +ぐぬぬ…
+ > + ) + } + ]} + /> + > + ) + }, + { + title: ( + <> +
+ まさか、こうも簡単に正解されるとは思わなかったが…
+
+ サヤちゃんが考えた弁当箱は、
+
+ ちなみに、サヤちゃんが考えた弁当箱以外にも、
+
+ 以下の法則に当てはまる弁当箱であれば、 どれでも
+
+ たしかにサヤちゃんの弁当箱は、上の法則に当てはまっている… +
++ よくこんなの分かったなあ。サヤちゃんは天才なのかもしれない! +
+ > + ) + }, + { + type: 'saya', + children: ( + <> +
+ そんなことないよ!でも、これで「
+ 1を引く機能{' '}
+
+ 今回学んだことを一言でまとめると、
+
+ 計算箱の「1を引く機能
+ たとえば、以下のような
+ これを弁当箱で再現するには、
+
+
+ 上の
+
+ まとめると、
+
+ 計算箱の「1を引く機能{' '}
+
+ どうだ、「1を引く機能{' '}
+
+ 約束通り、「1を引く機能{' '}
+
ぐぬぬ…では、返してやろう!
+ > + ) + }, + { + type: 'celebrate', + children: ( + <> +やったー!
+ > + ) + } + ]} + /> +
+ しかし、
+
+ 「繰り返しの機能
+ 難しそう…しかし、こっちには
+ ちなみに、中級編はここまでだ。 + 決着は、次からはじまる上級編でつけよう! +
+ > + ) + }, + { + type: 'brave', + children: ( + <> +よーし、望むところだ!上級編へ進もう!
+ > + ) + } + ]} + /> +では、計算箱を返してやろう!
- > - ) - } - ]} - /> -あれ…これだけか?
- > - ) - }, - { - type: 'thinking', - children: ( - <> -
- これは「1を足す機能{' '}
-
- 「1を引く機能{' '}
-
- それらは、まだ返すわけにはいかないな。 -
-
-
- いまお前たちに返せるのは、「
- 1を足す機能{' '}
-
な、なんだってー!
- > - ) - }, - { - type: 'crying', - children: ( - <> -- 話が違うじゃないか!さっきの問題を解いたら、計算箱を返してくれると言っただろう? -
- > - ) - }, - { - type: 'devil', - children: ( - <> -- 計算箱を返すとは言ったが… - - 計算箱のすべての機能を返すとは言っていないからな! - -
- > - ) - }, - { - type: 'sad', - children: ( - <> -そ、そんなー!嘘つきじゃないか!
- > - ) - }, - { - type: 'devil', - children: ( - <> -まあ、わたしは悪魔だからな。
- > - ) - } - ]} - /> - > - ) - }, - { - title: <>どうすればいい?>, - content: ( - <> -- じゃあ、どうしたらすべての機能を返してもらえるんだ? -
- > - ) - }, - { - type: 'devil', - children: ( - <> -
- そうだな…先ほどの問題ではお前たちに、
-
- 計算箱の「
- 1を足す機能{' '}
-
- だから、
-
- 「1を引く機能{' '}
-
えー!
-
- 「1を足す機能{' '}
-
だったら、それらは諦めることだな。
- > - ) - }, - { - type: 'sad', - children: ( - <> -- で、でも… - - それじゃ - 引き算や、大きな数の足し算・引き算 - ができないよ! - - 俺らは計算箱がないと何もできないんだ! -
- > - ) - }, - { - type: 'crying', - children: ( - <> -頑張って弁当箱で再現するしかないのか…
- > - ) - } - ]} - /> - > - ) - }, - { - title: ( - <> -- もちろん、ヒント無しでやれとは言わん。前回同様、ヒントを出してやろうじゃないか。 -
-ミニオン、ヒントを説明したまえ!
- > - ) - }, - { - type: 'dog', - children: ( - <> -わかりました。こちらの弁当箱をご覧ください。
-
- 前回と同じく、
-
- それぞれの
なんか、めちゃくちゃ複雑な弁当箱だな…
- > - ) - }, - { - type: 'dog', - children: ( - <> -
- そして、
-
- それぞれの
- 上の
-
-
- 結果は
- つまり、計算箱の「1を引く機能{' '}
-
- しかし…こんな複雑な弁当箱の{' '}
-
- 村人たちが困っていると、またサヤちゃんが何かひらめいたようです。 -
-ねえねえ、サヤも試しにやってみたんだけど…
- > - ) - }, - { - type: 'roll', - children: ( - <> -え…サヤちゃん、まさか答えが分かったというのかい?
- > - ) - }, - { - type: 'saya', - children: ( - <> -とりあえずこれを見てみて!
- > - ) - } - ]} - /> -- ふむふむ…まさか今回も一発で正解なんてことはありえないと思うけど、とりあえず試してみるか。 -
-
- 前回もやったように、
-
-
- 今回は
-
- つまり、
-
- じゃあ、
-
- それでは、
- 途中まで早送りしてみますね。
-
複雑すぎて、目で追うのがしんどい…
- > - ) - }, - { - type: 'dog', - children: ( - <> -- すべてを目で追う必要はないですよ! - なんとなく、「へー、こんなふうに進んでいくんだ」と思っていただければ大丈夫です。 -
-
- また、「
-
-
- それより見てみて!
-
- 途中で{' '}
-
- 前回と同じように
-
- 特別ルールで、
-
- そうですね!結果が狂わないように、
-
- では、最後まで
-
- 最終的に残った以下の弁当箱は、
-
ということは、サヤちゃんの弁当箱は…
-
-
-
- つまり、
-
やったー!
- > - ) - }, - { - type: 'surprised', - children: ( - <> -す、すごい…!
- > - ) - } - ]} - /> - > - ) - }, - { - title: ( - <> -
- ぐぬぬ…しかし、
-
- たとえば、
-
-
- じゃあ、
-
-
- 合体したものを
-
- まずは実行してみるね。
-
- 最終的に残った以下の弁当箱は、
-
- つまり、
-
わーい、わーい!
- > - ) - }, - { - type: 'devil', - children: ( - <> -ぐぬぬ…
- > - ) - } - ]} - /> - > - ) - }, - { - title: ( - <> -
- まさか、こうも簡単に正解されるとは思わなかったが…
-
- サヤちゃんが考えた弁当箱は、
-
- ちなみに、サヤちゃんが考えた弁当箱以外にも、
-
- 以下の法則に当てはまる弁当箱であれば、 どれでも
-
- たしかにサヤちゃんの弁当箱は、上の法則に当てはまっている… -
-- よくこんなの分かったなあ。サヤちゃんは天才なのかもしれない! -
- > - ) - }, - { - type: 'saya', - children: ( - <> -
- そんなことないよ!でも、これで「
- 1を引く機能{' '}
-
- 今回学んだことを一言でまとめると、
-
- 計算箱の「1を引く機能
- たとえば、以下のような
- これを弁当箱で再現するには、
-
-
- 上の
-
- まとめると、
-
- 計算箱の「1を引く機能{' '}
-
- どうだ、「1を引く機能{' '}
-
- 約束通り、「1を引く機能{' '}
-
ぐぬぬ…では、返してやろう!
- > - ) - }, - { - type: 'celebrate', - children: ( - <> -やったー!
- > - ) - } - ]} - /> -
- しかし、
-
- 「繰り返しの機能
- 難しそう…しかし、こっちには
- ちなみに、中級編はここまでだ。 - 決着は、次からはじまる上級編でつけよう! -
- > - ) - }, - { - type: 'brave', - children: ( - <> -よーし、望むところだ!上級編へ進もう!
- > - ) - } - ]} - /> -
+ 中級編では、ラムダ村の村人たちは計算箱の「
+ 1を足す機能
+ 一方、「繰り返しの機能
+ 「繰り返しの機能
+ まず、こちらの計算箱をご覧になり、
+
+ こちらも復習になりますが、ラムダ村の村人たちにとって、計算箱の「
+ 繰り返しの機能
+ たとえば、
+
+
+ しかし、
+
+ 一方、繰り返しの機能を使えば、
+
+ ラムダ村の村人たちは、計算箱の「繰り返しの機能{' '}
+
+ うーん、
+
+ どんなに考えても、計算箱の「
+ 繰り返しの機能
サヤちゃん、何か思いついた?
+ > + ) + }, + { + type: 'saya', + children: ( + <> +サヤも、さっぱり分からないなあ…
+ > + ) + }, + { + type: 'crying', + children: ( + <> +サヤちゃんでも分からないなんて…もうお手上げだ!
+ > + ) + } + ]} + /> +
+ すると、悩んでいる村人たちのもとに、悪魔の助手の
+ みなさん、なかなかお困りのようですね。よければ、 + ヒントを出しましょうか? +
+ > + ) + }, + { + type: 'crying', + children: ( + <> +おお、ミニオン!お願いだ、ヒントを教えてくれ!
+ > + ) + }, + { + type: 'dog', + children: ( + <> +
+ 分かりました、ではまず、計算箱の「
+ 条件分岐の機能
+ 「条件分岐の機能
まず、こちらの計算箱をご覧ください。
+ > + ) + } + ]} + /> +なんだこれは?
+
+
+ それぞれの
+ 具体例で説明したほうが分かりやすいと思うので、
+
+
+ 分かった。とりあえず、{' '}
+
+ 上から順に
+ これで、
+
+
では、どうしてこうなったか説明しますね!
+ > + ) + } + ]} + /> + > + ) + }, + { + title: ( + <> + 真ん中が
+ 「条件分岐の機能
+
+ そうですね。このように真ん中が{' '}
+
+ なるほど、だから
+ では、もうひとつ例を紹介します。こちらは、
+
+
+
どうしてこうなったか説明しましょう。
+
+ こちらも、真ん中の数字が
+ 今回は真ん中が
なるほど…
+ > + ) + } + ]} + /> + > + ) + }, + { + type: 'summary', + title: ( + <> +
+ まとめると、この「
+ 条件分岐の機能
+
+ まず、
+
+ なるほど、「
+
+ 真ん中が
+ この「
+ 条件分岐の機能
+ へー、そんなこと、ラムダ村の俺らは誰も知らなかったぞ! +
+ > + ) + }, + { + type: 'dog', + children: ( + <> +
+ そうなんです。「
+ 条件分岐の機能
+ たしかに、「
+
+ 真ん中が
+ しかし、この「
+ 条件分岐の機能
え、そうなの?
+ > + ) + }, + { + type: 'dog', + children: ( + <> +
+ はい。ここが重要なのですが…村人のみなさんは「
+ 繰り返しの機能
うん、どうしていいか全然分からない…
+ > + ) + }, + { + type: 'dog', + children: ( + <> +
+ 実は、「繰り返しの機能{' '}
+
なんと!
+ > + ) + }, + { + type: 'dog', + children: ( + <> +
+ だからまずは、「条件分岐の機能{' '}
+
+ これが解ければ、「繰り返しの機能{' '}
+
そうか。よーし、やってみよう!
+ > + ) + } + ]} + /> +
+ というわけで、次のページでは、「条件分岐の機能{' '}
+
- 中級編では、ラムダ村の村人たちは計算箱の「
- 1を足す機能
- 一方、「繰り返しの機能
- 「繰り返しの機能
- まず、こちらの計算箱をご覧になり、
-
- こちらも復習になりますが、ラムダ村の村人たちにとって、計算箱の「
- 繰り返しの機能
- たとえば、
-
-
- しかし、
-
- 一方、繰り返しの機能を使えば、
-
- ラムダ村の村人たちは、計算箱の「繰り返しの機能{' '}
-
- うーん、
-
- どんなに考えても、計算箱の「
- 繰り返しの機能
サヤちゃん、何か思いついた?
- > - ) - }, - { - type: 'saya', - children: ( - <> -サヤも、さっぱり分からないなあ…
- > - ) - }, - { - type: 'crying', - children: ( - <> -サヤちゃんでも分からないなんて…もうお手上げだ!
- > - ) - } - ]} - /> -
- すると、悩んでいる村人たちのもとに、悪魔の助手の
- みなさん、なかなかお困りのようですね。よければ、 - ヒントを出しましょうか? -
- > - ) - }, - { - type: 'crying', - children: ( - <> -おお、ミニオン!お願いだ、ヒントを教えてくれ!
- > - ) - }, - { - type: 'dog', - children: ( - <> -
- 分かりました、ではまず、計算箱の「
- 条件分岐の機能
- 「条件分岐の機能
まず、こちらの計算箱をご覧ください。
- > - ) - } - ]} - /> -なんだこれは?
-
-
- それぞれの
- 具体例で説明したほうが分かりやすいと思うので、
-
-
- 分かった。とりあえず、{' '}
-
- 上から順に
- これで、
-
-
では、どうしてこうなったか説明しますね!
- > - ) - } - ]} - /> - > - ) - }, - { - title: ( - <> - 真ん中が
- 「条件分岐の機能
-
- そうですね。このように真ん中が{' '}
-
- なるほど、だから
- では、もうひとつ例を紹介します。こちらは、
-
-
-
どうしてこうなったか説明しましょう。
-
- こちらも、真ん中の数字が
- 今回は真ん中が
なるほど…
- > - ) - } - ]} - /> - > - ) - }, - { - type: 'summary', - title: ( - <> -
- まとめると、この「
- 条件分岐の機能
-
- まず、
-
- なるほど、「
-
- 真ん中が
- この「
- 条件分岐の機能
- へー、そんなこと、ラムダ村の俺らは誰も知らなかったぞ! -
- > - ) - }, - { - type: 'dog', - children: ( - <> -
- そうなんです。「
- 条件分岐の機能
- たしかに、「
-
- 真ん中が
- しかし、この「
- 条件分岐の機能
え、そうなの?
- > - ) - }, - { - type: 'dog', - children: ( - <> -
- はい。ここが重要なのですが…村人のみなさんは「
- 繰り返しの機能
うん、どうしていいか全然分からない…
- > - ) - }, - { - type: 'dog', - children: ( - <> -
- 実は、「繰り返しの機能{' '}
-
なんと!
- > - ) - }, - { - type: 'dog', - children: ( - <> -
- だからまずは、「条件分岐の機能{' '}
-
- これが解ければ、「繰り返しの機能{' '}
-
そうか。よーし、やってみよう!
- > - ) - } - ]} - /> -
- というわけで、次のページでは、「条件分岐の機能{' '}
-
+ 村人たちは与えられたヒントをもとに、「
+ 条件分岐の機能
+ 復習すると、上の計算箱は、
+
+ もし
+ そして、
+
+ もし
+ これを弁当箱で再現するには、どうすればいいんだろう…? +
+ > + ) + } + ]} + /> + > + ) + }, + { + title: <>サヤちゃんの案>, + content: ( + <> +するといつものように、サヤちゃんが何かひらめいたようです。
+サヤもちょっと考えてみた!これを見てくれる?
+ > + ) + } + ]} + /> +なんと!もうひらめいたの?
+ > + ) + }, + { + type: 'saya', + children: ( + <> +
+ うん!
+
+ まず、一番下の「
+
+
+ 入れてみると次のようになるよ。
+
+
+ うん、これって「条件分岐の機能{' '}
+
+ 「条件分岐の機能
+
+ たしかに、
+
+ 両方とも
+ じゃあ、次は{' '}
+
+
+ 入れてみると次のようになるよ。
+
+ おお、今度は先ほどと逆に、{' '}
+
+ これも、「条件分岐の機能{' '}
+
+ 「条件分岐の機能
+
+ たしかに、
+
+ 両方とも
+ とういうことは、やっぱりサヤちゃんの弁当箱が、「
+ 条件分岐の機能
いちおう最後のチェックとして、
+ん?どういうこと?
+ > + ) + }, + { + type: 'saya', + children: ( + <> +たとえば、
+
+ では、
+
+ サヤの弁当箱の
+ これを
+
+ では、
+
+ というわけで、
+
+ 最終的に残ったこちらの弁当箱は、
+
+ だから、
+
やったー、さすがサヤちゃん!
+ > + ) + } + ]} + /> + > + ) + }, + { + type: 'summary', + title: ( + <> +お見事!サヤさん、正解です!
+ > + ) + }, + { + type: 'saya', + children: ( + <> +やったー!
+ > + ) + }, + { + type: 'dog', + children: ( + <> +
+ ちなみに、
+
+ 以下のような
+ まとめると、
+
+ 計算箱の「条件分岐の機能{' '}
+
うーん、条件分岐の機能を再現できたのはいいけど…
+
+ 俺たちがやらないといけないのは、「
+ 繰り返しの機能
+ そうですね。しかし、上級その1でぼくが言ったことを思い出して下さい。 +
+
+ 「繰り返しの機能
+ だから、先ほど「
+ 条件分岐の機能
+ みなさんは「繰り返しの機能{' '}
+
うーん…そう言われても、どういうことやらさっぱり…
+ > + ) + }, + { + type: 'dog', + children: ( + <> ++ では、 + 次のページでまたヒントを出しましょう! +
+というわけで、先に進んでみてください。
+ > + ) + } + ]} + /> +
- 村人たちは与えられたヒントをもとに、「
- 条件分岐の機能
- 復習すると、上の計算箱は、
-
- もし
- そして、
-
- もし
- これを弁当箱で再現するには、どうすればいいんだろう…? -
- > - ) - } - ]} - /> - > - ) - }, - { - title: <>サヤちゃんの案>, - content: ( - <> -するといつものように、サヤちゃんが何かひらめいたようです。
-サヤもちょっと考えてみた!これを見てくれる?
- > - ) - } - ]} - /> -なんと!もうひらめいたの?
- > - ) - }, - { - type: 'saya', - children: ( - <> -
- うん!
-
- まず、一番下の「
-
-
- 入れてみると次のようになるよ。
-
-
- うん、これって「条件分岐の機能{' '}
-
- 「条件分岐の機能
-
- たしかに、
-
- 両方とも
- じゃあ、次は{' '}
-
-
- 入れてみると次のようになるよ。
-
- おお、今度は先ほどと逆に、{' '}
-
- これも、「条件分岐の機能{' '}
-
- 「条件分岐の機能
-
- たしかに、
-
- 両方とも
- とういうことは、やっぱりサヤちゃんの弁当箱が、「
- 条件分岐の機能
いちおう最後のチェックとして、
-ん?どういうこと?
- > - ) - }, - { - type: 'saya', - children: ( - <> -たとえば、
-
- では、
-
- サヤの弁当箱の
- これを
-
- では、
-
- というわけで、
-
- 最終的に残ったこちらの弁当箱は、
-
- だから、
-
やったー、さすがサヤちゃん!
- > - ) - } - ]} - /> - > - ) - }, - { - type: 'summary', - title: ( - <> -お見事!サヤさん、正解です!
- > - ) - }, - { - type: 'saya', - children: ( - <> -やったー!
- > - ) - }, - { - type: 'dog', - children: ( - <> -
- ちなみに、
-
- 以下のような
- まとめると、
-
- 計算箱の「条件分岐の機能{' '}
-
うーん、条件分岐の機能を再現できたのはいいけど…
-
- 俺たちがやらないといけないのは、「
- 繰り返しの機能
- そうですね。しかし、上級その1でぼくが言ったことを思い出して下さい。 -
-
- 「繰り返しの機能
- だから、先ほど「
- 条件分岐の機能
- みなさんは「繰り返しの機能{' '}
-
うーん…そう言われても、どういうことやらさっぱり…
- > - ) - }, - { - type: 'dog', - children: ( - <> -- では、 - 次のページでまたヒントを出しましょう! -
-というわけで、先に進んでみてください。
- > - ) - } - ]} - /> -
+ では、これから「繰り返しの機能{' '}
+
まずは、こちらの弁当箱をご覧ください。
+ > + ) + } + ]} + /> +めちゃくちゃ複雑な弁当箱だなあ…
+ > + ) + }, + { + type: 'dog', + children: ( + <> +
+ ここで質問です。
+
+ 上の弁当箱を、
+
+ そんなの、すぐ答えられるわけないだろう!
+ こんな複雑な弁当箱、
+
+ サヤはすぐ分かったよ!
+
+
+ まさにその通り!サヤちゃん、正解です!
+
へ?なんでそんな早く正解が分かるの…?
+
+
+ サヤちゃん、まさか一瞬で頭の中で
+
+ ううん、そんなことはしてないよ。じゃあ、どうやって解いたかを教えてあげるね! +
+ > + ) + } + ]} + /> + > + ) + }, + { + title: <>計算箱に置き換える>, + content: ( + <> ++ まず、 + + 一番上の部分と、右の真ん中の部分に注目してみて! + +
+ > + ) + } + ]} + /> +
+ あ、
+
+ 一番上の部分をよく見ると、これは{' '}
+
+ さらに、
+
+ 右の真ん中の部分をよく見ると、これは{' '}
+
+ そう!だから、とりあえずこれらを
+
+
なるほど…!
+ > + ) + }, + { + type: 'saya', + children: ( + <> +次に、この右の黄色の部分に注目してみて!
+ > + ) + } + ]} + /> ++ これはもしかして… +