tag:crieit.net,2005:https://crieit.net/tags/%E3%81%82%E3%81%91%E3%81%8A%E3%82%81/feed「あけおめ」の記事 - CrieitCrieitでタグ「あけおめ」に投稿された最近の記事2019-01-02T04:11:28+09:00
https://crieit.net/tags/%E3%81%82%E3%81%91%E3%81%8A%E3%82%81/feed
tag:crieit.net,2005:PublicArticle/147072019-01-01T23:26:06+09:002019-01-02T04:11:28+09:00https://crieit.net/posts/Vue-jsVue.jsで謹賀新年(失敗作)
<p>なんか面白いものを作ろうと思ったけどだめだった…。失敗作だけどとりあえず投稿…。</p>
<p data-height="383" data-theme-id="0" data-slug-hash="YdEMGm" data-default-tab="result" data-user="dala00" data-pen-title="VueYear" class="codepen">See the Pen <a target="_blank" rel="nofollow noopener" href="https://codepen.io/dala00/pen/YdEMGm/">VueYear</a> by dala00 (<a target="_blank" rel="nofollow noopener" href="https://codepen.io/dala00">@dala00</a>) on <a target="_blank" rel="nofollow noopener" href="https://codepen.io">CodePen</a>.</p>
だら@Crieit開発者tag:crieit.net,2005:PublicArticle/147052019-01-01T00:00:27+09:002019-01-01T10:42:41+09:00https://crieit.net/posts/Python-5c2a2f0bb5a45あけおめからPython
<h1 id="皆さんへのメッセージです。"><a href="#%E7%9A%86%E3%81%95%E3%82%93%E3%81%B8%E3%81%AE%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%A7%E3%81%99%E3%80%82">皆さんへのメッセージです。</a></h1>
<pre><code class="python">謹賀, 新年=(lambda x:(not x,x))([])
新年.append((謹賀+謹賀)**((謹賀+謹賀)**(謹賀+謹賀+謹賀))-(謹賀+謹賀+謹賀)**(謹賀+謹賀+謹賀)-(謹賀+謹賀))
新年.append((謹賀+謹賀)**((謹賀+謹賀)**(謹賀+謹賀+謹賀)-謹賀)+謹賀)
新年.append(新年[-謹賀]+謹賀)
新年.append(新年[謹賀-謹賀])
新年.append(新年[謹賀])
新年.append(新年[謹賀+謹賀]+((謹賀+謹賀)*(謹賀+謹賀))**(謹賀+謹賀)-謹賀)
新年.append(新年[謹賀-謹賀])
新年.append(新年[謹賀])
新年.append(新年[謹賀+謹賀]+(謹賀+謹賀)**(謹賀+謹賀+謹賀))
新年.append(新年[謹賀-謹賀])
新年.append(新年[謹賀+謹賀])
新年.append(新年[謹賀])
print(bytes(新年).decode('utf-8'))
</code></pre>
<p>実行してみましょう。</p>
<h1 id="小ネタは置いといて。"><a href="#%E5%B0%8F%E3%83%8D%E3%82%BF%E3%81%AF%E7%BD%AE%E3%81%84%E3%81%A8%E3%81%84%E3%81%A6%E3%80%82">小ネタは置いといて。</a></h1>
<p>この前、ふとリスト内包表記の中身(ローカル変数空間)が気になったので以下のコードを実行してみました。</p>
<pre><code class="python">[i for i in [0] if print(locals()) or 1]
</code></pre>
<p>結果はこうなりました。</p>
<pre><code class="python">{'i': 0, '.0': <tuple_iterator object at 0x0000018E8BDDE518>}
</code></pre>
<p>はい、コードの実行フレームが分かれていますね。ところで表示された辞書オブジェクトのキー<code>'.0'</code>って何でしょう?気になったので以下のコードを実行してみました。もし、私の予想が正しければ実行は終了しないはずです。</p>
<pre><code class="python">[i for i in [0] if locals().__setitem__('.0', range(2).__iter__()) or 1]
</code></pre>
<p>実際にやってみた結果、<code>[0]</code>が出力されました。どういうことなんでしょう…?<br />
<code>__setitem__</code>をした後に<code>print(locals())</code>で中身を調べてみます。</p>
<pre><code class="python">[i for i in [0] if locals().__setitem__('.0', range(2).__iter__()) or print(locals()) or 1]
</code></pre>
<p>結果はこのようになりました。</p>
<pre><code class="python">{'i': 0, '.0': <tuple_iterator object at 0x0000018E8BDDE518>}
</code></pre>
<p>要素を変えることができていません。なぜでしょう? 残念なことにいくつか仮説を立ててみたのですが、そのどれもが間違っていました。</p>
<h2 id="仮説1. ローカル変数空間はループごとに新しく作られている"><a href="#%E4%BB%AE%E8%AA%AC%EF%BC%91.+%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%A4%89%E6%95%B0%E7%A9%BA%E9%96%93%E3%81%AF%E3%83%AB%E3%83%BC%E3%83%97%E3%81%94%E3%81%A8%E3%81%AB%E6%96%B0%E3%81%97%E3%81%8F%E4%BD%9C%E3%82%89%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B">仮説1. ローカル変数空間はループごとに新しく作られている</a></h2>
<p>これは簡単に確かめることができます。</p>
<pre><code class="python">[i for i in [0,1] if print(id(locals())) or 1]
</code></pre>
<p>これで表示される数が2つとも等しければ使いまわされていることが証明できます。私が実行した結果はこうなりました。</p>
<pre><code class="python">1711743637328
1711743637328
[0, 1]
</code></pre>
<p>はい、一致していますね。異なるオブジェクトのIDが一致することはまずありえませんので、ローカル変数空間は使いまわされていることがわかりました。</p>
<h2 id="仮説 2. '.0'というキーは例外的に書き換えできない"><a href="#%E4%BB%AE%E8%AA%AC+2.+%27.0%27%E3%81%A8%E3%81%84%E3%81%86%E3%82%AD%E3%83%BC%E3%81%AF%E4%BE%8B%E5%A4%96%E7%9A%84%E3%81%AB%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84">仮説 2. '.0'というキーは例外的に書き換えできない</a></h2>
<p>当然なんてことはありませんでした。</p>
<pre><code class="python">>>> x = {}
>>> x['.0'] = 12
>>> x
{'.0': 12}
>>> x['.0'] = 4
>>> x
{'.0': 4}
</code></pre>
<h2 id="仮説 3. ローカル名前空間のオブジェクトがdictではない"><a href="#%E4%BB%AE%E8%AA%AC+3.+%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%90%8D%E5%89%8D%E7%A9%BA%E9%96%93%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%8Cdict%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84">仮説 3. ローカル名前空間のオブジェクトがdictではない</a></h2>
<p>だんだん投げやりになってきましたね。当然そんなわけなく、<code>dict</code>でした…。</p>
<pre><code class="python">>>> [i for i in [0] if print(type(locals())) or 1]
<class 'dict'>
[0]
</code></pre>
<p>とまぁ、こんな感じで<code>Python</code>サイドからの解明は終ぞできませんでした…。今年はPythonのコードリーディングをしようかと考えています。</p>
<h1 id="リスト内包表記は単体でチューリング完全と聞いたので"><a href="#%E3%83%AA%E3%82%B9%E3%83%88%E5%86%85%E5%8C%85%E8%A1%A8%E8%A8%98%E3%81%AF%E5%8D%98%E4%BD%93%E3%81%A7%E3%83%81%E3%83%A5%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E5%AE%8C%E5%85%A8%E3%81%A8%E8%81%9E%E3%81%84%E3%81%9F%E3%81%AE%E3%81%A7">リスト内包表記は単体でチューリング完全と聞いたので</a></h1>
<p>リスト内包表記だけでいくつか書いてみました。まずは普通にFizzBuzzから。</p>
<pre><code class="python"># FizzBuzz in list comprehension
[('Fizz' if not i%3 else '')+('Buzz' if not i%5 else '')+(str(i) if i%3 and i%5 else '') for i in range(20)]
</code></pre>
<p>続いてはAtCoder Beginners Selectionより<a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abs/tasks/abc088_b">Card Game for Two</a>を解くプログラム。結構強引ですね。</p>
<pre><code class="python">print(sum(x-y for x, y in zip(*(lambda x:((x.append(0) if len(x)%2 else None),x.sort(reverse=True),(x[::2],x[1::2]))[2])((input(), [int(i) for i in input().split()])[1]))))
</code></pre>
<p>正直言うと、自分も難読化以上の意味はないと思いました…。</p>
<p>ですが、いろいろやっているとやはり内包表記のポテンシャルは高いと感じました。あなたもやってみてはいかが?</p>
<h1 id="for文で遊ぶ"><a href="#for%E6%96%87%E3%81%A7%E9%81%8A%E3%81%B6">for文で遊ぶ</a></h1>
<pre><code class="python">for i in range(20):
print(i)
</code></pre>
<p>と同じプログラムを<code>range</code>関数なしで黒魔術っぽくやってみたいと思います。</p>
<pre><code class="python">for i in (lambda x: (x, x.append(x))[0])([]):
print(len(i)-1)
i.append(i)
if i[20:]:
i.clear()
</code></pre>
<p>循環参照をうまく使ってみました。難読化以上の意味はないです</p>
<p>私からは以上です。皆さん、今年も元気に行きましょう!</p>
frodo821