সি - 519
(বা 137 যদি আপনি আমাকে কাঠামোর জন্য ক্রেডিট করেন ...)
কেবলমাত্র এই একটি অপারেশনটি সমাধান করার পরিবর্তে, আমি দৃ .়তার সমস্ত সমস্যা সমাধানের জন্য একটি কাঠামো তৈরি করার সিদ্ধান্ত নিয়েছি ।
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char*(*O)(char*);
char*b(char*s){long long int v=0,i,l=0;char*t=0;l=strlen(s);t=malloc(l+2);
for(i=0;i<l;i++)v+=s[i]-'0';snprintf(t,l+2,"%lld",v);return t;}
int a(char**s,O o){int r;char*n;n=o(*s);r=!strcmp(*s,n);free(*s);
*s=n;return r;}
int main(int c, char**v){size_t l, m=0;char *d,*n=0;O o=b;FILE*f=stdin;
while(((l=getline(&n,&m,f))>1)&&!feof(f)){int i=0;n=strsep(&n,"\n");
d=strdup(n);while(!a(&n,o))i++;printf("%s %d\n",d,i);free(d);free(n);n=0;m=0;}}
কেবল দুটি লাইনই char*b
এই সমস্যাটির জন্য অনন্য।
এটি ইনপুটটিকে স্ট্রিং হিসাবে বিবেচনা করে, যার অর্থ আউটপুট পর্যায়ে "0" গুলি আগে স্ট্রিপ হয় না।
উপরেরটির মন্তব্য, ত্রুটি পরীক্ষা করা এবং প্রতিবেদন করা এবং ফাইল পড়া (স্ট্যান্ডার্ড ইনপুট থেকে অবশ্যই ইনপুট আসতে হবে) রয়েছে:
/* persistence.c
*
* A general framework for finding the "persistence" of input strings
* on opperations.
*
* Persistence is defined as the number of times we must apply
*
* value_n+1 <-- Opperation(value_n)
*
* before we first reach a fixed point.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../getline.h"
/* A function pointer type for operations */
typedef char*(op_func)(char*);
typedef op_func* op_ptr;
/* Op functions must
* + Accept the signature above
* + return a point to a newly allocated buffer containing the updated str
*/
char* addop(char*s){
int i,l=0;
long long int v=0;
char *t=NULL;
/* protect against bad input */
if (NULL==s) return s;
/* allocate the new buffer */
l = strlen(s);
t = malloc(l+2);
if (NULL==t) return t;
/* walk the characters of the original adding as we go */
for (i=0; i<l; i++) v += s[i]-'0';
//fprintf(stderr," '%s' (%d) yields %lld\n",s,l,v);
snprintf(t,l+2,"%lld",v);
//fprintf(stderr," %lld is converted to '%s'\n",v,t);
return t;
}
/* Apply op(str), return true if the argument is a fixed point fo
* falsse otherwise,
*/
int apply(char**str, op_ptr op){
int r;
char*nstr;
/* protect against bad input */
if ( NULL==op ) exit(1);
if ( NULL==*str ) exit(4);
/* apply */
nstr = op(*str);
/* test for bad output */
if ( NULL==nstr ) exit(2);
r = !strcmp(*str,nstr);
/* free previous buffer, and reasign the new one */
free(*str);
*str = nstr;
return r;
}
int main(int argc, char**argv){
size_t len, llen=0;
char *c,*line=NULL;
op_ptr op=addop;
FILE *f=stdin;
if (argc > 1) f = fopen(argv[1],"r");
while( ((len=getline(&line,&llen,f))>1) && line!=NULL && !feof(f) ){
int i=0;
line=strsep(&line,"\n"); // Strip the ending newline
/* keep a copy for later */
c = strdup(line);
/* count necessary applications */
while(!apply(&line,op)) i++;
printf("%s %d\n",c,i);
/* memory management */
free(c);
free(line);
line=NULL;
llen=0;
}
}
আমরা যদি চালুনির মতো স্মৃতি ফাঁস করতে ইচ্ছুক থাকতাম তবে আরও কিছুটা বাঁচানো যেত। একইভাবে #define
রিটার্ন এবং লাইক দিয়েও, তবে এই মুহুর্তে আমি এটিকে কোনও কুরুচিপূর্ণ করে তোলার কোনও যত্ন করি না।