この言い方だとポシンタン感あるな
This account is not set to public on notestock.
コンパイラ Clang に変えたら通った
単に GCC が最新の機能を追従していなかっただけと考えられる
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
#include <algorithm>
#include <array>
#include <concepts>
#include <cstddef>
#include <iostream>
#include <optional>
#include <ranges>
#include <unordered_set>
namespace {
constexpr std::size_t MemoSize = 100;
std::array<std::array<std::optional<unsigned int>, MemoSize>, MemoSize> memo {};
} // namespace
unsigned int
NimSum(unsigned int lhs, unsigned int rhs);
template<typename T>
std::unordered_set<T>
operator|(const std::unordered_set<T> & lhs, const std::unordered_set<T> & rhs);
template<std::unsigned_integral N>
N
Mex(const std::unordered_set<N> s);
int
main()
{
std::cout << NimSum(3, 5) << "\n";
return 0;
}
unsigned int
NimSum(unsigned int lhs, unsigned int rhs)
{
std::optional<unsigned int> & memoValue = memo[lhs][rhs];
if (memoValue.has_value()) {
return memoValue.value();
}
std::unordered_set<unsigned int> leftSet(
std::from_range,
std::views::iota(0u, lhs) |
std::views::transform([&rhs](unsigned int n) { return NimSum(n, rhs); })
);
std::unordered_set<unsigned int> rightSet(
std::from_range,
std::views::iota(0u, rhs) |
std::views::transform([&lhs](unsigned int n) { return NimSum(lhs, n); })
);
unsigned int result = Mex(leftSet | rightSet);
memoValue = result;
return result;
}
template<typename T>
std::unordered_set<T>
operator|(const std::unordered_set<T> & lhs, const std::unordered_set<T> & rhs)
{
std::unordered_set<T> result {lhs};
result.insert_range(rhs);
return result;
}
template<std::unsigned_integral N>
N
Mex(const std::unordered_set<N> s)
{
for (auto && n : std::views::iota(N())) {
if (!s.contains(n)) {
return n;
}
}
}
This account is not set to public on notestock.
あっおい待てい(江戸っ子)
符号なし整数のオーバーフローはラップアラウンドすると規格で定められているはずだゾ
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
This account is not set to public on notestock.
C++って永遠に可算年くらい前みたいな泥臭いコーディングする地獄かと思ってたけど意外と新しい機能もあるんやなって
std::unordered_map::contains が C++20 になるまで入ってなかったのはどん判って感じだけど
C++er、約 9 年間 someMap.contains(x) の代わりに someMap.find(x) != someMap.end() 使わされてたらしい
map はともかく set で考えると、集合とかいう「含むか含まないか」という意味論しか持たねえコンテナで「含む」という述語が入ってないのはおかしいだろそれよぉ?