深夜だ。
もっと頑張った方が絶対良いと思う。
明日は頑張ろう。
何を。
まずはそれを考えるところからかな。
定量的な目標を設定して達成度を評価するとか、
そうせざるを得ない状況になった。
深夜だ。
もっと頑張った方が絶対良いと思う。
明日は頑張ろう。
何を。
まずはそれを考えるところからかな。
定量的な目標を設定して達成度を評価するとか、
そうせざるを得ない状況になった。
幼児が数分で解けるのに大人が解けない算数(?)の問題をPHPで解きました。
元ネタ : https://matome.naver.jp/odai/2133393856936222101
正解は数字に開いている穴の数の合計が方程式のルール(0や4は1、2や3は0、8だけは2)ってやつ。
PHPのコードはこちら。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
<?php $sourceStr = <<<EOT 8809 3333 7111 5555 2172 8193 6666 8096 1111 1012 3213 7777 7662 9999 9313 7756 0000 6855 2222 9881 3333 5531 5555 2581 EOT; $lines = explode("\n", $sourceStr); foreach($lines as $line){ $dataOfLine = explode(" ", $line); $a[] = $dataOfLine[0]; $a[] = $dataOfLine[1]; } for($i=0; $i<count($a); $i++){ $n = $a[$i]; dispAns($n); if($i%2!==0){ echo "\n"; }else{ echo "\t"; } } // ライブラリ // 数値について回答を出力 function dispAns(String $str){ $ans = multiDigitIntStr2cnt($str); printf("%04d = %d", $str, $ans); } // 複数桁整数文字列をカウントに変換 function multiDigitIntStr2cnt(string $s){ $encoding = "UTF-8"; $textLength = mb_strlen($s, $encoding); $total = 0; for($i = 0; $i < $textLength; $i++) { $ch = mb_substr($s, $i, 1, $encoding); $num = intval($ch); $total += singleDigitInt2cnt($num); } return $total; } // 複数桁整数をカウントに変換 // 0000に対応できないため不採用 function multiDigitInt2cnt(int $n){ $total = 0; do { $num = $n%10; $total += singleDigitInt2cnt($num); $n = (int)($n/10); }while(0<$n); return $total; } // 1桁整数をカウントに変換 function singleDigitInt2cnt(int $n) : int { switch($n){ case 0: return 1; case 1: return 0; case 2: return 0; case 3: return 0; case 4: return 1; case 5: return 0; case 6: return 1; case 7: return 0; case 8: return 2; case 9: return 1; default: return 1000000; } } |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 |
8809 = 6 3333 = 0 7111 = 0 5555 = 0 2172 = 0 8193 = 3 6666 = 4 8096 = 5 1111 = 0 1012 = 1 3213 = 0 7777 = 0 7662 = 2 9999 = 4 9313 = 1 7756 = 1 0000 = 4 6855 = 3 2222 = 0 9881 = 5 3333 = 0 5531 = 0 5555 = 0 2581 = 2 |
ここで実行できます。
文字列置換(PHP)
str_replace関数で置換できる。
str_replace(置換対象文字列、置換後文字列、元の文字列、置換した回数);
str_ireplace関数はアルファベットの大文字小文字を区別しない。
置換対象文字列と置換後文字列は配列で指定できる。
1 2 3 4 5 6 7 8 9 10 11 |
<?php $original = "A piece of the apple pie."; $searchArr = ["a piece", "the apple pie"]; $replaceArr = ["Lots", "apple cake"]; $replaced = str_ireplace($searchArr, $replaceArr, $original, $cnt); echo $original . "\n"; echo $replaced . "({$cnt})\n"; |
1 2 |
A piece of the apple pie. Lots of apple cake.(2) |
何か生産的なことをしたい。
恋愛とか。プログラミングの仕事とか。
生産的なことをする必要がある。
とりあえずきょうはもう寝ることにする。
明日こそ、生産的なことをしよう。
家でダラダラしていたら22:30になってしまった。
何かしら生産的なことをしなければならない。
シェアハウスで自宅にひとりきりな日は貴重なため家で過ごすのが得策と思ってずっと家にいてしまった。
いまから隣の駅のファミレスに足を運んで何か作業をしようと思う。
そして生産的なことをするために何をどうするべきかよく考えて答えを出す。
クイックソートとバブルソートの性能(ソートの速さ)を比較しました。
ソート対象の配列のサイズが大きくなるほどバブルソートは遅くなりますね。
それにしてもC言語は文字列の連結とか配列の要素数をさくっと取得とかできなくて不便ですね。
今度他の言語とも同じ条件で性能を比較してみようかな。
クイックソート(C言語)
クイックソートquicksortのアルゴリズムは難しいから暗記している。
ユズノハは3年半C言語で働いていたが、会社を辞めてからはJavaやらPHPばかり書いており、
そういえばC言語でクイックソートを書いたことがなかったなと思い書いてみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
#include <stdio.h> #include <time.h> #include <stdlib.h> void init(){ srand((unsigned)time(NULL)); } int getRandomInt_minMax(int min, int max){ if(max<min){ return min; } double d = rand() / (double)RAND_MAX; int randomOffset = (int)(d*(max-min+1)); int reti = min + randomOffset; return reti; } void prti(int arg){ printf("%d\n", arg); } void prtf(double arg){ printf("%f\n", arg); } void dispArrayList(int* a, int size){ for(int i=0; i<size; i++){ printf("%d => %d\n", i, a[i]); } } void dispArrayLine(int* a, int size){ for(int i=0; i<size; i++){ printf("%2d", a[i]); if(i!=size-1){ printf(" "); }else{ printf("\n"); } } } void initArr(int* a, int size){ for(int i=0; i<size; i++){ a[i] = 0; } } void setRandomForArr_minMax(int* a, int size, int min, int max){ for(int i=0; i<size; i++){ a[i] = getRandomInt_minMax(min, max); } } int getPivot(int a, int b, int c){ if(a>b){ if(b>c){ return b; }else{ return a > c ? c : a; } }else{ if(a>c){ return a; }else{ return b > c ? c : b; } } } void swap(int* a, int l, int r){ int t = a[l]; a[l] = a[r]; a[r] = t; } void quicksort_core(int* a, int size, int left, int right){ if(right<=left){ return; } int l = left; int r = right; int p = getPivot(a[l], a[l+1], a[r]); while(1){ while(a[l]<p){ l++; } while(p<a[r]){ r--; } if(r<=l){ break; } swap(a, l, r); l++; r--; } quicksort_core(a, size, left, l-1); quicksort_core(a, size, r+1, right); } void quicksort(int* a, int size){ quicksort_core(a, size, 0, size-1); } int main(void){ // 初期化(乱数の種に時間渡したりとか) init(); // 変数宣言 int size = 50; // 配列のサイズ int a[size]; // 整数配列 int min = 0; // 整数乱数の最小値 int max = 99; // 整数乱数の最大値 // 整数配列の各要素に整数乱数をセット setRandomForArr_minMax(a, size, min, max); // ソート前出力 dispArrayLine(a, size); // クイックソート quicksort(a, size); // ソート後出力 dispArrayLine(a, size); } |
見ての通りquicksort_core()は再帰呼出し。
C言語は関数のオーバーロード(多重定義)ができないため、quicksort()とquicksort_core()の2つが必要になる。
更に配列のサイズも配列変数から取得できないため引数で渡す必要がある。
メイン関数が一番下なのはサブ関数のプロトタイプ宣言を省略するため。
やはりC言語は不便な言語だ。
ハードウェアに近いところをいじる時以外はC言語は遠慮したい。
PHPの変な仕様を発見しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php // 配列$arr1を宣言して初期化 $arr1 = array(0, 1, 2); // 配列$arr1のindex:1の"アドレス"を$dummyに代入 $dummy = &$arr1[1]; // 配列$arr1をarr2に代入 $arr2 = $arr1; // $arr2の全要素に10加算 for($i=0; $i<count($arr2); $i++){ $arr2[$i] += 10; } // $arr1の中身を出力 print_r($arr1); ?> |
上記コードの出力結果print_r($arr1);は下記になります。
1 2 3 4 5 6 |
Array ( [0] => 0 [1] => 11 [2] => 2 ) |
なぜか$arr1のindex:1だけ10加算されています!
これは、
$dummy = &$arr1[1];
で$dummyという変数に参照を代入した結果、
$arr1[1]と$dummyは同一の領域を指すことになる。
そのため$arr1を代入した$arr2の全要素に10加算した時に、
$dummyの値に10加算されるため、$arr1[1]の値だけ$dummy1と同じ1+10=11になるのだそうです。
これは危険な仕様ですね。
僕はC,Javaの後にPHPの学習を始めたため、
なかなか慣れないです。
ユズノハのプログラミング学習サイト
当ブログ には管理人 ユズノハ が学んだプログラミングに関する事柄を投稿します。
Twitterかブログに気軽にコメントをいただけたら嬉しいです。