この言い方だとポシンタン感あるな
このアカウントは、notestockで公開設定になっていません。
コンパイラ Clang に変えたら通った
単に GCC が最新の機能を追従していなかっただけと考えられる
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、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;
}
}
}
このアカウントは、notestockで公開設定になっていません。
あっおい待てい(江戸っ子)
符号なし整数のオーバーフローはラップアラウンドすると規格で定められているはずだゾ
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
このアカウントは、notestockで公開設定になっていません。
C++って永遠に可算年くらい前みたいな泥臭いコーディングする地獄かと思ってたけど意外と新しい機能もあるんやなって
std::unordered_map::contains が C++20 になるまで入ってなかったのはどん判って感じだけど
C++er、約 9 年間 someMap.contains(x) の代わりに someMap.find(x) != someMap.end() 使わされてたらしい
map はともかく set で考えると、集合とかいう「含むか含まないか」という意味論しか持たねえコンテナで「含む」という述語が入ってないのはおかしいだろそれよぉ?