challenge LL Golf Hole 5 - 最上位の桁を数え上げる

与えられた自然数までの数え上げを行います。ただし、繰り上がりが起こったときは最上位の桁のみを数え上げます。また、与えられる自然数には0以外の桁が2回以上登場してはいけません。たとえば、300を入力として与えられた場合は以下のような出力となります。

0
1
2
3
4
5
6
7
8
9
10
20
30
40
50
60
70
80
90
100
200
300

与える自然数についてはリテラルで与える、標準入力で与える、引数で与えるなどは自由とします。

※LL Future実行委員の高野光弘です。この出題は LL Future公式の出題であり、優れたものについてはLL Golfのセッションでご紹介させていただくかもしれません。ご理解の上、ご投稿ください。また、LL Futureのチケットは現在も発売中です。よろしければ、メインイベントの方にもぜひご参加ください。

1
2
3
4
5
6
#!/usr/bin/env ruby
def f(n, m = 0)
    puts m    
    n == m ? return : f(n, m + 10 ** (m.to_s.size - 1) )
end
f(300)

Posted feedbacks - C

C++に対抗意識を燃やしてみたけどかてなかったorz
うーん、atoi()をstrcmp()にすればもう少し短くなる気がするんだけどうまく動かない。。
strcmp()って短い文字列は小さいと判断されると思ったのだけど気のせいかなー?

// gcc -Wall doukaku200.c

ちなみに圧縮すると↓のような感じ(113バイト?)
char s[9]={48},*t=s;
main(int ac, char* av[]){for(;atoi(s)<atoi(av[1]);(*s)++)
{puts(s);if(*s==59)*s=*(++t)=48;}}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
char s[9]={0x30},*t=s;
int main(int ac, char* av[])
{
    for(;atoi(s)<=atoi(av[1]);(*s)++)
    {
        puts(s);
        if(*s==0x39)
        {
            t++;
            *s = *t = 0x30;
        }
    }
    return 0;
}
/* EOF */

コマンドラインで数を指定します。 int/longの範囲を超える大きな数値でもOK.数値ではなく文字列処理でやってるんで。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main(int argc, char *argv[])
{
        char *p, *q;
        int len;
        len=strlen(argv[1]);
        p=malloc(len+1);
        memset(p, ' ', len);
        p[len]='\0';
        q=p+len-1;
        *q='0' -1;
        while(strcmp(argv[1], p)>0) {
                if(++(*q) >'9') {
                        *q='0';
                        *--q ='1';
                }
                puts(q);
        }
}

100バイト切れた。 まだまだですがこんなところで。

1
2
3
4
5
b=10;c;main(a){a=atoi(gets());while(a>=b){printf("%d\n",c);c+=b/10;c>=b?b*=10:1;}printf("%d\n",a);}

$> cat num.txt
100
$> cat num.txt | ./a.out

b=10;c;main(a){a=atoi(gets());while(a>=c){printf("%dn",c);c+=b/10;c>=b?b*=10:1;}}

1
というわけで修正してみました。大丈夫だと思いますが...

gets用のバッファが必要なのでは??
修正+若干の縮め
1
b=1;c;main(a){for(scanf("%d",&a);a>=c;c+=b,b*=c-b*10?1:10){printf("%d\n",c);}}

Index

Feed

Other

Link

Pathtraq

loading...