takaのブログ
Amebaでブログを始めよう!

7th-2

メモ的なかんじです


単一換字式です。E >>> T > A > O > I > N くらいの頻度から考える

よって、問1のあれで文字数を探してみる


二文字で頻度多いのはis of 一文字はI aあたりで予想

三文字はthe(これと頻出のetaoinから復号、that →修正、そんでtest these thoseなど確認


二文字つながりが一番多いのがthかもしれない(ly,edもか?


復号化のプログラム→予測と修正


文字数数えるやつね

#include <stdio.h>
#include <string.h>
#define Nmax 9000

int main(){
char a[Nmax];
int numchar[126];
int n,i,j;
for(i=0;i<=126;i++) numchar[i]=0;
fgets(a,Nmax,stdin);
n=strlen(a);
for(i=0;i<n;i++){
for(j=32;j<=126;j++){
if(a[i]==j){
numchar[j]++;
break;
}
}
}
for(j=32;j<=126;j++){
printf("%c=%05d \t",j,numchar[j]);
}
return 0;
}


復号プログラム

#include <stdio.h>
#include <string.h>
#define Nmax 90000

int main(){
char a[Nmax];
char before[52]="AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
char after[52]="PpZzJjEeCcOoDdUuRrKkQqSsIiWwLlGgMmFfVvBbXxYyTtAaHhNn";
int n,i,j,c;

fgets(a,Nmax,stdin);
n=strlen(a);

for(i=0;i<n-1;i++){
if(a[i]==' ')printf(" ");/*空白はそのまますぐ出力して次へ*/
else{
c=0;
for(j=0;j<52;j++){/*変換するfor文*/
if(before[j]==a[i]){
printf("%c",after[j]);
c++;
break;
}
}
if(c==0)printf("%c",a[i]);/*変換しないときの出力*/

/*if(C==0)printf("#"); ←これはまだすべての変換表が埋まってないときに代わりにつかう*/
}
}
return 0;
}

同じ文字列の使用回数を数えるやつ
#include <stdio.h>
#include <string.h>
#define Nmax 90000

int main(){
char a[Nmax];
char b[15];
int n,n_b,i,j,count=0;

fgets(a,Nmax,stdin);
n=strlen(a);
printf("search : ");
fgets(b,15,stdin);
n_b=strlen(b);

for(i=0;i<n-1;i++){
j=0;
while(a[i]==b[j]){
j++;
i++;
if(j==n_b-1)count++;
}
}
printf("%d",count);
return 0;
}

7th-1

#include <stdio.h>
#include <string.h>
#define Nmax 9000
int arrayswap(char a[],int i,int j){
int tmp;
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
return 0;
}
int movebottom(char a[],int n){
if(n==0)return 0;
else{
movebottom(a,n-1);
if(a[n-1]>a[n])arrayswap(a,n-1,n);
return 0;
}
}
int bubble(char a[],int n){
if(n==0)return 0;
else{
movebottom(a,n);
bubble(a,n-1);
return 0;
}
}

int main(){
char a[Nmax];
int n,i;
fgets(a,Nmax,stdin);
n=strlen(a);
for(i=0;i<n;i++)printf("%c",a[i]);
bubble(a,n);
for(i=0;i<=n;i++)printf("%c",a[i]);
return 0;
}


もうひとつ
#include <stdio.h>
#include <string.h>
#define Nmax 9000

int main(){
char a[Nmax];
int numchar[126];
int n,i,j;
for(i=0;i<=126;i++) numchar[i]=0;
fgets(a,Nmax,stdin);
n=strlen(a);
for(i=0;i<n;i++){
for(j=32;j<=126;j++){
if(a[i]==j){
numchar[j]++;
break;
}
}
}
for(j=32;j<=126;j++){
if(numchar[j]>0){
for(i=0;i<numchar[j];i++)printf("%c",j);
}
}

return 0;
}


第三回

3(1)
#include<stdio.h>
#define MAX 100
#define N 10
int X[MAX];
int omosa=0,rieki=0,T_omosa=0,T_rieki=0,tmp[N];
/*データの取り込み(ファイル取り込みがベストか)*/
int c[N][2]={{7,208},{7,205},{13,169},{140,306},{111,189},{148,220},{220,320},{130,174},{273,307},{100,91}};

void Out(void){
int i;
for(i=0;i<N;i++)printf("%1d",X[i]);
printf("\n");
return;
}

void keisan(void){
int n;
omosa=0;
rieki=0;
for(n=0;n<N;n++){
if(X[n]==1){
omosa+=c[n][0];
rieki+=c[n][1];
}
}
if(omosa<=546 && rieki>T_rieki){
T_rieki=rieki;
T_omosa=omosa;
for(n=0;n<N;n++)tmp[n]=X[n];
}
return;
}

void Binary(int i){
if(i>=N)Out();
else{
X[i]=0;if(i==N-1)keisan();
Binary(i+1);
X[i]=1;if(i==N-1)keisan();
Binary(i+1);
}
return;
}

int main(){
int a;
Binary(0);
printf("実行番号(1の所が実行)\n0123456789\n");
for(a=0;a<N;a++)printf("%1d",tmp[a]);
printf("\n重さ%d: ,利益:%d\n",T_omosa,T_rieki);
return 0;
}
結果
実行番号
0123456789
1111011000
重さ:535 ,利益:1428
表2の方は計算時間:?分
結果
バイトの時間のため、中断
うちの環境だと30分かけて4桁残してるので、あと2^4倍の時間がかかると思われー
そう考えると現実的な時間では、30分かけて出た23個くらいまでかな

{{21,160},{24,148},{4,24},{27,140},{33,158},{37,132},{67,160},{99,236},{54,127},{186,290},{202,313},{51,72},{239,312},{254,323},{57,72},{255,316},{71,84},{164,171},{312,262},{308,230},{77,56},{165,108},{277,165},{226,112},{306,96},{42,13}


#include<stdio.h>
#define MAX 100
#define N 6
int X[MAX];
int time,T_time=10000,tmp[N],count=0;
int c[N][N]={{0,11,12,20,41,18},{0,0,10,21,20,24},{0,0,0,12,43,20},{0,0,0,0,42,14},{0,0,0,0,0,59},{0,0,0,0,0,0}};

void Out(void){
int i;
for(i=0;i<N;i++)printf("%1d",X[i]);
printf("\n");
return;

}

void swap(int i,int j){
int x;
x=X[i];
X[i]=X[j];
X[j]=x;
}

void keisan(void){
int i,j,n,m;
time=0;
for(i=0;i<N;i++){
n=X[i];
if(i<N-1)m=X[i+1];
else m=X[0];
time+=c[n-1][m-1];
}
if(time==T_time)count++;
if(time<T_time){
count=0;
T_time=time;
for(j=0;j<N;j++) tmp[j]=X[j];
}
return;
}

void perm(int i){
int j;
if(i>=N){
Out();
keisan();
}
else{
for(j=i;j<N;j++){
swap(i,j);
perm(i+1);
swap(i,j);
}
}
return;
}

int main(){
int i,j;
/*c[i][j]とc[j][i]を同期*/
for(i=0;i<N;i++){
for(j=0;j<i;j++) c[i][j]=c[j][i];
}
for(i=0;i<N;i++)X[i]=i+1;
perm(0);
printf("かかる時間:%d\ncount(出発する駅が異なれば,それは別の経路と考える):%d回\nkeiro:",T_time,count+1);
for(i=0;i<N;i++)printf("%d",tmp[i]);
}