Arama butonu
Bu konudaki kullanıcılar: 2 misafir, 1 mobil kullanıcı
196
Cevap
12765
Tıklama
8
Öne Çıkarma
Cevap: Reddit, HN, Euler, DH gibi sitelerden iş görüşmesi soruları + ödev soruları (4. sayfa)
T
6 yıl
Yarbay
Konu Sahibi

Soru: 1 Milyonunu fibonacci sayısını bulunuz.

4 satırlık kod ile yaklaşık 20sn'de buldum. Sayının uzunluğu 208988 basamak!

Not1: Cok büyük rakamları tutabilen SBCL derleyici kullandım
Not2: 1 Milyonuncu fibonacci sayısının uzunluğunu program kodu ile değil, editörden ölçerek buldum.



A
6 yıl
Yarbay

< Resime gitmek için tıklayın >
Fibonacci genel teriminde N yerine 1 milyon yazınca çıkar.

——
2 elemanlı bir queue( tek yönlü olandan, dequeue olmayan dı galiba) oluşturalım
1 1 olsun
Sonra for döndürüp 1 milyon kere{
İçindeki ikisini topla queue ye ekle
Sonra diğer kenardaki elemanı çıkart
}
Böylece queue muz
1,1
1,2
2,3
3,5
5,8
... gibi oldu
1 milyonu da bulunca yazdırırız
Buna dynamic programming deniyor galiba, dinamik programala nedir diye 1-2 örnek bakmıştım
Map, tablo falan kullanıyordu.
——
Recursion ile de yapılabilir
F(n)=f(n-1)+f(n-2) gibi
Bunlarda javada depth hatası verir gibi, ama başka özel yolu vardır belki



< Bu ileti mini sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.
T
6 yıl
Yarbay
Konu Sahibi

O formülü hatırladım fakat o fibonacci sayısını yaklaşık olarak hesaplıyor diye biliyorum yani tam degeri vermiyor.

Tam değeri bulmak için optimize edilmiş rekürsif fonksiyon en hızlı yol. Ancak sonuç 1 milyonuncu fibonacci sayısı 208988 rakam uzunluğunda olduğu için sadece optimizasyon da yeterli değil, dev rakamları tutacak compiler veya C# için BigInt gibi kütüphane gerekli. SBCL (Steel Bank Common Lisp) compiler dev rakamları tutabildiği için onu kullandım 30sn gibi sürde buldu. Şu an başında olduğum bilgisayarda SBCL ile eşdeğer fakat biraz daha düşük performanslu CMUCL (Carneige Mellon University Common Lisp) derleyici var ve 32bit o yüzden sanırım 1dk dan fazla sürdü (yine tam ölçmedim 20-30sn sonra bilgisayarın başından kalktım birkaç dk sonra döndüğümde hesaplamıştı)

< Resime gitmek için tıklayın >
Emacs editörün durum çubuğundaki Bot (?? 208988) sonucun karakter sayısını gösteriyor yani 1 Milyonuncu Fibonacci 208988 rakam uzunluğunda.

Senin formuldeki (1+kök 5) / 2 altın oran rakamı bu arada. fibonacci dizisi ile altın oran arasında matematiksel ilişki var.



< Bu ileti mini sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @alimmm78
G
6 yıl
Yarbay

bu işlerde makine gücü de önemlidir ama bendeki makine de 15 saniye civarı hesaplıyor en kısa kod işine bakmıyorum tabi



using System;
using System.Numerics;

namespace ddds
{
class Program
{

static BigInteger[] f = new BigInteger[1000001];
public static BigInteger fib(int n)
{

if (n == 0)
return 0;

if (n == 1 || n == 2)
return (f[n] = 1);

if (f[n] != 0)
return f[n];

int k = (n & 1) == 1 ? (n + 1) / 2
: n / 2;
f[n] = (n & 1) == 1 ? (fib(k) * fib(k) +
fib(k - 1) * fib(k - 1))
: (2 * fib(k - 1) + fib(k)) *
fib(k);

return f[n];
}


public static void Main(string[] args)
{

Console.Write(fib(1000000).ToString().Length);
Console.ReadKey(true);
}
}
}


Bu mesaja 1 cevap geldi.
T
6 yıl
Yarbay
Konu Sahibi

Evet 15 sn sürüyor fakat fibonacci sayısının sadece uzunluğunu ilettiği için. Sayının kendisini konsola yazdırması (ToString().Length'i kaldırarak) dakikalar sürdü ve bir hata ile sonlandı:
< Resime gitmek için tıklayın >
Sayının kendisini yazdırmak bu soruya dahil.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @Gökşen PASLI
G
6 yıl
Yarbay

Bende console a yazdırma da bir problem çıkmadı süresi de aynı



< Bu ileti mobil sürüm kullanılarak atıldı >

H
6 yıl
Binbaşı

bu sorularda matrix exponentiation kullanilir ki soyle:
|1 1| * |F1 0| = |F2 0|
|1 0| * |F0 0| = |F1 0|



|1 1| n |F1 0| = |Fn+1 0|
|1 0| * |F0 0| = |Fn 0|


(ilk matrisin n inci kuvvetini aliyoruz ilk matrisimiz ile carpiyoruz)

bu yontemde matrisin n. kuvvetini hesaplamak icin fast exponentiation kullanilir.
ornek python kodu burada(kodu ben yazmadim ornege uysun diye sayilari degistim sadece ):


def mul(A,B):
return [ [ sum(A[r][i]*B[i][c] for i in range(2)) for c in range(2) ] for r in range(2) ]

def exp(A,n):
if n==0: return [ [1,0], [0,1] ]
C = exp(A,n//2)
C = mul(C,C)
return mul(A,C) if n%2 else C

n = int( input() )
print( mul(exp( [ [1,1], [1,0] ], n ),[[1,0],[0,0]])[0][0])





< Bu mesaj bu kişi tarafından değiştirildi hynx -- 20 Eylül 2019; 0:13:5 >
Bu mesaja 1 cevap geldi.
T
6 yıl
Yarbay
Konu Sahibi

Matriks ile üs hesaplama kodu biraz karışık. Ve o kod milyonuncu fibonacci yi ne kadar sürede hesaplar o da belli değil.
Benim kod en kısa ve C# tan sonra en hızlı. Aşağıdaki milyonuncu fibonacciyi hesaplama süresini ölçtüm, yaklaşık 50sn.
@Gökşen PASLI C# BigInt modülünü cok iyi yazmışlar, yüzbinlerce rakam uzunluğunda Int 'i bile sorunsuz hesaplıyor. Fakat senin kodu mono-4.2.1 kurulu Mac OS X'te denerken
error CS0234: The type or namespace name `Console' does not exist in the namespace `System'. Are you missing an assembly reference?
hatası verdi. Kullandığım build dosyası:
quote:


binary=$1
platform=-platform:x64
mcs "$binary.cs" -pkg:dotnet "$platform"
-lib:/Library/Frameworks/Mono.framework/Versions/4.2.1/lib//mono/xbuild-frameworks/.NETPortable/v4.5
-reference:System.Numerics.dll
-reference:System.dll
-reference:System.Core.dll
-reference:System.Net.dll

Oradaki System.Numerics.dll 'i sorunsuz kullanıyor, ardından gelen 3 System.xxx.dll'i ben ekledim, Console 'u bulur diye, bulamadı. mono-4.2.1'de Console desteği yok gibi. İlginç bir eksiklik. O çalışsaydı, Mac'te senin kodu deneyebilecektim.
< Resime gitmek için tıklayın >



< Bu ileti mini sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @Gökşen PASLI , @rekteo
H
6 yıl
Binbaşı

attigim kod pythonda 5 snde calisiyor ayni algoyi c++da yazsak 1 sn altina duser bence ama daha cirkin bir kod olur




Bu mesajda bahsedilenler: @vonderplanitz
T
6 yıl
Yarbay
Konu Sahibi

@FatihAsl
https://forum.donanimhaber.com/link-139633625
'deki maaş artış hesapla problemi

quote:


Kullanıcı 2020TL, 3400TL, 5500TL gibi maaş listesi ve her bir maaşa uygulanacak artış oran listesi ve para birimi girecek.
Örneğin kullanıcı şunları girdiyse

maaş_listesi: (2020, 3400, 5500)
artis_oran_listesi: (1.25, 1.1, 1.0)
para_birimi: "TL"

Program şunu basacak:

Maaş:2020, Yeni: 2525.00TL
Maaş:3400, Yeni: 3740.00TL
Maaş:5500, Yeni: 5500.00TL


Perl 6 ile tek satırda çözümü (forumdaki code etiketi kodu bozdugu için SS gönderdim)
< Resime gitmek için tıklayın >





< Bu mesaj bu kişi tarafından değiştirildi Tuğkan-0153 -- 27 Eylül 2019; 17:3:44 >

< Bu ileti mini sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @FatihAsl
C
6 yıl
Yarbay

maalesef bu tek satır değil


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @vonderplanitz
T
6 yıl
Yarbay
Konu Sahibi

Perl 6'da satır ayrımı ; ile yapılır. Hiçbir ; olmayan bir kod nasıl tek satır olmuyor onu merak ettim şimdi ::)



< Bu ileti mini sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @FatihAsl
C
6 yıl
Yarbay

quote:

Orijinalden alıntı: Tuğkan-0153

Perl 6'da satır ayrımı ; ile yapılır. Hiçbir ; olmayan bir kod nasıl tek satır olmuyor onu merak ettim şimdi ::)
bilmiyordum. bu durumda Perl6 yı hiç sevmedim. hiç okunaklı değil. bu satır sonsuza kadar uzar gider


Bu mesaja 1 cevap geldi.
T
6 yıl
Yarbay
Konu Sahibi

Kodu tek satır iddiasıyla yazdığım için pek okunaklı değil. 2 veya 3 satıra yaysam Perl6 bilmeyen biri için dahi oldukça okunaklı olabilir fakat o zaman tek satır iddiası gerçekleşmemiş olur. Fakat buradaki asıl konu zaten, kodu tek satırda yazmaya calışırken dilin değişik özelliklerini öğrenmek.



< Bu ileti mini sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @FatihAsl
C
6 yıl
Yarbay

quote:

Orijinalden alıntı: Tuğkan-0153

Kodu tek satır iddiasıyla yazdığım için pek okunaklı değil. 2 veya 3 satıra yaysam Perl6 bilmeyen biri için dahi oldukça okunaklı olabilir fakat o zaman tek satır iddiası gerçekleşmemiş olur. Fakat buradaki asıl konu zaten, kodu tek satırda yazmaya calışırken dilin değişik özelliklerini öğrenmek.
birde okunaklı versiyonu görürsek daha eğitici olur

edit: ben ekleyim bari. işte tek satır denen şey aslında aşağıdaki gibi



given my @a=prompt().split(', ')
{
for (@a[0].split(' ') Z* @a[1].split(' ')).kv
{
printf("%s yeni %.2f %s\", @a[0].split(' ')[$^a], $^b, @a[2])
}
}




buda golang kodu

package main

import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)

func main() {
if scanner := bufio.NewScanner(os.Stdin); scanner.Scan() {
grup := strings.Split(scanner.Text(), ", ")
for i, element := range strings.Split(grup[0], " ") {
maas, _ := strconv.ParseFloat(element, 64)
oran, _ := strconv.ParseFloat(strings.Split(grup[1], " ")[i], 64)
fmt.Printf("Maaş:%g, Yeni:%-6.2f%s", maas, (maas * oran), grup[2])
}
}
}


kodlar bozulduğu için buda goland ide ekran görüntüsü

< Resime gitmek için tıklayın >

golang in C++ dan daha pratik olduğuna itiraz edenler lütfen bu örneği C++ ile yapabilir mi?





< Bu mesaj bu kişi tarafından değiştirildi CleanCoders -- 27 Eylül 2019; 23:8:52 >
Bu mesaja 1 cevap geldi.
T
6 yıl
Yarbay
Konu Sahibi

Süslü parantezleri yeni satırlara yayarak satır sayısı belirlenmez. Süslü parantezin tek amacı kod bloğunu görünür kılmaktır ve başladığı satıra ait syntax olarak kabul edilir yani süslü parantez içindeki kod bloğu, başladığı satıra aittir. O yüzden gönderdiğim Perl 6 kodu tek satır. İç içe geçmiş bloklar birbirine bağımlı tek satır.

Ona bakarsan senin GOnzalez kodunda da bir satırlık ifadede 8 süslü parantez var, onları

finput := [][]string
{
{
"Maaş Listesi :", ""
},
{
"Oran Listesi :", ""
},
{
"Para Birimi :", ""
}
}

şeklinde yeni satırlara yayarak 11 satır, tüm program ise 31 satır sayılır :)

C++'da bu programı 14 satırda yaptım, GOnzalez ile kafa kafaya. Kodları göndermedim cunku Perl 6'da tek satırda yaptım zaten. GOnzalez 'de 19 satırda yaptığın şeyi 1 satırda hallettim. GOnzalez C++ dan daha az pratik demedim, sadece C++ varken GOnzalez gereksiz dedim yoksa pratiklik açısından GOnzalezle C++ kafa kafaya fakat tabi ki C++ GOnzalezle karşılaştırılamayacak kadar yaygın. OS'ler, sistem programları C++ ile yapılıyor. Mac'te sürücü yazacaksın diyelim, C++ kullanıyorsun. GNOME, KDE gibi masaüstü ortamları da C++ ile geliştiriliyor. GNOME un geliştiricileri aa GOnzalez diye bir dil çıkmış, C++'yi bırakıp artık GOnzalez kullanım demiyorlar cunku onu gerektirecek bir durum yok. Sistem programlarını geç, işletme & finans yazılımlarında yine C++ ve Python, Java, Scala ve Clojure kullanılıyor. Wall Street'te finans işlemleri için C++ ve Clojure kullanan adamlar aa GOnzalez cıkmış GOnzalez kullanalım demeyecekler. Web frameworklerde de PHP ve ES6'ya ek olarak Ruby ve Python yaygın. Web backend geliştiricileri aa hızlı GOnzalez cıkmış dur şu Ruby Rails framwork 'ü bırakayım demez cunku artık Ruby bile oldukça hızlı. Perl 6 JVM'de calışabiliyor, ona göre tasarlandı. JVM 'de calışmak demek hız demek. Gelişmiş bir web uygulaması yapacak kişi GOnzalez hızlı diye kulanmaz cunku artık hepsi hızlı.Bu durumda Gonzalezle 19 satırda kodlanabilen şeyi 1 satırda kodlama imkanı sağlayan Perl 6'ya sıcak bakar. Hadi Perl 6 biraz yabancı kalıyor diyelim, Ruby , Python falan kullanır, web için yine GOnzalez'i kullanmaz. Hiçbir özelliği olmayan fuzuli bir dil.



< Bu ileti mini sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @FatihAsl
C
6 yıl
Yarbay

quote:

Orijinalden alıntı: Tuğkan-0153

Süslü parantezleri yeni satırlara yayarak satır sayısı belirlenmez. Süslü parantezin tek amacı kod bloğunu görünür kılmaktır ve başladığı satıra ait syntax olarak kabul edilir yani süslü parantez içindeki kod bloğu, başladığı satıra aittir. O yüzden gönderdiğim Perl 6 kodu tek satır. İç içe geçmiş bloklar birbirine bağımlı tek satır.

Ona bakarsan senin GOnzalez kodunda da bir satırlık ifadede 8 süslü parantez var, onları

finput := [][]string
{
{
"Maaş Listesi :", ""
},
{
"Oran Listesi :", ""
},
{
"Para Birimi :", ""
}
}

şeklinde yeni satırlara yayarak 11 satır, tüm program ise 31 satır sayılır :)

C++'da bu programı 14 satırda yaptım, GOnzalez ile kafa kafaya. Kodları göndermedim cunku Perl 6'da tek satırda yaptım zaten. GOnzalez 'de 19 satırda yaptığın şeyi 1 satırda hallettim. GOnzalez C++ dan daha az pratik demedim, sadece C++ varken GOnzalez gereksiz dedim yoksa pratiklik açısından GOnzalezle C++ kafa kafaya fakat tabi ki C++ GOnzalezle karşılaştırılamayacak kadar yaygın. OS'ler, sistem programları C++ ile yapılıyor. Mac'te sürücü yazacaksın diyelim, C++ kullanıyorsun. GNOME, KDE gibi masaüstü ortamları da C++ ile geliştiriliyor. GNOME un geliştiricileri aa GOnzalez diye bir dil çıkmış, C++'yi bırakıp artık GOnzalez kullanım demiyorlar cunku onu gerektirecek bir durum yok. Sistem programlarını geç, işletme & finans yazılımlarında yine C++ ve Python, Java, Scala ve Clojure kullanılıyor. Wall Street'te finans işlemleri için C++ ve Clojure kullanan adamlar aa GOnzalez cıkmış GOnzalez kullanalım demeyecekler. Web frameworklerde de PHP ve ES6'ya ek olarak Ruby ve Python yaygın. Web backend geliştiricileri aa hızlı GOnzalez cıkmış dur şu Ruby Rails framwork 'ü bırakayım demez cunku artık Ruby bile oldukça hızlı. Perl 6 JVM'de calışabiliyor, ona göre tasarlandı. JVM 'de calışmak demek hız demek. Gelişmiş bir web uygulaması yapacak kişi GOnzalez hızlı diye kulanmaz cunku artık hepsi hızlı.Bu durumda Gonzalezle 19 satırda kodlanabilen şeyi 1 satırda kodlama imkanı sağlayan Perl 6'ya sıcak bakar. Hadi Perl 6 biraz yabancı kalıyor diyelim, Ruby , Python falan kullanır, web için yine GOnzalez'i kullanmaz. Hiçbir özelliği olmayan fuzuli bir dil.
Perl bilmiyorum. ama kesinlikle Perl kötü demem eminim çok iyi bir dildir. ama ihtiyacları karşılamıyorsa başka dile geçmek gerekir. ben gerekirse her dilde program yazarım.

linkini veriyorum adamlar Perl den Go ya geçmişler. gerçek dünya çok farklı
https://medium.com/@alvintz.v/how-we-migrate-from-perl-to-golang-1520a4951392


Bu mesaja 1 cevap geldi.
T
6 yıl
Yarbay
Konu Sahibi

Benim kullandığım Perl değil, Perl 6. Bazen Perl kullandığım da oluyor fakat yukarda gördüğün tüm 'tek satır' kodlar hep Perl 6. İkisi arasında cok fark var. Perl 1987'de çıkmış, Perl 6 ise 2015'te piyasaya cıkmış (düzgün çalışan compiler olarak) Linkteki kişiler Perl 6 nedir bilmiyorlar, denize düşmüşler GOnzalez'e sarılmışlar :)



< Bu ileti mini sürüm kullanılarak atıldı >
Bu mesaja 2 cevap geldi.

Bu mesajda bahsedilenler: @FatihAsl
C
6 yıl
Yarbay

quote:

Orijinalden alıntı: Tuğkan-0153

Benim kullandığım Perl değil, Perl 6. Bazen Perl kullandığım da oluyor fakat yukarda gördüğün tüm 'tek satır' kodlar hep Perl 6. İkisi arasında cok fark var. Perl 1987'de çıkmış, Perl 6 ise 2015'te piyasaya cıkmış (düzgün çalışan compiler olarak) Linkteki kişiler Perl 6 nedir bilmiyorlar, denize düşmüşler GOnzalez'e sarılmışlar :)
Perl6 yeni bir dil ise önce gerçek dünyada kendini kanıtlaması gerekecek.


Bu mesaja 1 cevap geldi.
T
6 yıl
Yarbay
Konu Sahibi

Maaş oran hesapla programının daha okunaklı versiyonu. 3 satır:



my @g= prompt('Maaş Listesi, Artış Listesi, Para Birimi gir: ').split(', ');
my (@maaslar,@oranlar,$birim) Z= @g[0].split(' '), @g[1].split(' '), @g[2];
for (@maaslar Z* @oranlar).kv {printf("%s yeni %.2f %s",@maaslar[$^k], $^v, $birim)}


# 1.satır: 2200 3400 5500, 1.25 1.1 1, TL formatında girilen veriyi ', ' ile ayırıp dizi yap
# 2.satır: Dizinin her bir elemanını Z= / zip eşittir metaoperatorü ile değişkenlere ata. Zip ismi zipper / fermuar dan gelmektedir ve bir dizinin her bir elemanını diger dizide karşılık gelen eleman ile belirtilen operatörü uygular, burada Z= olduğu için eşittir operatörü uygulanır.

# 3.satır: zip çarpı metaoperatörü ile @maaslar dizisinin her bir elemanını @oranlar'da karşılık gelen eleman ile çarpararak yeni maaş degerlerin içeren bir liste oluştur. Her liste, dizide olduğu gibi bir key / anahtar ve value / değer dizisi olarak gösterilebilir bunun için Perl 6'da kv metodu kullanılır. kv metodu { } içindeki bloğa for'daki her bir döngü için key ve value değerlerini gönderir ve onları da sırasıyla $^k ve $^v konumsal / positional parametreleri tutar, bu durumda $^k (dizi endeksi 0'la başladığı için) 0 1 2 şeklinde artacaktır dolayısıyla printf içinde @maaslar[$^k] sırasıyla maasları, $^v de ona karşılık gelen maas * oran degerini (value) basacaktır, sona birimi ekleyince işlem tamamlanacaktır.


$ perl6.exe maas-oran-hesapla_uzun.pl
Maaş Listesi, Artış Listesi, Para Birimi gir: 2200 3400 5500, 1.25 1.1 1, TL
2200 yeni 2750.00 TL
3400 yeni 3740.00 TL
5500 yeni 5500.00 TL





< Bu mesaj bu kişi tarafından değiştirildi Tuğkan-0153 -- 29 Eylül 2019; 13:3:26 >


Bu mesajda bahsedilenler: @FatihAsl