برنامج يقوم بهذا الأمر أنظر للصورة :
http://im51.gulfup.com/rGfQ...حيث تدخل كلمة أو جملة حيث يقوم بإظهار في السطر الأول الحرف الأخير فقط من الكلمة مباشرة في مكانه الأصلي حسب ترتيب حروف تلك الكلمة و بعدها في السطر الثاني نفس الأمر و لكن مع إظهار آخر حرفين و يقوم بفعل نفس الشيئ حتى آخر حرف .
لقد قمت ببرمجته بالباسكال و الجافا مثال :
Hi I am mino From Arabia
a
ia
bia
abia
rabia
Arabia
Arabia
m Arabia
om Arabia
rom Arabia
From Arabia
From Arabia
o From Arabia
no From Arabia
ino From Arabia
mino From Arabia
mino From Arabia
m mino From Arabia
am mino From Arabia
am mino From Arabia
I am mino From Arabia
I am mino From Arabia
i I am mino From Arabia
Hi I am mino From Arabia
رجاء جربوا حله بنفسكم بدون النظر إلى الكود المصدري .
البرنامج بالباسكال :
program projectarabia;
var
i,j,k,n:integer;
t:string;
begin
writeln('entree un mot :');
readln(t);
n:=length(t);
for i:=1 to n do
begin
for j:=n downto i+1 do
begin
write(' ');
end;
for k:=i downto 0 do
write(t[n-(k-1)]);
writeln;
end;
readln;
end.
البرنامج بالجافا :
public class Mainclass {
public static void main(String[] args){
int i,j,k,n;
String t;
char ch;
System.out.println("entree un mot :");
Scanner sc=new Scanner(System.in);
t=sc.nextLine();
n=t.length();
for(i=1;i<=n;i++){
for(j=n;j>=i+1;j--){
System.out.print(" ");
}
for(k=i;k>0;k--){
ch=t.charAt(n-k);
System.out.print(ch);
}
System.out.println();
}
}
}
أتمنى رؤية طرق مختلفة عن طريقتي للحل .
التعليقات
in perl:
$_ = "Hi I am mino From Arabia";
print "\n"," "x(y///c-$i), substr $_,-$i while ($i++<y///c);
لقد حاولت اختصار الكود أكثر مايمكنني. عندي قناعة أنه يمكن توفير 10 حروف أخرى (دون المسافات) لكن لا ادري كيف :(
صاحب السؤال لم يطلب ذلك في مثاله. غير ذلك المسافة حرف كغيرها ولا يصح أن تقسو عليها وتطالبني بحذفها :))
بالبايثون
a= "I test from python"
print a
l=len(a)
for x in range(1,l+1):
print len(a[0:l-x])*" "+a[l-x:l]
http://im83.gulfup.com/0KGo...
لتجاوز التكرار الموضح في الصورة
برغم ان المثل اعلى لا يحتوى على الشرط و به تكرار :
حل php
للمتبجحين بالحلول المعقدة للغتهم....
<?php
$s='Hi I am mino From Arabia';$t='le';$h='s';$f=$h.'tr';$j=$h.'ub'.$f;$t=$f.$t.'n';$n="\n";$l=$t($s);for($i=1;$i<$l;$i++)$b.=$j($s,$l-$i).$n;echo"$s$n$b$s";
?>
حل آخر
<?php
print p('Hi I am mino From Arabia');function p($L,$A=array()){$c='count';$s=strlen($L);$A[]=substr($L,-$c($A)-1);return$s==$c($A)?"$L\n".implode("\n",$A):p($L,$A);}
?>
صعوبة قراءة الكود في أي لغة برمجة
عيب وليس ميزة
نفسي أعرف غرضك من تعمد تعقيد الكود :)
عموماً
طريقتي النظيفة وبالـ PHP
http://im80.gulfup.com/JEuu...
<pre style="text-align: right;float: left;">
<?php
$str = "Hi I am mino From Arabia";
for ($i = 0;$i >= (strlen($str) * -1);$i--) {
echo substr($str, $i)."\n";
}
?>
هل تعني أنّ هذا السباجيتي مقروء؟
<div id="HI">Hi I am mino From Arabia</div>
<script>
var str = 'Hi I am mino From Arabia';
var length = str.length;
for (var i = 0;i <= length;i++) {
document.getElementById('HI').innerHTML += (' '.repeat(length-i)) + str.substr(str.length-i) + '<br>';
}
String.prototype.repeat = function( num )
{
return new Array( num + 1 ).join( this );
}
</script>
حسنا، كتبته وأنا آكل ^_^ لذلك هو يظهر هكذا
http://i.share.pho.to/28474...
ولجعله منسقا كما طلبت كان علي إجراء هذا التعديل
http://i.share.pho.to/6150d...
<div id="Hi">Hi I am mino From Arabia</div>
<script>
var str = 'Hi I am mino From Arabia';
var length = str.length;
for (var i = 0;i <= length;i++) {
if (str.substr(str.length-i).substr(0,1) == ' ') continue;
document.getElementById('Hi').innerHTML += '<div style="text-align:right">' + str.substr(str.length-i) + '</div>';
}
</script>
بعد أن جربته يبدوا بأنه يعمل جيدا و لكنه لا يظهر جيدا ربما الأمر راجع إلى المتصفح.
<!DOCTYPE html>
<html>
<head>
<title>Home</title>
</head>
<body>
<div id="HI">Hi I am mino From Arabia</div>
<script>
var str = 'Hi I am mino From Arabia';
var length = str.length;
for (var i = 0;i <= length;i++) {
document.getElementById('HI').innerHTML += (' '.repeat(length-i)) + str.substr(str.length-i) + '<br>';
}
String.prototype.repeat = function( num )
{
return new Array( num + 1 ).join( this );
}
</script>
</body>
</html>
ما رأيك لو غيرنا الشكل قليلاً :]
<?php
$str = 'Hi I am mino From Arabia';
$len = strlen($str);
echo '<pre>'.$str.' '.$str."\r\n" ;
for($i=1;$i<$len;$i++){
echo str_pad(substr($str,$len-$i),$len," - ", STR_PAD_LEFT). ' '.
str_pad(ltrim(substr($str, $len - $i),' '), $len, ' - ',STR_PAD_RIGHT).
'<br>';
}
echo $str.' '.$str.'</pre>' ;
echo '<pre>' ;
for($i=1;$i<$len;$i++){
echo str_pad(substr($str,0,$len-$i),$len," - ", STR_PAD_LEFT). ' '.
str_pad(ltrim(substr($str,0, $len - $i),' '), $len, ' - ',STR_PAD_RIGHT).
'<br>';
}
echo $str.' '.$str.'</pre>' ;
?>
تعديل على الكود علما أنه كارثة برمجية،لكنه يفي بالغرض
http://i.imgur.com/3q5RrZ3.png
<pre>
<?php
$str = 'Hi I am mino From Arabia';
$len = strlen($str);
echo '<pre>';
for($i=1;$i<$len;$i++){
echo str_pad(substr(strrev($str),$len-$i),$len," ", STR_PAD_LEFT). ' : '.
strrev(str_pad(ltrim(substr(strrev($str), $len - $i),' '), $len, ' ',STR_PAD_LEFT)).
'<br>';
}
echo '<b>' . strrev($str).' : '.$str.'</b><br>' ;
for($i=1;$i<$len;$i++){
echo strrev(str_pad(substr($str,0,$len-$i),$len," ", STR_PAD_RIGHT)). ' : '.
str_pad(ltrim(substr($str,0, $len - $i),' '), $len, ' ',STR_PAD_RIGHT).
'<br>';
}
echo '</pre>' ;
الحل الأول بلغة بايثون
s='Hi I am mino From Arabia'
l=len(s)
for i in range(1, l+1): print (" "*(l-i))+s[-i:]
في كلا الكودين في موضوعك توجد ثلاث حلقيات تكرار، هل لا بد منها ؟
كما ترى في مثالي بالجافاسكربت وأيضا بالـ php يمكن الحصول على نفس النتيجة بحلقية تكرار واحدة!
أو لنقل أني تجاوزت حلقية التكرار الثانية للفراغات، لكن لماذا 3 حلقيات تكرار ؟
حسنا، العمل معتمد كليا على دالة substring، إذا وُجد مثلها في لغاتك المفضلة فيمكنك كتابة مثل ما كتبت
لقد خدعتني ياستعمالك لهذه الدالة ،فأنا كتبت البرانمج من الصفر و شكرا على هذه الدالة فلم أكن أعرفها .
هذا هو الكود بعد استعمال الدالة substring :
public class Mainclass {
public static void main(String[] args){
int i,j,n,k;
String t;
System.out.println("entree un mot :");
Scanner sc=new Scanner(System.in);
t=sc.nextLine();
n=t.length();
k=n;
for(i=1;i<=n;i++){
k=k-1;
for(j=n;j>=i+1;j--){
System.out.print(" ");
}
System.out.println(t.substring(k));
}
}
}
هذا الحل بلغة الجافا
https://drive.google.com/fi...
وهذا الكود
public static void main(String[] args) {
StringBuilder s = new StringBuilder(" ");
String c="Hi i am ahmed from algeria";
System.out.println(c);
for (int i = s.length()-1; i >= 0; i--) {
s.replace(i, i+1,c.substring(i, i+1) );
System.out.println(s);
}
}
recursive methods: كود Java
public static String space(int i) {
if(i == 1) {
return "";
}
return " " + space(--i);
}
public static String sub(String str, int i) {
if (str.length() == 0) {
return "";
}
return sub(str.substring(1), ++i) + space(i) + str + "\n";
}
public static void main(String[] args) {
System.out.print(sub("Hi I am mino From Arabia", 0));
}
-- In Haskell
import Data.List(tails)
let s = "Hi I am mino From Arabia" in mapM_ print$reverse$map(\x->(replicate((length s)-length x)' ')++x)$tails s
اطول قليلا من نسختي في ال perl إلا أنها أجمل :D
'Hi I am mino From Arabia'=~/^.*(.+)$(??{printf"%*s\n",length,$1})/
67 بايت (perl). ~ ضحكات شريرة متقطعة~.
لو أحد عمل نسخة أقصر رجاء المراسلة. ربما يمكنني توفير بعض الحروف الأخرى.
ما فرحت به هو عين ما انتقد على البيرل ، أعني التعقيد البرمجي ، وصدقني لو رجعت إلى هذا الكود بعد ستة أشهر فلن تفهمه أنت نفسك فكيف بغيرك
اللغات البرمجة التي لاقت رواجا هي التي يكون كودها مقروءا كلغة البشر مع أشياء أخرى مثل قابلية التوسع والمحمولية والانتاجية والدعم
أشاركك أن زيادة الذكاء في البيرل عواقبها وخيمة أحيانا لكن نفس الكلام ينطبق على اللغات الأخرى كذلك (وان كانت بمقدار أقل).
يوجد بيرل معقد لكني لا أعد regex بسيط كالذي بالأعلى ضمنه.
تعقيد الكود لا يسمى ذكاء ، ربما في زمن مضى ولكن الآن إذا كتبت كودا معقدا بأي لغة برمجية فهذا يعد مشينا ، لأن البرمجة تطورت بشكل كبير واصبحت المشاريع الكبرى يشترك فيها مبرمجون كثر ، ويضطر كل مبرمج أحيانا ليقرأ ما كتبه الآخر ، ثم يأتي tester وعليه أيضا أن يقرأ ، ثم رئيس المشروع ، ثم مبرجو الصيانة من بعد
محاولتي بـ ++C
#include <iostream>
using namespace std;
char str[] = "Hi I am mino From Arabia";
int main()
{
char *pstr;
pstr = str + sizeof(str) - 1;
cout << str << endl;
while(pstr != str - 2)
{
for(int i=pstr - str; i>0 ; i--)
cout << " ";
cout << pstr << endl;
--pstr;
}
return 0;
}
بدون دول
بعد التحسين
#include <iostream>
using namespace std;
char str[] = "Hi I am mino From Arabia";
int main()
{
char *pstr = str + sizeof(str) - 1;
int n = pstr - str;
cout << str << endl;
while(pstr != str - 2)
{
cout.width(n+1);
cout << pstr-- << endl;
}
return 0;
}
الحل بتاعي PHP بس ماعرفت اسوي الفراغات بين الاحرف.
<?php
$name = 'Hi I am mino From Arabia';
$strlen = strlen($name);
for($i=0; $i<=$strlen; $i++){
echo substr($name, $i, $strlen).'<br>';
}
?>
وهذا بــ PHP . ونفس الفكره ايضا بأى لغه :))
المشكله ليست فى اللغه ... المشكله فيمن يستخدم اللغه إما يعقدها ويجعل الاخرون يكرهونها .. أو العكس :))
#include <stdio.h>
i;main(n){char s[]="Hi I am mino From Arabia";n=sizeof s;while(i++<n)printf("%*s\n",n,s+n-i);}
بـالسي واكتفي بهذا القدر :D
بعض التعديل ليعمل بشكل صحيح ^-^
#include <stdio.h>
void main(){
char s[] = "Hi I am mino From Arabia";
int i=0,n = sizeof(s);
while(i++<n)
printf("%*s\n",n,s+n-i);
}
أخي من أين تأتي الفراغات؟
لم يلزمه تعديلات. الكود صحيح ويعمل على أي كومبيلر موافق لمعيار C89. مثال سطر أوامر لعمل الكومبيل:
gcc a.c -std=c89 -o a.exe && a
على عكس الكود بتاعك ^-^ (void main غير معيارية).
بالنسبة للمسافات اقرأ ال manpage بتاعت printf (أو انظر هنا: http://en.cppreference.com/... ابحث عن نجمة *)
لم يلزم التعديل
شيفرتك Code غير واضحة، يفضل تنسيق الشيفرة
كودك غير أمن بسبب إستخدامك argc كـ n
الكود صحيح ويعمل على أي كومبيلر موافق لمعيار C89.
لو ذكرت ذلك كان أفضل
ماذا عن المعايير الجديدة؟
على عكس الكود بتاعك ^-^ (void main غير معيارية).
كتبتُ void main لأنك لم تكتب return 0 (السبب الذي منعت لأجله كتابت void)
بالنسبة للمسافات اقرأ ال manpage بتاعت printf
شكرا لك
يبدو أن كائن cout أنساني دالة printf
هدفي كان استخدام حروف قليلة قدر الإمكان.
لا مانع من تغيير قيمة argc. ليست فكرة جيدة في أغلب الأحيان لكنها وفرت حرفا في كودي. معطيات main دائما قابلة للتعديل.
المعيارت الأحدث لا تستخدم في الـ code golf (برمجة تمرين بأقل عدد من الحروف) لأنها كما لاحظت تحتاج عدد أكبر من الحروف
عذر أقبح من ذنب :D الـ C89 يسمح بترك ال return مع جعل سلوك البرنامج غير معرف (لكن بما ان البرنامج انتهى فمن يبالي). من أول ال C99 يمكن تركها وتعوض ضمنيا بـ return 0 أي أنه لا يوجد مبرر لإستخدام void في أي إصدار كان (لاحظت رابطك بالأسفل; يستثني من ذلك النظم التي تفتقد إلى نظام تشغيل تعود return إليه)
<?php
echo "<pre>";
echo $string = "We Are Future Programmers."; $array = str_split($string); // spilting the string in array // loop for the lines equal the length of my string for($i=strlen($string); $i >= 0; $i--){ //loop for check every character for ($x=0; $x <= strlen($string); $x++) { // check if the character in reverse equal the line number if($x >= $i && $x < strlen($string)){ echo $array[$x]; } else{ echo " "; } } echo "";
}
?>
<?php
echo "<pre>";
echo $string = "We Are Future Programmers."; $array = str_split($string); // spilting the string in array // loop for the lines equal the length of my string for($i=strlen($string); $i >= 0; $i--){ //loop for check every character for ($x=0; $x <= strlen($string); $x++) { // check if the character in reverse equal the line number if($x >= $i && $x < strlen($string)){ echo $array[$x];
}
else{
echo " ";
}
}
echo "<br>";
}
?>
<?php
echo "<pre>";
echo $string = "We Are Future Programmers.";
$array = str_split($string); // spilting the string in array
// loop for the lines equal the length of my string
for($i=strlen($string); $i >= 0; $i--){
//loop for check every character
for ($x=0; $x <= strlen($string); $x++) {
// check if the character in reverse equal the line number
if($x >= $i && $x < strlen($string)){
echo $array[$x];
}
else{
echo " ";
}
}
echo "";
}
?>
<?php
echo "<pre>";
echo $string = "We Are Future Programmers.";
$array = str_split($string); // spilting the string in array
// loop for the lines equal the length of my string
for($i=strlen($string); $i >= 0; $i--){
//loop for check every character
for ($x=0; $x <= strlen($string); $x++) {
// check if the character in reverse equal the line number
if($x >= $i && $x < strlen($string)){
echo $array[$x];
}
else{
echo " ";
}
}
echo "<br>";
}
?>
تجربتي مع C++ :)
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int i;
int s;
string str;
cout << "Enter Your Name: ";
getline(cin, str);
cout << "Your Name: " << str << endl;
int n = str.length();
for (i = n; i >= 0; i--)
{
int s=0;
while (s++ < i)
cout << " ";
for (s = i; s <= n; s++)
cout << str[s];
cout << endl;
}
cout << endl;
system("PAUSE");
return 0;
}
بعد حل مشكلة الفراغات
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int i;
int s;
string str;
cout << "Enter Your Name: ";
getline(cin, str);
cout << "Your Name: " << str << endl;
int n = str.length();
for (i = n; i >= 0; i--)
{
cout.width(i + 1);
if (str[i] == ' ') continue;
for (s = i; s <= n; s++){
cout << str[s];
}
cout << endl;
}
cout << endl;
system("PAUSE");
return 0;
}
باستخدام لغتي المفضلة Lua وبكل بساطة: لتجربة الكود الصقه في: http://www.lua.org/demo.html
m = "Hi I am Mustafa From Arabia"
itr = #m-1
for i=1,#m do
s=string.sub(m, -i)
space = string.rep(" ", itr)
print(space..s)
itr = itr - 1
end
إذا الجائزة من نصيـبي ^^
من أجمل اللغات حتى الآن بالنسبة لي. للأسف ليس لها صيت بين مجتمعنا العربي.
تابع هذا المجتمع للاطلاع على المزيد: https://arabia.io/lua
قاعد اقلب المواضيع القديمة فوجدت هذا الموضوع الجميل
وأحببت مشاركتكم بلغتي المفضلة lua
w = "Hi I am Waseem From Arabia"
for i=#w,1 , -1 do
print (string.rep(" ", i)..string.sub(w, i))
end
لتجربة الكود
رغم أن التحدي قديم، لكني كنت أبحث عن تحديات لأتمرن عليها، فوقعت على هذا التحدي.
وهذا حللته بلغة السي، وقد جعلت النص الذي سيعرض، هو ما سيمرر كمعاملات إلى البرنامج ليصبح أكثر مرونة:
/*By the name of Allah
* this program is completed in: 24/2/1436
* By mujahid
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (int argc,char **argv){
if(argc<2){
printf("Print your text!\n");
return -1;
}
size_t len=0;
for(size_t i=1;i<argc;i++)
len+=strlen(argv[i]);
len+=argc-2;
char *txt=malloc(len+1),*txt2=malloc(len+2);
if(txt==NULL||txt2==NULL){
printf("Error in memory!\n");
return -1;
}
*txt=0;*txt=0;
int i1=1;
do{
strcat(txt,argv[i1]);
strcat(txt," ");
}
while(++i1<argc);
txt[strlen(txt)-1]=0;
printf("%s\n",txt);
len=strlen(txt);
for(int i=len-1;i>=0;i--){
for(int i3=0;i3<len;i3++){
if(i3<i){
strncat(txt2," ",1);
}
else{
strncat(txt2,txt+i3,1);
}
}
printf("%s\n",txt2);
*txt2=0;
}
free(txt2);free(txt);
return 0;
}