Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
inne
- Beiträge: 3289
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Beitrag
von inne » 28.02.2021 09:41:40
inne hat geschrieben: 27.02.2021 18:00:40
smutbert hat geschrieben: 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?
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
-
eggy
- Beiträge: 3334
- Registriert: 10.05.2008 11:23:50
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
schade, dass es keinen spoilertag gibt, ich schick Dir den Link mal per pm
-
inne
- Beiträge: 3289
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
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.
-
heinz
- Beiträge: 535
- Registriert: 20.12.2007 01:43:49
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: 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: 3289
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
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: 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.
-
smutbert
- Beiträge: 8342
- Registriert: 24.07.2011 13:27:39
- Wohnort: Graz
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 ☺
-
heinz
- Beiträge: 535
- Registriert: 20.12.2007 01:43:49
Beitrag
von heinz » 12.03.2021 09:16:51
inne hat geschrieben: 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: 11.03.2021 16:10:35
dass der Name des Herrn Fibunacci soweit ich weiß Leonardo Fibonacci war ☺
Ups... sorry... Hast natürlich recht...
Zu meiner Verteidigung:
Im Script hab ich es zu 99% richtig...
Gruss,
heinz
-
smutbert
- Beiträge: 8342
- Registriert: 24.07.2011 13:27:39
- Wohnort: Graz
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: 3289
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
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
-
heinz
- Beiträge: 535
- Registriert: 20.12.2007 01:43:49
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: 3289
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
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
$ 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;
}'
-
thoerb
- Beiträge: 1685
- Registriert: 01.08.2012 15:34:53
- Lizenz eigener Beiträge: MIT Lizenz
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: 778
- Registriert: 26.11.2017 14:03:31
- Wohnort: Freiburg
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.
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: 1685
- Registriert: 01.08.2012 15:34:53
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von thoerb » 24.03.2021 20:14:58
Huo hat geschrieben: 24.03.2021 20:07:31
Auf die Hilfsvariable fz kannst Du allerdings verzichten, was dem Code einen noch eleganteren Anstrich verleiht.
Stimmt!
-
tobo
- Beiträge: 2336
- Registriert: 10.12.2008 10:51:41
Beitrag
von tobo » 24.03.2021 22:04:48
Huo hat geschrieben: 24.03.2021 20:07:31
[...]einen noch eleganteren Anstrich verleiht.
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"))
-
smutbert
- Beiträge: 8342
- Registriert: 24.07.2011 13:27:39
- Wohnort: Graz
Beitrag
von smutbert » 24.03.2021 22:12:19
python ist ja so cool
Code: Alles auswählen
print("{} ist {}eine Fibonacci-Zahl".format(z, "" if a==z else "k"))
-
Phineas
- Beiträge: 354
- Registriert: 20.06.2012 20:26:19
Beitrag
von Phineas » 17.04.2021 12:04:18
Wie wäre es denn mit einer Fleißarbeit? Ich stelle mir einen Rentenrechner vor: Rentendatum und Bundesland eingeben und das Skript berechnet, wieviele Arbeitstage es noch bis zur Rente sind.
(Ja: Ich war mal Wehrpflichtiger.)
-
reox
- Beiträge: 2515
- Registriert: 06.06.2006 22:09:47
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von reox » 20.04.2021 15:31:21
smutbert hat geschrieben: 24.03.2021 22:12:19
python ist ja so cool
python wird immer cooler
Code: Alles auswählen
print(f"{z} ist {'' if a == z else 'k'}eine Fibonacci-Zahl")
-
inne
- Beiträge: 3289
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Beitrag
von inne » 29.06.2022 13:49:09
Hallo,
ich hätte eine Idee für eine neue Aufgabe, aber ich weiss nicht so recht, ob es so viel Sinn macht diese als Skript zu Lösen oder doch besser als Programm in C.
Die Aufgabe wäre: Wandle ein Zeichenkette, die eine gültige Zahl in Dezimalschreibweise enthält (also z.B. "123.056"), in einen double Wert um. Nun haben Skriptsprachen i.d.R. keine Typenunterscheidung in dem Sinn. Deswegen die Frage nach dem Sinn.
Was denkt ihr? Natürlichen wären Funktionen wie int oder atoi usw. tabu, wo bei ich diese auch einmal nutze im Grunde, weil es damit weniger Code ist. Es ginge auch ohne.
-
Meillo
- Moderator
- Beiträge: 9224
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 29.06.2022 14:48:12
Eine Umsetzung mit scanf(3) ist simpel.
Wenn man es von Hand machen soll (d.h. z.B. Einlesen nur mit getchar(3)), dann stellt sich (fuer den professionellen Programmierer) hoffentlich gleich Frage, wie es sich mit der Problematik von Rundungsfehlern bei Fliesskommazahlen verhaelt.
Aber vielleicht vernachlaessigen wir dieses Thema zunaechst einmal.
Dann finde ich das eine gute Aufgabe ... weniger eine Scriptingaufgabe als eine Rechnenaufgabe aber dennoch eine gute Fingeruebung.
Use ed once in a while!
-
inne
- Beiträge: 3289
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Beitrag
von inne » 29.06.2022 14:54:57
Meillo hat geschrieben: 29.06.2022 14:48:12
Eine Umsetzung mit scanf(3) ist simpel.
Auch tabu
Du hast ganz recht, es geht wenn um die Mathematik dahinter!
Also bist Du dabei, dann gilt es die Aufgabe bis zum Sonntag den 9. Juli zu Lösen, oder später? Das wäre dann eine Woche und Sonntag als Stichtag. Und ich sage mal der Einfachheit halber sind auch Skripte erlaubt solange man erkennt, dass nicht "geschummelt" wurde.
-
Meillo
- Moderator
- Beiträge: 9224
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 29.06.2022 15:04:56
Ich habe eine Loesung in C fertig. Die poste ich dann ab dem Abgabedatum.
Kannst du bitte noch Beispielinput und -output bereitstellen, damit man sein Programm testen kann und unserer Programme einigermassen einheitlich und vergleichbar werden.
Use ed once in a while!
-
inne
- Beiträge: 3289
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Beitrag
von inne » 29.06.2022 15:10:00
Das sol steht für Solution und ist der Kommandoaufruf, mit Eingabewert als Zeichenkette.
Hast Du aus der Standardbibliothek kopiert, ich bin gespannt ob meine Lösung dann im Vergleich doch nichts taugt
-
TRex
- Moderator
- Beiträge: 8316
- Registriert: 23.11.2006 12:23:54
- Wohnort: KA
Beitrag
von TRex » 29.06.2022 15:19:04
Und dann geb ich das als String aus.
-
Meillo
- Moderator
- Beiträge: 9224
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 02.07.2022 09:08:57
Die weitere Diskussion zur Umsetzung in C und Fragen dazu welche Zahlen wie erkannt werden sollen ist nach viewtopic.php?t=184511 abgespalten worden.
Use ed once in a while!