【CodeWars】1/31 ~ 2/6に解いた問題たち
記事の内容
1/31 ~ 2/6にCodeWarsで解いた問題です。
JavaScriptを使用しています。
朝解いているので、すぐ解ける簡単な問題ばかりです。
Alphabet war
コード
function alphabetWar(fight) { const left = { w: 4, p: 3, b: 2, s: 1 } const right = { m: 4, q: 3, d: 2, z: 1 } const alphabetArray = fight.split(''); let leftValue = 0; let rightValue = 0; alphabetArray.forEach(alphabet => { if (alphabet in left) { leftValue += left[alphabet]; } else if (alphabet in right) { rightValue += right[alphabet]; } }) if (leftValue === rightValue) { return "Let's fight again!"; } else if (leftValue > rightValue) { return "Left side wins!"; } else { return "Right side wins!"; } }
おそらくかなりひどい。
他の人の解答を見ると、map()やreduce()などを使うと短く書けるみたい。
Convert a Boolean to a String
問題の概要 booleanを文字列にして返却する。
コード
function booleanToString(b){ return b.toString(); }
booleanにtoStringが使えるとは思わなかった。
Object.prototype.toString()なので、何にでも使えるのか。
My head is at the wrong end!
問題の概要 配列の先頭と末尾を入れ替えた配列を返却する。
コード
function fixTheMeerkat(arr) { return arr.reverse(); }
Do I get a bonus?
問題の概要 bool値によって給料の額を10倍にして返却。
コード
const bonusTime = (salary, bonus) => bonus === true ? `£${salary * 10}` : `£${salary}`;
FIXME: Get Full Name
問題の概要 クラスのメソッドを修正して適切な出力がされるようにする。
コード(1回目)
class Dinglemouse{ constructor( firstName, lastName){ this.first = firstName; this.last = lastName; } getFullName(){ if (!this.first && !this.last) { return ''; } else if (!this.first && this.last) { return this.last; } else if (this.first && !this.last) { return this.first; } else { return `${this.first} ${this.last}`; } } }
引数から渡ってきた2つの変数名に悩んだ末に、firstとlastというよくわからない名前をつけてしまった。
条件分岐は書きたくなかったが、上手いやり方を思いつかなかったので仕方なく。
コード(2回目)
class Dinglemouse{ constructor( firstName, lastName ){ this._firstName = firstName; this._lastName = lastName; } getFullName(){ return `${this._firstName} ${this._lastName}`.trim(); } }
他の人の解答を見てやり直し。
trimは思いつかなかった。
Number to digit tiers
問題の概要 n桁の数値を1~n桁目までそれぞれ区切って配列に格納する。
コード
const createArrayOfTiers = num => { const numString = num.toString(); let result = []; for (let i = 1; i <= numString.length; i++) { result.push(numString.substr(0, i)); } return result; }
【CodeWars】1/24 ~ 1/30に解いた問題たち
記事の内容
1/24 ~ 1/30にCodeWarsで解いた問題です。
JavaScriptを使用しています。
朝解いているので、すぐ解ける簡単な問題ばかりです。
get character from ASCII Value
問題の概要 受け取った数字をASCIIでの値に変換する。
コード
function getChar(c) { return String.fromCharCode(c) }
Can we divide it?
問題の概要 変数numberが変数a, bでそれぞれ割り切れるかどうか。
コード
function isDivideBy(number, a, b) { return number % a === 0 && number % b === 0 ? true : false; }
今回はa, b2つと決まっていたが、何個あるかわからない場合はevery()とかを使う感じかな。
Limit string length - 1
問題の概要 文字列の指定された位置から「…」に置き換える。
コード
function solution(string,limit){ if (string.length <= limit) { return string; } let result = string.substr(0, limit); return result + "..."; }
Love vs friendship
問題の概要
コード
1回目
function wordsToMarks(string){ const alphabets = { a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8, i: 9, j: 10, k: 11, l: 12, m: 13, n: 14, o: 15, p: 16, q: 17, r: 18, s: 19, t: 20, u: 21, v: 22, w: 23, x: 24, y: 25, z: 26 } const charArray = string.split(''); let stringValue = 0; charArray.forEach(char => { stringValue += alphabets[char]; }) return stringValue; }
特に何も考えずに実装。 ひどいことになった。 わかりやすいかもしれないけど…。
2回目
function wordsToMarks(string) { let stringValue = 0; for (let i = 0; i < string.length; i++) stringValue += string.charCodeAt(i) - 96; return stringValue; }
他の人がString.prototype.charCodeAt()を使っていたので、真似てみた。
周りが文字コードを知っているならこれを使ってもいいかもしれない。
Incorrect division method
問題の概要 割り算の答えが返ってくるようにコードを修正する。(コメントアウトの部分)
コード
// const solve = (x, y) => x // y; const solve = function(x, y) { return x / y; }
問題が簡単だったので、下に関数式を書いてみた。
[Code Golf] Return Odd No Matter What
問題の概要 12文字以下で処理を書く。(関数の名前は除く)
コード
const alwaysOdd=n=>n%2?n:n-1
Averages of numbers
問題の概要
配列の隣り合う要素の平均を配列で返す。
コード
const averages = numbers => { let result = []; if (numbers === null) { return result; } for (let i = 0; i < numbers.length; i++) { if (i !== numbers.length -1) { result.push((numbers[i] + numbers[i + 1]) / 2); } } return result; }
空の配列のlengthプロパティにアクセスしようとすると、エラーが返ってくるのはあまり納得が行かない。
0が返ってきたらいいのに。
【CodeWars】1/17 ~ 1/23に解いた問題たち
記事の内容
1/17 ~ 1/23にCodeWarsで解いた問題です。
JavaScriptを使用しています。
朝解いているので、すぐ解ける簡単な問題ばかりです。
Super Duper Easy
問題の概要 引数が数字なら計算して返却。文字列ならErrorを出す。
コード
function problem(x){ return typeof x === "number" ? x * 50 + 6 : "Error"; }
The falling speed of petals
問題の概要 花弁の落ちる速度が与えられるので、何秒で地面に到達するかを返却。
コード
function sakuraFall(v) { return v > 0 ? 400 / v : 0; }
String matchup
問題の概要 配列の要素がもう片方の配列に何回登場するかをカウントする。
コード
function solve(a,b){ let count = 0; let result = []; for (let i= 0; i < b.length; i++){ count = 0; for (let j= 0; j < a.length; j++) { if (b[i] === a[j]) { count++; } } result.push(count); } return result; }
ゴリ押しでいってしまった…。
他の人の解答を見る感じmapとfilterを使うのが良いみたい。
Calculate BMI
問題の概要 BMIを計算して値に応じた出力をする。
コード
function bmi(weight, height) { const bmi = weight / height ** 2; let judge = ''; if (bmi > 30) { judge = "Obese"; } else if (bmi > 25.0){ judge = "Overweight"; } else if (bmi > 18.5) { judge = "Normal"; } else { judge = "Underweight"; } return judge; }
単純な条件が多くなるとswitchの方がいいかもしれない。
ただ、MDNをみた感じswitch文に不等号を使ってる例がないので推奨された書き方ではないのかも?
他に、return の位置をどうするか。
各分岐でreturnしてもいいが、1箇所でreturnする方が個人的にわかりやすい気がする。
Are arrow functions odd?
問題の概要 array.filterを用いて奇数の配列を作成する。
コード
function odds( values ){ return values.filter( value => value % 2 !== 0 ); }
まだfilterのような=>の使い方がわかってない。。
Take the Derivative
問題の概要
簡単な数値の計算をして、文字列として返却する。 www.codewars.com
コード
function derive(coefficient,exponent) { return `${coefficient*exponent}x^${exponent-1}` }
個人的には変数の展開には、+を使って連結するよりも↑で記述する方が楽かも。
Polish alphabet
問題の概要 文字列に含まれるポーランド語アルファベットを置換する。
コード
const polish = { ą: 'a', ć: 'c', ę: 'e', ł: 'l', ń: 'n', ó: 'o', ś: 's', ź: 'z', ż: 'z' }; function correctPolishLetters (str) { let result = ''; let regex = ''; Object.keys(polish).forEach(function (key) { regex = new RegExp(`${key}`, 'g'); str = str.replace(regex, polish[key]); }); return str; }
replaceAll()を使ったら「is not a function」とでた。
MDNにはメソッドとして記載されているけど、実行環境によっては使えない感じだろうか。
結局replaceに()グローバルフラグをつけるとreplaceAll()と同様のことができた。
【CodeWars】1/10 ~ 1/16に解いた問題たち
記事の内容
1/10 ~ 1/16にCodeWarsで解いた問題です。
JavaScriptを使用しています。
朝解いているので、すぐ解ける簡単な問題ばかりです。
1/10 N-th Power
問題の概要 配列のN番目の要素のN乗を返却する。
コード
function index(array, n){ return array[n] ? Math.pow(array[n], n) : -1 }
1/11 Four/Seven
問題の概要
4なら7, 7なら4を返却する。
ただし、ifやswitchを使用せずに。
コード
function fourSeven(n){ const obj = { 4: 7, 7: 4 } return obj[n] || 0; }
1/12 Find Multiples of a Number
問題の概要
limit以下の数字の配列を作る。 www.codewars.com
コード
function findMultiples(integer, limit) { let multiples_array = [integer]; let sum = integer; while (sum + integer <= limit) { sum += integer; multiples_array.push(sum); } return multiples_array; }
forで書いてもよかったかも。
1/13 Parse nice int from char problem
問題の概要 文字列の先頭にある数字をNumber型で返却する。
コード
function getAge(inputString){ let ans = inputString.match(/^[\d]/); return Number(ans[0]); }
2回目
function getAge(inputString){ return parseInt(inputString); }
1/14 Sum of Minimums!
問題の概要 各配列の最小の要素の合計を返却する。
コード
function sumOfMinimums(arrs) { let sum = 0; arrs.forEach ((arr) => { sum += Math.min(...arr); }) return sum; }
1/15 Lario and Muigi Pipe Problem
問題の概要 nからmまでの数字が入った配列の抜け落ちている要素を補完して返却する。
コード
function pipeFix(numbers){ return range(numbers[0], numbers[numbers.length -1], 1); } const range = (start, stop, step) => Array.from({ length: (stop - start) / step + 1}, (_, i) => start + (i * step));
1/16 Write out expression!
問題の概要
計算式を文字の計算にする。
コード
function expressionOut(expr) { const formula = expr.split(' '); let result = OPERATORS[formula[1]] ? `${NUMBERS[formula[0]]} ${OPERATORS[formula[1]]}${NUMBERS[formula[2]]}` : "That's not an operator!"; return result; } const NUMBERS = { '1': 'One', '2': 'Two', '3': 'Three', '4': 'Four', '5': 'Five', '6': 'Six', '7': 'Seven', '8': 'Eight', '9': 'Nine', '10': 'Ten' };
【CodeWars】1/3 ~ 1/9に解いた問題たち
記事の内容
1/3 ~ 1/9にCodeWarsで解いた問題です。
JavaScriptを使用しています。
朝解いているので、すぐ解ける簡単な問題ばかりです。
1/3 USD => CNY
問題の概要 ドルから人民元に変換する。 www.codewars.com
コード
function usdcny(usd) { let cny = usd * 6.75 cny = cny.toFixed(2) return `${cny} Chinese Yuan` }
JavaScript第一段。
1/4 Sum The Strings
問題の概要 2つのString型の数字の和をString型で返却する。
コード
function sumStr(a,b) { return String(Number(a)+Number(b)); }
1/5 Check the exam
問題の概要 2つの配列の要素の一致・不一致でスコアを算出する。
コード
function checkExam(answer, submit) { let score = 0; for (let i = 0; i < submit.length; i++) { if (submit[i]) { score += submit[i] === answer[i] ? 4 : -1; } } return score < 0 ? 0: score; }
Best Practiceに選ばれた解答はarray.reduce()を使ってた。
1/6 Unique numbers
問題の概要 配列の重複を削除した新しい配列を返却する。 www.codewars.com
コード
function uniqueNumbers(numbersArray) { let uniqueArray = numbersArray.filter(function (x, i, self) { return self.indexOf(x) === i; }); return uniqueArray; }
JavaScriptにはPHPのarray_unique()みたいなものは無かった…。
1/7 NBA full 48 minutes average
問題の概要 外挿を求めて返却する。
コード
function pointsPer48(ppg, mpg) { if (ppg === 0 || mpg === 0) { return 0;} let ans = ppg / mpg * 48; return Number(ans.toFixed(1)); }
恥ずかしながら、外挿って言葉を初めて知った。 既知のデータから範囲外の予測をすることらしい。
1/8 Multiplication table for number
問題の概要 1 ~ 10 * 与えられた数を改行して出力する。
コード
function multiTable(number) { let result = ''; for (let count = 1; count <= 10; count++) { if (count === 10) { result += `${count} * ${number} = ${count * number}`; } else { result += `${count} * ${number} = ${count * number}\n`; } } return result; }
ifじゃなくて、参考演算子で書けばよかったかも。
1/9 CSV representation of array
問題の概要 配列を結合する。
コード
1回目
function toCsvText(array) { let csv = ''; for (const innerArray of array) { csv += innerArray.join(); if (innerArray !== array.slice(-1)[0]) { csv += '\n'; } } return csv; }
2回目
function toCsvText(array) { return array.join('\n'); }
難しく考えすぎてた。 ただ、JavaScriptでの配列の結合の仕方や配列の最後の要素の取得など学べたのでよかった。
毎日簡単な問題を解くのもいいけど、2~3日かけて難しめの問題を解くのもアリな気がする。
Apacheのアクセスログを調べる
Apahceのログを見ようと思ったけど、場所がわからなかったので。
ApacheはMacに初めからインストールされている物を使用しています。
起動とかその辺はこちらを参照
httpd.confからログの出力場所を調べる
まず、httpd.confからログファイルを出力している場所を調べます。
vi /private/etc/apache2/httpd.conf
ノーマルモードでは「/access_log」のように「スラッシュ+検索文字列」で検索ができます。(nで移動可)
350行目付近にアクセスログの出力場所の記述がありました。
どうやら、/private/var/log/apache2/access_log
にあるようです。
tail -f /private/var/log/apache2/access_log
ありました!
2020年(9月~)でやってみたこと
2020年(9月~)でやってみたこと
2020年(といっても後半)に取り組んだことの振り返りです。
やったこと
CakePHPの学習
CakePHPの基本的な使い方については身についたものの、仕組みを理解して適切に使えているかというと微妙なところです。
オレオレフレームワークを作るなどして深い部分を理解できるようにしたいです。
CodeWarsを毎日解く
9月の途中から毎日CodeWarsで問題を解いていました。 (簡単な問題ばかりですが…)
朝起きたらコードを書く習慣が身につきました。
業務でPHPを使っているので、PHPで問題を解いてます。
100日行ったら別の言語で解く予定です。
基本情報の勉強
情報系の出ではないため、情報処理の基礎を身につけたいと思い勉強をしました。
結局コロナで延期やら頻尿やらで受けないことにしましたが、学習の価値は十分にあったと思います。
基本的な知識や概念を知っているかどうかで、情報の吸収量が違うような気がします。
AWS認定資格の勉強
一番簡単なクラウドプラクティショナーを取りました。
業務で役立っているとはいえませんが、短期間でとれるため、気分転換の勉強としては良かったです。
ただ、プログラマとして取るならもう一つ上のレベルでも良かったかもしれません…。
Arduino
Arduinoを買ってLチカまでやったけれど放置気味です。
楽器を作れればいいなとは思うものの、そこまでのモチベーションはありませんでした。
また気が向いた時にでも挑戦します。
まとめ
本当にちょっとでもいいので業務時間外で毎日コードを書けたのは良かったと思います。
簡単な問題ばかり解いていますが、知らなかった組み込み関数を使ったり、他のすごい方々の解答を見て学んだりできるので、やってて飽きません。
また、基本情報など基礎知識の習得に時間を割いたことも個人的には良かったです。
業務ですぐ使える知識ではないので、勉強することの不安はありました。
しかし、物事を深く学ぼうとすると基礎的な知識が必要になってくるのでやってて良かったと感じます。
本当は業務などを含めて全体的に良かったことやわるかったことを振り返るつもりが全く異なる記事になってしまいました…。
ただ、あまり業務のことを書くのも少し怖いので、これぐらいでいいのかもしれませんが。