• 0
مصطفى 36a2

تحدي العقول ..البرمجة أم الإبداع ..2

سؤال

السلام عليكم إخوتيsmile.gif

في الحلقة الثانية من تحدي العقل للتفكير ضمن حيز محدد

لدينا اليوم مسألة بسيطة وفق الأدوات العادية ولكنها (قد) تكون صعبة وفق أدوات بسيطة

المسألة هي :

نقوم بإدخال عدد X مكون من رقمين بالضبط

ثم نقوم بإدخال سلسلة محارف عدد محارفها أكبر تماماً من الرقم المدخل وأصغر من 100

وما عليك إلا أن تقوم بكتابة كود لطباعة المحرف ذو الترتيب X

مثال :

الدخل :

05asdafgg

الخرج:

f

فقط لا غير ..

أما شروط الحل مذكورة في المسألة السابقة...

(أقصر كود يحصل على أفضل نتيجة )

بالتوفيقsmile.gif

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

13 إجابة على هذا السؤال .

  • 0

أهلا أخي مصطفى العزيز على فلبي smile.gif ، أنت الآن تريد أن تثير جنوني laugh.gif . هل سنبتكر دالة للإدخال مثل الدالة scanf () و إن كان الأمر كذلك فكيف سنفعل ذلك ؟؟؟ wacko.gif هل تعرف الكود المضدري للدالة scanf() و على ماذا تعتمد ؟ لأن المقاطعات في النظام المحمي 32 بت لم تعد تستخدم فكيف تعمل دالة الدخل إذن ؟ سؤال يحيرني ... أتمنى أن تقدموا لي شيئا جديدا لأنني لا أستطيع أن أقدم شيئا في هذا الصدد smile.gif.

أما إن كنت تقصد استعمال الدوال العادية المتوفرة في المكتبات القياسية فهذا يدل على أن الروتين سيتكرر كما في الحلقة الأولى . يكفي أن " نلعب بشوية مؤشرات يا زلميlaugh.gif" هههههههه

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لقد وجدت السورس كود ، إنه طويل حقا blink.gif ،،،


/* * Copyright (c) 2004 Apple Computer, Inc. All rights reserved. * * @[email protected] * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. The rights granted to you under the License * may not be used to create, or enable the creation or redistribution of, * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. * * Please obtain a copy of the License at * [url="http://www.opensource.apple.com/apsl/"]http://www.opensource.apple.com/apsl/[/url] and read it before using this file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. * * @[email protected] */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Chris Torek. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include <sys/cdefs.h> #if 0 /* XXX coming soon */ #include <ctype.h> #else static inline int isspace(char c) { return (c == ' ' || c == '\t' || c == '\n' || c == '\12'); } #endif #include <stdarg.h> #include <string.h> #include <sys/param.h> #include <sys/systm.h> #define BUF 32 /* Maximum length of numeric string. */ /* * Flags used during conversion. */ #define LONG 0x01 /* l: long or double */ #define SHORT 0x04 /* h: short */ #define SUPPRESS 0x08 /* *: suppress assignment */ #define POINTER 0x10 /* p: void * (as hex) */ #define NOSKIP 0x20 /* [ or c: do not skip blanks */ #define LONGLONG 0x400 /* ll: long long (+ deprecated q: quad) */ #define SHORTSHORT 0x4000 /* hh: char */ #define UNSIGNED 0x8000 /* %[oupxX] conversions */ /* * The following are used in numeric conversions only: * SIGNOK, NDIGITS, DPTOK, and EXPOK are for floating point; * SIGNOK, NDIGITS, PFXOK, and NZDIGITS are for integral. */ #define SIGNOK 0x40 /* +/- is (still) legal */ #define NDIGITS 0x80 /* no digits detected */ #define DPTOK 0x100 /* (float) decimal point is still legal */ #define EXPOK 0x200 /* (float) exponent (e+3, etc) still legal */ #define PFXOK 0x100 /* 0x prefix is (still) legal */ #define NZDIGITS 0x200 /* no zero digits detected */ /* * Conversion types. */ #define CT_CHAR 0 /* %c conversion */ #define CT_CCL 1 /* %[...] conversion */ #define CT_STRING 2 /* %s conversion */ #define CT_INT 3 /* %[dioupxX] conversion */ static const u_char *__sccl(char *, const u_char *); int sscanf(const char *ibuf, const char *fmt, ...) { va_list ap; int ret; va_start(ap, fmt); ret = vsscanf(ibuf, fmt, ap); va_end(ap); return(ret); } int vsscanf(const char *inp, char const *fmt0, va_list ap) { int inr; const u_char *fmt = (const u_char *)fmt0; int c; /* character from format, or conversion */ size_t width; /* field width, or 0 */ char *p; /* points into all kinds of strings */ int n; /* handy integer */ int flags; /* flags as defined above */ char *p0; /* saves original value of p when necessary */ int nassigned; /* number of fields assigned */ int nconversions; /* number of conversions */ int nread; /* number of characters consumed from fp */ int base; /* base argument to conversion function */ char ccltab[256]; /* character class table for %[...] */ char buf[BUF]; /* buffer for numeric conversions */ /* `basefix' is used to avoid `if' tests in the integer scanner */ static short basefix[17] = { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; inr = strlen(inp); nassigned = 0; nconversions = 0; nread = 0; base = 0; /* XXX just to keep gcc happy */ for (;;) { c = *fmt++; if (c == 0) return (nassigned); if (isspace(c)) { while (inr > 0 && isspace(*inp)) nread++, inr--, inp++; continue; } if (c != '%') goto literal; width = 0; flags = 0; /* * switch on the format. continue if done; * break once format type is derived. */ again: c = *fmt++; switch (c) { case '%': literal: if (inr <= 0) goto input_failure; if (*inp != c) goto match_failure; inr--, inp++; nread++; continue; case '*': flags |= SUPPRESS; goto again; case 'l': if (flags & LONG) { flags &= ~LONG; flags |= LONGLONG; } else flags |= LONG; goto again; case 'q': flags |= LONGLONG; /* not quite */ goto again; case 'h': if (flags & SHORT) { flags &= ~SHORT; flags |= SHORTSHORT; } else flags |= SHORT; goto again; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': width = width * 10 + c - '0'; goto again; /* * Conversions. */ case 'd': c = CT_INT; base = 10; break; case 'i': c = CT_INT; base = 0; break; case 'o': c = CT_INT; flags |= UNSIGNED; base = 8; break; case 'u': c = CT_INT; flags |= UNSIGNED; base = 10; break; case 'X': case 'x': flags |= PFXOK; /* enable 0x prefixing */ c = CT_INT; flags |= UNSIGNED; base = 16; break; case 's': c = CT_STRING; break; case '[': fmt = __sccl(ccltab, fmt); flags |= NOSKIP; c = CT_CCL; break; case 'c': flags |= NOSKIP; c = CT_CHAR; break; case 'p': /* pointer format is like hex */ flags |= POINTER | PFXOK; c = CT_INT; flags |= UNSIGNED; base = 16; break; case 'n': nconversions++; if (flags & SUPPRESS) /* ??? */ continue; if (flags & SHORTSHORT) *va_arg(ap, char *) = nread; else if (flags & SHORT) *va_arg(ap, short *) = nread; else if (flags & LONG) *va_arg(ap, long *) = nread; else if (flags & LONGLONG) *va_arg(ap, long long *) = nread; else *va_arg(ap, int *) = nread; continue; } /* * We have a conversion that requires input. */ if (inr <= 0) goto input_failure; /* * Consume leading white space, except for formats * that suppress this. */ if ((flags & NOSKIP) == 0) { while (isspace(*inp)) { nread++; if (--inr > 0) inp++; else goto input_failure; } /* * Note that there is at least one character in * the buffer, so conversions that do not set NOSKIP * can no longer result in an input failure. */ } /* * Do the conversion. */ switch (c) { case CT_CHAR: /* scan arbitrary characters (sets NOSKIP) */ if (width == 0) width = 1; if (flags & SUPPRESS) { size_t sum = 0; for (;;) { if ((n = inr) < (int)width) { sum += n; width -= n; inp += n; if (sum == 0) goto input_failure; break; } else { sum += width; inr -= width; inp += width; break; } } nread += sum; } else { bcopy(inp, va_arg(ap, char *), width); inr -= width; inp += width; nread += width; nassigned++; } nconversions++; break; case CT_CCL: /* scan a (nonempty) character class (sets NOSKIP) */ if (width == 0) width = (size_t)~0; /* `infinity' */ /* take only those things in the class */ if (flags & SUPPRESS) { n = 0; while (ccltab[(unsigned char)*inp]) { n++, inr--, inp++; if (--width == 0) break; if (inr <= 0) { if (n == 0) goto input_failure; break; } } if (n == 0) goto match_failure; } else { p0 = p = va_arg(ap, char *); while (ccltab[(unsigned char)*inp]) { inr--; *p++ = *inp++; if (--width == 0) break; if (inr <= 0) { if (p == p0) goto input_failure; break; } } n = p - p0; if (n == 0) goto match_failure; *p = 0; nassigned++; } nread += n; nconversions++; break; case CT_STRING: /* like CCL, but zero-length string OK, & no NOSKIP */ if (width == 0) width = (size_t)~0; if (flags & SUPPRESS) { n = 0; while (!isspace(*inp)) { n++, inr--, inp++; if (--width == 0) break; if (inr <= 0) break; } nread += n; } else { p0 = p = va_arg(ap, char *); while (!isspace(*inp)) { inr--; *p++ = *inp++; if (--width == 0) break; if (inr <= 0) break; } *p = 0; nread += p - p0; nassigned++; } nconversions++; continue; case CT_INT: /* scan an integer as if by the conversion function */ #ifdef hardway if (width == 0 || width > sizeof(buf) - 1) width = sizeof(buf) - 1; #else /* size_t is unsigned, hence this optimisation */ if (--width > sizeof(buf) - 2) width = sizeof(buf) - 2; width++; #endif flags |= SIGNOK | NDIGITS | NZDIGITS; for (p = buf; width; width--) { c = *inp; /* * Switch on the character; `goto ok' * if we accept it as a part of number. */ switch (c) { /* * The digit 0 is always legal, but is * special. For %i conversions, if no * digits (zero or nonzero) have been * scanned (only signs), we will have * base==0. In that case, we should set * it to 8 and enable 0x prefixing. * Also, if we have not scanned zero digits * before this, do not turn off prefixing * (someone else will turn it off if we * have scanned any nonzero digits). */ case '0': if (base == 0) { base = 8; flags |= PFXOK; } if (flags & NZDIGITS) flags &= ~(SIGNOK|NZDIGITS|NDIGITS); else flags &= ~(SIGNOK|PFXOK|NDIGITS); goto ok; /* 1 through 7 always legal */ case '1': case '2': case '3': case '4': case '5': case '6': case '7': base = basefix[base]; flags &= ~(SIGNOK | PFXOK | NDIGITS); goto ok; /* digits 8 and 9 ok iff decimal or hex */ case '8': case '9': base = basefix[base]; if (base <= 8) break; /* not legal here */ flags &= ~(SIGNOK | PFXOK | NDIGITS); goto ok; /* letters ok iff hex */ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': /* no need to fix base here */ if (base <= 10) break; /* not legal here */ flags &= ~(SIGNOK | PFXOK | NDIGITS); goto ok; /* sign ok only as first character */ case '+': case '-': if (flags & SIGNOK) { flags &= ~SIGNOK; goto ok; } break; /* x ok iff flag still set & 2nd char */ case 'x': case 'X': if (flags & PFXOK && p == buf + 1) { base = 16; /* if %i */ flags &= ~PFXOK; goto ok; } break; } /* * If we got here, c is not a legal character * for a number. Stop accumulating digits. */ break; ok: /* * c is legal: store it and look at the next. */ *p++ = c; if (--inr > 0) inp++; else break; /* end of input */ } /* * If we had only a sign, it is no good; push * back the sign. If the number ends in `x', * it was [sign] '0' 'x', so push back the x * and treat it as [sign] '0'. */ if (flags & NDIGITS) { if (p > buf) { inp--; inr++; } goto match_failure; } c = ((u_char *)p)[-1]; if (c == 'x' || c == 'X') { --p; inp--; inr++; } if ((flags & SUPPRESS) == 0) { u_quad_t res; *p = 0; if ((flags & UNSIGNED) == 0) res = strtoq(buf, (char **)NULL, base); else res = strtouq(buf, (char **)NULL, base); if (flags & POINTER) *va_arg(ap, void **) = (void *)(uintptr_t)res; else if (flags & SHORTSHORT) *va_arg(ap, char *) = res; else if (flags & SHORT) *va_arg(ap, short *) = res; else if (flags & LONG) *va_arg(ap, long *) = res; else if (flags & LONGLONG) *va_arg(ap, long long *) = res; else *va_arg(ap, int *) = res; nassigned++; } nread += p - buf; nconversions++; break; } } input_failure: return (nconversions != 0 ? nassigned : -1); match_failure: return (nassigned); } /* * Fill in the given table from the scanset at the given format * (just after `['). Return a pointer to the character past the * closing `]'. The table has a 1 wherever characters should be * considered part of the scanset. */ static const u_char * __sccl(char *tab, const u_char *fmt) { int c, n, v; /* first `clear' the whole table */ c = *fmt++; /* first char hat => negated scanset */ if (c == '^') { v = 1; /* default => accept */ c = *fmt++; /* get new first char */ } else v = 0; /* default => reject */ /* XXX: Will not work if sizeof(tab*) > sizeof(char) */ (void) memset(tab, v, 256); if (c == 0) return (fmt - 1);/* format ended before closing ] */ /* * Now set the entries corresponding to the actual scanset * to the opposite of the above. * * The first character may be ']' (or '-') without being special; * the last character may be '-'. */ v = 1 - v; for (;;) { tab[c] = v; /* take character c */ doswitch: n = *fmt++; /* and examine the next */ switch (n) { case 0: /* format ended too soon */ return (fmt - 1); case '-': /* * A scanset of the form * [01+-] * is defined as `the digit 0, the digit 1, * the character +, the character -', but * the effect of a scanset such as * [a-zA-Z0-9] * is implementation defined. The V7 Unix * scanf treats `a-z' as `the letters a through * z', but treats `a-a' as `the letter a, the * character -, and the letter a'. * * For compatibility, the `-' is not considerd * to define a range if the character following * it is either a close bracket (required by ANSI) * or is not numerically greater than the character * we just stored in the table (c). */ n = *fmt; if (n == ']' || n < c) { c = '-'; break; /* resume the for(;;) */ } fmt++; /* fill in the range */ do { tab[++c] = v; } while (c < n); c = n; /* * Alas, the V7 Unix scanf also treats formats * such as [a-c-e] as `the letters a through e'. * This too is permitted by the standard.... */ goto doswitch; break; case ']': /* end of scanset */ return (fmt); default: /* just another character */ c = n; break; } } /* NOTREACHED */ }

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أهلا أخي مطصفى :)

سؤال جميل جداً, يبدو أنك ستحولنا إلى مبرمجين BF دون أن نشعر ^_^

لدي سؤالين بخصوص تخزين المتغيرات :

هل يتم إدخال المتغير و السلسلة بشكل منفصل أم لا ؟

و هل الــ Enter هي علامة انتهاء إدخال السلسل الحرفية ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

نعم الرمز رقم 10 في جدول الآسكي هو نهاية الإدخال ...والذي يصدره زر Enter كما تفضلت أخي [email protected]

بالنسبة للإدخال ...فإذا كنت قد فهمت سؤالك جيداً فالجواب هو ما يلي :

الدالة الوحيدة للإدخال هي , والتي تكافئ عملياً getchar في العزيزة C وبالتالي فإن الإدخال يتم حرفاً حرفاً ... وينتهي الإدخال بالرمز LF ذو القيمة 10 ..كما أسلفنا smile.gif

هذا ما فهمته من السؤال عندما قرأته أول مرة ..

وعندما قرأته للمرة الثانية فهمته تماماً ... يتم إدخال المتغير مع السلسلة دون أي فراغات ..

حيث أن أول محرفين هما رقمان يشكلان قيمة المتغير مثلا 01asd أو 12ewqrqwettttt حيث أن المتغير في الأولى 1 وفي الثانية 12 ..

بخصوص تحويلكم إلى مبرمجين BF laugh.gif فالأمر ليس كذلك .. مجرد تنشيط لمناطق نائمة في الدماغ منذ زمن طويل ..بسبب الاعتماد على أدوات احترافية جاهزة

بالتوفيق في تحريك الجمجمة laugh.gif... شكراً لك wink.gif

____________________________________

أخي الغالي حمزة

اقرأ الجزء الأول حتى تفهم السؤال laugh.giflaugh.gif فأنا لا أريد أن نخترع دالة للدخل laugh.gif

بالتوفيق ...أنتظر حلك ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

كيف الحال أخي مصطفى , سؤال جميل سلمت يداك .

محاولتي بـ 74 تعليمة :

++++++++++[->+++++<]>-->,>,<<[->->-<<]>[->>++++++++++<<]>[->>,<<]>[->,<]>.

الكود بلغة الـ C :

++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;
while(*ptr){
--*ptr;++ptr;
++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;
--ptr;
}
++ptr;--*ptr;--*ptr;
++ptr;*ptr=getchar();
++ptr;*ptr=getchar();
--ptr;--ptr;
while(*ptr){
--*ptr;++ptr;--*ptr;++ptr;--*ptr;--ptr;--ptr;
}
++ptr;
while(*ptr){
--*ptr;++ptr;++ptr;
++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;++*ptr;
--ptr;--ptr;
}
++ptr;
while(*ptr){
--*ptr;++ptr;++ptr;*ptr=getchar();--ptr;--ptr;
}
++ptr;
while(*ptr){
--*ptr;++ptr;*ptr=getchar();--ptr;
}
++ptr;putchar(*ptr);

دمتم في رعاية الله

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أول مرة رأيت السؤال ظننته صعبا جداً ولكن مع الأيام تظهر أفكار جديدة لا نعرف كيف ... قبل النوم .. أثناء الأكل .. في الطريق ..المهم أن العقل لا يرتاح ...

ومهمة هذه اللغة أن تتحدى العقل ...

حلك رائع أخي أحمد ...

انظر حلّي .. وكيف تحدد هدفك بصرامة ..laugh.gif

++++++++[->++++++<],<,>>[-<-<->>]<[-<++++++++++>]<-[->,<],.

59 تعليمة ...

ما رأيك :)

سننتظر باقي الاخوة بضع ساعات قبل الإغلاق smile.gif

بالتوفيق

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

_____________________________________

هذا كود الC حسب برنامج الأخ أحمد

أخي أحمد يمكنك إضافة تعريف المصفوفة وبدالة الدالة main وتضمين مكتبة stdio حتى يكون البرنامج مكتمل ...(مجرد header لا أكثر ... )


++*ptr; ++*ptr; ++*ptr; ++*ptr; ++*ptr; ++*ptr; ++*ptr; ++*ptr; while(*ptr){ --*ptr; ++ptr; ++*ptr; ++*ptr; ++*ptr; ++*ptr; ++*ptr; ++*ptr; --ptr; }
*ptr=getchar(); --ptr;
*ptr=getchar(); ++ptr; ++ptr; while(*ptr){ --*ptr; --ptr; --*ptr; --ptr; --*ptr; ++ptr; ++ptr; }--ptr; while(*ptr){ --*ptr; --ptr; ++*ptr; ++*ptr; ++*ptr; ++*ptr; ++*ptr; ++*ptr; ++*ptr; ++*ptr; ++*ptr; ++*ptr; ++ptr; }--ptr; --*ptr; while(*ptr){ --*ptr; ++ptr;
*ptr=getchar(); --ptr; }
*ptr=getchar(); putchar(*ptr);

بالتوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تعليقاً على كودك أخي أحمد ...

في هذا الجزء

++++++++++[->+++++<]>--

قمت بعملية 10*5 -2 ..ويمكنك أن تقوم ب 8*6 ..تقوم بنفس المفعول وتعليمات أقل ..

وباقي الكود جيد جداً ... إلا هذه النقطة ..آخر حلقة ما ظيفتها .. فهو أصلا لا يدخل إليها أبداً !

[->,<]

كما رأيت أخي الكريم لا داعي لأخذ كل المحارف ..يكفي أن نأخذ ما يلزمنا للخرج ..وهذا ما قصدته بكلمة (الصرامة) في كتابة الكود ..أي لا تكتب إلا ما تحتاج ..

وهي على عكس التعميم .. أو برمجة API التي تجعلك تفكر في المبرمج الذي سيأتي بعدك .. أو المستخدم الذي سيستعملها ... هنا نقوم بعمل واحد لهدف واحد فقط ..(أسلوب سهل وممتع)

بالتوفيقsmile.gif

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

ألا تلاحظ أنك إنتهكت حرمة الذاكرة ودخلت في منطقة ليس مخصصة لبرنامجك smile.gif في الجزء التالي من الكود :

],<

- ويمكن كتابة نفس تعليمات الكود السابق 59 تعليمة بالشكل التالي :

>++++++++[-<++++++>],>,<<[->->-<<]>[->++++++++++<]>[->,<]>.

أخي أحمد يمكنك إضافة تعريف المصفوفة وبدالة الدالة main وتضمين مكتبة stdio حتى يكون البرنامج مكتمل ...(مجرد header لا أكثر ... )
- تغاضيت عن هذا لأني أستخدم دوال التحويل في عملية الترجمة مباشراً , ولكن بما أنك طلبت هذا فسأعدل الكود لاحقاً على نفس الرابط .
قمت بعملية 10*5 -2 ..ويمكنك أن تقوم ب 8*6 ..تقوم بنفس المفعول وتعليمات أقل ..
-جدول الضرب والنسيان لا يجتمعان smile.gif .
وباقي الكود جيد جداً ... إلا هذه النقطة ..آخر حلقة ما ظيفتها .. فهو أصلا لا يدخل إليها أبداً !

[->,<]

- يدخل إليها في حالة إدخال قيمة غير القيمة الصفرية في خانة الآحاد , فأنا لم أعتمد في الكود على جمع خانة الآحاد مع العشرات ولكن قمت بعمل دورة لخانة الآحاد وأخرى للعشرات فإذا كان أي من قيمة رقم الآحاد أو العشرات مساوياً للصفر لا يتم دخول الحلقة الخاصة بذلك .
كما رأيت أخي الكريم لا داعي لأخذ كل المحارف ..يكفي أن نأخذ ما يلزمنا للخرج ..وهذا ما قصدته بكلمة (الصرامة) في كتابة الكود ..أي لا تكتب إلا ما تحتاج ..

وهي على عكس التعميم .. أو برمجة API التي تجعلك تفكر في المبرمج الذي سيأتي بعدك .. أو المستخدم الذي سيستعملها ... هنا نقوم بعمل واحد لهدف واحد فقط ..(أسلوب سهل وممتع)

- بالفعل إسلوب سهل وممتع ولكن غير مجدي في حالة الواقع العملي وأحد أهم مميزات اللغة الجيده هي المرونة وقابليتها لتعدد الطرق لتوفير الوقت والجهد على المبرمج في التفكير في الوصول لما يريد من إستخدامه لهذه اللغة .

إلى هنا والكود الذي قدمه أخي مصطفى هو أقصر الطرق حتى الآن .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
ألا تلاحظ أنك إنتهكت حرمة الذاكرة

نعم بالفعل جيد أنك انتبهت لذلك .. نسيت اخبارك أنه في هذه اللغة .. يمكن أن نمشي للخلف أي عملية wrap ... فإذا كانت المصفوفة 500 عنصر فعند العودة إلى الخلف نصبح في العنصر 499

ويمكنك رؤية ذلك في المترجم الذي برمجته بلغة C حيث أن العودة للخلف عندما نكون في أول عنصر تجعلنا في آخر عنصر ...

-جدول الضرب والنسيان لا يجتمعان smile.gif .

laugh.giflaugh.gif

بالفعل إسلوب سهل وممتع ولكن غير مجدي في حالة الواقع العملي وأحد أهم مميزات اللغة الجيده هي المرونة وقابليتها لتعدد الطرق لتوفير الوقت والجهد على المبرمج في التفكير في الوصول لما يريد من إستخدامه لهذه اللغة .

كلام سليم .. مجرد طريقة تفكير مناتسبة لبعض الحالات smile.gif

بالتوفيق

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

أنا لم أطلع على توثيق هذه اللغة فكتاباتك هنا عنها نعتبرها المرجع الأول والأخير smile.gif .

وعلى هذا بما أن الأمر شرعي فتعديل بسيط على الكود يجعله 58 تعليمة تقوم بالمطلوب :

++++++++[->++++++<],<,>>[-<-<->>]<[-<++++++++++>]<[->,<]>.

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

حسناً إذاً ... استحققت أفضل حل عن جدارة إذاً smile.gif

نلتقي بإذن الله في الموضوع القادم ... (سيكون بإذن الله عن الأعداد الأولية ... ولكنني متردد في طرحه هنا أو في منتدى الرياضيات ... )

على كل حال سنتابع هذه السلسلة بحيث نتيح للاخوة قراءة المشاركات على الاقل .. (ربما يعجبهم الانضمام الينا )happy.gif

بالتوفيق أخي أحمد ... نلتقي بإذن الله قريباً ...

والسلام عليكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

بارك الله فيك ,

تم تعديل المترجم على نفس الرابط السابق بالنسبة لتضمين بداية كود الـ C وفي حالة الرجوع أقل من الصفر .

وهذا الكود المصدري بعد التعديل :

BF.zip

دمت في أمان الله

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .