ubuntuusers.de

[CodeGala] Zeigt her eure Codes

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Adna_rim Team-Icon

Anmeldungsdatum:
8. November 2006

Beiträge: 2521

Da ja jetzt in mehreren Threads Leute in ihrer Lieblingssprache Lösungen gepostet hatte und ich das recht Interessant fand und als angenehme Abwechslung in meinem Klausurenstress momentan hatte ich die Idee, dass man sowas regelmässig machen kann, wenn ihr Interesse habt? Man könnte dann auch eine Wiki-Seite öffnen, auf der man immer die zahlreichen Lösungen darstellt. Was haltet ihr von der Idee?

Ich hatte vorhin im Fernsehen was über Sonnenblumen gesehen und dort wurde der goldene Schnitt erwähnt, was imo eine sehr einfache und kleine Aufgabe wäre, die in jeder Sprache recht ähnlich zu realisieren ist, doch vielleicht hat ja jemand eine aussergewöhnliche Lösung ☺ ?. Also wenn jemand Lust dazu hat, postet eure Lösungen, in euerer Lieblingssprache.

Aufgabenstellung: Die Fibonacci-Folge mit f1=1 und f2=1 für die ersten 100 Fibonacci-Zahlen zu bestimmen und daraus für alle Fibonacci-Zahlen den Näherungswert an den Goldener Schnitt bestimmen.

Meine Ruby-Lösung:

#!/usr/bin/env ruby

fibonacci=[1,1]
gold_schnitt=[]
while fibonacci.size <= 100
        gold_schnitt<<fibonacci[-1].to_f/fibonacci[-2].to_f
        fibonacci<<fibonacci[-1]+fibonacci[-2]
end

printf("\nFibonacci-Zahlen: ")
fibonacci.each {|num| printf('%s ',num)}
printf("\n\nGoldener-Schnitt: ")
gold_schnitt.each {|num| printf('%s ',num)}
puts

Die Ausgabe:

Fibonacci-Zahlen: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049 12586269025 20365011074 32951280099 53316291173 86267571272 139583862445 225851433717 365435296162 591286729879 956722026041 1548008755920 2504730781961 4052739537881 6557470319842 10610209857723 17167680177565 27777890035288 44945570212853 72723460248141 117669030460994 190392490709135 308061521170129 498454011879264 806515533049393 1304969544928657 2111485077978050 3416454622906707 5527939700884757 8944394323791464 14472334024676221 23416728348467685 37889062373143906 61305790721611591 99194853094755497 160500643816367088 259695496911122585 420196140727489673 679891637638612258 1100087778366101931 1779979416004714189 2880067194370816120 4660046610375530309 7540113804746346429 12200160415121876738 19740274219868223167 31940434634990099905 51680708854858323072 83621143489848422977 135301852344706746049 218922995834555169026 354224848179261915075 573147844013817084101 

Goldener-Schnitt: 1.0 2.0 1.5 1.66666666666667 1.6 1.625 1.61538461538462 1.61904761904762 1.61764705882353 1.61818181818182 1.61797752808989 1.61805555555556 1.61802575107296 1.61803713527851 1.61803278688525 1.61803444782168 1.61803381340013 1.61803405572755 1.61803396316671 1.6180339985218 1.61803398501736 1.6180339901756 1.61803398820532 1.6180339889579 1.61803398867044 1.61803398878024 1.6180339887383 1.61803398875432 1.6180339887482 1.61803398875054 1.61803398874965 1.61803398874999 1.61803398874986 1.61803398874991 1.61803398874989 1.6180339887499 1.61803398874989 1.6180339887499 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.6180339887499 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 

greets

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

#!/usr/bin/perl
# Core Module
use strict;
use warnings;
use utf8;
use open ':utf8';
use open ':std';
use Memoize;

sub fib {
    my ( $number ) = @_;
    return 1 if $number <= 1;
    return fib($number-1) + fib($number-2);
}

memoize('fib');

for my $i ( 1 .. 100 ) {
    printf "%.0f / %.0f = %.14f\n", fib($i), fib($i-1), fib($i) / fib($i-1);
}

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

bash mit bc:

l=1;r=1; for s in $(seq 1 50); do l=$((l+r)); r=$((r+l)); echo -e $s"\t"$l"\t"$r"\t" $(echo "scale=16; $r/$l" | bc); done
1       2       3        1.5000000000000000
2       5       8        1.6000000000000000
3       13      21       1.6153846153846153
4       34      55       1.6176470588235294
5       89      144      1.6179775280898876
6       233     377      1.6180257510729613
7       610     987      1.6180327868852459
8       1597    2584     1.6180338134001252
9       4181    6765     1.6180339631667065
10      10946   17711    1.6180339850173579
11      28657   46368    1.6180339882053250
12      75025   121393   1.6180339886704431
13      196418  317811   1.6180339887383030
14      514229  832040   1.6180339887482036
15      1346269 2178309  1.6180339887496481
16      3524578 5702887  1.6180339887498588
17      9227465 14930352         1.6180339887498895
18      24157817        39088169         1.6180339887498940
19      63245986        102334155        1.6180339887498947
20      165580141       267914296        1.6180339887498948
21      433494437       701408733        1.6180339887498948
22      1134903170      1836311903       1.6180339887498948
23      2971215073      4807526976       1.6180339887498948
24      7778742049      12586269025      1.6180339887498948
25      20365011074     32951280099      1.6180339887498948
26      53316291173     86267571272      1.6180339887498948
27      139583862445    225851433717     1.6180339887498948
28      365435296162    591286729879     1.6180339887498948
29      956722026041    1548008755920    1.6180339887498948
30      2504730781961   4052739537881    1.6180339887498948
31      6557470319842   10610209857723   1.6180339887498948
32      17167680177565  27777890035288   1.6180339887498948
33      44945570212853  72723460248141   1.6180339887498948
34      117669030460994 190392490709135  1.6180339887498948
35      308061521170129 498454011879264  1.6180339887498948
36      806515533049393 1304969544928657         1.6180339887498948
37      2111485077978050        3416454622906707         1.6180339887498948
38      5527939700884757        8944394323791464         1.6180339887498948
39      14472334024676221       23416728348467685        1.6180339887498948
40      37889062373143906       61305790721611591        1.6180339887498948
41      99194853094755497       160500643816367088       1.6180339887498948
42      259695496911122585      420196140727489673       1.6180339887498948
43      679891637638612258      1100087778366101931      1.6180339887498948
44      1779979416004714189     2880067194370816120      1.6180339887498948
45      4660046610375530309     7540113804746346429      1.6180339887498948


und so weiter ☺

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Plopp, da bin ich geplatzt.
numeric_limits<unsigned long long>::max() == 18446744073709551615

e1bart0 Team-Icon

Avatar von e1bart0

Anmeldungsdatum:
12. Mai 2007

Beiträge: 927

Wohnort: München

Mit Perl ohne Rekursion 😉
http://paste.pocoo.org/show/30317

BadBoy

Avatar von BadBoy

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 479

@Adna rim:
zumindest die Ausgabe würd ich rubylike machen:

print("\nFibonacci-Zahlen: ")
puts fibonacci.join(" ")
print("\n\nGoldener-Schnitt: ")
puts gold_schnitt.join(" ")

und auch die schleife könnt man anders lösen:

(1..100).each { ...

*ggg*

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4687

Wohnort: Berlin

Python:

#!/usr/bin/env python
from __future__ import division
from itertools import islice


def fib_and_golden_ratio():
    a = b = 1
    while True:
        yield (a, b / a)
        a, b = b, a + b


def main():
    for values in islice(fib_and_golden_ratio(), 100):
        print '%d, %.50f' % values


if __name__ == '__main__':
    main()

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Adna rim hat geschrieben:

Da ja jetzt in mehreren Threads Leute in ihrer Lieblingssprache Lösungen gepostet hatte und ich das recht Interessant fand und als angenehme Abwechslung in meinem Klausurenstress momentan hatte ich die Idee, dass man sowas regelmässig machen kann, wenn ihr Interesse habt? Man könnte dann auch eine Wiki-Seite öffnen, auf der man immer die zahlreichen Lösungen darstellt. Was haltet ihr von der Idee?

Wenn's konkret wird kann ich mich der Idee schlecht entziehen, aber generell gibt es sowas an soviel Stellen, daß es mir wie ein DLTDW vorkommt - Stammtischniveau meist.

Andererseits ist Support ja auch meist pragmatisch-knapp und nicht sonderlich elaboriert.

Als Unterhaltung finde ich ist der Platz dafür aber eher das Forum als das Wiki.

Statt bash mit etwas bc kann man auch bc mit etwas bash nutzen:

echo "scale=16;r=0;l=1;while (i++<100) {r+=l;l+=r;r;l;l/r;}" | bc

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4687

Wohnort: Berlin

Und Haskell:

fibonacci = fib 1 1
    where fib a b = a : (fib b (a+b))

f (a,b) = (show a) ++ " " ++ (show ((fromInteger b) / (fromInteger a)))

main = putStrLn $ unlines $ take 100 $ map f $ zip fibonacci (tail fibonacci)

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Hier in C++, aber nicht besonders schön:

#include <iostream>
#include <vector>
#include <gmpxx.h>
using namespace std;
int main() {
        vector<mpz_class> v(100);
        v[0]=v[1]=1;
        cout << 1 << endl << 1 << endl;
        for(char i=2;i<100;++i) {
                v[i]=v[i-1]+v[i-2];
                cout << v[i] << endl;
        }
        for(char i=1;i<100;++i) {
                cout << mpq_class(v[i],v[i-1]).get_d() << endl;
        }
} 

Benötigt libgmp3-dev und libgmpxx4ldbl.
Compilen mit g++ programm.cpp -lgmpxx -lgmp.

audax

Avatar von audax

Anmeldungsdatum:
15. September 2006

Beiträge: 1253

Manno. Da war man kurz mal weg.... 😉

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Furchtbar - ein Forum voller Versager:

Ruby:
	return 1 if $number <= 1; 
Bash:
	l=1;r=1;
Perl:
	return 1 if $number <= 1; 
Python:
	a = b = 1 
C++:
	v[0]=v[1]=1; 
Haskell:
	fibonacci = fib 1 1


Die Fibonacci-Zahlen beginnen mit 0, 1, 1 - einer macht's falsch, und alle machen es nach.
Hier eine netter formatierte bc-Lösung:

#/bin/bc
#
# fibonacci und Goldener Schnitt
#
scale=16
i=0
r=0
l=1
r
r/l
while (i++<100)
{
        r+=l
        print i, "\t", r, "\t", r/l, "\t"
        l+=r
        print l, "\t", l/r, "\n"
}
print "\n\n"

audax

Avatar von audax

Anmeldungsdatum:
15. September 2006

Beiträge: 1253

Marc 'BlackJack' Rintsch hat geschrieben:

Python:

#!/usr/bin/env python
from __future__ import division
from itertools import islice


def fib_and_golden_ratio():
    a = b = 1
    while True:
        yield (a, b / a)
        a, b = b, a + b


def main():
    for values in islice(fib_and_golden_ratio(), 100):
        print '%d, %.50f' % values


if __name__ == '__main__':
    main()


Oft wird auch f0 = 0 ausgelassen und die Fibonacci-Folge mit f1 = 1 und f2 = 1 beginnend definiert, insbesondere bei der Anwendung auf Situationen, in denen ein Anfangswert Null keinen Sinn hat.

@unknown: Man möchte nicht durch 0 teilen, wirklich nicht. Das ist doof.

€dit:
Hier mal meins:

from __future__ import division
from itertools import islice

def fibgen():
    n = m = 1 
    while True:
        yield n, m
        n, m = m, n+m 

print '\n'.join(
    ("%d\t%d\t%f" % (c, new, new/old) for 
        c, (new, old) in enumerate(islice(fibgen(), 100))))

Prinz_Igor

Avatar von Prinz_Igor

Anmeldungsdatum:
29. März 2006

Beiträge: 470

Wohnort: Uslar

Ich mag es manchmal lieber schlicht und einfach:

f1 = 0
f2 = 1
print f1
print f2
for i in range(98):
  f3 = f1+f2
  print '%d %.50f' % (f3,float(f3)/f2)
  f1 = f2
  f2 = f3

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

user unknown hat geschrieben:

Die Fibonacci-Zahlen beginnen mit 0, 1

...wayne, in diesem Kontext?

Antworten |