simbelmynë :: diary

小児科医療 & 趣味はコンピュータいじりです

HPVワクチンの副反応?に対する報道(2016/3/16)についての物言い

(いろいろと読み解いてみましたが、もし間違いがあったら指摘してください!)

2016/6/21追記

この記事を書いた時はかなり慎重な態度をとりました。池田班の発表はスライドを見る限り信ぴょう性に乏しいのですが、断言はしませんでした。また、統計の誤りについては報道側の誤解ではないか、という表記をしました。自分はこの発表会を直接聞いておらず、そこまでの断定ができなかったためです。

また、疑わしいとは思いつつも、池田教授がまさかこんな、あからさまで、だれが見ても分かるような、誤った統計によるミスリードを狙ったり、研究結果を自分の出したい結論にあうように部分抽出する(チェリーピッキング)を行うとは思いがたい、そうではないと思いたかったからでもあります。

その後、Wedge様にてこのような記事が出たり、
子宮頸がんワクチンと遺伝子 池田班のミスリード 利用される日本の科学報道(前篇) WEDGE Infinity(ウェッジ)

子宮頸がんワクチン「脳障害」に根拠なし 誤報の震源は医学部長 利用される日本の科学報道(中篇) WEDGE Infinity(ウェッジ)

あまつさえ、今回このような記事が出たりするにあたり、
子宮頸がんワクチン薬害研究班に捏造行為が発覚 利用される日本の科学報道(後篇) WEDGE Infinity(ウェッジ)

記事の内容が正しいとすればですが、これは報道側の誤解というより、池田班側の科学的犯罪という印象が濃厚となってきました。子宮頸癌を防ぐ方法に間違ったレッテルを貼り普及を妨げることは、将来多くの人命を失わせる結果に繋がります。それがわかっていてなお、自分の誤りを認められず、意図的な編集を加えたスライドで印象操作を行ったとすれば、これはたいへん悪質だと言わざるを得ません。

具体的にどのような研究不正が行われたかについては、宮川剛先生のこのtweetに始まる一連のお話が、参考になると思います。



この記事を書いた時点での私の慎重な認識が残念なことに覆されたことを追記します。

もちろん、この誰でも見抜けるようなちゃちな科学的犯罪を見抜けず、大騒ぎをして間違いを市中に広めてしまった、各報道機関の責任はいずれ追求されてしかるべきであろうと思います。

追記終わり。




子宮頸がんワクチン副反応「脳に障害」 国研究班発表(TBS)
http://news.tbs.co.jp/newseye/tbs_newseye2727277.html

3月16日、こんなニュースが報道されました。各局、各新聞、ほぼ同様の内容を横並びで報道しています。

これは同日、厚生労働省にて開催された「ヒトパピローマウイルス感染症の予防接種後に生じた症状に関する厚生労働科学研究事業成果発表会」での発表を受けてのものです。

このようなタイトルで報道されると、一般の人は「ええっ」と思いますよね。自分もちょっと驚きました。なにか、HPVワクチンの副反応に明確な原因や、疫学的な根拠が示されたのかと思いました。ですが、その後ツイッターのタイムラインを見ていると、どうもそうではなく、2つの意見の発表があって、そのうち(同意する専門家の少ないほうの)片方だけがセンセーショナルに報道された、ということのようでした。

専門家の間ではとてもそうは思われない、同意する専門家が少ないような意見であっても、報道でそれが増幅されると、一般の方にはそれがまるで真実であるかのように伝わってしまいます。自分はたまたま医学の分野で仕事をしていますから、この報道がナンセンスだとわかりますが、他の分野で同じようなことがあれば見抜けないかもしれません。しかしこの問題は、比較的若い女性、例えば小さい子供を持つ母親、が癌で亡くなるケースを如何に減らすかという問題に直結するわけですから、このような発表と報道には多少の感情も含みつつ、説明を試みたいと思います。

2つの発表のスライドは以下で公開されております。
ヒトパピローマウイルス感染症の予防接種後に生じた症状に関する厚生労働科学研究事業成果発表会審議会資料 |厚生労働省

なお、すでに大御所青木先生&毎日いんふぇくしょん編集部様のご解説もありますので、そちらも御覧ください。
HPVワクチン 接種後体調変化の報道 と その周辺 2016年3月 - 感染症診療の原則

どのような発表があったのか

この発表会ですが、まず「発表会であること」に留意してください。真実を発見したわけではありません。
1 池田修一先生(他8名)のグループ
2 牛田享宏先生(他40名以上)のグループ
です。

このうち、報道されたのは1のグループの方の内容で、2は報道には殆ど入っていないと思います。1のグループの発表内容がどのようなものであったか、詳しく見てみます。

池田修一先生のグループの発表内容

大きくわけて以下の様な部分にわけられます。

  • 信州大学を受診した副反応を疑われる123例の要約 5例の症例報告を含む
  • 副反応を呈しやすいHLA型(白血球の血液型)があるのではないかという話
  • モデルマウスを作成した話

これらをすこし詳しく見て、なぜ私がそして多くの一般の医師が「これはちょっと・・・」と感じるのかを、説明できればと思います。

症例要約、症例報告の部分

123例のうち、副反応を否定できなかったのが98例だそうです。
その98例の主な症状が、以下のようにまとめられていました。
f:id:simbelmyn:20160318152604j:plain

そして、それらの症状が、HPVワクチン接種からどれくらいの期間が空いて発現したのかを示したのが以下の表です。
f:id:simbelmyn:20160318152636j:plain

なるほど、確かに接種後に多彩な症状が起きていますが、これらはこの年齢(10〜15歳)の時期だとよく見られる症状です。実際、私も外来でこれらの症状を呈する患者さんを診察し、対応することがよくあります。
ですから、(この手の話では本当によくいわれることですが)「接種していない人たちにはこれらの症状がどれくらいの頻度で発症してるけど、接種した人たちではそれがこんなに増えたよ!」という比較のデータが必要ですよね。それはなかなか手間とお金がかかることなので、例えば、「症状が出て受診した人たちと、たまたま、偶然、他の症状で病院を受診していた同じ年齢性別の患者さんとで、HPVワクチンを接種していた率がこんなに違いましたよ!」という比較でも、初期は許されます。


報道内容からして、そんなデータが得られて発表されたのかと私は思いました。だからちょっと驚いたのです。しかし発表内容をみるとどうもそうではありません。ただ症状が出た人たちについて羅列があるだけで、HPVワクチンが原因であると推定する根拠はありません。

ここで私はまず報道側に抗議したいです。この発表内容でHPVワクチンと症状を結びつけることはできないはずですが、それは報道する側もわかっているはずです。それなのに、まるで関係性が明らかであるような内容で報道するのは、(この点については後述しますが)悪魔の所業といって良いと思います。

第二に、発表されたグループにも言いたい。当然、HPVワクチンとこれらの症状を結びつける根拠が薄いことはわかったうえでの発表だと思いますが、それなのにまるでHPVワクチンそのものが多彩な症状を呈しているかのように発表していらっしゃる。これは良くないことだと私は思います。


例えば、このようなスライドがあるのですが、
f:id:simbelmyn:20160318152843j:plain

右側の「多彩な症状に対する適切な診断がされない不安、緊張」が「高次脳機能障害」を引き起こす、という点は(本当に脳が変化しているのか器質的な変化のない機転なのかは別にして)あり得る視点だと思います。また左側には「接種に伴う疼痛」から「自律神経障害」に矢印がつながっていますが、これもあり得る話ですが、もしそうならばHPVワクチンそのものには関係のない、注射という処置そのものによる副反応であると言えるでしょう。中央の「関節炎」に関しては、根拠が示されていません。


これが、次のスライドになると、
f:id:simbelmyn:20160318153014j:plain

これらの症状がHPVワクチンによる副反応であるとされています。あれ、何かここのつながりを示す根拠、これまでに説明されましたっけ?なぜこんな話のつながりになるのか、私にはわかりませんでした。


次に症例提示。症例1は起立性低血圧(OD)、とくに体位性頻脈(POTS)と診断された症例です。これは本当によく見られる症状でして、たまたま接種後に発症しただけのように思われます。このような発表をするわけですから、何か「そうではない根拠」「HPVワクチンとの関連を示すような根拠」を示すのかとおもいきや、それがありません。
以下、自律神経障害、多発性関節炎、高次脳機能障害、と症例がつづいていきますが、とくにそれらがHPVワクチンの副反応であると考えた、その根拠は示されません。それでいて、ステロイド投与、免疫抑制剤、血液浄化療法などと、かなり治療としては重い副作用を伴うものを実施している施設もあると発表されていて、これは・・・医師の道からはみ出てる・・・のでは・・・。


そしてこのスライド
f:id:simbelmyn:20160318153214j:plain

おそらく、「偶発合併症っていうけど、HPVワクチン後にはこんだけ発症してるよ」、と言いたいのかなと思います。ですが、この文献(JAMA. 2009;302(7):750-7, PMID:19690307)を参照しますと、

Postlicensure safety surveillance for quadrivalent human papillomavirus recombinant vaccine. - PubMed - NCBI

結論のとこに「VAERSのデータでは、これら副反応の発生率は他のワクチン接種後と大差ないよ。ただし失神と静脈塞栓(?)は多いかな」と書いてあります。スライドには膠原病、GBS、横断性脊髄炎の発生がHPVに関連して発症しているように書かれていますが、他のワクチンと大差ないということはつまり、HPVワクチンに特別にこうしたリスクがあるとはいえない、ってことです。一般の人は元の文献まで見ないだろう、と思ったかどうかわかりませんが、私はこれもよくないと思います。

これらの症状を呈しやすいHLA型(白血球の型)があるのではないかという部分

特定のHLA型においてある病気(主に自己免疫疾患)が多いということはよく知られたことですから、HPVワクチン後の症状の原因として自己免疫を疑ったことでHLA型との関連を調べるという着想になっているのだと思います。実際に症状をうったえる患者さんでHLA型を調べてみたところ特定の型が多かったですよ、というのが以下のスライドであります。

f:id:simbelmyn:20160318153359j:plain

例えば、白血球のDPB1という遺伝子座に05:01というタイプを1つでも持っていた人が、14例中10例(71%)であって、実際には遺伝子ですから一人2つずつ持っておりますから、全体の数でいうと観察された遺伝子のうち46%がこの05:01タイプであったということのようです。一般日本人ではこの遺伝子は38.4%に認めますから患者に多いですね・・・って、ええっ?

たかだか10例の検索ですから、これで「多い」とはいえないことは容易におわかりかと思います。偶然かたよることもありますし、遺伝子座はたくさんありますから、ひとつひとつ見ていったら患者群にたまたま多かったタイプも見つかることでしょう。もっと症例数が多ければ違いを見出すことも可能でしょうが、10例20例では無理でしょうね。
しかもこのタイプは東アジアでは最多みたいです。私はこの発表会に参加したわけではないので実際の発表を聞いておりません。ですから、発表者がこのデータをもって「発症者にこのタイプが多い」と言ったとは思えない、さすがにそんなこと言わないだろうと思うわけですが、そういう内容の報道もあります・・・。

脳機能障害、患者8割が同じ遺伝子(毎日新聞 2016/3/16)
http://mainichi.jp/articles/20160317/k00/00m/040/109000c


2016/3/18 13時時点のキャプチャです。強調は私がしました。

毎日新聞のこの報道は一般日本人38.4%のところ患者71%だった、と誤解されてると思うのですが、どうでしょうか。上記のようにこの71%は保有率であって、一人2つ持ってるなかで1つでも対象の遺伝子だった割合を示しているのだと思います。遺伝子の数でいうと、割合は46%です。これと38.4%を比較すべきではないですか。この点はたぶん毎日新聞さんの誤解だと思うのですが、それにしても、そもそも日本人の遺伝子の4割はこのタイプなわけで、絞り込みにもなりません。これがもし本当だったとしても有意義だとは思えず、研究姿勢としても疑問です。

モデルマウスの作成

マウスとヒトは同じ哺乳類ですが、マウスの病態はそのままヒトに当てはめることはできません。大きく異なります。という話かとおもいきや、このマウスはノックアウトマウスで自己免疫疾患を生じやすい奴なんですね。これで自己抗体が産生され海馬から検出されたからといって何かを言って良いのでしょうか。
HPVV報道のNF-κBp50 欠損マウスの解説 - Togetterまとめ

いやまあ参考にはしますが、大きくニュースにしたり政策立案の参考にするレベルではありません。しかもサーバリックスしか投与されていませんがガーダシルはどうしたの?投与はきっとしたんだと思いますが、比較のワクチンも3種類しかないし他のワクチンはどうなの?目立つとこだけ残してデータ削ってないか、ちょっと疑っちゃうんですよね。本論文には全部かいてあるんでしょうか。

牛田享宏先生のグループの発表はどんな感じなの?

なぜ池田先生のほうの発表ばかり報道されるのか全くわかりませんが。
器質的な明確な原因がない痛み(機能性疼痛)について考えようよ、という話です。

牛田先生の発表スライド
http://www.mhlw.go.jp/file/05-Shingikai-10901000-Kenkoukyoku-Soumuka/0000116635.pdf

それは何らかのきっかけ(組織障害、神経障害、それは注射の痛みかもしれません、きっかけは無いかもしれません)があって悪循環に陥ると、実質的な障害がなくても脳が不快な物質を生じ、痛みを感じることがあるのだと、もちろんそれは本人にとっては現実の痛みであって、気のせいでは無いのだと、そういうお話です。そのものずばり、「脅迫的な情報、例として、「この痛みは●●が原因で重症化します」というもの」も悪循環の原因として挙げられています。

f:id:simbelmyn:20160318164046j:plain

思春期の子どもたちはこのような器質的要因のない痛みを訴えることが(HPVワクチン導入より前から)よくあります。実際に慢性的な痛みを感じている子供が中学生の20%前後にみられたという調査結果も示されます。環境要因もあり、ストレスとの関連も示されます。別に強引な論ではなく、正直、小児科医の立場からしますと、まあODの子もPOTSの子もよくみますし、痛みを伴っていることもよくあります。まあそうですよね、ふつうに考えると、という感じで、牛田先生グループの意見に賛成、といった状況であります。

f:id:simbelmyn:20160318161540j:plain
f:id:simbelmyn:20160318161550j:plain

報道が加害者となる可能性について

たとえば、WHOは自殺のニュースについて、「センセーショナルに扱わない」「目立つところに掲載しない」「過剰に報道しない」「詳しい情報を伝えない」など、慎重な対応を求めています。

内閣府:自殺予防 メディア関係者のための手引き(2008年改訂版日本語版)
http://www8.cao.go.jp/jisatsutaisaku/link/kanren.html

HPVワクチンの副反応が疑われる事例についても同様です。牛田先生のスライドに示されていますが、痛みの悪循環を回す要因には「恐怖感」「警戒心」もあるわけです。簡単に省略して言ってしまうと、HPVワクチンの副反応が(実態以上に)喧伝されればされるほど、痛みの悪循環に陥る子どもが増えていってしまうわけです。

もちろん、大部分が器質的に異常のない疼痛だろうと思われても、一部の症例にHPVワクチンを原因として器質的変化が起きている可能性は、あります。可能性を否定することは未来永劫できません。そこに可能性があれば報道するのは報道機関の習性としてやむを得ないのかな、と思うのですが、「実態を超えて恐怖を煽る」「主流の意見をあえて報道しない」「恐怖を伝えるだけでそれが非常に稀であることを伝えない」「実際に痛みがでたらどうしたらよいのかを伝えない」といった対応は好ましくない、というか良くない、というかそれはもう加害者だろうと思うわけであります。

この点は牛田先生のスライドにも現れています。
この発表では、HPVワクチンそのものの副反応による疼痛の存在を否定していません。何事も可能性をいうことは簡単、否定することは難しいからなのですが、
一方で例えば、HPVワクチンの副反応に伴う疼痛に悩まされている、と認識している児がいたとしましょう。私たちはこの子に、「それはHPVワクチンの副反応ではない」とはふつう言いません。なるほど、そういうこともあるかもしれない、まあ無いかもしれないけどそれは置いておいて、とりあえず痛みをコントロールして、まあまあ良い状態で生活できるようにしようぜ、とお話します。得てして親御さんのほうが原因究明に躍起だったりしてそれが痛みの一番の原因だったりしますが、本人にとっては痛みのコントロールが第一です。

f:id:simbelmyn:20160318161327j:plain
名古屋市で行われたアンケート調査でも、接種群、未接種群で、未接種群のほうが症状が多かったりしましたが、
「個々の事例の因果 関係については慎重に判断する必要」という一文が、この問題を繊細に扱う必要があることを表しています。


最初に本人の思いを肯定してしまうと、より悪循環の深みにはまる誘因となります。逆に否定してしまうと、その子は二度と病院に訪れてくれないかもしれません。だから原因はとりあえず脇において、痛みのコントロールから入ると思います。そのあたりの配慮もされているんじゃないかなあと思いました。

私の意見

池田先生のスライド
・多彩な症状があるのはわかったけど、それHPVワクチンと関係無いんじゃない?そこの根拠ありますか?
・そのHLAタイプ、もともと日本人に多いタイプだし、一般日本人と患者群で発現率変わんないし、更に調べるんですか?
・あと毎日新聞はデータの解釈間違ってる?かな?
ノックアウトマウスで自己抗体が海馬に付着している。うむ。それをもとにヒトの政策立案したら、10段階ぐらい飛ばしてるよね(さすがに池田先生はこんなこと言ってないと思う。報道の空気がこれ)。

牛田先生のスライド
・いちおう小児科医の大多数99.9%くらいの意見はこんな感じだと思います。これも報道してほしいんだけど。

報道に対して
・センセーショナルな報道やめてください。それだけで患者数が増えるし余計に患者が見えなくなるんじゃ。あと勘違いが多分に入ってると思う。

私の意見2

慢性的な症状を呈している子どもたち、といっても、回復している方々も多いと思いますが、いま症状が続いている人たち。
HPVワクチンの副反応「ではない」ケースが含まれる、そのようなケースのほうが多い、のではないかと推察いたします。
いまは一部の医師に囲い込まれてしまって、我々にも実態がわかりません。
一部の医師は効果も副作用も未知の投薬を行っています。全体が公表されていないので今のところ評価すらできません。
そのような人たちがメディア報道によってさらに増加し、悪循環に陥ります。
とても不幸なことに思います。

もちろん、そこには本当にHPVワクチンの副反応の人も含まれるかもしれない。
しかし現状では検証が進まないです。なぜなら、本当は副反応ではない人たちが研究対象に多く含まれていたら、有意義な検査方法も治療効果の判定も、症例の紛れのなかに埋没してしまうからです。
インフルエンザの治療について研究をするのに、ウィルスの検出について考えないでほとんどが風邪の人たちを対象に研究したり、しないでしょう?
これも不幸極まりないことです。

また、将来、子宮頸癌で命を落とすであろう人たち。
ワクチンで防げたであろう手術を迫られる人たち。
いま、その未来の被害者に手を差し伸べられる方法がでてきたのに、どんどん延期されている状態です。
そもそも、子宮頸癌の検診頻度を上げなければならないならそのこと自体も幸福ではありません。
本当に、いまのHPVワクチン副反応の頻度は、将来の死亡者を増やしてでも、ワクチン実施に待ったを掛けなければいけない状態ですか?そこまでの状態が、池田先生のスライドから読み取れますか???

政策の立案には、この3つを全部視野に入れる必要があります。
現在症状を呈している人たちを重要視して、将来子宮頸癌で命を落とす人を軽視するのは、私には矛盾して見えます。
(HPVワクチンが子宮頸癌を減らすことは直接観察されていないって?前癌病変が減る段階で十分な検証だし、そもそも前癌病変が減れば検査手術も減るのだから、それだけでも十分幸福になるじゃないか)

発表が自由に公平に行われることには大きな意味があります。
このような記事による他者の発表の自由な吟味にも、同じように意味があることです。
そのうえで、落ち着いて情報を判断して精査に反映されるよう、落ち着いた目で議論を眺められるよう、みんなが意識しないといけませんし、とくに報道は重要です。
報道が加害者になる可能性を十分に考慮してください。平等で、疫学的根拠を踏まえた、皆が幸せになる方向の報道をしていただきたいと思っております。

ノロウィルスの迅速検査は必要か(いや必要ではない)

反語タイトルばかりですが。

流行していますね、ノロウィルス感染症。今年は変異したノロウィルス(GII-P17.GII-17)の流行ということで、予め大規模な流行を予測して病院内に警告を発しておりました。今のところ、当院の地域では例年通りの患者数と思われますが、職員にも何名か発症者がおられてそちらも心配です。

さて、嘔吐下痢の患者さんがいらっしゃったとき、ノロウィルスの感染症かどうかを簡便にしらべる方法として、便を検体としてのノロウィルス迅速検査というものがあります。変異ウィルスにも対応した検査キットも、一応導入しましたよ。
ちなみに、保険適用は3歳未満および65歳以上ですので、対象外の方は実費負担請求となります。
f:id:simbelmyn:20151218144613j:plain


「そもそも迅速検査してノロウィルスだとわかる必要があるのか?」という話題が、毎年あがります。

毎年あがるのですが、これは「議論がある」とか「両論がある」とかいう話ではなくて、現時点での検査キットの性能と、簡単な計算と理屈がわかれば、これはもう「必要ない」で確定です。この結論は揺るがないと思います。なのになぜか、患者さんから求められることしばしば、医者側もあまり考えないで検査することしばしば、という状況なんですよね。どうにかならないのでしょうか。

なぜ検査が必要ないと言えるか

嘔吐下痢症の原因となるウィルスには、主に秋冬のノロウィルス、冬春乳児のロタウィルス、その他のウィルス(アデノウィルス、サポウィルス、アストロウィルスとか)があります。
この中で多いのはノロウィルスとロタウィルスで、とくに流行期には、ほぼこのどちらかと言って良いでしょう。
これら2つは流行期が異なりますから、季節と現在の流行状況がわかれば、このウィルスだろうというある程度の推測が可能、ということですね。

ウィルス性胃腸炎の原因ウィルスはノロとロタが多い
f:id:simbelmyn:20151218145929g:plain

ノロとロタの流行ピークは季節が異なる
f:id:simbelmyn:20151218145926g:plain

出典:広島市 - 感染症トピックス/ノロウイルスによる感染性胃腸炎

事前に予測がほぼ付いているのに、それをあえて検査して確定する必要があるか?

たとえば、原因ウィルスによって対応が大きく異なるなら、精度よく鑑別する必要が出てくるかもしれません。

対応の一つは治療です。これは、ウィルスによって違いがありません。基本的に無治療で、可能な範囲で経口補水に努め、脱水の兆候がみられたら点滴をするということです。

もう一つは、周囲の人間への感染対策です。ノロウィルスとロタウィルス、どちらもアルコールが無効、あるいは十分な効果が期待できないということで、原則的には消毒に次亜塩素酸を用います。家庭で言うとハイターとかカビキラーとかです。
嘔吐下痢への対応・対策は、原因ウィルスによって変わりません。

細菌性腸炎のことも考える必要があるでしょうか?いえ、その必要はほとんど無いでしょう。
なぜなら、ウィルス性腸炎の症状は普通、強い嘔吐から始まって1日程度で下痢に移行するのに対し、細菌性腸炎は腹痛と下痢、ときに血便が中心で、嘔吐はそれほど強くない、という違いがあるからです。また、細菌性腸炎だからといって抗菌薬が必須かというと、そうでもなくて、通常最初から抗菌薬を投与することは推奨されません。ただ、多くの細菌性腸炎はヒトヒト感染をしませんので、そういう意味では確定できるとありがたい、というのはあるでしょう。

というわけで、治療の面、感染対策の面からは、鑑別する必要性は薄いと言えます。

迅速検査キットの陰性は信用できない

迅速検査キットの感度は100%ではありません。感度というのは、「ほんとにノロウィルスがいたとして、そのうち何%で検査陽性になるか」という数字です。検査したら100%みつかる、というものではないのですね。

添付文書の公称値によれば、PCR検査を基準とした場合の感度は90%前後ですが、実際に検査してみて評価した文献をみますと、およそ50%くらいです。ここ数年で感度が改善しているとしても、高めに見積もって感度70%くらいでしょう。検査してもそれくらいしか見つからないんですね。

一方、特異度(ほんとにノロウィルスがいなかったとして、それを間違えずに検査陰性にする率)も100%では無いのですが、おそらくこちらは高いので、簡単のために100%だとしてしまいましょう。

さて、今は流行期です。嘔吐下痢症の患者さんが100人いたとして、そのうち80人くらいはノロウィルスの感染症でしょう。このノロウィルスを迅速検査キットで検出することに意味があるかどうか、考えてみます。よくある4分図で、感度70%、特異度100%の仮定です。

検査が陽性 検査が陰性
ほんとにノロウィルスの人 80人 56人 24人
ノロウィルスじゃない人 20人 0人 20人
合計 56人 合計 44人

こんな結果になります。検査が陰性だった人の列を見てみましょう。ぜんぶで44人の人が検査陰性になっていますが、そのうち半分以上の24人は、実はノロウィルスの感染者です。

このように、一般的な話として、「その病気が多い、流行していると思われる時期に」、「感度がそれほど高くない検査を行うと」、検査が陰性だった人の中でも相当の割合の人が実は感染者である、という状態になってしまうのです。これは、インフルエンザの診断でも問題になることです。

こうしてみますと、検査が陰性だったからといって対応を変えることが如何に意味のないことか、お分かりいただけるでしょう。

検査することのデメリット

例えば、「ノロウィルスの迅速検査が陰性だったら登校してよい/会社に来てよい」といわれて病院に来る方が多数おられるのです。ほんとは感染者なのに検査が陰性になってしまうことが多分にあるにもかかわらず。

中には、病院にいってノロウィルスの検査をしてもらってきてください、とか、ノロウィルスの検査が陰性だったという診断書をもらってきてください、とか、会社や学校から言われてこられるかたもいらっしゃいます。

嘔吐があったけど、検査したらノロ陰性だったから出勤した、登校した、なんて患者さんが周囲にウィルスを振りまいて、流行規模を大きくします。例えば、食品を取り扱う仕事をされている方だったら、こんな対応で良いでしょうか?同僚だったら、お子様の同級生だったら?やっぱり嫌ですよね。

これが、検査をすることのデメリットです。検査が陰性であると、ノロウィルスではないと誤解し、安心してしまうんですね。これは二重に間違っていて、実はノロウィルスである可能性がかなりあること、そして、ノロウィルスでないほかのウィルスであったとしても、消毒を含め厳重な対応を要求されることに変わりはないのです。

嘔吐下痢症の場合は、検査結果が陽性だったからどうこうする、というのではなく、全てノロウィルス/ロタウィルスのどちらかであろうという前提で対応すべきで、検査結果に大きな意味はありません。症状があったら全て、学校仕事はおやすみ、家族全員手をよく洗い、トイレのドアノブやレバーを清拭し、吐物は次亜塩素酸で消毒しましょう。

患者さんの立場、医師の立場として

人間は不安定な状態に置かれることを嫌うようですので、患者さんの立場として○○ウィルスの感染の結果こうなっている、と確定すると心の安定が得られる、という点については同意します。しかし、そのために検査をすることはデメリットのほうが大きいのだ、ということをこれまで述べてきました。

医師の立場からすると、まず、患者さんに対して何かしてあげることができる、やることがある、というのは抗いがたい誘惑です。

加えて、一般的な病院の外来診療においては、(保険適用がなされれば)検査しただけ保険料が支払われます。保険料は元をたどれば国庫のお金で、その元は税金です。ま、元手が何であろうが、要するに儲かる、検査したほうが。私のようなしがない勤務医の給料には病院の儲けは反映されませんが、上からの収入をアップせよという圧力というものはあるわけで・・・。

必要な検査はする、必要な検査はしないという態度で臨みたいところですが、そこに患者さん側、会社や学校からの「検査して欲しい」という要求が入るのは、どうも解せません。できるだけフラットなピュアな状態で、検査の是非を判断させて欲しいと願っております。

どういう場合なら迅速検査に意味があるか

  • ひとつは、病態について少しでも情報がほしい時。痙攣や脳症が疑われる状況とか。
  • ひとつは、入院患者で群発した場合。全体的な対応方針を決めるにあたって必要。

くらいでしょうか?あんまり無いんですよね。

まとめ

  • 嘔吐下痢症の原因はノロウィルスかロタウィルスが多い
  • 症状と季節と流行状況から推測可能であり、この推測が間違っていても大きな問題にはならない
  • 迅速検査キットの性能はそれほど高くない。陰性と診断されても実はウィルスがいる人も多い。
  • 迅速検査をして、真実とは異なる陰性と結果が出ることにはデメリットが大きい


この度は以上であります。

2015/12/24の追記

この記事書いたまま公開してなかったのですが、本日も、とある内科医師が「ノロウィルスの迅速検査って、こっちが胃腸炎だと思ってても全然陽性にならねーじゃん、どうなってるんだ!?」と検査技師に怒ってたらしいです。実臨床では参考にすべきではないと、何度も院内メールで回したんですが、読んでないんだよね。こういうこと考えて診療してる医者ばっかりじゃないってことです。

B型肝炎ウィルスのワクチンを乳児に接種する必要性は十分にあるか?

多くの小児科医はHBVワクチンをぜひ接種して欲しいと願ってはいますが、この記事を書いている2015年11月現在、B型肝炎ウィルス(HBV)の予防接種を乳児期に接種するかどうかは、ご両親にとって悩ましい話だと感じられるかもしれません。

我々の施設では、小児科医が親と一緒に、出生後初期の予防接種のスケジュールを立てるようにしています。この時、現時点では任意接種のワクチン(ロタとHBV)は、費用が自己負担となることもあって、接種を迷われる親も当然いらっしゃいます。だいたい、80%くらいの方がロタワクチンの接種を、50%強がB型肝炎ワクチンの接種を希望されます。ロタのほうが接種率が高いのは、その高い感染率と下痢嘔吐というわかりやすい症状があるからでしょう。

一方、HBVワクチンの必要性というのは、小児科医にとっても説明の難しい問題です。費用がかかるというのは子供が生まれたばかりの親にとって大事な問題ですし、B型肝炎はロタのように頻度の多い疾患ではないからです。

HBVワクチンは近々、定期接種に組み入れられるだろうと言われています。そうなると費用は全額補助となり、上記のような悩み事は避けられるはずなのですが、このワクチンが現代日本でどれくらい必要なのか、については、聞かれた時のためにも明確な答えを持っておきたいところです。

B型肝炎になると何が悪いのか?

HBVによる感染の経過を、簡単にまとめてみます。

乳幼児期(3歳以下)の感染 ・持続的な感染となりやすい
成人の感染 ・感染しても多くは症状が出ないが、20-30%は急性肝炎の症状
・急性肝炎のおよそ10%は持続的な感染となる。持続化しやすい遺伝子型Aのウィルスが増加傾向にある。

持続感染者(キャリア)になると、そのうちの10-15%がゆっくりと進行して肝硬変から肝細胞癌を発症します。まさに、HBVクチンはこの肝細胞癌を減らす目的のワクチンだと言えそうです。

HBVは何処で感染するのか?

むかし、といっても1985年までですから一昔前までですが、HBV感染の多くは母子感染、とくに分娩時の産道を通るときに母親から感染するものでした。しかしこの感染経路については、HBVキャリアの母親からの出生時に予防処置をすることで、現在ではほぼ100%防ぐことができるようになりました。

その他の感染経路として、注射針の使い回し、輸血や血液製剤の使用など、医療行為によるものがありました。注射針の使い回しなんてことは、現在ではもちろん行われていませんし、血液製剤についても十分な検査と対策がとられるようになっており、残念ながら技術的限界でゼロにはできないものの、年間数例の感染が報告されるのみとなっています。

となると、HBVワクチン接種は必要なの?という疑問が、でてきませんか?

母子感染、医療行為に関連する感染がなくなっても、HBVの感染経路はなくなりません。2015年現在では、HBVの主な感染原因は、血液や体液を介する感染と、性行為感染によるものが大部分となっています。
血液や体液を介する感染については、保育園などでの集団感染事例や、噛みつきでも感染例があります。HBVはもともと、感染力自体はかなり高いウィルスなのです。

性行為感染となると、もう少し年齢が上の感染となります。以前は、成人になってからの感染は一過性の肝炎にとどまり、キャリアにはなりにくいといわれていました。しかし現在では、成人となってからの感染でもその10-15%はキャリアになると言われています。遺伝子型Aというキャリアになりやすいウィルスが増加しているのも、先に書いたとおりです。

現在、日本国内のHBV保有者はおよそ100万人と言われ、感染の機会はなくなってはいません。私たちは感染者を差別すべきではなく、かつ、HBV感染を減らしたいと思っているのです。そのためには、ワクチンを出来るだけ多くの人が接種することによって、偶発的な感染を防ぐべきでしょう。

感染の危険が依然としてあるとして、HBVワクチンをすべての子供に接種するだけの理由はあるのか?

母子感染が防がれた現在、その後に自然に感染する機会があるとは言っても、そんなに多くは無いのではないか?。このことが、小児科医がHBVワクチンの必要性について説明するときのウィークポイントとなっていました。

キャリア化したときの結果が重大なのは明らかです。10-15%が肝硬変から肝癌に進行、といえば、誰しもそれは防ぎたいなあと感じることでしょう。しかし、感染する機会が少ないのであれば、お金もかかるし…、と言われてしまうと、さて、小児科医の側には、これを説得する十分な材料があるのでしょうか?

そのためには、乳児期以後、自然に感染する率が実際どれくらいあるのか、というデータを見なければなりません。そして、本当に感染してしまった場合の不利益と、ワクチンの不利益(ほぼ、お金です)に、それぞれの確率を掛けて比較するという作業が必要です。

母子感染を防いだ現在、その後の感染機会はどれくらいあるのか?

どれくらいの感染率があれば、接種したほうがお得!と感じてもらえるのかは人それぞれなのですが、とりあえず現在のデータを調べてみましょう。

これまでになされた調査がよくまとまった公的資料があります。

「小児におけるB型肝炎の水平感染の実態把握と ワクチン戦略の再構築に関する研究」結果概要
厚生科学研究費補助金 肝炎等克服政策研究事業(第12回 予防接種基本方針部会 平成27年1月9日)

大雑把にいうと、20歳くらいまでに500人に1人くらいが自然にHBVに感染し、そのうち10人に1人くらいが感染が持続し、慢性化しているというデータです。

どうでしょうか、この数字は高いとお思いでしょうか?

少なくとも私個人としては、それまで思っていたよりもずっと高率で、この数字を見た時はちょっと驚き、これはもっと強めにワクチン接種するように言わねばならなかったな、と反省した次第です。

もともと母子感染防止が普及する前はこの10倍のキャリアの方がいらっしゃいました。いまの若者のリスクが下がったのは、母子感染防止の恩恵です。しかしながら、ウィルスが存在する限り、それが原因で病気になる人が発生し続けるのも確かですから、ウィルスを駆逐する手段があって、その不利益とコストが得られる利益に十分見合うのであれば、その手段を取るべきでしょう。

HBVワクチンは、安全性を担保するデータが非常によく集積されているワクチンの一つです。ウィルスを駆逐するのであれば、母子感染予防だけでは不可能ですから、ワクチンによって世の中の大多数の人がHBVに対して免疫をもった状態が望まれます。

過去、天然痘からポリオ、麻しんにいたるまで、そうやってワクチンをみんなで接種することによって、この国からウィルスをなくし、病気の不安自体をなくしてきたのでした。B型肝炎もそれを目指すべきだ、と思いますし、WHOの大きな方針でもあります。そういう目で見ると、500人に1人が自然に感染するという数字は、かなり高いなあと思うのです。

チメロサール含有のワクチンは避けるべき?

先日、小児科外来に来られたお母さんに、「この病院で使用されているインフルエンザワクチンは、どこのメーカーのものですか?」と、聞かれました。

とても注意深いお母さんだな、と思いました。

おそらく、保存剤として使用されている水銀(チメロサール)を気にされて、そのように聞かれたのだと思います。そして、チメロサールの有無は、メーカーと製剤によって異なるのです。


2015-16シーズンのインフルエンザワクチンについて表にまとめてみました。

製造販売 形態 チメロサール含有
北里第一三共 0.25mlシリンジ ×
北里第一三共 0.5mlシリンジ ×
北里第一三共 1mlバイアル あり
化血研 1mlバイアル あり
ビケン田辺三菱/ビケンMSD 0.5mlバイアル ×
ビケン田辺三菱/ビケンMSD 0.5mlシリンジ ×
デンカ 1mlバイアル ×

付け加えますと、2015年11月現在、日本で普通に接種されているワクチンでチメロサールを含有しているのは、他にB型肝炎ワクチンの「ビームゲン」のみです(B型肝炎ワクチン「ヘプタバックス」は含有していません)。

さて、このお母さんには当院で採用している薬剤の製造元をお伝えしました。
しかし、本当にチメロサールが悪いことをするのか、含有しないものを選んだほうが良いのか、本当のところはどうなんでしょうか。

チメロサールに有害性は・・・

もともとこの話は、Wakefieldという医師が1998年に、「MMRワクチンと自閉症」に関連があるという発表をしたのが始まりでした(現在では完全に否定されています)。この論文はマスコミの後押しもあって反響を呼び、イギリスのMMRワクチン接種率を大きく引き下げることになったのです。

しかし、この論文は症例数が少ないばかりか、データの捏造、賄賂、Wakefield自身が単独ワクチンで儲けようとしていたことなどを指摘されて、最終的には撤回されました。この事件は、データを捏造して子どもたちを危険にさらした最悪の事例のひとつとして、医療従事者のなかに記憶されています。

次にBernaldという人が2001年に、「DPTワクチンに含まれるチメロサール自閉症」に関連があるという主張をしました。当時糾弾されていたWakefieldも、この説に便乗したそうです。
しかし、その後の大規模な調査の結果、チメロサールも、MMRワクチンも、自閉症とは関係しない」(そう主張するような根拠はない)と、結論づけられました。この結論は、2015年の時点でも変わっていません。

このように、チメロサールの有害性はすでに否定されているのですが、いちど世の中に広がってしまった情報はなかなか訂正されず、子どもをもつ親を不安がらせているのです。

そうは言っても、ワクチンに何か入っているのは、不安?

チメロサールは保存剤として、ワクチンバイアル内が細菌に汚染されるのを防ぐという重要な目的があります。チメロサールが使用される前には、汚染により死亡した事例も発生していたのです。

まだチメロサールの有害性がよくわかっていなかったころ、1999年にアメリカ小児科学会が「チメロサール除去をすすめる」推奨をしたことがありました。また日本では2004年に、日本小児神経学会などが「チメロサール自閉症とは関係がないが、できるだけ除去すべき」との声明を出したことがあります。このころの情報が、印象が、まだ世の中に残っています。

しかしその後の調査では、チメロサールの有益性が評価される一方で、有害性は確認されていません。おもに環境問題から水銀の使用を控える動きもありましたが、2012年にWHOが使用について問題なしという結論を出し、各学会もこれに従っています。

現在では、製造業者の努力のおかげで、チメロサールを含有するワクチンは大分すくなくなりました。冒頭のお母さんのように、チメロサール含有でないワクチンを選んで接種するかどうかは個人の自由とおもいますが、その根拠はといえば、すでに過去のものとして消失してしまっているのです。

あまり気にする必要はないと、小児科医としては思います。



厚生労働省 保存剤(チメロサール等)が添加されている新型インフルエンザワクチンの使用について(pdf)
http://www.mhlw.go.jp/kinkyu/kenkou/influenza/dl/infu090918-04.pdf

アメリカ小児科学会(AAP)による、WHO推奨の追認
https://www.aap.org/en-us/about-the-aap/aap-press-room/pages/AAP-Endorses-WHO-Statement-on-Thimerosal-in-Vaccines.aspx

MacでテザリングしながらParallelsでWindows 10 Homeを実行するときは要注意

Parallels DesktopOSX上でWindowなど他OSを仮想化するときのメジャーな選択肢の一つです。

最近、Parallels Desktop 11が発表されたところです。

記事の前に、質問に丁寧迅速にご回答いただいた、act2様に感謝いたします。

Parallels Desktop 11 for Mac Retail Box JP

Parallels Desktop 11 for Mac Retail Box JP

www.act2.com

現在の状況

僕は最近、VAIO ZからMacbook Pro 13'(2015 Early)に乗り換えたところなんですが、
互換性のためにParallels Desktop 10を導入し、Windows 8.1(無印)を実行しています。
仕事でオフィスファイルの共有が必要なので、というのが表向きの理由で、
本当はDQXプレイヤーだからなんですけどね。
(じゃあWin機買えよって?うむ。しかしVAIO株式会社が色々と死んだことがMac転向を後押ししました)

Paralellsはとても良く動いてくれています。割りと細かいところに気が配ってありますし、
速度も、多分Bootcampより一枚落ちるんでしょうが、DQXを快適にプレイできる程度の速度は十分保たれています。

ただしゲームプレイ時の発熱には気を配っています。
先代VAIO Zの戦死の理由はファン酷使による故障でした。まあVAIO Zってもともと熱設計ぎりぎりだったんですけどね。

ELECOM ノートパソコン用冷却台 冷え冷えクーラー SX-CL03MSV

ELECOM ノートパソコン用冷却台 冷え冷えクーラー SX-CL03MSV


さて、さらに最近、Windows10が発売されました。
Windows8.1から10 Homeには、1年間は無料でアップグレードが可能です。
実際、自宅のPCは更新済です。
しかし、このParalells上のWindows8.1は、あることが気になって更新を掛けないでいます。

Windows 10 Homeでは、Windows Updateが自動かつ強制

それは、Windows 10 Homeでは、Windows Updateが自動・強制になっていることです。

Windows Updateは、Windows8.1の時代までは、「アップデートを全自動インストール、再起動要求」の他に、「ダウンロードをする時点で確認が入る」または「ダウンロードは自動で、インストールをする時点で確認が入る」という選択が可能だったと思います。

僕は、「ダウンロードをする時点で確認」を選択していますが、これには2つ理由があって、
ひとつは、作業中に急に再起動を要求されるとか鬱陶しい、ということと、
もうひとつは、テザリングしてる間に何GBものファイルをダウンロードされたら携帯電話の7GB制限に引っかかってしまう、ということです。

しかし、これがWindows 10 Homeになると、「全自動」しか選択できなくなりました。
より細かく書きますと、「ダウンロードは自動、再起動タイミングはあるていど任意」です。
Windows 10 Proだと、ダウンロードタイミングを制御できるようなんですが、Homeではこの状況です。

当然このままだとテザリングしてる人たちが全員爆死するわけですから、対応策はもちろん用意されています。
この回避方法はWindows 8の段階からあるんですが、「Wifi接続については」従量課金される回線なのかどうかを「個別に」設定することが可能で、従量課金接続している間はアップデートのダウンロードを抑制する仕組みになっています。

この仕組はWindows 10もそのままですから、テザリングも安心して可能ですね。

何が問題なのか

ところが、Paralells上のWindowsだと話がかわってきます。

Parallels DesktopOSX上のインターネット接続を共有したり、あるいはブリッジに直接接続してネットワーク上ではOSXとは別のコンピュータとして振る舞ったりすることができますが、ゲストOS(つまりWindows)から見ると、OSX側の接続方法にかかわらず、一括して「有線接続」に見えてしまうのです。
「一括」と「有線」ということが大事で、Windowsからは複数の接続方法があるように見えませんし、ただひとつ見える接続は「有線」です。このため、従量課金回線の個別設定はできません。

この状態では、テザリング中であろうがお構いなしにWindows Updateが走ることになります。
これを防ぐ方法がないかぎり、僕はWindows 8.1Windows 10 Homeにアップグレードすることができないのです。

…という僕の考えはあっているか?

といってもこれは僕の推測であったので、本当にこうなるかどうか、Paralells Desktopを販売されているact2様のサポートコミュニティで聞いてみました。
windows10での自動更新と従量課金回線 – act2 FAQ

f:id:simbelmyn:20150828112223p:plain

f:id:simbelmyn:20150828112228p:plain
ご回答 : ご質問の従量課金回線についてでございますが、仮想マシンには必ず仮想アダプタ(すべてEthernet)割り当てられますので認識されているとおりWindowsは接続回線を認識出来ません。ちなみに最新バージョン Paralles Desktop 11の新機能Travle Modeはバッテリーをセーブする機能ですが Windows updateを止める事が出来ます。 

というわけで、この認識は正しいようでした。

Travel Modeで回避可能?

Paralells Desktop 11の新機能「Travel Mode」とは、バッテリー駆動時にParallelsの設定を自動変更する機能のようです。
その一つの効果として、バッテリー駆動時にWindows Updateを止めることができます。
つまり、「電源につないでいない間は、Windows Updateを抑制できる」ので、テザリングしていてもOKということですね。

僕が現在使っているのはParallels Desktop 10ですが、いいです、この機能が使えるなら、11にアップデートしましょう。
ですがこれではすべての問題は解決しません。「電源につなぎながらテザリングするときはWindows Updateを抑制できない」からです。

電源につなぎながらテザリング?その上でParalellsつかってWin10 Home?どんだけニッチな需要やねん、とは思いますが、
僕はそれをやることがあるんです。

f:id:simbelmyn:20150828112232p:plain

このTravel ModeのWindows Update自動On/Off機能は、
Windows 10 ProのWindows Update制御機能とは関係なく、Windows 10 Homeでも有効みたいでした。

回避策が今のところ見つからない

Parallels DesktopOSXの回線種別を認識するようにするためには、かなり大きな改変が必要となりますので、実現可能性は低いと思います。

次善の策として、Windows Updateの抑制を手動制御できればよいんですが、Parallels Desktop 11はそういうつくりにはなっていないようです。

というわけで、結論として、

  • テザリングしながらParallels Desktop上でWindows 10 Homeを実行するときは、自動更新で多量のアップデートファイルがダウンロードされる可能性があり、これは制御できない。
  • Parallels Desktop 11の新機能であるTravel Modeをつかえば、ノート型端末でバッテリ駆動の間は、自動更新を抑制できる。
  • それ以外の場合に自動更新を抑制したければ、Windows 10 Proを使用するしか無い。

Win 10 Proつかえよという話なんですが、僕のおこずかいでは、新規購入資金なんて簡単に出ません。
フリーウェアで自動更新を抑制できるのが出てくれないかな、と他力本願しつつ、Win 8.1で様子見の状態となっております。

DRPMを肺炎につかってよいか論争を脇からみていたまとめ

フィニバックス(DRPM:ドリペネム)を肺炎につかってよいかという議論が某MLで盛り上がっていました。
きっかけは米国FDAが「いかなる肺炎にも使用を承認しない」というコメントを2014/3/5に出したことでした。

そもそもフィニバックスというかカルバペネムを肺炎に使用するようなケースはめちゃくちゃ限定的、、、
とはいえ、世の中そう「わかってる」医者ばかりではないので、うちのような中規模病院だと、
「使われちゃってる」ケースは、なきにしもあらず。

ともあれ、FDAアノテーションでもって、では自分としては、自分の病院としてはどうすべきか、
感染制御担当として、院内にどのようなコメントを出すべきか、ということになるわけですが、

言い訳がましいですが、小児科医と感染制御担当の両立という状況で、なかなか感染症専門医の先生方の
情報収集レベルに追いつくのは難しく、、、

このような議論を傍でみていて、へーそうなのかー、と思いながら、
提示された文献をひとつひとつ読み込んでいく、というスタイルになりがちであります。


以下、議論に出てきた主題、文献、各国公的機関の立ち位置などを、時系列にわかりやすくならべて、
自分が理解しやすいようにし、自分の病院にどのようなリコメンドを出すか、考えてみた記録です。




2014年3月5日、米国FDAはドリペネム(DRPM:日本ではフィニバックスとして販売、シオノギ)の、
肺炎への使用について警告した。




FDAが肺炎への適応を認めているカルバペネムはIPMだけ。
	DRPMの適応は、複雑性腹腔内感染症、複雑性尿路感染症に与えられている。
EMA(European Medicine Agency)は、DRPMをHAP(院内肺炎)/VAPの適応で承認している(500mg q8h)。

2008年に2報の大規模RCTの報告があり、

VAPに対して、DRPMはIPMに非劣性	(Crit Care Med. 2008 Apr;36(4):1089)
-DRPM 500mg q8h 4時間投与
-IPM  500mg q6h or 1g q8h 30-60分投与	7-14日間
HAPに対して、DRPMはPIPC+TAZに非劣性	(Curr Med Res Opin. 2008 Jul;24(7):2113)
-DRPM		500mg q8h 4時間投与
-PIPC+TAZ	4.5g  q6h 30分投与	7-14日間

であったと報告されている。


日本では、

呼吸器感染症に対して、DRPMはMEPMに非劣性(RCT)	(化療学会誌 2005 53 S-1:185)
-DRPM	250mg q12h
-MEPM	500mg q12h	7日間
FNに対して、DRPMはMEPMと同等(後方視)	(Jpn. J. Infect. Dis. 2012 65:228)
-DRPM	500mg q8h
-MEPM	1g    q8-12h

との報告がある。


このような背景のもと、EMAからDRPM 1g q8h投与についての有効性・安全性データ集積の要望を受けて、

VAP患者を対象としたDRPM vs IPMの比較試験が行われた。
-DRPM	1g q8h 4時間投与	7日間
-IPM	1g q8h 1時間投与	10日間

しかしこの試験は、死亡率がDRPM群で高かったため、試験途中に早期終了となった。(Critical Care 212 16:R218)

この結果、FDA、EMA、日本は、以下の様な反応を示している。

FDA:(2014/3/5)
DRPMに対しては、「(VAPだけではなく)いかなる肺炎の治療にも」使用を承認しない。
EMA:(2012/6/22)
DRPMをHAPに使用する場合、現在承認されている 500mg q8h の投与量は不十分かもしれない。
DRPM 1g q8h 10-14日間の仕様を推奨する。
日本:(2012/4/27)
DRPMで死亡が多かった原因は、投与が7日間に制限されたことが原因と考えられる。
本邦では投与日数の上限は定められておらず、新たな注意喚起は不要。
(この文章はシオノギ。これをPMDAが承認した)

FDAの対応については、日本国内の感染症専門医の間でも評価がわかれている。

とくに、2012年の報告については、

  • DRPMが7日間、IPMが10日間の試験デザインがDRPM不利だったのでは?という点や、
  • ドロップアウトが多すぎないか?という点について異論が出ている。

これに対する再反論として、

  • 非劣性試験の性格上、効果以外の点で多少の優位(短い日数でOK)を示す必要がある。デザインは妥当。
  • 7日目の死亡率の時点で既に有意差がありそう。
  • FDAの文書では、ドロップアウトの大部分を含めて再評価した数値で判断がなされている。

といった意見がでている。

2008年のRCTや日本国内の臨床試験結果ではDRPMの効果が確認されていることや、EMAが穏健な判断を示していることも、FDAの対応に対して評価が分かれる原因となっている。




これを受け、当院での肺炎に対するDRPM使用に関して、ICTからの意見は以下のとおりである。

1. DRPMをVAP(人工呼吸器関連肺炎)に使用する場合は、500mgから必要に応じて1gを1日3回投与し、
10~14日間の使用とすること。

2. VAP以外の肺炎に対しては、
第一選択としてABPC+SBT(ユナシン) 3g×3-4回/日
無効の場合に、PIPC+TAZ(ゾシン) 4.5g×3-4回/日
 の使用を推奨する。
 ※ただし、ユナスピンでは6g/日までの投与しか承認されていない
 ※いずれも数字は腎機能正常の場合

(3. うちの病院、MEPM(メロペン)もIPM(チエナム)も採用してないのになんでDRPM(フィニバックス)だけ採用されてんねん。もうちょっとエビデンスあるカルバペネムが採用されてたら悩まなくてええ所やねん。どっちか採用してくれへんかな。)

スーパー楕円のダンジョンLV3でコードゴルフ

こんにちは、仕事中にコード書いてる小児科医、simbelmyn@simbelmyncomです。
院長に知れたら首かもしれません。

さて、codeIQというITエンジニアのためのスキル評価+転職支援サイトがありまして、
我々小児科医には誠に縁もゆかりも無い筈なのですが、趣味で参加しています。

プログラマへの転職意図はありません。いまのところ。
でも電子カルテの糞さが身にしみてるので、電子カルテ開発だったら転職するな。

スーパー楕円のダンジョン

さておき、「スーパー楕円のダンジョン(注:リンク先では問題の内容はみられなくなっています)」とは、
クロノス・クラウン合同会社 柳井政和様@rutenが出題された問題で、
問題の条件をみたすようなJavascriptのコードを書いて提出するものです。

この文章は、私がこの問題に対して提出した解答について、どのように考えてそのコードに至ったかを、記録したものです。
2月4日に書いていますが、公開は2月17日に解答が締め切られた後にする予定です。
一位になったら、この記事アップするんだ・・・俺。


とまあ、こんなふうな偉そうな記事を書いている私ですが、
結城浩@hyukiセンセイが先日出題された問題、通称ジェムストリング問題は盛大に間違えました。
そんなレベルの人間の書く文章ですが、ご容赦ください。

さて、その問題ですが

要約しますと、魔王の復活を阻止するため、「スーパー楕円の封印」を解く必要がある、と。
えー・・・なんだそりゃ?いやまあ続きを読みます。
「スーパー楕円の封印」をとくためには、

・X(-36~36)、Y(-18~18)が与えられるので、
・スーパー楕円1:(|x|/32)^3 + (|y|/ 8)^3 <= 1 の内部であれば1を
・スーパー楕円2:(|x|/16)^3 + (|y|/16)^3 <= 1 の内部であれば2を
・1と2の両方の重なる部分であれば3を

返すようなプログラムを、javascriptで書く必要があると、いうわけです。
いわゆるFizzBuzz問題です。
そして、もうこれ以降は魔王もダンジョンも関係なくなってしまいます。
なんで魔王がスーパー楕円なのかとか、理屈をこねる余裕すら与えない、
なかなか潔いフレーバーですな、ふむふむ、などと思うわけです。魔王哀れ。


で、FizzBuzzではあるんですが、

function yourCode() {
    var arr = [];
    var RNG_X = 36;
    var RNG_Y = 18;
    for (var y = -RNG_Y; y <= RNG_Y; y ++) {
        for (var x = -RNG_X; <= RNG_X; x ++) {
            arr.push(【ここの部分】);
        }
    }
    return arr;
}

この、【ここの部分】に入るコードを答えるというのが問題となっておりました。
なので制御構文が使いにくいですね。


さらに、このスーパー楕円のダンジョン問題ですが、レベルが1~3まであって、別の問題として登録されています。
各レベルで何が違うのか、というと、文字数制限と、「使ってはいけない文字・構文」があるのです。見てみますと、

・レベル1:200文字以内、全文字が使用可能
・レベル2:150文字以内、以下使用禁止:
 Math ' " String Array [ ] $ jQuery eval this window ? :
・レベル3:200文字以内、以下使用禁止:
 Math ' " String Array [ ] $ jQuery eval this window ? : * / & |

こうなっております。

制限内で意図した結果が得られるコードが書ければ正解なのですが、
なんとなく短いコードを追求したくなりますね。なりますよね?

レベル1とレベル2

この問題レベル1と2で、私の提出した解答は以下のとおりです。
・レベル1:

((A=(x<0?-x:x)*x*x)+(B=(y<0?-y:y)*y*y)<4097)*2|A/64+B<=512(58文字)

・レベル2:

(p=x<0,q=y<0,p+=x*x*x^-p,q+=y*y*y^-q,p+q<4097)*2|p/64+q<=512(60文字)

レベル1では、絶対値の計算にMath.abs()が使用可能ですが、三項演算子を使用したほうが文字数が少なくなるので、そちらを使用しております。

2/19追記:LV1では、どうもMath.absを使うほうが主流だったようです。
というか1位のなかでMath.abs使ってないの俺だけだった・・・。

レベル2では、Mathも三項演算子も使用できなくなりましたので、|x|を計算するために、
 |x| = (x<0) + ( x xor -(x<0) )
という演算を行っています。

(x<0)はxが0未満ならtrue、0以上ならfalseです。javascriptでは、trueは1、falseは0と解釈されるらしいです。
その結果、
 xが0以上:|x| = 0 + (x xor 0)
 xが0未満:|x| = 1 + (x xor-1)
という計算式になり、xの絶対値が計算できています。

レベル3

さて、問題本番はレベル3です。「* / & |」の4文字が追加で使用禁止になりました。
乗算ができないのは大きな大きな悩みどころです。

もう一度スーパー楕円1と2の式を示しますが、

・X(-36~36)、Y(-18~18)が与えられるので、
・スーパー楕円1:(|x|/32)^3 + (|y|/ 8)^3 <= 1 の内部であれば1を
・スーパー楕円2:(|x|/16)^3 + (|y|/16)^3 <= 1 の内部であれば2を
・1と2の両方の重なる部分であれば3を

という計算をしなければなりません。

・絶対値の計算

という困難に加えて、

・xの3乗、yの3乗の部分を乗算を使わないでどう計算するのか、

という2つ目の困難が加わった形になりました。


この辺のレベル調整というか、とてつもない問題が立ちふさがって、かつ、工夫次第でなんとかなる、しかも、安易な抜け道は塞がれているような、そういう針の穴を通すような問題づくりには毎回感服いたします。すごいです。

どういう経緯で、この4文字を選んだんだろうか?
記号^(算術XOR)が使用可能で残されているのは意図的なんだろうけど、解答についてどこまで予測していたのだろうか?
と思うわけです。
問題をつくることもさることながら、問題のデバッグにかかる労力にも頭が下がります。


さて、乗算について解決法を探らなければなりません。

課題:

(p=x<0,q=y<0,p+=x*x*x^-p,q+=y*y*y^-q,p+q<4097)*2|p/64+q<=512
ここから乗算記号*をなくす。
さらに、/(除算)も、&(算術AND)も、|(算術OR)も使用不可

しかし、あまり選択肢は無いと思います。
乗算といえば左ビットシフトで2の乗数倍を代用できますが、今回は「x * x * x」を計算する必要がありますから、掛ける数は2の乗数に限りません。よってビットシフトは使えません。

すると、加算で代用するしかありません。
x * xであれば、xをx回加算することで代用です。
ここで、制御構文forを使用する必要が出てきます。

誰もがぶつかる問題だと思いますが、解答は

Array.push(【ここ】);

に入る必要があります。
関数の引数内で制御構文forは使えません。どうやってこれを引数の外に出しましょうか?

私は最初、以下の様に対応しました。

【コード1】

((A=m(m(m(x>0,2)-1,x),m(x,x)))+m(B=m(m(m(y>0,2)-1,y),m(y,y)),64)<=32768)+m(A+B<=4096,2));}}return arr;}function m(a,b){arr=0;if(b<0){b=-b;a=-a;}{{for(i=0;i<b;i++,arr+=a

今見ると笑っちゃうのですが、超強引で、読みにくい。カッコの数があわなくて苦労しました。

これは、解答内で強引にyourCode関数の定義を終わらせてしまい、
その後ろでa*bを計算するための乗算関数m(a,b)を定義しています。
問題文の最後はreturn arrで終わっていますから、これに整合するように、
乗算関数mの返し値も変数arrに入れておく必要がありました。

絶対値の計算は、m(m(x>0,2)-1,x)で行っています。解釈すると、x * ( (x>0)*2-1 )です。xの符号に合わせて、1か-1を乗算して、|x|を計算しています。

xの絶対値の3乗を計算するだけなのに、m(m(m(x>0,2)-1,x),m(x,x))という冗長なコードが必要になってしまいました。

これを整理して、次のコードになりました。これが最初に提出したコードです。

【コード2】

((A=m(m(m(x>0,2)-1,x),m(x,x)))+m(B=m(m(m(y>0,2)-1,y),m(y,y)),64)<=32768)+m(A+B<=4096,2));}}return arr;}function m(a,b){arr=0;if(b<0)b=-b,a=-a;{{for(;b--;arr+=a

(159文字)

コードを短縮する

問題の性格上短縮の必要性はまったく無いのですが、私の性格上短縮します。

まず、

・絶対値の計算をレベル2の解答に使用したものを使用したほうが短縮できる?
・2倍、64倍には乗算関数mではなくビットシフトをつかう
・乗算関数mの引数には正の数しか与えられないように工夫し、mの内部はシンプルにする。
・不等号を工夫する。4096以下ではなくて4097未満に。

こんな事を考えて、以下のコードを書きました。

【コード3】

((p=x-(u=x<0)^-u,q=y-(v=y<0)^-v,A=m(p,m(p,p)),B=m(q,m(q,q)),A+B<4097)<<1)+(A+(B<<6)<32769));}}return arr;}function m(a,b){arr=0;{{for(;b--;arr+=a

これで145文字になりました。この後まだ縮むはずです。
が、たぶんすぐに限界がきます。新しいことを考える必要がありそうです。

乗算関数を関数オブジェクトにする

そもそも、乗算関数mって、こんな強引な場所でしか実装できないのしょうか?
いや、関数オブジェクトで良いのでは?(実はこのときまで関数オブジェクトの存在を知らなかったのでした)

・乗算関数mを関数オブジェクトとして実装してみる
・(A+B<4097)<<1とA+(B<<6)<32769の2つの項を加算しているが、
 それぞれ(0と2)・(0と1)の値しかとらないので、加算ではなくXORで代用できる。
・しかも、XORにすれば演算子の優先順位の観点から、カッコでくくる必要がなくなる。

これでコーディングしてみます。
【コード4】

(m=function(a,b){for(c=0;b--;c+=a);return c},A=m(p=x-(u=x<0)^-u,m(p,p)),B=m(q=y-(v=y<0)^-v,m(q,q)),A+B<4097)<<1^A+(B<<6)<32769

関数オブジェクトの威力で、126文字まで一気に縮みました。


乗算関数でなく3乗する関数を

これa*bの乗算関数がないとだめでしょうか?
3乗するのにm(p,m(p,p))って冗長なんですけど?

・「引数を3乗する関数t」を考えてみる。
・絶対値の計算も3乗関数t内で行うことにする
・yの3乗を64倍するところは、yの4倍を3乗したほうが短縮できそうかな?

この方針で、下のコードができました。
【コード5】

(t=function(a){for(s=0,b=a=a-(u=a<0)^-u;b--;)for(c=a;c--;s+=a);return s},t(x)+t(y)<4097)<<1^t(x)+t(y<<2)<32769

これで110文字になりました。

最初の段階で提出された解答では、最短112文字と聞いていたので、これで最短行けちゃうんじゃないでしょうか。これ以上短縮が思いつかないし。
そう思い、これで再提出しました。

挫折1

出題者様「最短は更新されて107文字です。」

ガーン。なんだと。いやコードゴルフじゃないんですがコレ。落ち着け落ち着け。
でも短縮できるとなると短縮したくなります。ちくしょう。

さらなる短縮へ returnなんていらない

えー、どこが冗長なんだろうかと考えますと、絶対値を取るところでしょうか。
b=a=a-(u=a<0)^-u の部分ですが、短縮できる匂いがプンプンします。
あれ?制御構文使えるように、3乗部分を独立関数にしたんだから、if使えるじゃないですか。

てことは、関数tはこれで良い?
【コード6】

(t=function(a){if(a<0)a=-a;for(s=0,b=a;b--;)for(c=a;c--;s+=a);return s},t(x)+t(y)<4097)<<1^t(x)+t(y<<2)<32769

これで(109文字)



あと冗長なのは、functionとかreturnとかの長い単語ですが、これは無くせないよなあ、、、。
、、、まてよ、別に3乗関数tは値を戻さなくても、外側のスコープの変数に答えを入れたら良いのでは?

理念としてはこういう感じ。returnなんていらんのです。
【コード7】

(t=function(a){if(a<0)a=-a;for(b=a;b--;)for(c=a;c--;s+=a);},s=0,t(x),t(y),s<4097)<<1^(s=0,t(x),t(y<<2),s<32769)

でもこれでは111文字に長くなってしまいました。

t(x)+t(y)と、t(x)+t(y<<2)の2つの値を知る必要があるのがネックです。
xの3乗=t(x)の計算が終わった時点で、sのバックアップをとっておいて、あとで再利用できないでしょうか?

【コード8】

(t=function(a){if(a<0)a=-a;for(b=a;b--;)for(c=a;c--;s+=a);},s=0,t(x),p=s,t(y),s<4097)<<1^(s-p<<6)+p<32769

できました!
p=s(このときのsはt(x)が入っています)でバックアップをとっておいて、
t(y<<2)の計算は、s-p(このときのsはt(x)+t(y)が入っているのです)を64倍することで計算できました。

これで105文字です。今度こそ最短いけてるでしょうか?

これ以上、短縮できるのか?

でも出題者様が以下のようなツイートをなさっていました。

・・・107文字マイナス数文字・・・だと・・・!?

どうやら105文字ではまだ最短とはいえないようです。
いやこれはコードゴルフじゃないゲフンゲフン。
と、ともかく、目標を設定することにしました。
100文字を切ることを目指してみましょう。



上の105文字の例ですが、冷静に考えると、最後の(s-p<<6)+p<32769ではpを移項できます。
移項するとs-p<<6<32769-pとなって、カッコが不要になりました。
また、3乗関数tですが、最後のセミコロンは省略できました。

【コード9】

(t=function(a){if(a<0)a=-a;for(b=a;b--;)for(c=a;c--;)s+=a},s=0,t(x),p=s,t(y),s<4097)<<1^s-p<<6<32769-p

(102文字)

100文字まであと少しです。
でも、107文字マイナス数文字、までは確認されているみたいですが、100文字を切れる保証は何処にもありません。
答えがないかもしれない問題を考えるのは、本当に難しいです。

それに、上記の102文字のコード、とても美しいです。
もうこれで十分美しいではないか、これ以上このコードをいじらなくてもいいじゃないか。
・・・と思うのですが、翌朝からはまた短縮可能かどうかの検討が始まるのでした。仕事しろ。

100文字を切るために

さて、とは言え、同じアルゴリズムではこれ以上短縮できないように思います。
逐一は書きませんが、この頃は様々な検討を試みては敗北しています。

・3乗関数tの中身をもっと短縮できないか?forを一つにできないか?
 → 無理かな?できるとしても冗長だろう
・3乗関数tを乗算関数の再帰で作れないか?
 → めちゃくちゃ冗長になる
・変数tは不要にできないか
 → どうしても2回呼ぶ必要があって無理そう
・そもそも「function」は書かなくてはいけないのか
 → 言語仕様です

こんな検討をして、いずれも無理だなあ、ということになりました。
そこで、ちょっと計算の順序を変えてみようという発想になりました。
なんとなく、s<4097の部分を、ゼロとの比較にできたら、短縮の可能性があるのではないか、というヤマカンがあったのです。

・sの初期値を0ではなく4097とする
・三乗関数tのなかではsに加算するのではなく減算する
・sは4097からxの3乗とyの3乗が減算され、マイナス方向に向かう。
・すると、s<4097の条件は、0<sに変換されます


t(x)+t(y)*64<32769 というのが、スーパー楕円2の式なのですが、
これまでは、p + (p-s<<6) < 32769 と表現していいました。これが右側部分です。

sを4097から減算方向にすることで、ここの表現が変化して、
 (4097-p) + (p-s)*64 < 32769 になります。
移項して整理すると、
 (p-s<<6) < 28672 + p となりました。

具体的にはこんなコードになります。
【コード10】

(t=function(a){if(a<0)a=-a;for(b=a;b--;)for(c=a;c--;)s-=a},s=4097,t(x),p=s,t(y),0<s)<<1^p-s<<6<28672+p

スムーズに変形してるように書いてますが、これが通るようになるまで苦労しました。
苦労しても、文字数は同じ102文字ですが、0<sの部分に可能性を感じませんか?
で、この0を消せないか、また色々チャレンジしました。

undefinedを駆使して0を表現する

最初は、3乗関数tの返り値がundefinedなので、これを0と解釈してくれないかな、という期待がありました。
こんなかんじです。t(y),0<sの部分を、t(y)<sで代用できないかと考えたコードです。
【コード11】

(t=function(a){if(a<0)a=-a;for(b=a;b--;)for(c=a;c--;)s-=a},s=4097,t(x),p=s,t(y)<s)<<1^p-s<<6<28672+p

しかしこれは封印解除に失敗しました。
javascriptよくしらないのですが、undefinedと0は違うものなんですね。

演算を通してみたらどうかと、こんなコードも書きました。
こんどは、t(x)+t(y,p=s)がゼロと解釈されてくれないかなという期待をもったコードです。
【コード12】

(t=function(a){if(a<0)a=-a;for(b=a;b--;)for(c=a;c--;)s-=a},s=4097,t(x)+t(y,p=s)<s)<<1^p-s<<6<28672+p

p=sを実行する位置に涙ぐましい工夫があります。こんな糞コード解釈してくれて有難うjavascript
しかしこのコードも封印解除に失敗しました。
undefinedとundefinedを加算してもundefinedになるんですね。うーむ。



悔し紛れに以下のコードを試します。
ビットシフトなら、ビットシフトならゼロになってくれる・・・t(x)<<(t(y,p=s)<s
【コード13】

(t=function(a){if(a<0)a=-a;for(b=a;b--;)for(c=a;c--;)s-=a},s=4097,t(x)<<t(y,p=s)<s)<<1^p-s<<6<28672+p

おめでとう!今度は封印解除に成功しました。これで101文字です。

と喜びましたが、さらにもう一個不等号削っちゃだめ?ということで・・・t(x)<t(y,p=s)

(t=function(a){if(a<0)a=-a;for(b=a;b--;)for(c=a;c--;)s-=a},s=4097,t(x)<t(y,p=s)<s)<<1^p-s<<6<28672+p

undefined < undefined はfalseで、ゼロになってくれました。これでも成功です。100文字

100文字を切った!

あと1文字でも削れれば、100文字を切るという目標が達成できるのですが、もう何処にも(削る所が)ないじゃん。
・・・いえ、ありました。右側、p-s<<6<28672+pの部分です。

ここは以前、28672でなくて32769だったので、短縮できなかったのです。

 ○*64 < 32769 + ■

という形だったので、短縮できなかったのですが、現在は、

 ○*64 < 28672 + ■

の形になったので、短縮できるようになったのです。

上記の式は、以下のように変形が可能です。そして64倍はビットシフトで表現できます。

 (○ - 448)*64 < ■

これは、sの値を4097から減算することにしたことによる副次的な効果でした。
さすがに、ここまで意図してsの減算を試したわけではなく、偶然に成り立ったものです。

これをコードに戻すと、

 p-s<<6<28672+p

これが

 p-s-448<<6<p

こう変形できます

よって全体のコードは
【コード15】

(t=function(a){if(a<0)a=-a;for(b=a;b--;)for(c=a;c--;)s-=a},s=4097,t(x)<t(y,p=s)<s)<<1^p-s-448<<6<p

このようになりました。
98文字となり、100文字を切るという目標を達成することができました。
これで3回目の提出をすることにしました。

休息

出題者様のツイートによりますと、この記事を書いている時点(2014年2月4日17時)では98文字は最短ということなので、
これで一旦頭を冷やすことに致します。仕事しろ。

が、もしかしたら、明日の朝にはまた考え始めているかもしれません。
コードゴルフじゃないのにね)

2014/2/7 19:30追記

レベル1の最短が57文字に更新されたということで、うんうん唸っていたのですが、
ああ、何のことはありませんでした。
コード14→15に適用したような変化を、レベル1のコードにも適用すればよかったのです。
プラスマイナスに工夫をしなければならないと思いますが、

(A=(x<0?-x:x)*x*x-4097,B=(y<0?y:-y)*y*y,A<B)*2|A<B+448<<6

(57文字)になりました。

これ以上の短縮はむずかしいでしょうか?

挫折2

と言いつつも、延々とその後もレベル3を考え続けておりました。
しかし全く不可能です。しょうがないよね、これできっと最短だよ。そんな風に思っていた時期が僕にもありました。

2014年2月13日 出題者様「正統派な最短96文字(更新!)です。」

ナンダッテー!
この記事書いたけど、一位にならなかったら恥ずかしいからアップしないつもりなんです。
しかも締め切りまで1週間切ってる。間に合うんだろうか?考えろ俺。

そして泥沼へ

再掲しますが、最後に提出した98文字のコードはコレでした。
【コード15】

(t=function(a){if(a<0)a=-a;for(b=a;b--;)for(c=a;c--;)s-=a},s=4097,t(x)<t(y,p=s)<s)<<1^p-s-448<<6<p

コレを如何に短縮するのか。あと2文字削ってようやく一位タイです。正直厳しい。
ひとまず、これまで検討して不可能と判断していたことを、もう一度考えなおしてみます。

・functionを削る
functionを削るために、三乗関数tをオブジェクトのsetterとして実装してみました。
【コード16】

(o={set t(a){if(a<0)a=-a;for(b=a;b--;)for(c=a;c--;)s-=a}},s=4097,o.t=x,p=s,o.t=y,0<s)<<1^p-s-448<<6<p

これでも封印解除はできます。しかし101文字と、伸びてしまいました。
functionの文字を除去出来ましたが、三乗関数が常にオブジェクトoを介したアクセスとなり、全体としては文字数短縮に至りませんでした。

・三乗関数の引数aを省略して、外側のスコープの変数にする。
【コード17】

(t=function(){for(b=a=-a;b-->0;)for(c=a;c--;)s-=a},s=4097,t(t(a=x))<t(p=s,t(a=y))<s)<<1^p-s-448<<6<p

関数tをa=x, a=-x, a=y, a=-yの4回呼んでしまおうという作戦で、
これでも封印解除できますが、100文字となり、短縮できませんでした。

簡単に書いてますが、数日うなり続けました。

forループ2つあるのは無駄だった

そんな日々でしたが、やっと手応えがありました。

・やっぱ三乗関数tの中のforループが2つあるの無駄じゃない?
 といっても再帰ループにするとものすごく長くなってしまうし・・・。

うーむ。
逆に考えて、何か使えるのに使ってない文字ない?
「%(剰余)」なんて使ってないけど?どう?

【コード18】

(t=function(a){if(a<0)a=-a;for(c=0,b=a;b;b-=((++c%a)<1))s-=a},s=4097,t(x)<t(y,p=s)<s)<<1^p-s-448<<6<p

101文字。アレ?

【コード19】

(t=function(a){if(a<0)a=-a;for(c=0,b=a;b;b-=++c%a<1)s-=a},s=4097,t(x)<t(y,p=s)<s)<<1^p-s-448<<6<p

97文字。アレアレ?

98文字から1文字短縮できました。

c=0, b=aと初期値を与えておいて、
1 cを1ずつカウントアップ
2 cがaの倍数になるたびに、bをカウントダウン
3 bがゼロになったら終了

これで、ループはひとつで良くなりました。%剰余を使えばよかったのでした。これって基本テクニック?

さらに!

4 cは初期値0からカウントアップする必要がない。
 cの初期値はaの倍数であれば正しく動作します。もちろんc=aでも良いはずです。

【コード20】

(t=function(a){if(a<0)a=-a;for(c=b=a;b;b-=++c%a<1)s-=a},s=4097,t(x)<t(y,p=s)<s)<<1^p-s-448<<6<p

これで、95文字になりました!暫定1位の記録を更新していいるはずです。
これで提出しました。さすがにこれで最短でしょう!


ーーーーー
ーーーー
ーーー
ーー

まだちょっとだけ続く

最短でしょう!とか言っときながらも、その後もうんうん考えました。
96文字までは、他の挑戦者の解答によって、短縮できるという保証がありました。
しかしいま、95文字まで短縮してしまっています。さらに短縮できるという保証はありません。
また、答えがないかもしれない問題を考えることになりました。
コードゴルフにおいて、切り込み隊長はそのフォロワーよりずっとハードだと思います。

絶対値の計算を再考する

今度は、aの絶対値をとる部分を再考してみました。
この部分は、レベル2の解答では、

p=x<0,p+=x*x*x^-p

というふうに計算していたところ、

三乗関数tを独立させるにあたり、

if(a<0)a=-a

と書き直した部分です。
aの絶対値を取るだけであれば、これ以上短くは書けないはずです。

三乗関数tの部分だけを示しますが、

t=function(a){if(a<0)a=-a;for(c=b=a;b;b-=++c%a<1)s-=a}

こうなっています。

絶対値の出し方を、レベル2で使用した方法で書いてみます。
一度は諦めた道なのですが、、、。

t=function(a){for(c=b=a=a-(u=a<0)^-u;b;b-=++c%a<1)s-=a}

残念ながら、この書き方だと1文字伸びてしまいます。

しかし、本当にaの絶対値はこんなに必要なんでしょうか?

tの内部ではa,b,cの3つの変数が、引数aの絶対値を保持し、その後にforループが始まります。
この変数を2つに抑えるのは無理でしょうか?と、考えましたが、これは無理でした。

次に、b,cがaの絶対値を持つのは許すから、引数aの絶対値を再度aに格納する必要はあるのか?と考えました。
aの符号がわからなくても問題ない形にできないだろうか?ということです。

新しい三乗関数t

t=function(a){for(c=b=a-(u=a<0)^-u;b;b-=++a%c==0)s-=c}

うむ。これでも動作します。古い三乗関数と同じ長さですが。
ともかく、a自身にaの絶対値を再格納しなくても動作するコードを書くことが出来ました。

【コード21】

(t=function(a){for(c=b=a-(u=a<0)^-u;b;b-=++a%c==0)s-=c},s=4097,t(x)<t(y,p=s)<s)<<1^p-s-448<<6<p

(95文字)

さらに、レベル2と全く同じ書き方で、余計な変数uの排除を試みます。
【コード22】

(t=function(a){for(b=a<0,c=(b+=a^-b);b;b-=++a%c==0)s-=c},s=4097,t(x)<t(y,p=s)<s)<<1^p-s-448<<6<p

(96文字)
変数uは排除出来ましたが、一文字伸びてしまいました。

この時点で、2月16日18時でした。締め切りまで24時間を切っていますが、これでギブアップか・・・。


・・・アレ?このカッコ、とれるの?

コレを c=(b+=a^-b) → こうしても → c=b+=a^-b
正しく解釈してくれることを、知りませんでした。

【コード22】

(t=function(a){for(b=a<0,c=b+=a^-b;b;b-=++a%c==0)s-=c},s=4097,t(x)<t(y,p=s)<s)<<1^p-s-448<<6<p

これで通ってしまいました。94文字です。

改めて、コード1から振り返ってみますと、もはや原型をとどめておりません。
思えば遠くへ来たものです*1

以上

スーパー楕円のダンジョンLV3 94文字への記録をまとめました。

これから、Javascriptコードゴルフをされる数寄者の方々のために、なにかのヒントをお伝えできれば幸いでございます。

拙い文章ですが、お読みいただきありがとうござました。

*1:古典部シリーズ4作目「遠まわりする雛」およびアニメ「氷菓」19話のエピソード「心当たりのあるものは」が好きです。そんだけです。すみません。

遠まわりする雛

遠まわりする雛