37.50.48

%20 の ブログ

Perl では「偽⇒0」は真だが「0⇒偽」は必ずしも真でない

Perl では、真偽値として解釈した値が偽であるならば、数値として解釈した値は 0 である。しかし、数値として解釈した値が 0 であっても、真偽値として解釈した値が偽になるとは限らない。

真偽 +0  .'' 備考
0 0 '0'  
0b0 0 '0'  
0x0 0 '0'  
0e5 0 '0'  
0.0 0 '0'  
.0 0 '0'  
'0' 0 '0' 空でない文字列で偽になるのはこれだけ
'' 0 ''  
() 0 ''  
(123,456,0) 0 '0' コンマ演算子
(@a=()) 0 '0'  
undef 0 ''  
11 11 '11'  
011 9 '9' 8進数
0b11 3 '3' 2進数
0x11 17 '17' 16進数
1e5 100000 '100000' 指数表記
123.456 123.456 '123.456'  
0.123 0.123 '0.123'  
.123 0.123 '0.123'  
'11' 11 '11'  
'011' 11 '011' 8進数として解釈されない
'0b11' 0 '0b11' 2進数として解釈されない
'0x11' 0 '0x11' 16進数として解釈されない
'0e5' 0 '0e5'  
'1e5' 100000 '1e5' 指数表記として解釈される
'0.0' 0 '0.0'  
'123.456' 123.456 '123.456'  
'0.123' 0.123 '0.123'  
'.123' 0.123 '.123'  
'0abc' 0 '0abc'  
'123abc' 123 '123abc'  
'abc' 0 'abc'  
(0,123,456) 456 '456' コンマ演算子
(@a=(0)) 1 '1'  
(@a=(123,456,0)) 3 '3'  

AtCoder での Perl golf に関するメモ

最近、AtCoder の問題を(ゴルフで)解き始めた。それに関するメモ。気が向いたら追記する。

 

N
$_**=3,print$_,$/for<>
$_=<>;print$_**3,$/
print+($_=<>)**3,$/
$_=<>**3;print$_,$/
print$_**3,$/for<>
print<>**3,$/

 

S
$_=<>;print s/abc/xyz/r
$_=<>;s/abc/xyz/;print
print s/abc/xyz/rfor<>
s/abc/xyz/,print for<>
print<>=~s/abc/xyz/r

 

X Y
print eval<>=~y/ /+/r,$/
<>=~$";print$`+$',$/
print<>!~$"+$`+$',$/

 

n
a1 a2 ... an
<>;$x+=$_ for split$",<>;print$x,$/
<>;$x+=$_ for<>=~/\d+/g;print$x,$/
<>;s/\d+/$x+=$&/gefor<>;print$x,$/
<>;<>=~s/\d+/$_+=$&/ger;print$_,$/
<>;$/=$";$x+=$_ for<>;print"$x
"
<>;print eval<>=~y/ /+/r,$/

 

ブログを始めるよりも前にあなごるで出題した問題

Anarchy Golf で自分が出題した問題について、ブログを始めたら何かしら書こうと以前から思っていたので書く。

 

850. A045718

素数±1 の数を 1 から 252 まで出力する問題。初めての出題だったので、簡単だし出題期間は1週間でいいよね・・・とか思って1週間にしてしまった。

861. tetration

テトレーションの問題。これを Whitespace で解こうとしたところ、普通に書くと TLE したので、2↑↑5 の代わりに 4**32768 の結果を出力して TLE を回避した。

889. 42

ultimate problem の入力と出力を逆にしたネタ問題。同じ入力に対して、異なる3つの出力が求められるので、何らかの乱数を使わないと解けない。しかも分岐が地味に面倒臭い。乱数を使わないと解けない問題として、123 という問題が既にあることは知っていたので、それとの違いをはっきり出すためにも、2回分岐するのはちょうど良かったと思う。Brainfuck では解けないと思っていたが、上手いこと cheat すると解けるらしい。

893. 32 div 0

Befunge のインタプリタの仕様を利用したネタ問題。Befunge の最短解が全体の最短解になる想定で出題した。exec を allow しているので、他の言語から Befunge を呼び出すこともできるようになっている。Befunge で最短解にたどりつくには、1Byte で 32 を作る方法を知らないといけない。

895. sandglass

入力を砂時計の形に変形する問題。あまり解答者が増えず、難易度調整の難しさを思い知った問題でもある。出題時に問題ページに署名をするようになったのはこの問題から。

902. 1 2 32 4 512

先頭が 1, 2, 3, 4, 5, ... , 100 になるような 2のn乗 の数を出力する問題。OEIS にもさすがにこれは載ってないだろと思ったら載ってて OEIS すげーってなった。

903. from 1 to 100

1 から 100 までの整数を改行区切りで出力する、とてもシンプルな問題。出題期間を初めてエンドレスにした。慣れていない言語に手を出すときに、まずは ASCII from 0x01 to 0x7f とセットでこれをやってみるといいんじゃないかな的な問題。一応、似たような問題として、Print out a lot _56K BEWARE_ という問題がある、ということを知ったのは出題したよりも後のことだった。

909. Convert hex to ASCII

16進数の入力に対して、最初の入出力例に示した変換を施す問題。FerNANDo で解くのがとても楽しかった。

913. differentiation

微分する問題。例外はあまり多くない方が良いと思い、なるべくシンプルに解けるような入出力にした。sed でも一応解いた。

914. antidifferentiation

不定積分する問題。こちらは敢えて例外を多くしてエンドレスで出題。面倒なのはよく分かっているので、解答者はあまりいないが気にしない。

916. FizzFizz

あの FizzBuzz をちょっと改変した問題。3のn乗の倍数なら Fizz をn回、5のm乗の倍数なら Buzz をm回出力する。この問題を出題した結果、FizzBuzz の解答も増え、何故か FizzBuzzBash の最短解が更新されるなどした。あと「アレンジ」が変な日本語だってことも分かった。



問題を解くのは楽しいので、出題者が増えれば嬉しいし、出題するのもそれはそれで楽しいので、今後も出題していきたいと思う。