Bende ona benzer şekilde yapmıştım. #include <stdio.h> #include <string.h> #include <stdint.h> int main(int a, char *argv[]) { char *kelime = argv[1]; int uzn = strlen(kelime); uint64_t maks = (1u << uzn) - 1; uint64_t basla = -1; do { uint64_t deger = ++basla; for(int i = 0; i < uzn; ++i) { kelime &= ~0x20; kelime |= (deger & 1) << 5; deger >>= 1; } printf("%s\n", kelime); } while(basla != maks); return 0; } |
dh ye kod yazmak eziyet yazdığım kodlar siliniyor yada saçma <span> bişeyler çıkıyor ![]() bu işlemi tek satırda yapan c kodu < Resime gitmek için tıklayın > |
Konumuz yalın kod yazmak ancak esas amaç yeni programlama yöntemlerini etkili biçimde kullanmak. Durum böyleyken sen klasik C kodu yazdın. "{" ile başlayan sıralar dışında 16 sıralık senin C kodu Perl 6'da tek sıra :)
Çalışma anı: < Resime gitmek için tıklayın > Şimdi başka bir soru: Paskal üçgenini basan kod yazınız. 5 değerinde Paskal üçgeni için örnek çıktılar:
Sola yatık de arada virgül olan, dizi operatörü içeren çıktılar da olabilir ancak böyle çıktı daha iyi görünüyor dogal olarak. Not: Paskal üçgeninin Wikipedia ile birlikte Internette birçok sitede çözümü var. |
Raku'nun tek sıra kod ile yapılabilen birnesi, C'de 17 sıralık kodla yapmanın avantajını söyle ben de C kullanmaya başlayacağım :) |
|
https://forum.donanimhaber.com//mesaj/yonlen/139500699 < Resime gitmek için tıklayın > tek satır ![]() |
Kodu denedim, güzel düşünce, C'nin for döngüsü içinde birden komut komut içerme olanağını, ASCII koduna 32 ekleyince A -> a olması, bitsel aritmetiği iyi kullanıyor ancak kod kırılgan. Benim Windows taki GCC 5.1 ile ilk denemede doğru çalışmadı. < Resime gitmek için tıklayın > |
devc++ uyarı dahi yok kod temiz ![]() < Resime gitmek için tıklayın > edit: x 256 yerine 2048 den küçükse yazman lazım. |
Şaka doğal olarak ancak gerçeklik payı var: Karışık dizi, yazı işlemlerini C ile programlayarak yeni programcılık yöntemlerini öğrenmek yada kullanmak cok zor. Gözünüze iliştiyse, Raku (eski adıyla Perl 6) for döngüsü kullanmadan dizileri işleyebiliyor de Haskell örnek alınarak eklenen yeni özellikler sayesinde dizi üzerinde en karışık işlemleri bile en kısa biçimde kodlayabiliyorsunuz. Bu özellikler Python'da yok. Perl (5) bilen biri olarak Raku'da dizileri virgülsüz tanımlama özelliği ilgimi çektiği için öğreneyim dedim, yeni özelliklerini öyle açımlamaya başladım. 2-3 haftadır Raku kullanıyorum. Perl 5'te ('Ertunc', 'Fatma', 'Hasan') biçiminde tanımlanabilen string dizisi, Raku 'da <Ertunc Fatma Hasan> olarak tanımlanabiliyor, bu hem kolay okunan bir görüntü hem de pratik programlama olanağı sağlıyor. |
printf'nin parantezini yanlış yerde kapatmışım düzeltince çalıştı ancak görülebildiği ölçüde yalnızca ardışık karakterler üzerinde çalışıyor dolayısıyla örneğin "importance" gibi bir sözcük üzerinde özdeş işlemi yaptırmak olası değil: < Resime gitmek için tıklayın > Neyse, sonraki soru üzerine yorumları alayım. Paskal üçgenini en kısa nasıl kodlayabilrsiniz :) |
char str[2][8]={{'A','B','C','D','E','F','G','H'},{'a','b','c','d','e','f','g','h'}}; bu tanımlamayı şöyle de yapabiliriz char str[2][10]={{"ABCDEFGH"},{"abcdefgh"}}; c dili belli amaçlar için oluşturulmadığı halde bukadar iş çıkarması nekadar başarılı olduğunu gösteriyor. |
C bilimsel problemleri kodlamak için değil, Unix'i programlamak üzere tasarlanmış. Ha, tasarımı cok başarılı olduğundan temel bilimsel problemlerde de kullanılıyor o ayrı. Sonuçta problem biraz karışıklaştığında C zor durumda kalır. paskal üçgenini Scheme ile kodladım. 10 sıra sürdü ancak pak sonuç verdi. Esasında paskal ücgeni C ile 10 satırı cok aşmayacak biçimde kodlanabilir ancka Scheme'de kodu yazarken deneme olanağı var, C'de yok o yüzden bu tür problemleri geliştirmek daha zor. Scheme'de üstteki pencerede yazıyorum 2 komutla anında alttaki pencerede kodu deneyebiliyorum: < Resime gitmek için tıklayın > |
https://rosettacode.org/wiki/Pascal%27s_triangle#Perl_6 her dilde var |
doğrusu bu koddan hiç bir şey anlamadım ![]() @Gökşen PASLI'nın verdiği linkte c diliyle hazır fonksiyon olmadan 6-7 satırla yapılmış.
|
Paskal üçgeni Fibonacci dizisi ile özdeş ilerleyişe iye bir tek gösterimi değişik (wikipedia'da paskal - fibonacci ilişkisi gösteriliyor) burada cok büyük olasılıkla fibonacci gibi matematiksel formül tanımı üzerinden giderek çözüyor olmalı ki bu programcı çözümünden cok matematik formulün C ile uygulanması oluyor başka deyişle bu çözümün programcılık açısından pek bir esprisi yok. Onun bir altında C ile rekürsif çözüm var o iyi görünmekle beraber gerçek rekürsif çözüm değil cunku iterasyon (döngü) var, gerçek rekürsif kodda iterasyon olmaz. Daha ötesi paskal üçgenindeki bir önceki sırayı tutmak üzere bir integer dizisi daha tanımlıyor ki gerçek rekürsif çözümde ona da gerek kalmaz. rekürsif çözümü doğru uygulayan Scheme kodu. Gözünüze iliştiyse o kodda hiçbir dizi yada listeyi önceden tanımlamıyor. Bununla beraber Scheme kodunda da birkaç eksik yakaladım, birincisi Scheme'deki isteğe bağlı (optional) argüman kullanarak kodu 3 sıra kısaltabilirsiniz, ikincisi ana işlemi iki rekürsif fonksiyona bölmek yerine yerine tek fonksiyon içinde duble rekürsif olarak da yazabilirsiniz böylelikle kod 2 sıra daha kısalabilir. Buradaki "kısaltma" ile amacımız kodun boyutunu kısaltmaktan cok, "daha az sayıda kod ile daha çok nes anlatmak" :) |
rekürsif kodda neden döngü olmasın böyle bir kuralmı var? |
Rekürsif kodun içinde döngü (iterasyon) olması futbol maçında topu elle oynamak gibi bir nes :) |
![]() |
Bakış açısı değil, teknik. Universidad Rey Juan Carlos'tan CompSci PhD'li Manuel Rubio Sánchez ile Harvard'tan CompSci PhD'li Paul Graham, rekürsif kodlama tekniği üzerine anlatılar, tutoriallar yayınlamış, bu tekniğin iterasyona göre etkin de geleceğin programcılık tekniği olduğunu belirtmişler. Sence ben onların bilgi ile deneyimine mi bakarım, yoksa her bir nesi C şablonunda çözmeye çalışan birinin bir twit uzunluğundaki yorumuna mı ![]() |
int main()
{
char str[2][8]={{'A','B','C','D','E','F','G','H'},{'a','b','c','d','e','f','g','h'}};
for(int x=0;x<256;++x)
{
for (int i=0; i < 8; i++)
printf("%c",str[x >> i & 1 == 1 ][ i ]);
printf("
");
}
getchar();
return 0;
}
çıktı
--------------
sıfırları küçük birleri büyük harf farz edersek aynı sonucu vermiş olur.
void showbits(int x)
{
for (int i=7; i >= 0; --i)
if (x >> i & 1 == 1)
putchar('1');
else
putchar('0');
printf("
");
}
int main()
{
for(int x=0;x<256;++x)
showbits(x);
getchar();
return 0;
}
çıktı
< Bu mesaj bu kişi tarafından değiştirildi Guest-D992B0457 -- 9 Ağustos 2019; 12:56:16 >
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesajda bahsedilenler: @vonderplanitz