Luzhiled's Library

This documentation is automatically generated by competitive-verifier/competitive-verifier

View the Project on GitHub ei1333/library

:warning: other/poyopoyo-pudding.hpp

Code

/**
 *  🍮 PoyoPoyoPudding 🍮
 *
 *  - 最大 10 層までプリンを重ねられる。
 *  - 各層には「甘さ (0-100)」と「弾力 (0-100)」を保持。
 *  - addLayer でプルプルを追加、eatTop で一口たべる。
 *  - shake でランダムに弾力が変わる(ぷるん♪)。
 *  - operator<< で可視化。🍮
 */
struct PoyoPoyoPudding {
  struct Layer {
    uint8_t sweetness;    // 0-100
    uint8_t springiness;  // 0-100
  };

  static constexpr size_t kMaxLayers = 10;

  // ---- 状態 ---- //
  std::array<Layer, kMaxLayers> layers{};
  std::size_t top = 0;  // 現在の層数

  // ---- 挙動 ---- //
  bool addLayer(uint8_t sweet, uint8_t spring) {
    if (top == kMaxLayers) return false;
    layers[top++] = {sweet, spring};
    return true;
  }

  bool eatTop() {
    if (top == 0) return false;
    --top;
    return true;
  }

  void shake() {
    mt19937 rng{static_cast<uint32_t>(
        std::chrono::steady_clock::now().time_since_epoch().count())};
    std::uniform_int_distribution<int> dist(-5, +5);
    for (std::size_t i = 0; i < top; ++i) {
      int v = static_cast<int>(layers[i].springiness) + dist(rng);
      layers[i].springiness = static_cast<uint8_t>(std::clamp(v, 0, 100));
    }
  }

  // ---- デバッグ/鑑賞用 ---- //
  friend ostream& operator<<(ostream& os, const PoyoPoyoPudding& p) {
    os << "🍮 PoyoPoyoPudding (" << p.top << " / " << kMaxLayers
       << " layers)\n";
    for (size_t i = p.top; i-- > 0;) {
      const auto& L = p.layers[i];
      os << "  ├─ Layer " << setw(2) << i << " | Sweet " << setw(3)
         << int(L.sweetness) << " | Spring " << setw(3) << int(L.springiness)
         << '\n';
    }
    return os;
  }
};
#line 1 "other/poyopoyo-pudding.hpp"
/**
 *  🍮 PoyoPoyoPudding 🍮
 *
 *  - 最大 10 層までプリンを重ねられる。
 *  - 各層には「甘さ (0-100)」と「弾力 (0-100)」を保持。
 *  - addLayer でプルプルを追加、eatTop で一口たべる。
 *  - shake でランダムに弾力が変わる(ぷるん♪)。
 *  - operator<< で可視化。🍮
 */
struct PoyoPoyoPudding {
  struct Layer {
    uint8_t sweetness;    // 0-100
    uint8_t springiness;  // 0-100
  };

  static constexpr size_t kMaxLayers = 10;

  // ---- 状態 ---- //
  std::array<Layer, kMaxLayers> layers{};
  std::size_t top = 0;  // 現在の層数

  // ---- 挙動 ---- //
  bool addLayer(uint8_t sweet, uint8_t spring) {
    if (top == kMaxLayers) return false;
    layers[top++] = {sweet, spring};
    return true;
  }

  bool eatTop() {
    if (top == 0) return false;
    --top;
    return true;
  }

  void shake() {
    mt19937 rng{static_cast<uint32_t>(
        std::chrono::steady_clock::now().time_since_epoch().count())};
    std::uniform_int_distribution<int> dist(-5, +5);
    for (std::size_t i = 0; i < top; ++i) {
      int v = static_cast<int>(layers[i].springiness) + dist(rng);
      layers[i].springiness = static_cast<uint8_t>(std::clamp(v, 0, 100));
    }
  }

  // ---- デバッグ/鑑賞用 ---- //
  friend ostream& operator<<(ostream& os, const PoyoPoyoPudding& p) {
    os << "🍮 PoyoPoyoPudding (" << p.top << " / " << kMaxLayers
       << " layers)\n";
    for (size_t i = p.top; i-- > 0;) {
      const auto& L = p.layers[i];
      os << "  ├─ Layer " << setw(2) << i << " | Sweet " << setw(3)
         << int(L.sweetness) << " | Spring " << setw(3) << int(L.springiness)
         << '\n';
    }
    return os;
  }
};
Back to top page