mirac cafe という名の不思議なブログ
※ ブログ等での私の投稿は個人の見解によるものであり、 所属する組織の見解ではありません。
※ ブログ等での私の投稿は個人の見解によるものであり、 所属する組織の見解ではありません。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
なんかプログラミング好きな人たちの間で、
makeplexさんの出された問題がはやっていたので、解いてみました。
頑張って解いたのですが、
何の変哲もないプログラムになってしまい寂しかったので、
ショートコーディング(プログラムを可能な限り短くする遊び)をやってみました。
600文字を切ったのでとりあえず満足。
多分ショートコーディングのプロとかがやれば
300文字ぐらいになるのでしょうが、
自分は適当に妥協することにしますw
ソースを貼っておきますが、
ネタバレにならないように色を青っぽくしておきます。
見たい人は選択して色反転させるなりして見てくださいね。
仕様:
入力は複数のデータセットを含み、各データセットは昇順13個の1-9なる数。
出力はmakeplexさんのものの通り。出力順序の入れ替わりは可とする。
Sample Input:
1112224588899
1122335556799
1112223335559
1223344888999
1112345678999
Sample Output:
1112224588899
(111)(222)(888)(99)[45]
1122335556799
(123)(123)(567)(99)[55]
(123)(123)(567)(55)[99]
(123)(123)(555)(99)[67]
1112223335559
(123)(123)(123)(555)[9]
(111)(222)(333)(555)[9]
1223344888999
(234)(234)(888)(999)[1]
(123)(234)(888)(999)[4]
(123)(44)(888)(999)[23]
1112345678999
(123)(456)(789)(99)[11]
(123)(11)(456)(789)[99]
(123)(11)(456)(999)[78]
(123)(11)(678)(999)[45]
(11)(345)(678)(999)[12]
(111)(345)(678)(999)[2]
(111)(234)(678)(999)[5]
(111)(234)(567)(999)[8]
(111)(234)(567)(99)[89]
(111)(234)(789)(99)[56]
(111)(456)(789)(99)[23]
ソースコード:
#define L(c)(f==13-c||b[f]!=b[f+c])
a[5];char b[14];F(int u,int n,int t,int w){int i,k,s,f=0;if(u==8191){for(i=5;i--;){putchar(i?'(':'[');for(k=0;k<13;k++)if(a[i]&1<<k)putchar(b[k]);putchar(i?')':']');}return puts("");}while(u>>f&1)f++;if(!t&&!w&&L(1)){a[0]=1<<f;F(u|a[0],n,1,1);}for(s=2;s--;){for(i=f;++i<13;)if(!(u&1<<i)&&b[f]+s==b[i]){for(k=i;++k<13;)if(!(u&1<<k)&&b[f]+s+s==b[k]&&(s||L(3))){a[n]=1<<f|1<<i|1<<k;F(u|a[n],n-1,t,w);break;}if(!w&&(s||L(2)))a[0]=1<<f|1<<i,F(u|a[0],n,t,1);if(!s&&!t&&L(2))a[n]=3<<f,F(u|a[n],n-1,1,w);break;}}}main(){for(;~scanf("%s",b);puts(""))puts(b),F(0,4,0,0);}
makeplexさんの出された問題がはやっていたので、解いてみました。
頑張って解いたのですが、
何の変哲もないプログラムになってしまい寂しかったので、
ショートコーディング(プログラムを可能な限り短くする遊び)をやってみました。
600文字を切ったのでとりあえず満足。
多分ショートコーディングのプロとかがやれば
300文字ぐらいになるのでしょうが、
自分は適当に妥協することにしますw
ソースを貼っておきますが、
ネタバレにならないように色を青っぽくしておきます。
見たい人は選択して色反転させるなりして見てくださいね。
仕様:
入力は複数のデータセットを含み、各データセットは昇順13個の1-9なる数。
出力はmakeplexさんのものの通り。出力順序の入れ替わりは可とする。
Sample Input:
1112224588899
1122335556799
1112223335559
1223344888999
1112345678999
Sample Output:
1112224588899
(111)(222)(888)(99)[45]
1122335556799
(123)(123)(567)(99)[55]
(123)(123)(567)(55)[99]
(123)(123)(555)(99)[67]
1112223335559
(123)(123)(123)(555)[9]
(111)(222)(333)(555)[9]
1223344888999
(234)(234)(888)(999)[1]
(123)(234)(888)(999)[4]
(123)(44)(888)(999)[23]
1112345678999
(123)(456)(789)(99)[11]
(123)(11)(456)(789)[99]
(123)(11)(456)(999)[78]
(123)(11)(678)(999)[45]
(11)(345)(678)(999)[12]
(111)(345)(678)(999)[2]
(111)(234)(678)(999)[5]
(111)(234)(567)(999)[8]
(111)(234)(567)(99)[89]
(111)(234)(789)(99)[56]
(111)(456)(789)(99)[23]
ソースコード:
#define L(c)(f==13-c||b[f]!=b[f+c])
a[5];char b[14];F(int u,int n,int t,int w){int i,k,s,f=0;if(u==8191){for(i=5;i--;){putchar(i?'(':'[');for(k=0;k<13;k++)if(a[i]&1<<k)putchar(b[k]);putchar(i?')':']');}return puts("");}while(u>>f&1)f++;if(!t&&!w&&L(1)){a[0]=1<<f;F(u|a[0],n,1,1);}for(s=2;s--;){for(i=f;++i<13;)if(!(u&1<<i)&&b[f]+s==b[i]){for(k=i;++k<13;)if(!(u&1<<k)&&b[f]+s+s==b[k]&&(s||L(3))){a[n]=1<<f|1<<i|1<<k;F(u|a[n],n-1,t,w);break;}if(!w&&(s||L(2)))a[0]=1<<f|1<<i,F(u|a[0],n,t,1);if(!s&&!t&&L(2))a[n]=3<<f,F(u|a[n],n-1,1,w);break;}}}main(){for(;~scanf("%s",b);puts(""))puts(b),F(0,4,0,0);}
PR
この記事にコメントする
カレンダー
04 | 2024/05 | 06 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
フリーエリア
最新コメント
[11/30 kamae]
[04/30 mirac]
[04/29 渚]
[01/20 渚]
[01/01 mirac]
[12/09 mirac]
[10/31 mirac]
[03/14 mirac]
[08/10 404ななしさん]
[08/09 halwhite]
最新記事
(07/28)
(07/15)
(05/04)
(04/30)
(04/17)
(03/05)
(02/21)
(02/16)
(02/01)
(01/29)
最新トラックバック
ブログ内検索