惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
T
The Exploit Database - CXSecurity.com
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
T
Tailwind CSS Blog
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
IT之家
IT之家
PCI Perspectives
PCI Perspectives
腾讯CDC
酷 壳 – CoolShell
酷 壳 – CoolShell
Recent Commits to openclaw:main
Recent Commits to openclaw:main
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
N
News and Events Feed by Topic
博客园 - 三生石上(FineUI控件)
Help Net Security
Help Net Security
雷峰网
雷峰网
有赞技术团队
有赞技术团队
Last Week in AI
Last Week in AI
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
量子位
GbyAI
GbyAI
O
OpenAI News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
AI
AI
S
Security Affairs
F
Fortinet All Blogs
L
LINUX DO - 最新话题
博客园 - 【当耐特】
Webroot Blog
Webroot Blog
Schneier on Security
Schneier on Security
W
WeLiveSecurity
Security Latest
Security Latest
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Tenable Blog
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
Simon Willison's Weblog
Simon Willison's Weblog
Cyberwarzone
Cyberwarzone
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
C
CERT Recently Published Vulnerability Notes
Engineering at Meta
Engineering at Meta
P
Palo Alto Networks Blog
博客园 - 叶小钗
T
Threatpost
H
Heimdal Security Blog
Microsoft Security Blog
Microsoft Security Blog

hayato

Chromium's DOM Deep Dive: Understanding Shadow DOM and Tree Structures - hayato Introducing the Task Scheduler in Chromium's Network Stack: A 0.3% Improvement in Loading Speed - hayato 出版のお知らせ 「普通の人が資産運用で99点をとる方法とその考え方」 - hayato Resource loading with Content Addressable Bundles - hayato 普通の人が資産運用で99点をとる方法とその考え方 - hayato Imperative Shadow DOM Distribution API - hayato Google にソフトウェアエンジニアとして入社して 10 年と 10 日がたちました - hayato Web のつくりかた: ソフトウェアエンジニアリングと雰囲気で理解する Web 標準とブラウザのつくりかた - hayato ブラウザのしくみ: データ構造とアルゴリズムと雰囲気で理解する DOM と Shadow DOM - hayato Rust が最強のプログラミング言語である証明 - hayato 六本木ではたらくソフトウェアエンジニアへのよくある質問とその答え (FAQ) (2015 - 2017) - hayato What's New in Shadow DOM v1 (by examples) - hayato Simple timer application for the pomodoro technique - hayato Google の面接試験で出る (はずがない)「海賊と金貨」問題を空気を読まないでプログラムで解いてみる - hayato hayato.io (4topcoder) - hayato SRM432 - hayato SRM405 - hayato SRM386 - hayato SRM385 - hayato SRM384 - ゲーム - hayato SRM369 - hayato SRM368 - hayato SRM366 - typo 2 連発 - hayato Python - generator で素数生成 - hayato New Launguage - 新言語追加の予定? - hayato lxml で HTML スクレーピング - hayato SRM358 - Today is a Bad Day (-50). - hayato SRM349 FizzBuzz 問題が簡単すぎるそんなあなたへ。「赤いマーブル問題」。 - hayato Suffix Array - hayato google-code-prettify を導入してみる - hayato Subset の生成 - hayato 2006 年のまとめ - SRM332 - hayato Google Code Jam 2006 - Championship Round - hayato Blogger Beta に移行 - hayato Google Code Jam 2006 - Round1 に挑戦 - Generics と AutoBoxing - hayato Google Code Jam 2006 - Qualification Round 通過 - hayato Google Code Jam 2006 - Qualification Round に挑戦 - hayato Google Code Jam 2006 - Practice1 - hayato Google Code Jam 2006 - 開催決定 - hayato Stay tuned... Global Google Code Jam 2006 - 秋に開催? - hayato SRM308 - Hard DP - hayato SRM304 - 条件付確率 - hayato JavaWorld に寄稿しました - hayato 2006 TopCoder Open Final Round - hayato IBM Rational Software Development Forum Tokyo で講演します - hayato SRM298 - ひとふで書き - hayato SRM293 - ビンゴ - hayato 2006 TopCoder Open - Round1 撃墜 - hayato 2006 TopCoder Open - Odds 発表 - hayato 2006 TopCoder Open Qualification Round - hayato SRM291 - OutOfMemory - hayato デブサミ 2006 で講演します - hayato SRM281 - 2006 年はポイントゼロスタート - hayato SRM280 - Challenge 祭り - hayato SRM277 - 初賞金げっと - hayato マラソン・マッチ - hayato reStructuredText で blogger - hayato 2006 TopCoder Open - NSA がスポンサーに - hayato SRM276 - お買い物は楽しく DP で - hayato SRM273 - bit 演算は int で行われるのね - hayato SRM272 - Division1 - 4 度目の正直 - hayato JavaOne Tokyo で講演します - hayato SRM270 - Integer == Integer - hayato SRM268 - Division2 脱出 - hayato SRM266 - NASA, we have a problem... - hayato SRM265 - Division2 落ち... - hayato SRM262 - 初 Division1 は Typo に終わる - hayato SRM260 - TopCoder への挑戦のはじまり - hayato
SRM287 - 気分は中学生?連立2元方程式 - hayato
2006-02-04 · via hayato

SRM287 に挑戦. 1 ヶ月ぶりの参戦.

300 点問題.以下のような 2 つの文字列が与えられます.

"1*X + 2*Y = 6"
"1*X + (-4)*Y = (-3)"

連立 2 元方程式です.「中学生か俺は?」でした..これを解いて,解が唯一存在するならば,以下のように解を文字列で

"X=(-7)/3 Y=3/4"

解がないならば

"NO SOLUTIONS"

を,解が複数存在するならば

"MULTIPLE SOLUTIONS"

を返しなさい.という問題です. 250 点問題ではなく 300 点問題ですのでちょっと面倒です.ですがそれほど難しい問題ではないと一見思ったのですが..

方針としては,各係数 A1-A3, B1-B3

A1 * X + A2 * Y = A3
B1 * X + B2 * Y = B3

をパースしてから,

int det = A1 * B2 - A2 * B1;
int x = B2 * A3 - A2 * B3;
int y = A1 * B3 - B1 * A3;

を計算して,det == 0 ならば,「解がない」 か 「解が複数」

if (det == 0) {
    if (x == 0) {
        return "MULTIPLE SOLUTIONS";
    }
    return "NO SOLUTIONS";
}

それ以外ならば, 「解がひとつ」ということで,

"X=x/det Y=y/det"

として,約分等・正しくフォーマットして返せばよい.これでいけると思って Submit したのですが,甘かったです.

これだけでは,以下のような係数がゼロの場合に対処できませんでした.

"0*X + 0*Y = 1"
"0*X + 0*Y = 2"

この場合は,正しい正解は"NO SOLUTIONS"ですが,上記ロジックだけだと"MULTIPLE SOLUTIONS"を返してしまいます.

以下のように係数ゼロを特別に扱う必要性がありました.

if (A1 == 0 && A2 == 0 && A3 != 0) return "NO SOLUTIONS";
if (B1 == 0 && B2 == 0 && B3 != 0) return "NO SOLUTIONS";
if (A1 == 0 && B1 == 0 && (A2 * B3 - B2 * A3) != 0) return "NO SOLUTIONS";
if (A2 == 0 && B2 == 0 && (A1 * B3 - B1 * A3) != 0) return "NO SOLUTIONS";

私も含めて多くの人はゼロのケースを考慮しない Code を書いてしまったようです.これに気づいた人は,チャレンジタイムで大稼ぎしていました.

この問題の Division1 での正解率は 11%,同じ問題が Division2 のレベル 2 問題にも使用されていましたが Division2 ではなんと正解率 0%,誰ひとり正解できなかったようです..

Problem Stats

450 点問題.

「ムーアの法則」: コンピュータのスピードは,18 ヶ月で 2 倍になる

今,計算を始めると 14 年かかる問題があるとします.今すぐ始めるのではなく,18 ヶ月待ってスピードが 2 倍の新しいコンピュータを買ってそれで計算を始めると 7 年ですみます. 14 年かかる計算が,合計 (1.5 + 7 = ) 8.5 年ですむわけです.この例だと,約 4 年まってから計算を始めるのがベストです.合計( 4 + 2.2 = ) 6.2 年ですみます.

このように,計算にかかる年数 (years) が与えられた場合,ムーアの法則が成り立つとすると,最短・今から何年後に計算を終わらせることができるでしょうか?という問題です.いつ新しいコンピュータを買い計算をはじめるか?がポイントになります.

x 年後に,新しいコンピュータを買って計算を始めるとすると,トータルでは

y = x + (years / 2^(x / 1.5) )

かかることになります.この y が最小になる x を探せばよいことになります.数学的に解くことはできるのでしょうが(微分してゼロになるところを求める)..数学的に悩むよりは,このような U 字型の関数の場合は, いわゆる binary search ではなく,ternary search で,y が最小になる x を探すことができます.

ternary search

区間 ( [left, right] ) 内の 2 点(x1, x2)をとり,y1, y2 を計算して,

  • y1 > y2 ならば,left = x1
  • y1 < y2 ならば,right = x2

として,区間を狭めていけば,最終的には,最小の y をとる xa にたどり着きます.

public class MooresLaw {

  public double shortestComputationTime(int years) {

      double left = 0;
      double right = years;

      while (right - left > 1e-11) {
          double x1 = (left * 2 + right) / 3.0;
          double x2 = (left + right * 2) / 3.0;
          if (cal(x1, years) > cal(x2, years)) {
              left = x1;
          } else {
              right = x2;
          }
      }
      return cal(right, years);
  }

  double cal(double x, int years) {
      return x + years / Math.pow(2, x / 1.5);
  }

SRM 中は,x 年後のコンピュータのスピードが,Math.pow(2, x / 1.5) で表せることにきずかず,前半部分・回りくどいことをしていまいました...なんとか正解しましたが.

1000 点問題. Open したものの,手が出ず..

結果

System Test の結果です. ( Room Statistics )

Room Statistics

全体的にポイントが低かったためか,レーティングは 1542 -> 1626 と上昇しました.