Scripting Contest

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
inne
Beiträge: 2827
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 28.02.2021 09:41:40

inne hat geschrieben: ↑ zum Beitrag ↑
27.02.2021 18:00:40
smutbert hat geschrieben: ↑ zum Beitrag ↑
27.02.2021 12:43:34
Müssen wir mit der Abgabe wirklich noch bis Ende März warten – bis dahin habe ich ja vergessen, dass es einen Scripting Contest gibt? :mrgreen:
Nein! Ich wäre auch fertig!
Wollen wird dann bis nächsten So. (7. März) noch warten (Damit die anderen es auch mitbekommen) und dann unsere Lösungen zeigen?
Auf die Zusatzaufgaben bin ich sehr gespannt, was andere wohl so gezählt haben. Und ob es eine favorisierte Programmiersprache für Mathematik gibt.

Anders könnten wir auch bis zum 31. März nur die Zusatz aufgaben zeigen :mrgreen:
(=_=)

Die Freiheit ist viel köstlicher, als das Geschenk, wofür man sie hingibt.

eggy
Beiträge: 2690
Registriert: 10.05.2008 11:23:50

Re: Scripting Contest

Beitrag von eggy » 28.02.2021 09:57:04

@inne: ja gibt es, die ist aber alles andere als mein Favorit, sogar ziemlich genau das Gegenteil davon :mrgreen:
schade, dass es keinen spoilertag gibt, ich schick Dir den Link mal per pm

inne
Beiträge: 2827
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 28.02.2021 10:52:24

Danke für die PN, man beachte auch den Beiträge von heisenberg zur Aufgabe "rtgen" damals.
(=_=)

Die Freiheit ist viel köstlicher, als das Geschenk, wofür man sie hingibt.

Benutzeravatar
heinz
Beiträge: 515
Registriert: 20.12.2007 01:43:49

Re: Scripting Contest

Beitrag von heinz » 11.03.2021 15:05:02

Hallo Zusammen,

jetzt da der "Abgabetermin" naeherrueckt, fallt mir noch eine Frage zur Aufgabenstellung ein.
inne hat geschrieben: ↑ zum Beitrag ↑
15.02.2021 08:22:43
Aufgabe: Berechnen der Fibonacci-Folge bis zu einem vom User gegebenen Wert.
Was genau ist dieser Wert?
Ist es die Soundsovielte Fibunacci-Zahl?
z.B.
WERT=7
Fibunacci-Zahl=13

Oder die naechst kleinere Fibunacci-Zahl in der naehe von WERT?
z.B.
WERT=1000
Fibunacci-Zahl=987

Gruss,
heinz

inne
Beiträge: 2827
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 11.03.2021 15:23:23

Ich ermittel die Fibonacci-Folge bis Fibonacci-Zahl >= Zahl und geben dann Ja Zahl ist ein Fibonacci-Zahl oder Nein Zahl ist keine Fibonacci-Zahl aus. Wobei ich es erlaube, beliebig viele Zahlen an das Skript zu übergeben. Optimal ist meine Lösung nicht unbedingt, weil ich die komplette Fibonacci-Folge im Speicher behalte.
heinz hat geschrieben: ↑ zum Beitrag ↑
11.03.2021 15:05:02
jetzt da der "Abgabetermin" naeherrueckt,
Der 31. war wohl doch etwas zu weit hin von mir.
Zuletzt geändert von inne am 12.03.2021 10:42:53, insgesamt 3-mal geändert.
(=_=)

Die Freiheit ist viel köstlicher, als das Geschenk, wofür man sie hingibt.

Benutzeravatar
smutbert
Moderator
Beiträge: 7782
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Scripting Contest

Beitrag von smutbert » 11.03.2021 16:10:35

An der Stelle kann ich mir nicht verkneifen darauf hinzuweisen, dass der Name des Herrn Fibunacci soweit ich weiß Leonardo Fibonacci war ☺

Benutzeravatar
heinz
Beiträge: 515
Registriert: 20.12.2007 01:43:49

Re: Scripting Contest

Beitrag von heinz » 12.03.2021 09:16:51

inne hat geschrieben: ↑ zum Beitrag ↑
11.03.2021 15:23:23
Ich ermittel die Fibonacci-Folge bis Fibonacci-Zahl >= Zahl und geben dann Ja Zahl ist ein Fibonacci-Zahl oder Nein Zahl ist keine Fibonacci-Zahl aus.
Alles klar...
smutbert hat geschrieben: ↑ zum Beitrag ↑
11.03.2021 16:10:35
dass der Name des Herrn Fibunacci soweit ich weiß Leonardo Fibonacci war ☺
Ups... sorry... Hast natürlich recht... :oops:
Zu meiner Verteidigung:
Im Script hab ich es zu 99% richtig... :mrgreen:

Gruss,
heinz

Benutzeravatar
smutbert
Moderator
Beiträge: 7782
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Scripting Contest

Beitrag von smutbert » 23.03.2021 18:01:49

So, jetzt ist der Abgabetermin verstrichen, oder?
(Es hat aber auch niemand etwas gesagt ☺)

Naja, es nie zu früh und selten zu spät - oder so ähnlich. Bei mir ist diese mir offensichtlich scheinende Lösung herausgekommen:

Code: Alles auswählen

                                           
#!/bin/sh

previous=0
current=1

if ! test "${1}" -gt 0; then
        echo "Ganze Zahl größer 0 erwartet."
        exit 1
fi

while test ${current} -le ${1}; do
        echo ""
        echo -n "${current}"
        new_current=$(echo "${current} + ${previous}" | bc)
        previous=${current}
        current=${new_current}
done

if test ${previous} -eq ${1}; then
        echo " ist eine Fibonacchi-Zahl."
        exit 0
else
        echo "Die angebene Zahl ${1} ist keine Fibonacchi-Zahl."
        exit 2
fi

inne
Beiträge: 2827
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 23.03.2021 18:10:46

Ok, ich suche meins dann auch mal raus.

Zu deinem (ich habe es als /tmp/foo.sh abgespeichert):

Code: Alles auswählen

$ bash /tmp/foo.sh 9999999999999999999
/tmp/foo.sh: Zeile 6: test: 9999999999999999999: Ganzzahliger Ausdruck erwartet.
Ganze Zahl größer 0 erwartet.
Meins kann schon mal viel viel größere Zahlen prüfen :idea:
(=_=)

Die Freiheit ist viel köstlicher, als das Geschenk, wofür man sie hingibt.

Benutzeravatar
heinz
Beiträge: 515
Registriert: 20.12.2007 01:43:49

Re: Scripting Contest

Beitrag von heinz » 23.03.2021 18:13:40

Aehnlich sah meine Loesung zuerst auch aus aber die Geschwindigkeit und die Probleme bei Zahlen > 64bit int brachten mich dann zu dieser Loesung:

Code: Alles auswählen

#!/bin/bash
#
# Aufgabe: von inne >> 15.02.2021 08:22:43
# Berechnen der Fibonacci-Folge bis zu einem vom User gegebenen Wert.
# Schreibe ein Skript das die Fibonacci-Folge bis zu einem vom Benutzer
# angebenden Wert berechnet und pr.fe ob der Wert eine Fibonacci-Zahl ist.
# R.ckgabewert soll 0 bei ja und nicht 0 bei nein sein.
#
# Loesung von heinz
#
# bc rechnet so lange Fibonacci-Zahlen aus, bis eine Zahl groesser als der
# eingegebene Wert ist.
# Danach wird die Zahl ausgegeben und getestet, ob sie eine Fibonacci-Zahl ist.
#



# Wurde ein Wert uebergeben?
if test -z "$1"
then
    echo -e "\a\n${0##*/} MAX-WERT\n"
    exit 1
else
# Ist uebergebener Wert eine Zahl?
    if test -n "$(tr -d [:digit:] <<<"$1")"
    then
        echo -e "\a\nEs duerfen nur ganze Zahlen angegeben werden!\n"
        exit 1
    fi
fi



# Fibonacci-Zahl berechnen
ergebnis=$(echo "
    wert=$1

    a=1
    b=0
    c=0
    stelle=1

    while (wert > c)
    {
    c=a+b
    a=b
    b=c
    stelle=stelle+1
    print c,\"\n\"
    }

    quit
"|bc|tr -d ' \\')

# Ergebnis ausgeben
echo "$ergebnis"



# Ergebnis testen
rueckgabe=$(echo "
    wert=$1

    a=1
    b=1
    c=0
    stelle=2

    while (c < wert)
    {
    c=a+b
    a=b
    b=c
    stelle=stelle+1
    }
    
    if (b == wert) print 0
    
    quit
"|bc)
    
# Rueckgabe 0=Ergebnis ist eine Fibonacci-Zahl, 1=Ergebnis ist keine Fibonacci-Zahl
exit ${rueckgabe:-1}

Musste meines nochmal anpassen, um den gleichen Output wie bei Euch zu erhalten.
Zuletzt geändert von heinz am 23.03.2021 18:41:19, insgesamt 3-mal geändert.

inne
Beiträge: 2827
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 23.03.2021 18:15:09

Meine Lösung:

Code: Alles auswählen

#!/usr/bin/env perl
# Fibonacci-Folge

use bignum;
use diagnostics;
use locale;
use strict;
use utf8;
use warnings;

binmode( STDIN,  ":encoding(UTF-8)" );
binmode( STDOUT, ":encoding(UTF-8)" );
binmode( STDERR, ":encoding(UTF-8)" );

# Zahlen aufsteigend sortieren, damit die letzte in der Liste die größte
# ist: $numbers[-1] # largest number

my @numbers = sort { $a <=> $b } ( (@ARGV) ? @ARGV : <STDIN> );

# Anfang der Fibonacci-Folge
my @fibonaccis = ( 0, 1 );

print "Fibonacci-Folge:\n";
print "@fibonaccis\n";

# Fibonacci-Folge bis zur größten Zahl s.o. weiterführen

while ( $fibonaccis[-1] < $numbers[-1] ) {
    push @fibonaccis, $fibonaccis[-2] + $fibonaccis[-1];
    print $fibonaccis[-1], "\n";
}

print "…\n";

# Zahl darauf hin prüfen, ob diese in der Fibonacci-Folge vorkommt und
# es sich somit um eine Fibonacci-Zahl handelt.

my $founds;
for my $number (@numbers) {
    chomp $number;
    if ( grep { $_ eq $number } @fibonaccis ) {
        print "Ja; $number ist eine Fibonacci-Zahl 😇\n";
        $founds++;
    }
    else {
        print "Nein; $number ist keine Fibonacci-Zahl 😈\n";
    }
}

exit !$founds;
Anwenundgen damit (Zusatzaufgabe):

Code: Alles auswählen

perl fibonacci.pl $(dpkg -l | grep ^ii | wc -l) | tail -1

Code: Alles auswählen

dpkg-query -W -f='${Package}\n' | while read; do echo $REPLY; perl fibonacci.pl $(dpkg -L $REPLY | wc -l) | tail -1; done | \grep -B 1 "ist eine"

Code: Alles auswählen

dpkg-query -W -f='${Package}\n' | while read; do echo $REPLY; perl fibonacci.pl $(dpkg -L $REPLY | wc -l) | tail -1; done | \grep "ist eine" | wc -l

Code: Alles auswählen

perl fibonacci.pl $(find / | wc -l) | tail -1

Code: Alles auswählen


$ cat ~/Dokumente/Computa/perl/bin/fibonacci-filecounts.bash 
#!/bin/bash
# With help from AWK people :-)

find "$1" 2>/dev/null | while read; do
	file -b --mime-type "$REPLY";
done | sort | uniq -c | awk '
{
	printf("%s: ", $0);

	# We must use a seperate file-descriptor for every call of the function /system/ (pipe)
	cmd=sprintf ("/usr/bin/env perl ./fibonacci.pl %d | tail -1", $1);
	cmd | getline l;
	close(cmd);

	# Instead of simply run this; that does not work at this point ;-)
	#sprintf ("/usr/bin/env perl ./fibonacci.pl %d | tail -1", $1) | getline l;

	print l;
}'

(=_=)

Die Freiheit ist viel köstlicher, als das Geschenk, wofür man sie hingibt.

thoerb
Beiträge: 1264
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting Contest

Beitrag von thoerb » 23.03.2021 18:53:52

Mein Lösung ist ähnlich der von @smutbert.

Code: Alles auswählen

#!/usr/bin/python3
import sys

z = int(sys.argv[1])
a = 0
b = 1
fz = 0

while fz <= z:
	print(fz)
	fz = a + b
	a = b
	b = fz

if (a == z):
	print (z, "ist eine Fibonacci-Zahl")
else:
	print (z, "ist keine Fibonacci-Zahl")

Huo
Beiträge: 207
Registriert: 26.11.2017 14:03:31

Re: Scripting Contest

Beitrag von Huo » 24.03.2021 20:07:31

@thoerb: Schöne Lösung! Auf die Hilfsvariable fz kannst Du allerdings verzichten, was dem Code einen noch eleganteren Anstrich verleiht. :wink:

Code: Alles auswählen

#!/usr/bin/python3
import sys

z = int(sys.argv[1])
a = 0
b = 1

while b <= z:
    print(b)
    a, b = b, a + b

if (a == z):
    print (z, "ist eine Fibonacci-Zahl")
else:
    print (z, "ist keine Fibonacci-Zahl")

thoerb
Beiträge: 1264
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting Contest

Beitrag von thoerb » 24.03.2021 20:14:58

Huo hat geschrieben: ↑ zum Beitrag ↑
24.03.2021 20:07:31
Auf die Hilfsvariable fz kannst Du allerdings verzichten, was dem Code einen noch eleganteren Anstrich verleiht. :wink:
Stimmt! :wink:

tobo
Beiträge: 1027
Registriert: 10.12.2008 10:51:41

Re: Scripting Contest

Beitrag von tobo » 24.03.2021 22:04:48

Huo hat geschrieben: ↑ zum Beitrag ↑
24.03.2021 20:07:31
[...]einen noch eleganteren Anstrich verleiht. :wink:
Da wäre (neben der Initialisierung) weiter unten auch noch Potenzial:

Code: Alles auswählen

print("{} ist {} Fibonacci-Zahl".format(z, "eine" if a==z else "keine"))

Antworten