僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
いつから勘違いしていたか、よく思い出せない。
高校数学の教科書をめくってみたら、-3 の二乗は -9
になると書いてあった。(-3) の二乗が 9 になる。
-3 を、(-3) と見なすものは Smalltalk と Lisp系諸言語、それにbc(1)といったところか。
GNU Smalltalk ready st> -3 raisedTo: 2 9 (expt -3 2) 9 $ echo -3^2 | bc 9
スクリプト言語は大体、教科書に同じ、みたいだ。
$ gawk 'BEGIN{print -3**2}' -9 $ perl -e 'print -3**2, "\n"' -9 $ ruby -e 'puts -3**2' -9 $ python -c 'print -3**2' -9 R version 2.14.1 (2011-12-22) > -3 ** 2 [1] -9
<補足>
Smalltalk は、"-" という単項メッセージの方が、"raisedTo:" という
キーワードメッセージより強いからだろう(
メッセージの優先順位)。
LISP なら -3 もアトムのはずだ。
bc(1)は、マニュアル読んだだけではいまいちピンとこなかった。
スクリプト言語についていえば、単項演算子 "-" より 二項演算子の "**" の優先度が高いらしいことに
よる模様。
perldocとか
Python の doc 、
それに
Ruby リファレンスマニュアルに記述あり。
もちろん、変数に代入すれば (-3) となるはずだ。
</補足>
#include<stdio.h>
#include<math.h>
int main()
{
double x = -3;
double n = 2;
double p = pow(x, n);
printf("%2.0f\n", p);
return 0;
}
$ gcc -Wall -o powr powr.c -lm && ./powr 9
man 3 pow で-lm に気づくまで、"undefined reference to `pow' " に頭を抱えていた。
おまけ。php もそうだった。
あと何があるんだろうなぁ。
$ php -r 'echo pow(-3, 2) . "\n";' 9
<補足>
変数に代入したせいかもしれない。そんな演算子がなければ、
そうするしかないだろう。
</補足>
予算消化問題。予算と合計数だけ決まってる場合、 単価の高いの(優先)と安いのとを それぞれ幾つにするか。
どうもシミュレーションがうまくできないので、 まずpython3でやってみた。
#!/usr/bin/env python3 all = 15 money = 10000 for x in range(all,1,-1): rest = money - (700 * x + 500 * (all - x)) if rest gt; 0 and rest < 700: print('Lunch_A(700) is {}'.format(x)) print('Lunch_B(500) is {}'.format(15 - x)) print('Total is {}'.format(money - rest)) break => Lunch_A(700) is 12 Lunch_B(500) is 3 Total is 9900
解けるまでひとしきり試行錯誤した後、少し手を入れた。
次にEmacsLispを使って見た。
(defun lunch(money all lunch_A lunch_B) (cond ((< (+ (* lunch_A all) (* lunch_B (- 15 all))) money) (list (cons 'Lunch_A@700 all) (cons 'Lunch_B@500 (- 15 all)) (cons 'Total (+ (* lunch_A all) (* lunch_B (- 15 all)))))) (t (lunch money (- all 1) lunch_A lunch_B)))) (lunch 10000 15 700 500) ((Lunch_A@700 . 12) (Lunch_B@500 . 3) (Total . 9900))
#include<stdio.h> int factr(int n) { if (n == 1) return 1; else n = n * factr(n - 1); return n; } int main() { int n = 5; n = factr(n); printf("%d\n", n); return 0; } ./a.out 120
リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。