My days of...

生活のことなど

Forループを使わなくても同じ実行結果になるメソッドがある場合はそのほうがよいのかな

JavaScriptのメモ。

以前どこかのブログだか記事かで、JavaScriptはfor分のループは使わない方がいいとか、という内容がありました。それで代わりに使うのは、forEachやmapなどを利用するのがいいとか。whileも入る?とその時は考えていた気がします。

その中にevery()メソッドもあるのでしょうか。

問題として

配列 arr = ['Hello', 'hello'] があるとして、2番目の要素が1番目の要素に全て含まれるかどうかのテスト。大文字、小文字は問わない。
例えば ['Hello', 'hello']であれば2番目文字列が全て1番目の文字列に含まれるため、trueを返す。
['Hello', 'Hey']の場合、2番目の文字列内の'y'が1番目の文字列には含まれないので、falseを返す。
['Aline', 'line']の場合、2番目の文字列が全て1番目の文字列 'Aline' に含まれるため、trueを返す。

自分の回答はfor文を利用しました。

function mutation(arr) {
for (let i = 0; i < arr[1].length; i++) {
if (arr[0].toLowerCase().indexOf(arr[1][i].toLowerCase()) === -1) {
return false;
}
}
return true;
}

こんな感じ

模範回答の中にはevery()を利用して、

return arr[1].toLowerCase().split("").every(l => { return arr[0].toLowerCase().indexOf(l) != -1 }

 な感じのコードが。MDN Web docにも当然あったので、for文を利用しない書き方がたくさんあるな、と思った次第。

developer.mozilla.org

 

初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発

初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発

 

 

Netflixのデアデビルも終了に

どうするのかと思ったら・・・やっぱり

deadline.com

アイアンフィスト、ルークケイジに続いて、デアデビルもシーズン3で終了に。

Netflixで制作されたデアデビル(Deardevil)ですが、シーズン3で終了になるようです。面白かったのに、残念ですね。残りジェシカ・ジョーンズとパニッシャーですがこれらもどうなるのでしょう。

デアデビルの場合、シーズン3最後を観て、次のシーズンがあるとしたらどう始めるの?と思うような終了だったのと、アイアンフィスト、ルークケイジ終了のアナウンスとも合わさり、しょうがないかな、と。あの引きはどうなる?と思わせてコレっていうのも大人の事情でしょう。

 

 

PythonのListの値を渡す方法

PythonのListで初歩的なことですが・・・

>>> a = [1,2,3]

>>> b = a

>>> a[1] = 5

>>> b

[1, 5, 3]

 Pythonでは参照渡し(メモリのid参照だっけ?)になるので同じものに。

>>> a = [1,2,3]

>>> c = a[:]

>>> a[2] = 8

>>> c

[1, 2, 3] 

>>> b = a

>>> b

[1, 2, 8]

>>> b[1] = 5

>>> a

[1, 5, 8]

>>> b

[1, 5, 8]

>>> c

[1, 2, 3]

>>> c[1] = 0

>>> c

[1, 0, 3]

>>> a

[1, 5, 8]

>>> b

[1, 5, 8]

なんだか間違えそうになるのですが、Listの値をコピーするのは[:]を使えば大丈夫っぽいのかな。b = a だとメモリ先をコピーするから同じもの。c = a[:] だと値をコピー、と。単純な初歩的なことだから覚えておこう。PHPだとそのまま値コピーだから・・・。 

値渡しと参照渡しの違いを理解する

情報処理教科書 プロジェクトマネージャ 2019年版

情報処理教科書 プロジェクトマネージャ 2019年版

 

 

わからない時はGoogleやStackoverflowなどインターネットを活用して検索、質問すればどこかに答えが転がっている、そんな感じ

最近、leetcode.comアルゴリズムのeasyの問題を適当に解いてます。書籍「独学プログラマー」で紹介されていました。有料のプレミアム会員にならなくても、問題を解くだけなら会員になるだけ。Pythonの練習に、という感じ。英語のサイトなので、英語の内容を読み解く必要があります。

Next Permutation - LeetCode

この問題を解こうとしたのですが、

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

The replacement must be in-place and use only constant extra memory.

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.

1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

 まず "permutation" がわからず、また "lexicographically next greater permutation of numbers" もわからず・・・。意味的に順列だとかなんとか程度しかわからず。leetcodeのDiscussionは基本、解答しかない(どんだけシンプルかつ早い処理を書いたー!みたいな)ので、検索してみることに。permutationについてWikipediaの内容がいいよーとStackoverflowで紹介されていたのでその通りにすると解けました。

Wikipedia has a nice article on lexicographical order generation. It also describes an algorithm to generate the next permutation.

Quoting:

The following algorithm generates the next permutation lexicographically after a given permutation. It changes the given permutation in-place.

  1. Find the highest index i such that s[i] < s[i+1]. If no such index exists, the permutation is the last permutation.
  2. Find the highest index j > i such that s[j] > s[i]. Such a j must exist, since i+1 is such an index.
  3. Swap s[i] with s[j].
  4. Reverse the order of all of the elements after index i till the last element.

Permutation - Wikipedia

The following algorithm generates the next permutation lexicographically after a given permutation. It changes the given permutation in-place.

  1. Find the largest index k such that a[k] < a[k + 1]. If no such index exists, the permutation is the last permutation.
  2. Find the largest index l greater than k such that a[k] < a[l].
  3. Swap the value of a[k] with that of a[l].
  4. Reverse the sequence from a[k + 1] up to and including the final element a[n].

日本語の説明には上記の条件についてどこに書いてあるのかわかりませんでした。日本語または日本人にとっては常識、当たり前な知識というか条件なんでしょうね。

アルゴリズムというかプログラミングについては沢山書いて書き慣れるというか、考え方を練習して早く慣れるようにしていきたいですね。一つの問題を解くのに1時間〜2時間は当たり前みたいなのはちょっと・・・と。でも、楽しいです。

paiza.hatenablog.com

ちょうどPaizaの方がこのようなアルゴリズムについて学べる本の詳細をしてくださってました。

アルゴリズム図鑑 絵で見てわかる26のアルゴリズム

アルゴリズム図鑑 絵で見てわかる26のアルゴリズム

 
世界でもっとも強力な9のアルゴリズム

世界でもっとも強力な9のアルゴリズム

 

 

上記の条件を考えながら書いた処理は、

class Solution:
 def nextPermutation(self, nums):
  """
  :type nums: List[int]
  :rtype: void Do not return anything, modify nums in-place instead.
  """
  nums_len = len(nums)
  largest_index = 0
  for i in range(nums_len-1):
   if nums[i] < nums[i+1]:
    largest_index = i
   next_largest = 0
  for j in range(nums_len):
   if nums[j] > nums[largest_index]:
    next_largest = j
  if nums[largest_index] == nums[next_largest]:
   nums.sort()
  else:
   nums[largest_index], nums[next_largest] = nums[next_largest],  nums[largest_index]
   j = nums_len-1
   tmp_list = []
   while j > largest_index:
    tmp_list.append(nums[j])
    j -= 1
   n = 1
   for i in tmp_list:
    nums[largest_index + n] = i
    n += 1 

 

無料で読めるネットにあるPythonとJavaScript本

英語はできないよりできたほうがいい。少なくとも英文は読めないより読める(理解できる)ほうがいい。

そういう風に思えるサイトです。多分昔からあるのだろうと思いますが、昨日知りました。

pythonbooks.revolunet.com

全て、ではないけれどOpenBookというくくりになるのですかね。無料で読めます(たまに読めないものもあります)。

Pythonの書籍になった情報の他に、JavaScriptの本もあります。

jsbooks.revolunet.com

英語を読むことができれば、世界が広がりやすくなるかも。

入門 Python 3

入門 Python 3

 
これからWebをはじめる人のHTML&CSS、JavaScriptのきほんのきほん

これからWebをはじめる人のHTML&CSS、JavaScriptのきほんのきほん

 

 

 

再帰関数ってよくわからない。慣れるしかないとかなんとか・・・

Python勉強中。で、再帰について。

よくわかりません、再帰。関数を定義している中でその関数(自分自身)を呼びます。慣れている人にはわかりやすく、慣れないとどうなってるの?となるそうです。無論自分は後者です。

再帰の問題をいろいろやってみました。ハノイの塔とかフィナボッチ数列とかがありますが、よくわかりません。それで、「たけやぶやけた」などどちらから読んでも同じになる回文を証明する、という問題をやってみました。

その前に再帰の条件ですが、

  1. 再帰終了条件をもつ
  2. 状態を変えながら、再帰終了条件へ近く
  3. 再帰的に関数自身を呼び出す

の3つの条件が必要となるそうです。

回答ですが、

def isPal(s):
if len(s) < 2:
return True
if s[0] != s[-1]:
return False
return isPal(s[1:-1])

 となりました。回答は検索してみつけました。理解できなかったところとしては、最後のisPal(s[1:-1])の部分。この部分は+1、-1を自動的に計算していってくれている、という理解でいいんですかね。なんで自動でやってくれるのでしょう?そういうものだから?で慣れることが大事なのかもしれません。

もう一つ、文字列を反対に並べるというもの。pythonの場合は[::-1]を使うと簡単にできますが、再帰関数の練習なので

def reverse_string(s):
w = ""
if len(s) > 0:
if len(s) == 1:
return s[0]
# print(len(s))
w += s[len(s)-1]
return w + reverse_string(s[:len(s)-1])
else:
return w

 これは自分で考えましたが、なんか微妙な感じです。もう少し良い書き方があるのでしょうけど思いつかず・・・

慣れるための練習問題やいい方法はどこかにないだろうか。

再帰の技法??基本的考え方・アルゴリズム・プログラミング

再帰の技法??基本的考え方・アルゴリズム・プログラミング

 

 

インストーラをダウンロードしてAnacondaをインストールした

なんかもういっかーみたいな気になって、自分のiMacAnacondaをダウンロードしてインストールした。Macなので、インストーラをダウンロードして、ダブルクリック、インストーラが起動してそのまま書いてある通りに進めば簡単インストール完了。

インストールの前に、pyenvの環境は全て削除。~/.bash_profileに書いたpyenvの内容削除、Homebrewからpyenvも削除。~/.pyenvのフォルダも全て削除。

www.anaconda.com

インストーラを起動してインストールしたら、iMacに元から入っていたpython 2.7も3.7になってしまったっぽい。なんだかしまった感がする。

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

 
[第2版]Python 機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

[第2版]Python 機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)