JSの半角→全角変換

<script>
	function zenkaku2Hankaku(str){
		return str.replace(/[A-Za-z0-9]/g, function(s){
			return String.fromCharCode(s.charCodeAt(0) + 0xFEE0);
		});
	}

	console.log(zenkaku2Hankaku("123abC"));
</script>

JSで書く場合も基本はスクリプトの中に辞書を持って変換しているのね。
仕組みを理解した。

カナ→ローマ字変換

mb_internal_encoding('utf-8');
$kana2romaji = new Kana2Romaji;

$str = "これは、ローマじへんかんのじっけんです";

$result = $kana2romaji->convert($str);
header("Content-type: text/html;charset=utf8");

echo $result;

class Kana2Romaji {
	function convert($str){
		$str = mb_convert_kana($str, "cHV", "utf-8");

		$kana = array(
            'きゃ', 'きぃ', 'きゅ', 'きぇ', 'きょ',
            'ぎゃ', 'ぎぃ', 'ぎゅ', 'ぎぇ', 'ぎょ',
            'くぁ', 'くぃ', 'くぅ', 'くぇ', 'くぉ',
            'ぐぁ', 'ぐぃ', 'ぐぅ', 'ぐぇ', 'ぐぉ',
            'しゃ', 'しぃ', 'しゅ', 'しぇ', 'しょ',
            'じゃ', 'じぃ', 'じゅ', 'じぇ', 'じょ',
            'ちゃ', 'ちぃ', 'ちゅ', 'ちぇ', 'ちょ',
            'ぢゃ', 'ぢぃ', 'ぢゅ', 'ぢぇ', 'ぢょ',
            'つぁ', 'つぃ', 'つぇ', 'つぉ',
            'てゃ', 'てぃ', 'てゅ', 'てぇ', 'てょ',
            'でゃ', 'でぃ', 'でぅ', 'でぇ', 'でょ',
            'とぁ', 'とぃ', 'とぅ', 'とぇ', 'とぉ',
            'にゃ', 'にぃ', 'にゅ', 'にぇ', 'にょ',
            'ヴぁ', 'ヴぃ', 'ヴぇ', 'ヴぉ',
            'ひゃ', 'ひぃ', 'ひゅ', 'ひぇ', 'ひょ',
            'ふぁ', 'ふぃ', 'ふぇ', 'ふぉ',
            'ふゃ', 'ふゅ', 'ふょ',
            'びゃ', 'びぃ', 'びゅ', 'びぇ', 'びょ',
            'ヴゃ', 'ヴぃ', 'ヴゅ', 'ヴぇ', 'ヴょ',   
            'ぴゃ', 'ぴぃ', 'ぴゅ', 'ぴぇ', 'ぴょ',
            'みゃ', 'みぃ', 'みゅ', 'みぇ', 'みょ',   
            'りゃ', 'りぃ', 'りゅ', 'りぇ', 'りょ',
            'うぃ', 'うぇ', 'いぇ'
        );
        
        $romaji  = array(
            'kya', 'kyi', 'kyu', 'kye', 'kyo',
            'gya', 'gyi', 'gyu', 'gye', 'gyo',
            'qwa', 'qwi', 'qwu', 'qwe', 'qwo',
            'gwa', 'gwi', 'gwu', 'gwe', 'gwo',
            'sya', 'syi', 'syu', 'sye', 'syo',
            'ja', 'jyi', 'ju', 'je', 'jo',
            'cha', 'cyi', 'chu', 'che', 'cho',
            'dya', 'dyi', 'dyu', 'dye', 'dyo',
            'tsa', 'tsi', 'tse', 'tso',
            'tha', 'ti', 'thu', 'the', 'tho',
            'dha', 'di', 'dhu', 'dhe', 'dho',
            'twa', 'twi', 'twu', 'twe', 'two',
            'nya', 'nyi', 'nyu', 'nye', 'nyo',
            'va', 'vi', 've', 'vo',
            'hya', 'hyi', 'hyu', 'hye', 'hyo',
            'fa', 'fi', 'fe', 'fo',
            'fya', 'fyu', 'fyo',
            'bya', 'byi', 'byu', 'bye', 'byo',
            'vya', 'vyi', 'vyu', 'vye', 'vyo',
            'pya', 'pyi', 'pyu', 'pye', 'pyo',
            'mya', 'myi', 'myu', 'mye', 'myo',
            'rya', 'ryi', 'ryu', 'rye', 'ryo',
            'wi', 'we', 'ye'
        );

        $str = $this->kana_replace($str, $kana, $romaji);

        $kana = array(
            'あ', 'い', 'う', 'え', 'お',
            'か', 'き', 'く', 'け', 'こ',
            'さ', 'し', 'す', 'せ', 'そ',
            'た', 'ち', 'つ', 'て', 'と',
            'な', 'に', 'ぬ', 'ね', 'の',
            'は', 'ひ', 'ふ', 'へ', 'ほ',
            'ま', 'み', 'む', 'め', 'も',
            'や', 'ゆ', 'よ',
            'ら', 'り', 'る', 'れ', 'ろ',
            'わ', 'ゐ', 'ゑ', 'を', 'ん',
            'が', 'ぎ', 'ぐ', 'げ', 'ご',
            'ざ', 'じ', 'ず', 'ぜ', 'ぞ',
            'だ', 'ぢ', 'づ', 'で', 'ど',
            'ば', 'び', 'ぶ', 'べ', 'ぼ',
            'ぱ', 'ぴ', 'ぷ', 'ぺ', 'ぽ'
        );

        $romaji = array(
            'a', 'i', 'u', 'e', 'o',
            'ka', 'ki', 'ku', 'ke', 'ko',
            'sa', 'shi', 'su', 'se', 'so',
            'ta', 'chi', 'tsu', 'te', 'to',
            'na', 'ni', 'nu', 'ne', 'no',
            'ha', 'hi', 'fu', 'he', 'ho',
            'ma', 'mi', 'mu', 'me', 'mo',
            'ya', 'yu', 'yo',
            'ra', 'ri', 'ru', 're', 'ro',
            'wa', 'wyi', 'wye', 'wo', 'n',
            'ga', 'gi', 'gu', 'ge', 'go',
            'za', 'ji', 'zu', 'ze', 'zo',
            'da', 'ji', 'du', 'de', 'do',
            'ba', 'bi', 'bu', 'be', 'bo',
            'pa', 'pi', 'pu', 'pe', 'po'
        );

        $str = $this->kana_replace($str, $kana, $romaji);

        $str = preg_replace('/(っ$|っ[^a-z])/u', "xtu", $str);
        $res = preg_match_all('/(っ)(.)/u', $str, $matches);
        if(!empty($res)){
        	for($i=0;isset($matches[0][$i]);$i++){
                if($matches[0][$i] == 'っc') $matches[2][$i] = 't';
                $str = preg_replace('/' . $matches[1][$i] . '/u', $matches[2][$i], $str, 1);
            }
        }
        $kana = array(
            'ぁ', 'ぃ', 'ぅ', 'ぇ', 'ぉ',
            'ヵ', 'ヶ', 'っ', 'ゃ', 'ゅ', 'ょ', 'ゎ', '、', '。', ' '
        );
         
        $romaji = array(
            'a', 'i', 'u', 'e', 'o',
            'ka', 'ke', 'xtu', 'xya', 'xyu', 'xyo', 'xwa', ', ', '.', ' '
        );
        $str = $this->kana_replace($str, $kana, $romaji);
        $str = preg_replace('/^ー|[^a-z]ー/u', '', $str);
        $res = preg_match_all('/(.)(ー)/u', $str, $matches);

        if($res){
        	for($i=0;isset($matches[0][$i]);$i++){
                if( $matches[1][$i] == "a" ){ $replace = 'â'; }
                else if( $matches[1][$i] == "i" ){ $replace = 'î'; }
                else if( $matches[1][$i] == "u" ){ $replace = 'û'; }
                else if( $matches[1][$i] == "e" ){ $replace = 'ê'; }
                else if( $matches[1][$i] == "o" ){ $replace = 'ô'; }
                else { $replace = ""; }
                 
                $str = preg_replace('/' . $matches[0][$i] . '/u', $replace, $str, 1);
            }
        }
        return $str;
	}

	function kana_replace($str, $kana, $romaji){
		$patterns = array();
		foreach($kana as $value){
			$patterns[] = "/" . $value . "/";
		}
		$str = preg_replace($patterns, $romaji, $str);
		return $str;
	}
}

なるほど、プログラムの中に辞書を作っておいて、変換してる訳ね。

PHPの和暦→西暦

ini_set('display_errors', "On");

function seireki($wareki_year){

	$wareki_year = str_replace("元年", "1年", mb_convert_kana($wareki_year, "n"));

	if(preg_match('!^(明治|大正|昭和|平成|令和)([0-9]+)年$!', $wareki_year, $matches)){

		$era_name = $matches[1];
		$year = intval($matches[2]);

		if($era_name === "明治"){
			$year += 1867;
		} else if($era_name === "大正"){
			$year += 1911;
		} else if($era_name === "昭和"){
			$year += 1925;
		} else if($era_name === "平成"){
			$year += 1988;
		} else if($era_name === "令和"){
			$year += 2018;
		}

		return $year . "年";
	}
	return null;
}
echo seireki("平成元年");

$ php index.php
1989年

preg_matchで元号と年を分割する訳ね。なるほど、ロジックはわかった。

PHPの西暦→和暦変換

ini_set('display_errors', "On");

function wareki($year){

	$eras = array(
		array('year' => 2018, "name" => "令和"),
		array('year' => 1988, "name" => "平成"),
		array('year' => 1925, "name" => "昭和"),
		array('year' => 1911, "name" => "大正"),
		array('year' => 1867, "name" => "明治")
	);

	foreach($eras as $era){

		$base_year = $era['year'];
		$era_name = $era['name'];

		if($year > $base_year){
			$era_year = $year - $base_year;

			if($era_year === 1){
				return $era_name . "元年";
			}

			return $era_name . $era_year ."年";
		}
	}
	return null;
}

echo wareki(1989);

$ php index.php
平成元

なるほど、これは凄い

数字のカンマ、カンマ削除

$num = 100000;
echo number_format($num);

$ php index.php
100,000

カンマ除去

$num = "100,000";
echo str_replace(",", "", $num);

$ php index.php
100000

半角カナ→全角カナ

$str = "キャピタルメディア";
echo mb_convert_kana($str, "KV");

$ php index.php
キャピタルメディア

全角カナ→半角カナ

$str = "キャピタルメディア";
echo mb_convert_kana($str, "kV");

$ php index.php
キャピタルメディアva

カナ以外にも、数字、英字、スペースも変換できる。なるほど。

日付変換

$date = "20230321";
echo date("Y/m/d", strtotime($date));

php index.php
2023/03/21

$date = "20230321";
echo date("Y年m月d日", strtotime($date));

$ php index.php
2023年03月21日

ゼロパディング、前ゼロ除去

ゼロパディング

$num = 7;
$num2 = sprintf('%03d', $num);
echo $num2;

$ php index.php
007

前ゼロ除去
L intにキャスト

$str = "00070";
$str = (int)$str;
echo $str;

ltrim

$str = "00070";
$str = ltrim($str, 0);
echo $str;

php 文字列の結合

$intermediate = "-";
$var1 = "いつかは";
$var2 = "ゆかし";
$joined = $var1 . $intermediate . $var2;
echo $joined;

$ php index.php
いつかは-ゆかし

php 真偽値

$var = true;
if($var){
	echo "成功";
} else {
	echo "失敗";
}

$ php index.php
成功

$var = false;
if($var){
	echo "成功";
} else {
	echo "失敗";
}

$ php index.php
失敗

ifでtrue, falseを判定できる

pythonのdebug

pdbを使用できる

import pdb

def factorial(n, sum=0):
	if n == 0:
		return sum

	pdb.set_trace()
	sum += n
	print(sum)
	return factorial(n-1, sum)

if __name__ == "__main__":
	factorial(5)
$ python3 test.py
> /home/vagrant/dev/test/test.py(8)factorial()
-> sum += n
(Pdb) bt
  /home/vagrant/dev/test/test.py(13)<module>()
-> factorial(5)
> /home/vagrant/dev/test/test.py(8)factorial()
-> sum += n
(Pdb) list
  3  	def factorial(n, sum=0):
  4  		if n == 0:
  5  			return sum
  6  	
  7  		pdb.set_trace()
  8  ->		sum += n
  9  		print(sum)
 10  		return factorial(n-1, sum)
 11  	
 12  	if __name__ == "__main__":
 13  		factorial(5)
(Pdb) 

Pythonのテストコード

# coding:utf-8

import unittest
import fizzbuzz as fb

class FizzBuzzTest(unittest.TestCase):
	def setUp(self):
		pass

	def tearDown(self):
		pass

	def test_normal(self):
		self.assertEqual(1, fb.fizzbuzz(1))

	def test_fizz(self):
		self.assertEqual("Fizz", fb.fizzbuzz(3))

	def test_buzz(self):
		self.assertEqual("Buzz", fb.fizzbuzz(5))

	def test_fizzbuzz(self):
		self.assertEqual("FizzBuzz", fb.fizzbuzz(3))

if __name__ == "__main__":
	unittest.main()

メインコード

# coding:utf-8

def fizzbuzz(number):
	if number % 15 == 0:
		return "FizzBuzz"
	if number % 5 == 0:
		return "Buzz"
	if number % 3 == 0:
		return "Fizz"

	return number

if __name__ == "__main__":
	for i in range(1, 101):
		print(fizzbuzz(i)) 

t$ python3 test_fizzbuzz.py
..F.
======================================================================
FAIL: test_fizzbuzz (__main__.FizzBuzzTest)
———————————————————————-
Traceback (most recent call last):
File “test_fizzbuzz.py”, line 23, in test_fizzbuzz
self.assertEqual(“FizzBuzz”, fb.fizzbuzz(3))
AssertionError: ‘FizzBuzz’ != ‘Fizz’
– FizzBuzz
+ Fizz

———————————————————————-
Ran 4 tests in 0.002s

FAILED (failures=1)