NaaN日記

やったこと、覚えたことを発信する場

取り除いたりする(Ruby)

取り除くで!!という感じのものをまとめた

○末尾の改行文字(\n, \r)を取り除く

chomp
chomp!

chomp!はレシーバ自身を変更する。
引数に文字列を指定すると、その文字列を改行文字とみなす
末尾に改行文字があればレシーバ自身、ない時はnilを戻り値とする

>> moji = gets #Hello Curryと入力
>> moji
=> "Hello Curry\n"
>> moji.chomp #改行文字を取り除く
=> "Hello Curry"
>> moji
=> "Hello Curry\n"
>> moji.chomp! #レシーバ自身を変更
=> "Hello Curry"
>> moji
=> "Hello Curry"
>> moji.chomp!("y") #文字列を指定
=> "Hello Curr"

○末尾から1文字取り除く

chop
chop!

chop!はレシーバ自身を変更する。
末尾が"\r\n"で終わっている場合は"\r\n"を取り除く
漢字のように2バイト以上の文字でも1文字分消してくれる

>> moji = gets # Hello Curry
=> "Hello Curry\n"
>> moji.chop # 1文字(\n)取り除く
=> "Hello Curry"
>> moji.chop!
=> "Hello Curry"
>> moji
=> "Hello Curry"
>> moji.chop! # 1文字(y)取り除く
=> "Hello Curr"
>> moji
=> "Hello Curr"

○文字列の先頭の空白文字を取り除く

lstrip
lstrip!

lstrip!はレシーバ自身を変更する。

>> moji = gets"    Hello Curry\n"
>> moji.lstrip
=> "Hello Curry\n"
>> moji
=> "    Hello Curry\n"
>> moji.lstrip!
=> "Hello Curry\n"
>> moji
=> "Hello Curry\n"

○文字列の末尾の空白文字を取り除く

rstrip
rstrip!

rstrip!はレシーバ自身を変更する。
半角空白・タブ・復帰・改行・末尾のヌル文字など

>> moji = gets # "Hello Curry    \n"
=> "Hello Curry    \n"
>> moji.rstrip
=> "Hello Curry"
>> p moji
=> "Hello Curry    \n"
>> moji.rstrip!
=> "Hello Curry"
>> moji
=> "Hello Curry"
>> moji
=> "Hello Curry"
>> moji.rstrip! # 末尾が空白文字でないとき
=> nil

○文字の先頭と末尾の空白文字を取り除く

strip
strip!

strip!はレシーバ自身を変更する。

>> moji = gets # "   Hello Curry   \n"
>> moji.strip
=> "Hello Curry"
>> moji
=> "   Hello Curry   \n"
>> moji.strip!
=> "Hello Curry"
>> moji
=> "Hello Curry"

○配列の末尾の要素を削除し要素を返す

pop

レシーバ自身を変更する
空の時はnilを返す

>> list = ["N", "a", "a", "n", "\n"]
>> list.pop
=> "\n" # 末尾の要素
>> list
=> ["N", "a", "a", "n"] # list自身が変更された

○配列の先頭の要素を削除し要素を返す

shift

レシーバ自身を変更する
空の時はnilを返す

>> list = ["K", "a", "n", "p", "a", "n"]
>> list.shift
=> "K" # 先頭の要素
>> list
=> ["a", "n", "p", "a", "n"]

1から与えられた数まで素数かどうか(C)

前回の続きができた。今度は1から与えられた数まで調べる

#include <stdio.h>
#include <math.h>
int main(void){
    int max;//最大値
    int i, j;
    int sosu[100];  //とりあえず100まで。ここが0だったら素数
    double sqr[100];  //それぞれの平方根
    int num[100];  //1から最大値までが入っている
    scanf("%d", &max);
    for(i=1; i<=max; i++){
        sosu[i-1] = 0;
        num[i-1] = i;
        sqr[i-1] = floor(sqrt(num[i-1]));
    }
    if(max>=3){
        printf("1\n");
        printf("2は素数です\n");
        printf("3は素数です\n");
        for(i=3; i<=max; i++){
            for(j=2; j<=sqr[i]; j++){
                if (num[i]%j == 0){
                    sosu[i] = 1;
                }
                if (j == sqr[i]){
                    if (sosu[i] == 0){
                        printf("%dは素数です\n", num[i]);
                    }
                    else{
                        printf("%d\n", num[i]);
                    }
                }
            }
        }
    }
    else if (max == 1){
        printf("1\n");
        }
    else if(max == 2){
        printf("1\n");
        printf("2は素数です\n");
    }
    return 0;
}

やっぱり3以下は直接書いた方が早いという結論に現時点では至っている。
あと、とにかく大きい数を入力したくなる。

与えられた数が素数かどうか(C)

sqrtを使って素数かどうかを判断できるものを作れると知ったので、
入力した数字が素数かどうか判断するものを書いてみた。

#include <stdio.h>
#include <math.h>
int main(void){
    int num, i;
    int sqr;  //平方根
    int sosu = 0;  //ここの値が変わらなかったら素数
    scanf("%d", &num);
    sqr = floor(sqrt(num));
    if(num == 1){
        printf("1です\n");
    }
    if(num == 2){
        printf("2は素数です\n");
    }
    if(num == 3){
        printf("3は素数です\n");
    }
    for(i=2; i<=sqr; i++){
        if(num%i==0){
            sosu = 1;
        }
        if(i==sqr){
            if(sosu==0){
                printf("%dは素数です\n", num);
            }
            else{
                printf("%dは素数ではありません\n", num);
            }
        }
    }
    return 0;
}

1~3までの値をどうするか困ったのでそのまま書いた。
次は1から入力した値までの数を判断させるもの作れたらいいね

math.h その1(C)

math.h、何が何だか忘れそう

コンパイル

GCCコンパイルするためには

gcc hoge.c -lm
平方根・累乗・累乗根
sqrt(x);  //平方根
pow(x,n);  //累乗
pow(x, 1/n);  累乗根
対数関数・指数関数
log(x)  //対数関数
exp(x)  //指数関数
//指数関数は値が大きくなるので理科的表記に
切り上げ・切り捨て・四捨五入
ceil(x)  //切り上げ
floor(x)  //切り捨て
floor(x+0.5)//四捨五入
//返却値は実数
弧度
kodo = (M_PI * kakudo) / 180//M_PIはπ
三角関数
sin(kodo)
cos(kodo)
tan(kodo)
asin(kodo)
acos(kodo)
atan(kodo)//90度に気を付ける
桁数を求める
c = pow(n, p);
p = log10(c) / log10(n);
log10(c) = p * log10(n);//桁数 
ビット数
bit = log2(pow(n, p));
bit = p * log2(n);//ビット数

breakを使わないswitch(C)

西暦・月・日を入力して、
12月31日までの日数を答えるプログラムを作ってるときに、
breakを使わないswitch文でいけるんじゃね?と思って、
やってみた。

構造としては、
case 月:
の形で、1月だと2月、3月……と12月まで流れていく。
それぞれの月でその月に計何日あるかを残り日数の変数に足す。
日本語が難しい


#include <stdio.h>
int main(void){
    int y, m, d;  //左から西暦、月、日
    int day = 0;  //残り日数
    scanf("%d %d %d", &y, &m, &d);
    switch(m){
        case 1:
        day += 31;
        case 2:
            if (y%400 == 0 || (y%4 == 0 && y%100 != 0)){
                day++;  //閏年の時、1日増やす
            }
        day += 28;
        case 3:
        day += 31;
        case 4:
        day += 30;
        case 5:
        day += 31;
        case 6:
        day += 30;
        case 7:
        day += 31;
        case 8:
        day += 31;
        case 9:
        day += 30;
        case 10:
        day += 31;
        case 11:
        day += 30;
        case 12:
        day += 31;
        day -= d;
        break;
    }
    printf("12月31日まで残り%d\n", day);
    return 0;
}

只今ブログ休止中です。
再開は7/19以降を予定

ROT13というものがあるらしい(Python)

ROT13とは、
"Rotate by 13 places"
の略らしい。
英語を丁度13文字ずらしてくれる。

import codecsをして、
codecs.encode('変換したい文字', 'rot-13')で
変換してくれる。スゴイ。

import codecs
print(codecs.encode(input(), 'rot-13'))
#print(codecs.decode(input(), 'rot13'))この書き方でもいけた

#Gunax lbhと入力
#Thank youと出力!

ということで、上にもある通りencodeとdecodeでの違いがよくわからん、
というのが今後理解したいところ。

今回はこういうのあるんだーと知った話でした。

Unicodeを少し(Python)

ord(c)とは

1 文字の Unicode 文字を表す文字列に対し、その文字の Unicode コードポイントを表す整数を返します。
例えば、 ord('a') は整数 97 を返し、 ord('€') (ユーロ記号) は 8364 を返します。これは chr() の逆です。
(Python標準ライブラリの説明より)

使ってみる

>>>ord('宴')
23476
chr(i)とは

Unicode コードポイントが整数 i である文字を表す文字列を返します。
例えば chr(97) は文字列 'a' を、 chr(8364) は文字列 '€' を返します。 ord() の逆です。
引数の有効な範囲は 0 から 1,114,111 (16 進数で 0x10FFFF) です。 i が範囲外の場合 ValueError が送出されます。
(Python標準ライブラリの説明より)

先程の整数を入れてみる

>>>chr(23476)
'宴'
文字をずらしてみる
moji = input()   #文字を入力
shift = int(input())   #いくつ後ろにずらすか
result = ""
for act in moji:
    num = ord(act)   #文字コード
    shifted = chr(num + shift)   #文字にする
    result += shifted
print(result)

>>>Khoor
>>>-3
'Hello'


chr()の中に色々な数字入れたくなるよね