UWSCバッドノウハウクイズ Q3のこたえ

しゅんさんの記事から

さっそく答え書く

HASH_EXISTS:=HASH_KEY+token(,h[1])

HASH_KEY-101なので

HASH_EXISTS:=-101+token(,h[1])

とも書ける

しゅんさんやミリアムさんが書いてた35/31文字や38/31文字とはまた違う結果(34/30文字)になってるのが気になるんだけど、どうなってやがるんだぜ

解説
token(,h[1])h[1] = EMPTY と同等なので、これで配列変数hに一個要素出来る
そんで token(,h[1]) の戻り値が空文字なので、HASH_KEY (-101) と足してもいい感じに評価されますから HASH_EXISTS には HASH_KEY が代入されます
そんで次の h[0, HASH_REMOVE] ですが、0がキーの要素はないので当然なにも起こりません
で、Whileの頭に戻るとこんどは h[0, HASH_EXISTS]h[0, HASH_KEY] になってるので0番目の要素のキー、つまり1を返すから!でひっくり返ってFALSEです
無事ループを抜けます
やったぜ


元記事のコメントに書いた「右辺に何も書かない」は最近の(4.93や5.0.1)ではできないっぽい
いつ頃の出来事だったかも覚えてないんだけど、確かにそんな書き方が出来てひああってなったのだけは覚えてるんよ
EMPTYが入るだけだしそんな書き方したとこでデメリットしかないので、このクイズやるまで忘れていたけれども

UWSCバッドノウハウクイズ Q3のこたえ」への2件のフィードバック

  1. tokenとは素晴らしい。
    わからないなんて、またまた。

    ミリアムさんのは多分「h[0]:=eval(“hash_remove:=hash_exists”)」
    eval使ったら複文と変わらないので、同じようなもの、とかコメントしてたりします。
    hash_removeを書き換えるかhash_existsを書き換えるかの二通りです。
    hash_removeの方はhash_existsにする方法とhash_key(またはhash_val)にする方法がありますが、内部表現で言えば4文字で変わらないため、同一視してます。

    • なるほどなー
      evalの中でevalという発想は全くありませんでした
      確かに結果としては二周するのと大差ないですが、危ないことをやってる感がはるかに増しますね!
      そうかー…evalすらも評価するのかー…

      参照渡しならともすれば配列要素が作れるんではなかろうかという苦肉の策でした
      >token

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中