アプリ版:「スタンプのみでお礼する」機能のリリースについて

0か1が区切り無しで1000000個並んでいます。
0100000110001…
これを
0 1 0 0 0 0 0 1 1 0 0 0 1 …
のように空白文字を入れる、もしくはタブ、改行などを入れて、
1つづに分けたいのですが、どのようにしたら出来上がりますでしょうか。
シェル、もしくは、C++でお願い致します。

A 回答 (8件)

sed 's/\([01]\)/\1 /g' infile > outfile

    • good
    • 0
この回答へのお礼

ありがとうございました。
試したのですが、少し違う結果になってしまいました。
応用して出来るのかと思い少し試しましたが、私では力不足なようです。
すいません。

お礼日時:2007/10/26 11:57

0,1がbinaryなのか、characterなのかはっきりしませんが、characterでしたら、下記の通り。


-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
#include <stdio.h>

int
main(void)
{
int c;

while ((c = getchar()) != EOF) {
printf("%c\n",c);
}
return (0);
}
    • good
    • 0
この回答へのお礼

ありがとうございました。
こちらで作成させて頂きました。
急いでおりましたので、投稿より25分で回答を頂けて、大変助かりました。

お礼日時:2007/10/26 11:55

awk ならこんな感じ



awk '{ for ( i = 1 ; i <= length($1) ; i ++ ){ printf("%s ",substr($1,i,1)) } }' infile > outfile

printfの書式を工夫すれば、改行でもTabでも可能です。
    • good
    • 0
この回答へのお礼

ありがとうございました。
No.2さんのご回答を試し、解決いたしました。
今後も機会がありましたら、宜しくお願い致します。

お礼日時:2007/10/26 11:59

bash で:


while read -n 1 ch; do echo $ch; done < infile
普段なら私は sed を使うんだけど, 1行が長すぎるとアウトになる可能性があるのであえて使わず.
    • good
    • 0
この回答へのお礼

ありがとうございました。
勉強不足で、bashを知りません。
今後も機会がありましたら、宜しくお願い致します

お礼日時:2007/10/26 12:01

gawkなら十万個(バイト)でも問題ないと思うけど


ダメなやつもありそう。

echo abcdefg | gawk -vFS='' -vOFS=' ' '{$1=$1; print}'
a b c d e f g

#実際に使うときは入力ファイルを指定して

OFSに設定する値を変えればタブでも改行でもお好みのとおりに。
    • good
    • 0
この回答へのお礼

ありがとうございました。
勉強不足で、使いこなせませんでした。申し訳ございません。
今後も機会がありましたら、宜しくお願い致します

お礼日時:2007/10/26 12:02

ベンチマークをとってみました。


1,000,000文字
0m0.610s C mac_res
0m2.543s awk sakusaker7さん
0m6.538s awk nitorinさん
1m57.389s bash Tacosanさん
100,000文字
0m16.154s sed koko_u_さん

sedは1,000,000文字を入力したところ5分経っても終了せず、100,000で測定を打ち切りました。
sakusaker7さんのawkがすぐ思いつくなら、最適解かもしれません。
思いつかなければ、Cがコンパイルの手間を入れても、圧勝ですね。
    • good
    • 0
この回答へのお礼

ありがとうございました。
『0m0.610s C mac_res』で作成した後、こちらの投稿を見させて頂きました。
こちらの比較により、安心する事が出来ました。ありがとうございました。

お礼日時:2007/10/26 12:04

ベンチマークの測定環境を書き忘れました。


gcc version 4.2.1 (Debian 4.2.1-3)
700MHz Celeron, 265MB memory
乱数列は、以下のプログラムで発生しました。
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[]) {
int i,c,n;

if (argc < 1) {
fprintf(stderr, "gen qty\n");
return(1);
}

n = atoi(argv[1]);
srand(time(NULL));

for (i = 0; i < n; i++) {
c = (rand() < RAND_MAX/2) ? '0':'1';
putchar(c);
}
return (0);
}
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
sedはそのまま3時間ほど放置しましたが、1,000,000文字を処理できませんでした。
    • good
    • 0
この回答へのお礼

ありがとうございました。
今後も機会がございましたら、宜しくお願い致します。

お礼日時:2007/10/26 12:05

#4 です.


そういえばもとの質問に環境が書いてなかったけど, 勝手に Linux だと思っちゃった.... まあ, 今どきのシステムなら bash か ksh くらい入ってるでしょうから, いいことにしておきます. ただ, これは「シェルで書く」という 1点だけに集中した (一種の) ジョークプログラムなので, #6 のように時間を比較されると勝てません (というか, そもそもジョークなので時間で勝つことは想定外). sed は... バッファオーバーフローしてるかなぁ?
    • good
    • 0
この回答へのお礼

作成中のシェルに組み込みたかったので、シェルでの作成が本命でした。
お恥ずかしいのですが、勉強不足で、bashもkshも知りません。
申し訳ございません。
今後も機会がございましたら、宜しくお願い致します。
ありがとうございました。

お礼日時:2007/10/26 12:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!