paizaでmod7占い(ランク S 相当)やってみた 2

前回に引き続き Paizaの mod7占い
https://paiza.jp/learning/mod7

前回Pythonでitertools使ってタイムアウトになり
他に書けるの言語なんて、JS, Ruby, PHP ぐらいだからどれ選んでも遅い
LLじゃない言語っていうといま入門読んでる Haskell しか・・・

試しに書いてみた

import Control.Monad

combinations :: Int -> [a] -> [[a]]
combinations _ [] = []
combinations 1 xs = [[x] | x <- xs]
combinations n (x:xs) = [x:y | y <- combinations (n-1) xs] ++ combinations n xs

main::IO()
main = do
    n <- readLn :: IO Int
    ns <- replicateM n readLn :: IO [Int]
    print $ length [x | x <- combinations 3 ns, sum(x) `mod` 7 == 0]

f:id:ria0130:20151125120312p:plain

入門から始めてるのにHaskellで出来るわけないか・・・

paizaコーディングスキルチェックの各言語のバージョン、環境情報 | ITプログラマー・エンジニア転職のpaiza
Pythonより実行速度早いからって書いてみたけど、ちゃんと言語ごとに制限時間設けられてて
結局クリアできないっていう

paizaでmod7占い(ランク S 相当)やってみた

mod7占い (paizaランク S 相当)
https://paiza.jp/learning/mod7

N個の数値から3つの数値を組み合わせた総和が7で割り切れるパターンを数える問題

5  -- N個の数値
10  -- 1番目の数値
20  -- 2番目の数値
30  -- 3番目の数値
40  -- 4番目の数値
50  -- 5番目の数値
import itertools

n = input()
cards = tuple([input() for i in xrange(n)])

print len([None for a,b,c in itertools.combinations(cards,3) if (a+b+c) % 7 == 0])

itertoolsモジュールに頼りきって内包表記でまとめて処理したコード
タイムアウトで落とされたけどこれ以上早くできる気がしない・・・

f:id:ria0130:20151124163032p:plain

Haskell入門 階乗の解説

Haskell で階乗のお約束のコードは下記のものらしい

fact 1 = 1
fact n = n * fact (n - 1)

main = do
    print $ fact 5

再帰に不慣れだとちょっと戸惑うので簡単に解説

fact 1 = 1
fact n = n * fact (n - 1)

の部分でパターンマッチを行い、第1引数が 1 の場合はそのまま 1 を返す
第一引数がそれ以外の場合、第一引数が変数 n に束縛されて n * fact (n - 1) が実行される

条件にマッチする間再帰処理が呼び出し続け(往路)、
再帰処理が終わった時点で計算結果を順に返す(復路)

f:id:ria0130:20151120134702p:plain

図にして書くと 1 の時点で往路が終了し、復路に入っているのがわかる
まぁ慣れればそれだけの簡単な話でイメージさえ掴めばとくに難しいこともない

iOS上のSafariをOSXから確認する方法

web開発をされている皆さんは普段どのブラウザを使ってますでしょうか

Chrome?ふんふん、なるほど
メモリ消費大きいけどに動作も早いし使いやすいですよね
NodeでもV8エンジンにはお世話になってます

もし OSXiOS でweb開発してるのなら Safari もおすすめですよ
iOS端末上のwebインスペクタをOSX上で確認、変更ができるので
iPhoneで確認したときだけ表示が崩れるなんて場合に便利

使い方は以下

画像は
コマンドラインから扱いにくいディレクトリ名が作成されるのが嫌
・英語読む気があるなら英語のメッセージで調べたほうが情報が多い
っていう個人的な都合でOSを英語設定にしてるため適宜読み替えて参考にしてください

f:id:ria0130:20151120012531p:plain ここからiOS端末のwebインスペクタを表示

f:id:ria0130:20151120012549p:plain

f:id:ria0130:20151120012736p:plain

使い方はOSX上の Safari と同じように
ブラウザが変わるとこのあたりのツールもUI変わってて慣れるまで大変だとは思いますが・・・

なお、あらかじめ
OSX側:Preferences(⌘,) > Advanced > Show Develop menu bar
iOS側:Setting > Safari > Advances > Web Inspector
をそれぞれ有効にしてください

Haskell始めました

length' [] = 0
length'  (_:xs) = 1 + length' xs

sum' [] = 0
sum' (x:xs) = x + sum' xs

product' [] = 1
product' (x:xs) = x * product' xs

take' _ [] = []
take' n _ | n < 1 = []
take' n (x:xs) = x : take' (n - 1) xs

drop' _ [] = []
drop' n xs | n < 1 = xs
drop' n (_:xs) = drop' (n - 1) xs

reverse' [] = []
reverse' (x:xs) = reverse' xs ++ [x]


main = do
  -- リストの長さ
  print $ length' [1,2,3,4,5]  -- 5

  -- 総和
  print $ sum' [1,2,3,4,5] -- 15

  -- 階上
  print $ product' [1,2,3,4,5] -- 120

  -- 先頭2件を抽出
  print $ take' 2 [1,2,3,4,5]  --  [1,2]

  -- 先頭2件を除いたものを抽出
  print $ drop' 2 [1,2,3,4,5] -- [3,4,5]

  -- 逆順
  print $ reverse' [1,2,3,4,5]  -- [5,4,3,2,1]

qiita.com
今回はこちらの記事を参考に進めてます Haskell初心者でもわかりやすい記事に感謝

Haskell は数学だと聞いてたけどそれでも予想以上に数学色が強い
けどまぁ関数型言語を学ぶいいきっかけになったかなと

関数型が万能ってわけじゃないんだろうけどオブジェクト思考からのパラダイムもあるはずだから
早めに覚えておいたほうがなにかとうまく立ち回れそう

こんな風になりたぁい

vimからemacsに乗り換えた話

最近色々と変化があって、頭のなかだけじゃまとめきれなくなったのと
学生時代の憧れだったweb系ブロガーっていうのになってみようとブログを作成

新しい言語に触れてみたとか、関数型言語Haskell)を始めたとかよりも
エディタ変えたほうが個人的には大きな変化だったので今回はEmacsに乗り換えたお話

そもそもこれまでのエディタ遍歴が

だったのでEmacsも使い出すと4大エディタ全部手を出したことになる
ちなみに、それぞれ長所があるから今でもいくつか使ってます

vim
どハマりしてた頃(vundle全盛期)はプラグイン入れまくってIDEに近づいてた .vimrc で数百行とか書いてた気がする
標準から離れすぎてメンテが大変だったのとそこまで複雑化しても使いこなせなかったので SublimeText へ移行して
.vimrc もプラグイン無し標準の設定項目だけの50行程度まで縮小
今でもコンソール上だと基本これ・・・というか ssh して作業とかになると不可避

Sublime Text
vimme も emacser も SublimeText! っていう流行に流され使いはじめる
⌘d のマルチカーソルが超便利 これだけでローカル環境は移行する価値があった
プラグインpython で書けると聞いて pythonista としてもワクワクした(結局書いたことないけど)

Atom
正直この辺りからエディタにさほど拘りが無くなってきてなんとなく移行した感が強い
きっかけは AtomShell(現在のElectron)を使ってwebベースで動いてるところに興味があったから
SublimeText で出来ることはほとんど出来る感じ webベースだから複雑なことをするとちょっと重い・・・
今でも単なるテキストエディタとして使用 マルチカーソル便利 git status の modify を git add に置き換えてターミナルに貼り付けるとか

もう十分開発環境作っててこれ以上なにすんのって感じもするけど、新しく Emacs に触れてみると
vim との違いに驚愕

正直、『結局どっちもコンソール上で動くCUIエディタでしょ、便利便利』って思ってたけど全然違う
vim が普段 cd, mkdir, git とかしてるのと同じように編集して閉じてって使ってたのに対して
emacsCUIでも動くけどGUI環境も推奨されてるし立ち上げたら滅多に落とさずバッファに開いたファイルを
がんがん編集していく感じ(GVim?ナニソレ邪道)
使い方は人それぞれかもしれないけど、自分はもう emacs 上でほとんど作業するようになってしまった

随分前置きが長くなったけど、emacsを使うにあたって主に入れたもの
他のエディタでも入れるようなカラーシンタックスやオートコンプリートは省略

  • multi-term
    ターミナルエミュレーター
    これでフルスクリーン表示したり、エディタとウインドウ分割してコマンドが叩ける クリップボードからの貼り付けがまだ調子悪いのがネック 設定次第か

  • Evil
    Emacsvimバインドを追加する悪魔のパッケージ
    行数指定ジャンプに M-x gotoline とか9タイプ必要とかもう耐えられなくて入れた 後悔はしていない
    vim 操作染み付いてるからなんの違和感もなく導入できた

  • multiple-cursors
    SublimeText風マルチカーソル

f:id:ria0130:20151118230648p:plain

あとがき
初投稿で読み返してみると読者フレンドリーじゃないね
誰に対して書いてるかがまるで意識されてない

名言っぽいポエム
ここまで共に戦ってきたすべてのエディタに感謝を…
それぞれのエディタの開発者たちに感謝を!
訪れるのは、すべてが入り混じった混沌の世界!
世界は再構成される―!