73
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

7歳娘「パパ、数値をパーミッションに変換して?」

Last updated at Posted at 2022-09-17

ある日の我が家

娘「パパ、数値パーミッションに変換する方法を教えて!」

ワイ「ん、どういうこと?」
ワイ「いきなりどうしたんや」

娘「えっとね」
娘「小学校でこんな宿題が出ちゃったの!」

宿題

07の数値をパーミッションの文字列に変換する関数を実装しなさい。

※以下のルールで変換すること

0 -> "---"
1 -> "--x"
2 -> "-w-"
3 -> "-wx"
4 -> "r--"
5 -> "r-x"
6 -> "rw-"
7 -> "rwx"

ワイ「お〜」
ワイ「娘ちゃんも、もう小学1年生やもんな」
ワイ「こんな宿題が出るんやなぁ」

娘「そうなの」

ワイ「パーミッションって確か・・・権限のことよな?」

娘「うん」

ワイ「難しそうやなぁ」
ワイ「それで、どこまでできたん?」

娘「えっとね」

娘ちゃんが分かったこと

娘「パーミッションについてググってみたんだけどね」
娘「どうやら──」

  • 4読み取り(read -> r)を表す
  • 2書き込み(write -> w)を表す
  • 1実行(execute -> x)を表す

娘「↑こういうルールになってるみたい」
娘「だから、5の場合は"r-x"になるの」

ワイ「ええと・・・?」
ワイ「5は、4 + 1やから」
ワイ「readexecuteの権限があるから」
ワイ「パーミッションの文字列に変換すると"r-x"になるってことか」

娘「そうそう」

ワイ「ほな、3の場合は2 + 1やから」
ワイ「writeexecuteの権限があるから」
ワイ「"-wx"になるってことか」

娘「そういうこと」

ワイ「おお〜、そこまで分かればパパでもできそうや」
ワイ「パパの得意なJavaScriptで実装していくで!」

娘「わ〜い!」

ワイ、実装開始

ワイ「ほな、まずは3"-wx"に変換する処理を書いてみるで!」

娘「うん!」

ワイ「まずは──」

  const permissionNumber = 3

  const permissionText =
      permissionNumber
          .toString(2) // -> "11"

ワイ「↑こうやな」

娘「そっか!」
娘「.toString(2)ってすることで」
娘「3二進数の文字列に変換したんだね!」

ワイ「せや」

娘「パパ、すご〜い!」

ワイ「グヘヘ」
ワイ「せやろ〜?」
ワイ「(でも、この後どうすればいいのか全然わからん・・・)」

娘「あとは簡単だね!」

ワイ「!?
ワイ「(マジか!?)」
ワイ「お、おう!」
ワイ「ほ、ほな娘ちゃん、後は自分でやってみ〜」

娘「うん!」

娘ちゃん実装開始

娘「まずは──」

  const permissionNumber = 3

  const permissionText =
      permissionNumber
          .toString(2) // -> "11"
+         .padStart(3, "0") // -> "011"

娘「↑こうだね!」

ワイ「なるほどな」
ワイ「3桁になるようにゼロ埋めしたわけか」
ワイ「文字列が持ってるpadStart()っていうメソッドを使うことで」
ワイ「指定した桁数になるまでゼロ埋めしたりできるんやな」

娘「え?」

ワイ「いや知ってたけどな?」

娘「そっか」
娘「そして、次はこう!」

  const permissionNumber = 3

  const permissionText =
      permissionNumber
          .toString(2) // -> "11"
          .padStart(3, "0") // -> "011"
+         .split("") // -> ["0", "1", "1"]
+         .map(Number) // -> [0, 1, 1]

ワイ「ほ〜」
ワイ「文字列のsplit()メソッドを使って、"011"を分割して」
ワイ「["0", "1", "1"]という配列にしたんやな」
ワイ「そして、配列のmap()メソッドを使って、全ての要素を数値に変換した・・・」

娘「そうだね」

ワイ「そんで、この後どうすんのや?」

娘「え、分からないの?」

ワイ「いや分かるけどな?」
ワイ「娘ちゃんがやって見せて欲しいなぁって」

娘「そっか!」
娘「えっとね──」

  const permissionNumber = 3

  const permissionText =
      permissionNumber
          .toString(2) // -> "11"
          .padStart(3, "0") // -> "011"
          .split("") // -> ["0", "1", "1"]
          .map(Number) // -> [0, 1, 1]
+         .map((e, i) => e ? "rwx"[i] : "-") // -> ["-", "w", "x"]

娘「↑こうだね!」

ワイ「なるほどな」
ワイ「え〜と、これは・・・?」

  • 1だったら、"r""w""x"を返す
  • 0だったら、"-"を返す

ワイ「↑こういう関数を、配列の各要素に適用してるんやな?」
ワイ「せやから[0, 1, 1]["-", "w", "x"]になると」

娘「そうだね!」
娘「ここまでくれば、あとは──」

  const permissionNumber = 3

  const permissionText =
      permissionNumber
          .toString(2) // -> "11"
          .padStart(3, "0") // -> "011"
          .split("") // -> ["0", "1", "1"]
          .map(Number) // -> [0, 1, 1]
          .map((e, i) => e ? "rwx"[i] : "-") // -> ["-", "w", "x"]
+         .join("") // -> "-wx"

娘「↑こうするだけだね!」

ワイ「おお、配列をjoin()メソッドで連結して文字列にしたんやな」

娘「でも、ここからが分からないの」

ワイ「え・・・」
ワイ「あとはこれを関数にするだけやん」

娘「関数定義の仕方が分からないの・・・」

ワイ「いや、逆に!?」

関数にしてみる

ワイ「ほな、さっきの処理をpermissionNumberToTextっていう名前の関数にするで」

const permissionNumberToText = (permissionNumber) =>
    permissionNumber
        .toString(2)
        .padStart(3, "0")
        .split("")
        .map(Number)
        .map((e, i) => e ? "rwx"[i] : "-")
        .join("")

ワイ「↑こうやで」

実行してみる

ワイ「ほな、実行してみるで?」

console.log(permissionNumberToText(0))
// -> "---"

console.log(permissionNumberToText(1))
// -> "--x"

console.log(permissionNumberToText(2))
// -> "-w-"

console.log(permissionNumberToText(3))
// -> "-wx"

console.log(permissionNumberToText(4))
// -> "r--"

console.log(permissionNumberToText(5))
// -> "r-x"

console.log(permissionNumberToText(6))
// -> "rw-"

console.log(permissionNumberToText(7))
// -> "rwx"

娘「わ〜、できてる!」
娘「パパ、すご〜い!」

ワイ「せやろ!?」
ワイ「ゲヒャヒャ!」

よめ太郎「いやアンタ関数にしただけ!」

ワイ「調子に乗ってごめんやで・・・」

まとめ

  • 10進数の数値を、2進数に変換してゼロ埋めすると、"011"といった形式になる
  • "011"は以下のように考えることができる
    • 1文字目が"0"
      • 4(読み取り)のフラグがOFFになっている
    • 2文字目が"1"
      • 2(書き込み)のフラグがONになっている
    • 3文字目が"1"
      • 1(実行)のフラグがONになっている
  • あとは、
    • ONになっているものは"r""w""x"に変換
    • OFFになっているものは"-"に変換
    • ↑こうすることで、パーミッションの文字列に変換できる

その日の夜

ワイ「はあ、明日も仕事か〜」
ワイ「憂鬱やな〜」

娘「パパ、お仕事楽しくないの?」

ワイ「いや、それなりに楽しいんやけどな」
ワイ「パパ、空気を読むのが苦手やから」
ワイ「いっつも同僚との会話の中で空回ってしまって」
ワイ「そんな自分が嫌いなんや・・・」

娘「そっか・・・」
娘「でもね、パパ」
娘「人よりも空気が読めなかったり」
娘「人よりも傷つきやすかったり」
娘「人よりも感じる恐怖の量が多かったり」
娘「そんな特性を持ちながら、精一杯もがいてるパパは」
娘「とっても素敵だよ」

ワイ「うぅ・・・ありがとうやで、娘ちゃん・・・!」

娘「脳ガチャでハズれたからって、諦めないで・・・?」

ワイ「いや誰が脳ガチャのハズレやねん」
ワイ「しばくぞ」

〜おしまい〜

新しい記事もよろしくやで!

73
24
9

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
73
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?