コーディングの筋トレ

はじめに
  新しい技術として機械学習を学んでいます。
それとは別に最適かつ挑戦的なコーディング力を改めてトレーニング中です。
それとは別に最適かつ挑戦的なコーディング力を改めてトレーニング中です。
  atCoderはLeetCodeなど
  コーディングテストのサイトを利用することで
  コンテスト的な感覚で自分のシンプルなコーディング力を試せます。
  LeetCodeの方がその場でRunTestしたり課題もジャンル豊富でオススメ。
  どのようなアプローチを取っているか
  試行錯誤の中での思ったことを徒然と記します。
例題
  シンプルによくありそうな例題に挑戦。
レベルとしては初級あるいは初級中級の間でしょうか。
レベルとしては初級あるいは初級中級の間でしょうか。
「任意の長さである文字列を入力し、重複している文字の種類を出力せよ」
  例えば “abccddd” と入力したら “2” と出力します。
  “abcdef”であれば “0” を出力します。
ロジックのアプローチ
  色々方法はあるかと思います。
以下の手法はベストではないかもしれないですが
ロジックとコードの行き来がしやすいと思って挙げます。
以下の手法はベストではないかもしれないですが
ロジックとコードの行き来がしやすいと思って挙げます。
- 入力する(これをNとする)
- Nをnという一文字ずつの配列に置き換える
- n配列を要素に重複の無い配列mにする
- 各要素がnに対して2個以上であればカウンタを増やす(初期値0)
  というアプローチです。
  まあ、それほど重くならないだろうと踏んでO(ビッグオー)の計算はしてません。
言語の選択
  コーディングテストに投稿する際に最初に悩んだもの。
どの言語にするか。
		
			
			
			
			
				
			
		
		
			
			
			
			
				
			
		
		
			
			
			
			
				
			
		
		
			
			
			
			
				
			
		
どの言語にするか。
  最終的にはPython3に落ち着きました。
  普段はPHPをやっているけれども、なんだかんだすっきりしたコードになるし速い。
  Rubyでもまあまあいい気がします。PHPは好みでないことが判明。
1. PHP
| 1 2 3 4 5 6 7 8 | <?php $n = str_split(preg_replace("/(\r|\n|\r\n)/", "", fgets(STDIN))); $cnt = 0; $nn = array_count_values($n); foreach ($nn as $key => $count) {     if ($count > 1) $cnt++; } echo $cnt; | 
最初の
| 1 | "<?php" | 
 おまじないがそもそも邪魔。。。
  変数の前の “$” も邪魔。
2. Ruby
| 1 2 3 4 5 6 | n = gets.gsub(/(\r|\n|\r\n)/, "") cnt = 0 n.split('').uniq.each do |e|   cnt += 1 if n.count(e) > 1 end p cnt | 
PHP もですが、標準入力の最後の改行を含んでしまっている。
  uniqやeachなどフィルタ的な感覚で処理を重ねていけるのは良いところ。
  おそらくeachもワンラインで書ける。
3. Python
| 1 2 3 4 5 | n = list(input()) cnt = 0 for i in set(n):     if n.count(i) > 1: cnt += 1 print(cnt) | 
  コードがシンプルに、かつロジックも必要最小限な気がする。
  setなどは知らなければ最初調べる程度で
  その他は直感的にロジックに従って書いてる感覚。
その他のアプローチ
  前提の条件になるとは思いますが
コーディングはロジックが決まって投影するだけ。
なので数学的にビッグ・オーを最小にしながら解決するために
日頃から高校数学程度の脳トレーニングは有効な気がします。
コーディングはロジックが決まって投影するだけ。
なので数学的にビッグ・オーを最小にしながら解決するために
日頃から高校数学程度の脳トレーニングは有効な気がします。
Author Profile

スターフィールド編集部
SHARE




