/var/log/messages

Feb 4, 2019 - 1 minute read - Comments - programming

プログラミング Elixir (16)

ダブルクオート文字列のリストのセンタリング表示な課題。

  • length
  • rjust

が使えるのかどうか。確認しつつすすめてみます。

とりあえず

センタリング? はいっちゃん長い文字列の長さ /2 な長さの空白文字列を先頭に付ければ良いみたい。文字列の長さは

iex(19)> tmp = "abcde"
"abcde"
iex(20)> String.length(tmp)
5

なカンジらしく。あと、String.rjust は deplicated と言われてしまうなど。

iex(23)> String.rjust(tmp2, 5, ? )
warning: found ? followed by codepoint 0x20 (space), please use ?\s instead
  iex:23

warning: String.rjust/3 is deprecated. Use String.pad_leading/3 with a binary padding instead
  iex:23

"  abc"

あと、空白は ?\s なんすね。

こうなのか。

iex(24)> String.pad_leading(tmp2, 5, " ")
"  abc"

どうすりゃいいのか

とりあえず

  • 一番長い文字列の長さ取得
  • head を整形して IO.puts

なのかな。

ありゃ?

String.pad_leading に渡す引数がアレですね。結局以下なナニがでっちあがってるんですが、これは別途リファクタリング必要な気がしています。

  def center(stringlist) do
    _center(stringlist, longistLength(stringlist, 0))
  end

  def longistLength([], longist) do
    longist
  end
  def longistLength([head|tail], longist) do
    if String.length(head) > longist do
      longistLength(tail, String.length(head))
    else
      longistLength(tail, longist)
    end
  end

  defp _center([], length) do
    IO.puts(" ")
  end
  defp _center([head|tail], length) do
    IO.puts(String.pad_leading(head, String.length(head) + Kernel.trunc((length - String.length(head))/2), " "))
    _center(tail, length)
  end

実行例? が以下。

iex(80)> String.pad_leading("cat", String.length("cat") + Kernel.trunc((8 - String.length("cat"))/2), " ")
"  cat"
iex(82)> String.pad_leading("zebra", String.length("zebra") + Kernel.trunc((8 - String.length("zebra"))/2), " ")
" zebra"
iex(83)> String.pad_leading("elephant", String.length("elephant") + Kernel.trunc((8 - String.length("elephant"))/2), " ")     
"elephant"

プログラミング Elixir (15) 遠赤外線デスクヒーター

comments powered by Disqus