【悲報】自社のコーディング実技採用試験受からなかった
所要時間1時間の問題を
2時間かけてやりました…🐱実技あったら受からなかったな…🤣
未経験エンジニアの皆さんは実技試験のない会社を受けましょう!https://t.co/J7zYrgTATv#駆け出しエンジニアと繋がりたい #Progate— 優さん🌷わくわく開発YouTuber (@yuu13n6) April 25, 2020
fizzbuzzみたいな。
FizzBuzzのコマンドラインアプリをつくる問題なのだが、
// 直接問題は載せれない
もくじ
出力するとこうなるようにする
$ php fizzbuzz.php 7:fizz 8:buzz 20 20
$ php fizzbuzz.php 4:fizz 5:buzz 20 fizzbuzz
$ php fizzbuzz.php 6:fizz 3:buzz 5:piyo 20 piyo
$ php fizzbuzz.php 2:fizz 4:buzz 5:piyo 20 fizzbuzzpiyo
fizzbuzz $ php fizzbuzz.php 4:fizz 3:buzz 5:piyo 2000 fizzpiyo fizzbuzz $ php fizzbuzz.php 4:fizz 3:buzz 5:piyo 2001 割られる数が大きすぎます
$ php fizzbuzz.php 4:fizz 3:fizzodd 5:fizz1 10:boss 12:boss2 4:fizz 3:fizzodd 5:fizz1 10:boss 12:boss2 4:fizz 3:fizzodd 5:fizz1 10:boss 12:boss2 4:fizz 3:fizzodd 5:fizz1 10:boss 12:boss2 4:fizz 3:fizzodd 5:fizz1 10:boss 12:boss2 2000 データ数が多すぎます
fizzbuzz $ php fizzbuzz.php 4:abcdefghijklmn 3:buzz 5:piyo 2000 文字数が多すぎます
fizzbuzz $ php fizzbuzz.php 4:fizz 3:buzz 1:fizz2 5:buzz 2000 重複した文字列が偶数配列にあります fizzbuzz $ php fizzbuzz.php 4:fizz 3:buzz 1:fizz 5:buzz2 2000 重複した文字列が奇数配列にあります
作ったった
- PHP7.4
PHP7.3以下では動かないので注意
fizzbuzz.php
<?php
$app = new FizzBuzz($argv);
$app->execute();
class FizzBuzz
{
const INT_INDEX = 0;
const STRING_INDEX = 1;
const LIMIT_DATA_COUNT = 20;
const LIMIT_STRLEN = 11;
const LIMIT_INT_TARGET_VALUE = 2000;
private Array $data;
private Int $intTarget; // 割られる数
public function __construct($argv)
{
array_splice($argv, 0, 1); // コマンドで与えられた配列からファイル名を抜く
$arrayLastIndex = count($argv) - 1;
$this->intTarget = $argv[$arrayLastIndex];
array_splice($argv, $arrayLastIndex, 1); // 割られる数を配列から抜く
foreach ($argv as $key => $val) {
$tmp = explode(':', $val);
$this->data['int'][] = $tmp[self::INT_INDEX];
$this->data['string'][] = $tmp[self::STRING_INDEX];
}
}
public function execute()
{
$error = self::validate();
if (isset($error)) {
return print $error;
}
$resultString = "";
$max = count($this->data['int']);
for ($i = 0; $i < $max; $i++) {
// 割り切れる値の文字列を連結
if ($this->intTarget % $this->data['int'][$i] === 0) {
$resultString .= $this->data['string'][$i];
}
}
return !empty($resultString) ? print $resultString : print $this->intTarget;
}
private function validate()
{
// データ数チェック
if (count($this->data['int']) > self::LIMIT_DATA_COUNT) {
return 'データ数が多すぎます';
}
$oddArray = array();
$evenArray = array();
$oddArray = array_map('current', array_chunk($this->data['string'], 2)); // 奇数配列
$evenArray = array_map('current', array_chunk(array_slice($this->data['string'], 1), 2) ); // 偶数配列
// 偶数データの文字数チェック
foreach ($evenArray as $key => $val) {
if (strlen($val) > self::LIMIT_STRLEN) {
return '文字数が多すぎます';
}
}
// 割られる数が2000以下であるかチェック
if ($this->intTarget > self::LIMIT_INT_TARGET_VALUE) {
return '割られる数が大きすぎます';
}
// 奇数・偶数列でそれぞれで文字列が一意である
$oddValueCount = array_count_values($oddArray);
$oddMax = max($oddValueCount);
$evenValueCount = array_count_values($evenArray);
$evenMax = max($evenValueCount);
if ($oddMax !==1) {
return '重複した文字列が奇数配列にあります';
}
if ($evenMax !== 1) {
return '重複した文字列が偶数配列にあります';
}
}
}
ポイント① 引数の受け取り方
$ php fizzbuzz.php 引数
こういう形で実行すると、
PHPファイルで引数を$argv変数で受け取ることができる。
ポイント② 奇数配列
- $evenArray = array_map(‘current’, array_chunk($data[‘string’], 2));
array_map(‘関数’, 配列)
array_mapは配列要素1つずつに、関数の処理をループさせて与える関数
array_chunk(配列, 分割単位数)
<?php $array = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; $arrayChunk2 = array_chunk($array, 2); var_dump($arrayChunk2);
a, c, , e, gの配列を取得を目指す。
結果
array(4) {
[0]=>
array(2) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
}
[1]=>
array(2) {
[0]=>
string(1) "c"
[1]=>
string(1) "d"
}
[2]=>
array(2) {
[0]=>
string(1) "e"
[1]=>
string(1) "f"
}
[3]=>
array(1) {
[0]=>
string(1) "g"
}
}
<?php
$array = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
$array = array_map('current', array_chunk($array, 2));
var_dump($array);
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "c"
[2]=>
string(1) "e"
[3]=>
string(1) "g"
}
奇数配列ができた
ポイント③ 偶数配列
b, d, fの配列取得を目指す。
<?php $array = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; $array = array_slice($array, 1); var_dump($array);
array(6) {
[0]=>
string(1) "b"
[1]=>
string(1) "c"
[2]=>
string(1) "d"
[3]=>
string(1) "e"
[4]=>
string(1) "f"
[5]=>
string(1) "g"
}
array_sliceでaを削いだ。
<?php $array = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; $array = array_chunk(array_slice($array, 1), 2); var_dump($array);
array(3) {
[0]=>
array(2) {
[0]=>
string(1) "b"
[1]=>
string(1) "c"
}
[1]=>
array(2) {
[0]=>
string(1) "d"
[1]=>
string(1) "e"
}
[2]=>
array(2) {
[0]=>
string(1) "f"
[1]=>
string(1) "g"
}
}
array_mapでcurrent()を配列に適用する
<?php
$array = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
$array = array_map('current', array_chunk(array_slice($array, 1), 2));
var_dump($array);
array(3) {
[0]=>
string(1) "b"
[1]=>
string(1) "d"
[2]=>
string(1) "f"
}
偶数配列が取れた!
【悲報】自社採用 FizzBuzz試験に落ちる
PG10人でやって
試験時間内でできた人は7割くらい?
できるPGはできるんよな🐱💦業務では
仕様・要望を会話で詰めて実装に落とせる力が大事やで!
ワイくんもなんとかやれてる😭https://t.co/J7zYrgTATv#駆け出しエンジニアとつながりたい#Progate— 優さん🌷わくわく開発YouTuber (@yuu13n6) April 25, 2020


