ただし文字・数値リテラルを使わずに
早速ソース
$ false;echo $? |
awk '{one=$0;zero=one-one;two=one+one;three=one+two;
four=one+three;seven=three+four;eight=seven+one;
nine=eight+one;print(seven two);print(one zero one);
print(one zero eight);print(one zero eight);
print(one one one);print(three two);print(one one nine);
print(one one one);print(one one four);
print(one zero eight);print(one zero zero);print(three three); }'|
awk '{printf("%c",$0)}END{printf("\n")}'
[実行結果]
Hello world!
何番煎じかわかりませんが、会社のSlackに気まぐれで貼ったら意外と受けが良かったので。
見やすいように適当に改行入れてます。
解説
false;echo $?
falseは終了コード1を返すコマンドです。
続けて実行しているecho $?で直前のコマンド(false)の終了コードを出力しています。
awk '{one=$0;zero=one-one;...print(three three); }'
echo $?の値が$0に入っているため、oneという変数に格納します。
コレで1を作ることが出来たので、1 - 1 = 0、1 + 1 = 2のようにしてどんどん数値を作っていきます。
また、print()では変数や文字列同士をスペースを挟むことで結合して出力できます。
例) print("1" "2") => 12
コレを用いて、先程作った数値から"Hello world!"の各文字に対応する文字コードを作っていきます。
H = 72
e = 101
l = 108
o = 111
= 32
w = 119
r = 114
d = 100
! = 33
awk '{printf("%c",$0)}END{printf("\n")}'
あとは、printf("%c",x)でxの文字コードに対応する文字を表示させます。
printf()はprint()と違って改行を出力しないため、最後に改行を出力します。
以上です。
もっと簡潔に書けるよ!とかあればよろしくお願いします。