ファイル名にプレフィックスをつけるコマンド

add_prefix() {
    # 使い方:add_prefix [プレフィックス] [--execute]
    local prefix="$1"
    local mode="$2"

    if [ -z "$prefix" ]; then
        echo "エラー: プレフィックス(追加する文字列)を指定してください。"
        echo "使い方: add_prefix <文字列> [--execute]"
        return 1
    fi

    # ディレクトリ内の全てのファイル(隠しファイルを除く)をループ
    for file in *; do
        # ディレクトリなどは除外し、通常のファイルのみを対象にする場合
        if [ -f "$file" ]; then
            local new_name="${prefix}${file}"
            
            if [ "$mode" = "--execute" ]; then
                mv "$file" "$new_name"
                echo "変更完了: $file -> $new_name"
            else
                echo "[シミュレーション] $file -> $new_name"
            fi
        fi
    done

    if [ "$mode" != "--execute" ]; then
        echo "--------------------------------------------------"
        echo "⚠️  まだ実際の変更は行われていません。"
        echo "実際に実行する場合は、末尾に --execute をつけてください。"
        echo "例: add_prefix $prefix --execute"
    fi
}

ファクトリーパターン

実装例

// 生成のロジックを一箇所に集約する
function createNotification(type: string): Notification {
  if (type === 'email') return new EmailNotification();
  if (type === 'sms') return new SMSNotification();
  throw new Error('Unknown type');
}

メモ

  • インスタンスの生成を隠蔽する。つまり、引数に応じて違うクラスをnewしてインスタンスをreturnする。
  • controllerとmodelの間にserviceを作りビジネスロジックを作るとかに考え方は似ている気がする。

ストラテジーパターン

概念

  • 方法だけを渡せるので便利

使わない実装

  • 分岐が増えて困る
  • 修正漏れの可能性
  • ただの文字列なので静的解析も効かないので大変そう
<?php

// 決済処理を行うクラス
class OrderProcessor 
{
    public function __construct(
        private float $amount
    ) {}

    // 決済方法が増えるたびに、このメソッドの中に if/case が増えていく
    public function processPayment(string $method): void 
    {
        if ($method === 'credit_card') {
            echo "クレジットカード決済で ¥" . $this->amount . " を支払いました。\n";
        } elseif ($method === 'paypay') {
            echo "PayPay決済で ¥" . $this->amount . " を支払いました。\n";
        } else {
            echo "未対応の決済方法です。\n";
        }
    }
}

// --- 実行コード ---
$order = new OrderProcessor(1500);

// 決済方法の文字列を渡して実行
$order->processPayment('credit_card');
$order->processPayment('paypay');

使う実装

  • 決済を実行するだけのクラスと、決済方法のクラスを分けて、もらったものを実行するだけ
  • 方法をいくらでも増やせそう
<?php
// 1. 共通のインターフェース(作戦のルール)を決める
interface PaymentStrategy 
{
    public function pay(float $amount): void;
}

// 2. 具体的な決済方法(作戦A)をクラス化
class CreditCardPayment implements PaymentStrategy 
{
    public function pay(float $amount): void 
    {
        echo "クレジットカード決済で ¥" . $amount . " を支払いました。\n";
    }
}

// 3. 具体的な決済方法(作戦B)をクラス化
class PayPayPayment implements PaymentStrategy 
{
    public function pay(float $amount): void 
    {
        echo "PayPay決済で ¥" . $amount . " を支払いました。\n";
    }
}

// 4. 決済を実行する本体(コンテキスト)
class OrderProcessor 
{
    public function __construct(
        private float $amount
    ) {}

    // 決済を実行するメソッド(引数で「どの作戦(オブジェクト)を使うか」を受け取る)
    public function processPayment(PaymentStrategy $paymentMethod): void 
    {
        // 使う側は if文を持たず、渡されたオブジェクトの pay() を呼ぶだけ
        $paymentMethod->pay($this->amount);
    }
}

// --- 実行コード ---
$order = new OrderProcessor(1500);

// クレジットカードで支払う場合(オブジェクトを直で渡す)
$order->processPayment(new CreditCardPayment());

// PayPayで支払う場合
$order->processPayment(new PayPayPayment());

【AC】A - Mod While Positive

振り返り

  • 前回のC問題で理解を重視したからか、標準入力含め検索などせず10分かからず解けたと思うのでよかった
  • MとNを間違えてちょっとだけコードテストをやり直したが、1回でACだったのでよかった
  • A問題を素早く解くのも楽しい。B問題もそのようにできると良さそう。C問題も時間かけて理解するのは楽しかったので引き続きやっていきたい
  • 数学も骨太な算数から、基礎的な中高の数学を学び基礎と、競プロなどで応用的なものも楽しんでいきたい
  • 反復や書き写すだけで処理してしまうより、かなり時間かかっても理解を目指す方が、結局忘れなくて早い。定義を明確に、ユースケースをたくさん見る、歴史を見る。

回答

N,M=map(int, input().split())
cnt=0
for i in range(1000):
  M=N%M
  cnt+=1
  if (M<=0):
    print(cnt)
    break